diff --git a/modules/line_item/commerce_line_item.rules.inc b/modules/line_item/commerce_line_item.rules.inc
index d18f38a..caebc70 100644
--- a/modules/line_item/commerce_line_item.rules.inc
+++ b/modules/line_item/commerce_line_item.rules.inc
@@ -112,6 +112,69 @@ function commerce_line_item_rules_action_info() {
     'group' => t('Commerce Line Item'),
   );
 
+  $actions['commerce_line_item_apply_percentage_discount'] = array(
+    'label' => t("Apply percentage discount to price"),
+    'parameter' => array(
+      'commerce_line_item' => array(
+        'type' => 'commerce_line_item',
+        'label' => t('Line item'),
+      ),
+      'discount_percentage' => array(
+        'type' => 'decimal',
+        'label' => t('Discount percentage'),
+      ),
+      '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_line_item_price_component_options_list',
+        'default value' => 'discount',
+      ),
+      '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,
+      ),
+    ),
+    'group' => t('Commerce Line Item'),
+  );
+
+  $actions['commerce_line_item_apply_fixed_discount'] = array(
+    'label' => t("Apply fixed amount discount to price"),
+    'parameter' => array(
+      'commerce_line_item' => array(
+        'type' => 'commerce_line_item',
+        'label' => t('Line item'),
+      ),
+      'discount_amount' => array(
+        'type' => 'commerce_price',
+        'label' => t('Discount amount'),
+      ),
+      'include_tax' => array(
+        'type' => 'boolean',
+        'label' => t('Apply the discount including taxes.'),
+        'description' => t('Applying a discount including taxes will split the discount amount within the non-taxed price component as well as the taxes resulting in the exact amount entered, whereas selecting the discount as excluding taxes will result in the line item discounted in the amount set before taxes are calculated on the discounted price.'),
+      ),
+      '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_line_item_price_component_options_list',
+        'default value' => 'discount',
+      ),
+      '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,
+      ),
+    ),
+    'group' => t('Commerce Line Item'),
+  );
+
   return $actions;
 }
 
@@ -328,5 +391,118 @@ function commerce_line_item_unit_price_currency_convert($line_item, $currency_co
 }
 
 /**
+ * Rules action: apply a percentage discount to a given line item.
+ */
+function commerce_line_item_apply_percentage_discount($line_item, $discount_percentage, $component_name, $round_mode) {
+  if (is_numeric($discount_percentage)) {
+    $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
+    $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
+
+    // Calculate the discount multiplier from percentage given by rules
+    $discount_multiplier = 1 - ($discount_percentage / 100);
+    // Get the reference of all tax components to exclude them for the initial
+    // discount calculation.
+    $tax_components_info = commerce_tax_commerce_price_component_type_info();
+    _commerce_line_item_apply_percentage_discount($wrapper, $unit_price, $discount_multiplier, $round_mode, $component_name, $tax_components_info);
+  }
+}
+
+
+/**
+ * Rules action: apply a percentage discount to a given line item.
+ */
+function commerce_line_item_apply_fixed_discount($line_item, $discount_amount, $include_tax, $component_name, $round_mode) {
+  $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
+  $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
+
+  // Get the reference of all tax components to exclude them for the initial
+  // discount calculation.
+  $tax_components_info = commerce_tax_commerce_price_component_type_info();
+
+  // First we need to transform the amount into a percentage, depending whether
+  // we want the tax to be included or not, calculation will vary.
+  if ($include_tax == TRUE) {
+    // If the tax is expected as included, the discount needs to be applied
+    // partially to the price components as a whole and partially in the tax
+    // components individually.
+    $discount_multiplier = 1 - ($discount_amount['amount'] / $unit_price['amount']);
+    _commerce_line_item_apply_percentage_discount($wrapper, $unit_price, $discount_multiplier, $round_mode, $component_name, $tax_components_info);
+  }
+  else {
+    // If the tax is set as excluded, the discount mutiplied will be calculated
+    // to the price excluding taxes, and the taxes will be discounted
+    // additionally to this calculation.
+    $current_amount = 0;
+    foreach($unit_price['data']['components'] as $component) {
+      if (empty($tax_components_info[$component['name']])) {
+        $current_amount += $component['price']['amount'];
+      }
+    }
+    $discount_multiplier = 1 - ($discount_amount['amount'] / $current_amount);
+    _commerce_line_item_apply_percentage_discount($wrapper, $unit_price, $discount_multiplier, $round_mode, $component_name, $tax_components_info);
+  }
+}
+
+/**
+ * Helper function to calculate the common parts of the percentage discount.
+ * @param $line_item_wrapper
+ *   The wrapped line item entity.
+ * @param $unit_price
+ *   Unit price of the line item.
+ * @param $discount_multiplier
+ *   Decimal to use as multiplier of the discount to calculate.
+ * @param $round_mode
+ *   The round mode specifying which direction to round the number.
+ * @param $component_name
+ *   Component name to use for the discount component added to the price.
+ * @param $tax_components_info
+ *   Array of all available tax components.
+ */
+function _commerce_line_item_apply_percentage_discount($line_item_wrapper, $unit_price, $discount_multiplier, $round_mode, $component_name, $tax_components_info) {
+  $current_amount = 0;
+  // Get the tax components included for this line item at this point.
+  $tax_components = commerce_tax_components($unit_price['data']['components']);
+
+  // Loop all the price components but the tax ones in order to discount them.
+  foreach($unit_price['data']['components'] as $component) {
+    if (empty($tax_components_info[$component['name']])) {
+      $current_amount += $component['price']['amount'];
+    }
+  }
+  $updated_amount = commerce_round($round_mode, $current_amount * $discount_multiplier);
+  $difference = array(
+    'amount' => $updated_amount - $current_amount,
+    'currency_code' => $unit_price['currency_code'],
+    'data' => array(),
+  );
+  $line_item_wrapper->commerce_unit_price->amount = $updated_amount;
+  $line_item_wrapper->commerce_unit_price->data = commerce_price_component_add(
+    $line_item_wrapper->commerce_unit_price->value(),
+    $component_name,
+    $difference,
+    TRUE
+  );
+
+  // Loop the tax components and add an additional component with the same
+  // code as the tax but with negative amount to reflect the discount on the
+  // tax.
+  foreach($tax_components as $component) {
+    $updated_amount = commerce_round($round_mode, $component['price']['amount'] * $discount_multiplier);
+    $tax_discounted_price = array(
+      'amount' => $updated_amount - $component['price']['amount'],
+      'currency_code' => $unit_price['currency_code'],
+      'data' => array(),
+    );
+    $line_item_wrapper->commerce_unit_price->amount = $line_item_wrapper->commerce_unit_price->amount->value() + $updated_amount;
+    $line_item_wrapper->commerce_unit_price->data = commerce_price_component_add(
+      $line_item_wrapper->commerce_unit_price->value(),
+      $component['name'],
+      $tax_discounted_price,
+      TRUE
+    );
+  }
+}
+
+/**
  * @}
  */
