diff --git a/commerce_coupon_fixed_amount.install b/commerce_coupon_fixed_amount.install
index d4dc3d7..196b004 100644
--- a/commerce_coupon_fixed_amount.install
+++ b/commerce_coupon_fixed_amount.install
@@ -58,3 +58,18 @@ function commerce_coupon_fixed_amount_uninstall() {
       ->execute();
 }
 
+/**
+ * Implements hook_update_N().
+ * Triggers the field updating if this module is enabled
+ */
+function commerce_coupon_fixed_amount_update_7100(&$sandbox) {
+  // If module already enabled, trigger commerce_coupon_fixed_amount_commerce_coupon_type_configure()
+  // which creates the new "before taxes" field. This happens through commerce_coupon_type_save()
+  // which is called by commerce_coupon_type_enable().
+  // @TODO Currently the module cannot be updated while disabled, but when it's re-enabled the fields
+  // will be created as desired.
+  if (module_exists('commerce_coupon_fixed_amount')) {
+    drupal_load('module', 'commerce_coupon');
+    commerce_coupon_type_enable('commerce_coupon_fixed');
+  }
+}
diff --git a/commerce_coupon_fixed_amount.module b/commerce_coupon_fixed_amount.module
index 32e6286..c01712d 100644
--- a/commerce_coupon_fixed_amount.module
+++ b/commerce_coupon_fixed_amount.module
@@ -17,10 +17,11 @@ function commerce_coupon_fixed_amount_commerce_coupon_type_configure($bundle, $r
   $entity_type = 'commerce_coupon';
 
   // If a field type we know should exist isn't found, clear the Field cache.
-  if (!field_info_field_types('commerce_price')) {
+  if (!field_info_field_types('commerce_price') || field_info_field_types('list_boolean')) {
     field_cache_clear();
   }
-  // Look for or add the specified fixed amount
+
+  // Look for or add the specified fixed amount field
   $field_name = 'commerce_coupon_fixed_amount';
   $field = field_info_field($field_name);
   $instance = field_info_instance($entity_type, $field_name, $bundle);
@@ -44,6 +45,7 @@ function commerce_coupon_fixed_amount_commerce_coupon_type_configure($bundle, $r
       $field = field_update_field($field_data);
     }
   }
+
   if (empty($instance) || $reset) {
     $instance_data = array(
       'field_name' => $field_name,
@@ -80,6 +82,61 @@ function commerce_coupon_fixed_amount_commerce_coupon_type_configure($bundle, $r
       field_update_instance($instance_data);
     }
   }
+
+  // Clear out the variables to start fresh
+  unset($field, $instance, $field_data, $instance_data);
+
+  // Look for or add the specified "apply discount before taxes" field
+  $field_name = 'commerce_coupon_fixed_amount_pt'; // must be less than 32 chars; sorry!
+  $field = field_info_field($field_name);
+  $instance = field_info_instance($entity_type, $field_name, $bundle);
+  $weight = 0;
+
+  if (empty($field) || $reset) {
+    $field_data = array(
+      'field_name' => $field_name,
+      'type' => 'list_boolean',
+      'label' => t('Apply discount before taxes are calculated'),
+      'description' => t('If enabled the coupon will be distributed among products in order.<br/>If disabled (default) the fixed amount will be deducted from the order total (after any taxes were applied).'),
+      'cardinality' => 1,
+      'entity_types' => array($entity_type),
+      'locked' => FALSE,
+      'settings' => array(
+        'allowed_values' => array(0 => 'No, apply after calculating taxes', 1 => 'Yes, apply before calculating taxes'),
+      ),
+    );
+
+    if (empty($field)) {
+      $field = field_create_field($field_data);
+    }
+    else {
+      $field = field_update_field($field_data);
+    }
+  }
+
+  if (empty($instance) || $reset) {
+    $instance_data = array(
+      'field_name' => $field_name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle,
+      'label' => t('Apply discount before taxes are calculated'),
+      'description' => t('If enabled the coupon will be distributed among products in order.<br/>If disabled (default) the fixed amount will be deducted from the order total (after any taxes were applied).'),
+      'display' => array(),
+      'widget' => array(
+        'type' => 'options_onoff',
+        'settings' => array(
+          'display_label' => 1,
+        ),
+      ),
+    );
+
+    if (empty($instance)) {
+      field_create_instance($instance_data);
+    }
+    else {
+      field_update_instance($instance_data);
+    }
+  }
 }
 
 /**
diff --git a/commerce_coupon_fixed_amount.rules.inc b/commerce_coupon_fixed_amount.rules.inc
new file mode 100644
index 0000000..0ba3857
--- /dev/null
+++ b/commerce_coupon_fixed_amount.rules.inc
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * @file
+ * Coupon fixed amount rules integration file.
+ */
+
+/**
+ * Implements hook_rules_action_info().
+ */
+function commerce_coupon_fixed_amount_rules_action_info() {
+  $actions = array();
+  $actions['commerce_coupon_fixed_amount_pt_apply_to_product_li'] = array(
+    'label' => t('Apply a fixed (distributed; before taxes) coupon to a product line item'),
+    'parameter' => array(
+      'order' => array(
+        'type' => 'commerce_order',
+        'label' => t('Order'),
+      ),
+      'line_item' => array(
+        'type' => 'commerce_line_item',
+        'label' => t('Line item'),
+      ),
+      'coupon' => array(
+        'type' => 'commerce_coupon',
+        'label' => t('Coupon'),
+      ),
+      'component_name' => array(
+        'type' => 'text',
+        'label' => t('Price component type'),
+        'description' => t('Price components track changes to prices made during the price calculation process, and they are carried over from the unit price to the total price of a line item. When an order total is calculated, it combines all the components of every line item on the order. When the unit price is altered by this action, the selected type of price component will be added to its data array and reflected in the order total display when it is formatted with components showing. Defaults to base price, which displays as the order Subtotal.'),
+        'options list' => 'commerce_price_component_titles',
+        'default value' => 'base_price',
+      ),
+      'round_mode' => array(
+        'type' => 'integer',
+        'label' => t('Price rounding mode'),
+        'description' => t('Round the resulting price amount after performing this operation.'),
+        'options list' => 'commerce_round_mode_options_list',
+        'default value' => COMMERCE_ROUND_HALF_UP,
+      ),
+    ),
+    'base' => 'commerce_coupon_fixed_amount_pt_apply_to_product_li',
+    'group' => t('Commerce Coupon'),
+  );
+
+  return $actions;
+}
+
+/**
+ * Rules action callback to apply the distributed discount to a line item
+ *
+ * @param object $order
+ *   Commerce order
+ * @param object $line_item
+ *   Line item within the $order
+ * @param object $coupon
+ *   Coupon being used
+ * @param string $component_name
+ *   Price component from the coupon
+ * @param $round_mode
+ *   COMMERCE_ROUND_X constant - which rounding mode to use
+ */
+function commerce_coupon_fixed_amount_pt_apply_to_product_li($order, $line_item, $coupon, $component_name, $round_mode) {
+  // Calculate the total of the order products base price(s).
+  $order_line_item_total = 0;
+  if (isset($order->commerce_line_items[LANGUAGE_NONE]) && is_array($order->commerce_line_items[LANGUAGE_NONE])) {
+    foreach ($order->commerce_line_items[LANGUAGE_NONE] as $value) {
+      $order_line_item = commerce_line_item_load($value['line_item_id']);
+      // If the line item is a product line item...
+      if (isset($order_line_item) && in_array($order_line_item->type, commerce_product_line_item_types())) {
+        $wrapper = entity_metadata_wrapper('commerce_line_item', $order_line_item);
+        $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
+        $order_line_item_total += $unit_price['data']['components'][0]['price']['amount'] * $order_line_item->quantity;
+      }
+    }
+  }
+
+  $coupon_wrapper = entity_metadata_wrapper('commerce_coupon', $coupon);
+  // Apply the coupon just if it's active, the coupon is a fixed coupon, and it has
+  // pre-tax (apply before taxes) enabled
+  if ($coupon->is_active == TRUE && $coupon->type == 'commerce_coupon_fixed'
+  && isset($coupon_wrapper->commerce_coupon_fixed_amount_pt) 
+  && $coupon_wrapper->commerce_coupon_fixed_amount_pt->value() == 1) {
+    $fixed_amnt = $coupon_wrapper->commerce_coupon_fixed_amount->value();
+
+    // Get the price component to use in this price.
+    $price_component_name = $coupon_wrapper->price_component_name->value();
+    $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
+    $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
+
+    $amount = commerce_round($round_mode, $unit_price['data']['components'][0]['price']['amount'] / $order_line_item_total * $fixed_amnt['amount']);
+
+    // Calculate the updated amount and create a price array representing the
+    // difference between it and the current amount.
+    $current_amount = $unit_price['amount'];
+    $updated_amount = commerce_round($round_mode, $current_amount - $amount);
+
+    $difference = array(
+      'amount' => $updated_amount - $current_amount,
+      'currency_code' => $unit_price['currency_code'],
+      'data' => array(),
+    );
+
+    // Set the amount of the unit price and add the difference as a component.
+    $wrapper->commerce_unit_price->amount = $updated_amount;
+
+    $wrapper->commerce_unit_price->data = commerce_price_component_add(
+        $wrapper->commerce_unit_price->value(), $price_component_name, $difference, TRUE
+    );
+  }
+}
diff --git a/commerce_coupon_fixed_amount.rules_defaults.inc b/commerce_coupon_fixed_amount.rules_defaults.inc
index fa40f9b..71ca2ff 100644
--- a/commerce_coupon_fixed_amount.rules_defaults.inc
+++ b/commerce_coupon_fixed_amount.rules_defaults.inc
@@ -20,15 +20,16 @@ function commerce_coupon_fixed_amount_default_rules_configuration() {
 
   $rule->label = t('Redeem a coupon with fixed amount');
   $rule->active = TRUE;
-
   $rule
     ->event('commerce_coupon_redeem')
     ->condition('data_is', array('data:select' => 'coupon:type', 'op' => '=', 'value' => 'commerce_coupon_fixed'))
     ->condition('entity_has_field', array('entity:select' => 'coupon', 'field' => 'commerce_coupon_fixed_amount'))
+    ->condition('entity_has_field', array('entity:select' => 'coupon', 'field' => 'commerce_coupon_fixed_amount_pt'))
     ->condition('entity_has_field', array('entity:select' => 'commerce_order', 'field' => 'commerce_coupon_order_reference'))
-    ->condition(rules_and()->condition('data_is_empty', array('data:select' => 'coupon:commerce-coupon-fixed-amount'))->negate() )
+    ->condition(rules_condition('data_is_empty', array('data:select' => 'coupon:commerce-coupon-fixed-amount'))->negate())
     ->condition('data_is', array('data:select' => 'coupon:commerce-coupon-fixed-amount:amount', 'op' => '>', 'value' => 0))
     ->condition('data_is', array('data:select' => 'coupon:is-active', 'op' => '=', 'value' => TRUE))
+    ->condition(rules_condition('data_is', array('data:select' => 'coupon:commerce-coupon-fixed-amount-pt', 'op' => '=', 'value' => 1))->negate())
     ->action('list_add', array(
       'list:select' => 'commerce-order:commerce-coupon-order-reference',
       'item:select' => 'coupon',
@@ -44,5 +45,68 @@ function commerce_coupon_fixed_amount_default_rules_configuration() {
 
   $rules['commerce_coupon_fixed_amount_calculate_amount'] = $rule;
 
+  // Create a "before taxes" fixed amount calculation rule
+  $rule = rules_reaction_rule(array(), array(
+    'commerce_coupon_line_item' => array(
+      'type' => 'commerce_coupon_line_item',
+      'label' => 'commerce coupon line item'),
+    )
+  );
+  $rule->label = t('Calculate coupon with fixed (distributed; before taxes) amount');
+  $rule->active = TRUE;
+  $rule
+    ->event('commerce_coupon_redeem')
+    ->condition('data_is', array('data:select' => 'coupon:type', 'op' => '=', 'value' => 'commerce_coupon_fixed'))
+    ->condition('entity_has_field', array('entity:select' => 'coupon', 'field' => 'commerce_coupon_fixed_amount'))
+    ->condition('entity_has_field', array('entity:select' => 'coupon', 'field' => 'commerce_coupon_fixed_amount_pt'))
+    ->condition('entity_has_field', array('entity:select' => 'commerce_order', 'field' => 'commerce_coupon_order_reference'))
+    ->condition(rules_condition('data_is_empty', array('data:select' => 'coupon:commerce-coupon-fixed-amount'))->negate())
+    ->condition('data_is', array('data:select' => 'coupon:commerce-coupon-fixed-amount:amount', 'op' => '>', 'value' => 0))
+    ->condition('data_is', array('data:select' => 'coupon:is-active', 'op' => '=', 'value' => TRUE))
+    ->condition('data_is', array('data:select' => 'coupon:commerce-coupon-fixed-amount-pt', 'op' => '=', 'value' => 1))
+    ->action('list_add', array(
+      'list:select' => 'commerce-order:commerce-coupon-order-reference',
+      'item:select' => 'coupon',
+      'unique' => 1,
+    ));
+
+  $rules['commerce_coupon_fixed_amount_pretax_calc'] = $rule;
+
+  // Create a "before taxes" fixed amount "apply coupon to line item" rule
+  $rule = rules_reaction_rule();
+  $rule->label = t('Apply fixed (distributed; before taxes) coupons to product line item');
+  $rule->active = TRUE;
+
+  $rule
+    ->event('commerce_product_calculate_sell_price')
+    ->condition(rules_condition('data_is_empty', array(
+      'data:select' => 'commerce-line-item:line-item-id',
+      ))->negate())
+    ->condition('entity_has_field', array(
+      'entity:select' => 'commerce-line-item:order',
+      'field' => 'commerce_coupon_order_reference',
+      ));
+
+  $loop = rules_loop(array(
+    'list:select' => 'commerce-line-item:order:commerce-coupon-order-reference',
+    'item:var' => 'list_coupon',
+    'item:label' => t('Current coupon'),
+    ));
+
+  $loop->action('commerce_coupon_fixed_amount_pt_apply_to_product_li', array(
+    'order:select' => 'commerce-line-item:order',
+    'line_item:select' => 'commerce-line-item',
+    'coupon:select' => 'list-coupon',
+    'component_name:select' => 'list-coupon:price-component-name',
+    'round_mode' => COMMERCE_ROUND_HALF_UP,
+    ));
+
+  $rule->action($loop);
+
+  // Adjust the weight so this rule executes before taxation rules.
+  $rule->weight = -1;
+
+  $rules['commerce_coupon_fixed_amount_pretax_apply_coupon_to_line_item'] = $rule;
+
   return $rules;
 }
