diff --git a/addons/sale_coupon/models/coupon_program.py b/addons/sale_coupon/models/coupon_program.py
index 35fa15cb72efb93fe759e34ca0d2192cc326abb3..ae348eae340452d025f6f9d025de6004b1fadf18 100644
--- a/addons/sale_coupon/models/coupon_program.py
+++ b/addons/sale_coupon/models/coupon_program.py
@@ -75,7 +75,8 @@ class CouponProgram(models.Model):
             lines = order.order_line.filtered(lambda line:
                 program.reward_type == 'discount' and
                 (line.product_id == program.discount_line_product_id or
-                line.product_id == program.reward_id.discount_line_product_id
+                line.product_id == program.reward_id.discount_line_product_id or
+                (program.program_type == 'promotion_program' and line.is_reward_line)
             ))
             untaxed_amount = order_amount['amount_untaxed'] - sum([line.price_subtotal for line in lines])
             tax_amount = order_amount['amount_tax'] - sum([line.price_tax for line in lines])
diff --git a/addons/sale_coupon/tests/test_program_numbers.py b/addons/sale_coupon/tests/test_program_numbers.py
index f29b45430790ffcef0ac801407ca517411189129..2adf58064e494710100c21c65f53f3707db467af 100644
--- a/addons/sale_coupon/tests/test_program_numbers.py
+++ b/addons/sale_coupon/tests/test_program_numbers.py
@@ -772,3 +772,84 @@ class TestSaleCouponProgramNumbers(TestSaleCouponCommon):
         sol1.write({'product_uom_qty': 2.0})
         order.recompute_coupon_lines()
         self.assertEqual(len(order.order_line.ids), 1, "The promotion lines should have been removed")
+
+    def test_program_step_percentages(self):
+        # test step-like percentages increase over amount
+        testprod = self.env['product.product'].create({
+            'name': 'testprod',
+            'lst_price': 118.0,
+        })
+
+        test10 = self.env['coupon.program'].create({
+            'name': '10% discount',
+            'promo_code_usage': 'no_code_needed',
+            'program_type': 'promotion_program',
+            'discount_type': 'percentage',
+            'discount_percentage': 10.0,
+            'rule_minimum_amount': 1500.0,
+            'rule_minimum_amount_tax_inclusion': 'tax_included',
+        })
+        test15 = self.env['coupon.program'].create({
+            'name': '15% discount',
+            'promo_code_usage': 'no_code_needed',
+            'program_type': 'promotion_program',
+            'discount_type': 'percentage',
+            'discount_percentage': 15.0,
+            'rule_minimum_amount': 1750.0,
+            'rule_minimum_amount_tax_inclusion': 'tax_included',
+        })
+        test20 = self.env['coupon.program'].create({
+            'name': '20% discount',
+            'promo_code_usage': 'no_code_needed',
+            'program_type': 'promotion_program',
+            'discount_type': 'percentage',
+            'discount_percentage': 20.0,
+            'rule_minimum_amount': 2000.0,
+            'rule_minimum_amount_tax_inclusion': 'tax_included',
+        })
+        test25 = self.env['coupon.program'].create({
+            'name': '25% discount',
+            'promo_code_usage': 'no_code_needed',
+            'program_type': 'promotion_program',
+            'discount_type': 'percentage',
+            'discount_percentage': 25.0,
+            'rule_minimum_amount': 2500.0,
+            'rule_minimum_amount_tax_inclusion': 'tax_included',
+        })
+
+        #apply 10%
+        order = self.empty_order
+        order_line = self.env['sale.order.line'].create({
+            'product_id': testprod.id,
+            'name': 'testprod',
+            'product_uom_qty': 14.0,
+            'price_unit': 118.0,
+            'order_id': order.id,
+            'tax_id': False,
+        })
+        order.recompute_coupon_lines()
+        self.assertEqual(order.amount_total, 1486.80, "10% discount should be applied")
+        self.assertEqual(len(order.order_line.ids), 2, "discount should be applied")
+
+        #switch to 15%
+        order_line.write({'product_uom_qty': 15})
+        self.assertEqual(order.amount_total, 1604.8, "Discount improperly applied")
+        self.assertEqual(len(order.order_line.ids), 2, "No discount applied while it should")
+
+        #switch to 20%
+        order_line.write({'product_uom_qty': 17})
+        order.recompute_coupon_lines()
+        self.assertEqual(order.amount_total, 1604.8, "Discount improperly applied")
+        self.assertEqual(len(order.order_line.ids), 2, "No discount applied while it should")
+
+        #still 20%
+        order_line.write({'product_uom_qty': 20})
+        order.recompute_coupon_lines()
+        self.assertEqual(order.amount_total, 1888.0, "Discount improperly applied")
+        self.assertEqual(len(order.order_line.ids), 2, "No discount applied while it should")
+
+        #back to 10%
+        order_line.write({'product_uom_qty': 14})
+        order.recompute_coupon_lines()
+        self.assertEqual(order.amount_total, 1486.80, "Discount improperly applied")
+        self.assertEqual(len(order.order_line.ids), 2, "No discount applied while it should")