diff --git a/app/code/Magento/CatalogRule/Model/Rule.php b/app/code/Magento/CatalogRule/Model/Rule.php
index 859dbb110dec4a5962ab2e7fa8a5c1914b53166a..ff05ab857f3be04a6769137d3a6d89cf184b26c3 100644
--- a/app/code/Magento/CatalogRule/Model/Rule.php
+++ b/app/code/Magento/CatalogRule/Model/Rule.php
@@ -347,6 +347,58 @@ class Rule extends \Magento\Rule\Model\AbstractModel
         return $map;
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    public function validateData(\Magento\Framework\DataObject $dataObject)
+    {
+        $result = parent::validateData($dataObject);
+        if ($result === true) {
+            $result = [];
+        }
+
+        $action = $dataObject->getData('simple_action');
+        $discount = $dataObject->getData('discount_amount');
+        $result = array_merge($result, $this->validateDiscount($action, $discount));
+        if ($dataObject->getData('sub_is_enable') == 1) {
+            $action = $dataObject->getData('sub_simple_action');
+            $discount = $dataObject->getData('sub_discount_amount');
+            $result = array_merge($result, $this->validateDiscount($action, $discount));
+        }
+
+        return !empty($result) ? $result : true;
+    }
+
+    /**
+     * Validate discount based on action
+     *
+     * @param string $action
+     * @param string|int|float $discount
+     *
+     * @return array Validation errors
+     */
+    protected function validateDiscount($action, $discount)
+    {
+        $result = [];
+        switch ($action) {
+            case 'by_percent':
+            case 'to_percent':
+                if ($discount < 0 || $discount > 100) {
+                    $result[] = __('Percentage discount should be between 0 and 100.');
+                };
+                break;
+            case 'by_fixed':
+            case 'to_fixed':
+                if ($discount < 0) {
+                    $result[] = __('Discount value should be 0 or greater.');
+                };
+                break;
+            default:
+                $result[] = __('Unknown action.');
+        }
+        return $result;
+    }
+
     /**
      * Calculate price using catalog price rule of product
      *
diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php
index dbf6958530ac87af19504c393fc8fae0765b7d08..80f4ef5eed5ece794faef9fdc4b19f22ca4bb9af 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php
@@ -8,6 +8,11 @@ namespace Magento\CatalogRule\Test\Unit\Model;
 
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
 
+/**
+ * Class RuleTest
+ * @package Magento\CatalogRule\Test\Unit\Model
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class RuleTest extends \PHPUnit_Framework_TestCase
 {
     /** @var \Magento\CatalogRule\Model\Rule */
@@ -200,6 +205,110 @@ class RuleTest extends \PHPUnit_Framework_TestCase
         ];
     }
 
+    /**
+     * Test validateData action
+     *
+     * @dataProvider validateDataDataProvider
+     * @param array $data Data for the rule actions
+     * @param bool|array $expected True or an array of errors
+     *
+     * @return void
+     */
+    public function testValidateData($data, $expected)
+    {
+        $result = $this->rule->validateData(new \Magento\Framework\DataObject($data));
+        $this->assertEquals($result, $expected);
+    }
+
+    /**
+     * Data provider for testValidateData test
+     *
+     * @return array
+     */
+    public function validateDataDataProvider()
+    {
+        return [
+            [
+                [
+                    'simple_action' => 'by_fixed',
+                    'discount_amount' => '123',
+                    'sub_is_enable' => '0',
+                    'sub_simple_action' => 'by_percent',
+                    'sub_discount_amount' => '123',
+                ],
+                true
+            ],
+            [
+                [
+                    'simple_action' => 'by_percent',
+                    'discount_amount' => '9,99',
+                    'sub_is_enable' => '0',
+                ],
+                true
+            ],
+            [
+                [
+                    'simple_action' => 'by_fixed',
+                    'discount_amount' => '123',
+                    'sub_is_enable' => '1',
+                    'sub_simple_action' => 'by_percent',
+                    'sub_discount_amount' => '123',
+                ],
+                [
+                    'Percentage discount should be between 0 and 100.',
+                ]
+            ],
+            [
+                [
+                    'simple_action' => 'by_percent',
+                    'discount_amount' => '123.12',
+                    'sub_is_enable' => '1',
+                    'sub_simple_action' => 'to_percent',
+                    'sub_discount_amount' => '123.001',
+                ],
+                [
+                    'Percentage discount should be between 0 and 100.',
+                    'Percentage discount should be between 0 and 100.',
+                ]
+            ],
+            [
+                [
+                    'simple_action' => 'to_percent',
+                    'discount_amount' => '-12',
+                    'sub_is_enable' => '1',
+                    'sub_simple_action' => 'to_fixed',
+                    'sub_discount_amount' => '567.8901',
+                ],
+                [
+                    'Percentage discount should be between 0 and 100.',
+                ]
+            ],
+            [
+                [
+                    'simple_action' => 'to_fixed',
+                    'discount_amount' => '-1234567890',
+                    'sub_is_enable' => '1',
+                    'sub_simple_action' => 'by_fixed',
+                    'sub_discount_amount' => '-5',
+                ],
+                [
+                    'Discount value should be 0 or greater.',
+                    'Discount value should be 0 or greater.',
+                ]
+            ],
+            [
+                [
+                    'simple_action' => 'invalid action',
+                    'discount_amount' => '12',
+                    'sub_is_enable' => '0',
+                ],
+                [
+                    'Unknown action.',
+                ]
+            ],
+        ];
+    }
+
     /**
      * Test after delete action
      *
@@ -228,9 +337,10 @@ class RuleTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * Test IsRuleBehaviorChanged action
+     * Test isRuleBehaviorChanged action
+     *
+     * @dataProvider isRuleBehaviorChangedDataProvider
      *
-     * @dataProvider ruleData
      * @param array $dataArray
      * @param array $originDataArray
      * @param bool $isObjectNew
@@ -258,11 +368,11 @@ class RuleTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * Data provider for isRuleBehaviorChanged test
+     * Data provider for testIsRuleBehaviorChanged test
      *
      * @return array
      */
-    public function ruleData()
+    public function isRuleBehaviorChangedDataProvider()
     {
         return [
             [['new name', 'new description'], ['name', 'description'], false, false],
diff --git a/app/code/Magento/CatalogRule/i18n/de_DE.csv b/app/code/Magento/CatalogRule/i18n/de_DE.csv
index e5ac9c2fcdef8bfac205f90ab801001bc731ec19..2cfceb25ae29b3c8535b66e5a14384de4ee0a623 100644
--- a/app/code/Magento/CatalogRule/i18n/de_DE.csv
+++ b/app/code/Magento/CatalogRule/i18n/de_DE.csv
@@ -68,3 +68,6 @@ Promo,Promo
 "Conditions Combination",Bedingungenkombination
 "Product Attribute",Produktattribut
 "The rules have been applied.","Die Regeln wurden angewendet."
+"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100."
+"Discount value should be 0 or greater.","Discount value should be 0 or greater."
+"Unknown action.","Unknown action."
diff --git a/app/code/Magento/CatalogRule/i18n/en_US.csv b/app/code/Magento/CatalogRule/i18n/en_US.csv
index aab29051ead73af95b6155cd2734ec5621db5de7..2a931e8b33161f90787eaca154c140360a6aeac1 100644
--- a/app/code/Magento/CatalogRule/i18n/en_US.csv
+++ b/app/code/Magento/CatalogRule/i18n/en_US.csv
@@ -68,3 +68,6 @@ Promo,Promo
 "Conditions Combination","Conditions Combination"
 "Product Attribute","Product Attribute"
 "The rules have been applied.","The rules have been applied."
+"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100."
+"Discount value should be 0 or greater.","Discount value should be 0 or greater."
+"Unknown action.","Unknown action."
diff --git a/app/code/Magento/CatalogRule/i18n/es_ES.csv b/app/code/Magento/CatalogRule/i18n/es_ES.csv
index f49ec6eddb9d3f9645b141d375657d399f18ab7e..acd65c67ccdb2b5e26b074cc87412e51835fed7f 100644
--- a/app/code/Magento/CatalogRule/i18n/es_ES.csv
+++ b/app/code/Magento/CatalogRule/i18n/es_ES.csv
@@ -68,3 +68,6 @@ Promo,Promo
 "Conditions Combination","Combinación de condiciones"
 "Product Attribute","Atributos del producto"
 "The rules have been applied.","Las reglas han sido aplicadas."
+"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100."
+"Discount value should be 0 or greater.","Discount value should be 0 or greater."
+"Unknown action.","Unknown action."
diff --git a/app/code/Magento/CatalogRule/i18n/fr_FR.csv b/app/code/Magento/CatalogRule/i18n/fr_FR.csv
index f003629331ba8db57eff2ab85cb70a5a8c1f8b3e..5349ab2025341e751ea891d5601a411d55d94c40 100644
--- a/app/code/Magento/CatalogRule/i18n/fr_FR.csv
+++ b/app/code/Magento/CatalogRule/i18n/fr_FR.csv
@@ -68,3 +68,6 @@ Promo,Promo
 "Conditions Combination","Combinaison de conditions"
 "Product Attribute","Attribut de produit"
 "The rules have been applied.","Les règles ont été appliquées."
+"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100."
+"Discount value should be 0 or greater.","Discount value should be 0 or greater."
+"Unknown action.","Unknown action."
diff --git a/app/code/Magento/CatalogRule/i18n/nl_NL.csv b/app/code/Magento/CatalogRule/i18n/nl_NL.csv
index 5c21f95f6eabba150428a7c51edb4102bb6ad582..6bc287b3c44cea7d6d72af7aaf9882652d415197 100644
--- a/app/code/Magento/CatalogRule/i18n/nl_NL.csv
+++ b/app/code/Magento/CatalogRule/i18n/nl_NL.csv
@@ -68,3 +68,6 @@ Promo,Promo
 "Conditions Combination",Voorwaardencombinaties
 "Product Attribute","Product attribuut"
 "The rules have been applied.","De regels zijn ingesteld."
+"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100."
+"Discount value should be 0 or greater.","Discount value should be 0 or greater."
+"Unknown action.","Unknown action."
diff --git a/app/code/Magento/CatalogRule/i18n/pt_BR.csv b/app/code/Magento/CatalogRule/i18n/pt_BR.csv
index 39db9b3f737aa1b8037bc0967117f1c7ced1ef3f..77c2c40996739516e7fd8849a8e246462bd59b1a 100644
--- a/app/code/Magento/CatalogRule/i18n/pt_BR.csv
+++ b/app/code/Magento/CatalogRule/i18n/pt_BR.csv
@@ -68,3 +68,6 @@ Promo,Promo
 "Conditions Combination","Combinação de condições"
 "Product Attribute","Atributo de Produto"
 "The rules have been applied.","As regras foram aplicadas."
+"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100."
+"Discount value should be 0 or greater.","Discount value should be 0 or greater."
+"Unknown action.","Unknown action."
diff --git a/app/code/Magento/CatalogRule/i18n/zh_CN.csv b/app/code/Magento/CatalogRule/i18n/zh_CN.csv
index 4d291b895c161b9428069c891c095eea0d5933bb..e1fe27f48fbf548174ad16348e1f547747c26cf8 100644
--- a/app/code/Magento/CatalogRule/i18n/zh_CN.csv
+++ b/app/code/Magento/CatalogRule/i18n/zh_CN.csv
@@ -68,3 +68,6 @@ Promo,Promo
 "Conditions Combination",条件组合
 "Product Attribute",产品属性
 "The rules have been applied.",规则已应用。
+"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100."
+"Discount value should be 0 or greater.","Discount value should be 0 or greater."
+"Unknown action.","Unknown action."
diff --git a/app/code/Magento/CatalogRule/view/adminhtml/templates/promo/js.phtml b/app/code/Magento/CatalogRule/view/adminhtml/templates/promo/js.phtml
index 8e87adac441dbf88047073fbf9044fbe4c2ecdd1..a3604faa6d38ccf46a41fa16145bc1a8b5fea6c3 100644
--- a/app/code/Magento/CatalogRule/view/adminhtml/templates/promo/js.phtml
+++ b/app/code/Magento/CatalogRule/view/adminhtml/templates/promo/js.phtml
@@ -13,15 +13,53 @@ function hideShowSubproductOptions()
         $('rule_sub_simple_action').up('div.field').show();
         $('rule_sub_discount_amount').up('div.field').show();
         $('rule_sub_discount_amount').addClassName('required-entry validate-not-negative-number');
+        changeValidationForSubDiscountPercent();
     } else {
+        $('rule_sub_discount_amount').
+            removeClassName('required-entry').
+            removeClassName('validate-not-negative-number').
+            removeClassName('validate-number-range').
+            removeClassName('number-range-0.00-100.00');
         $('rule_sub_simple_action').up('div.field').hide();
         $('rule_sub_discount_amount').up('div.field').hide();
-        $('rule_sub_discount_amount').removeClassName('required-entry').removeClassName('validate-not-negative-number');
     }
 
     return true;
 }
+
+function changeValidationForDiscountPercent()
+{
+    if ($('rule_simple_action').value == 'by_percent' || $('rule_simple_action').value == 'to_percent') {
+        $('rule_discount_amount').addClassName('validate-number-range number-range-0.00-100.00');
+    } else {
+        $('rule_discount_amount').removeClassName('validate-number-range').removeClassName('number-range-0.00-100.00');
+    }
+
+    return true;
+}
+
+function changeValidationForSubDiscountPercent()
+{
+    if ($('rule_sub_is_enable').value == 1) {
+        if ($('rule_sub_simple_action').value == 'by_percent' || $('rule_sub_simple_action').value == 'to_percent') {
+            $('rule_sub_discount_amount').addClassName('validate-number-range number-range-0.00-100.00');
+        } else {
+            $('rule_sub_discount_amount').
+                removeClassName('validate-number-range').
+                removeClassName('number-range-0.00-100.00');
+        }
+    }
+
+    return true;
+}
+
 jQuery(document).ready(hideShowSubproductOptions);
+jQuery(document).ready(changeValidationForDiscountPercent);
+jQuery(document).on('change', '#rule_sub_is_enable', hideShowSubproductOptions);
+jQuery(document).on('change', '#rule_simple_action', changeValidationForDiscountPercent);
+jQuery(document).on('change', '#rule_sub_simple_action', changeValidationForSubDiscountPercent);
 window.hideShowSubproductOptions = hideShowSubproductOptions;
+window.changeValidationForDiscountPercent = changeValidationForDiscountPercent;
+window.changeValidationForSubDiscountPercent = changeValidationForSubDiscountPercent;
 });
 </script>
diff --git a/app/code/Magento/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php
index 988a9e2beca59c3b12da13a0123e2b7b858778a6..20bb67ca0632c708946d9961f22099b1f810128a 100644
--- a/app/code/Magento/Rule/Model/AbstractModel.php
+++ b/app/code/Magento/Rule/Model/AbstractModel.php
@@ -350,19 +350,19 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel
     /**
      * Validate rule data
      *
-     * @param \Magento\Framework\DataObject $object
+     * @param \Magento\Framework\DataObject $dataObject
      * @return bool|string[] - return true if validation passed successfully. Array with errors description otherwise
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
      */
-    public function validateData(\Magento\Framework\DataObject $object)
+    public function validateData(\Magento\Framework\DataObject $dataObject)
     {
         $result = [];
         $fromDate = $toDate = null;
 
-        if ($object->hasFromDate() && $object->hasToDate()) {
-            $fromDate = $object->getFromDate();
-            $toDate = $object->getToDate();
+        if ($dataObject->hasFromDate() && $dataObject->hasToDate()) {
+            $fromDate = $dataObject->getFromDate();
+            $toDate = $dataObject->getToDate();
         }
 
         if ($fromDate && $toDate) {
@@ -374,14 +374,14 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel
             }
         }
 
-        if ($object->hasWebsiteIds()) {
-            $websiteIds = $object->getWebsiteIds();
+        if ($dataObject->hasWebsiteIds()) {
+            $websiteIds = $dataObject->getWebsiteIds();
             if (empty($websiteIds)) {
                 $result[] = __('Please specify a website.');
             }
         }
-        if ($object->hasCustomerGroupIds()) {
-            $customerGroupIds = $object->getCustomerGroupIds();
+        if ($dataObject->hasCustomerGroupIds()) {
+            $customerGroupIds = $dataObject->getCustomerGroupIds();
             if (empty($customerGroupIds)) {
                 $result[] = __('Please specify Customer Groups.');
             }
diff --git a/app/code/Magento/Sales/Block/Adminhtml/Report/Filter/Form.php b/app/code/Magento/Sales/Block/Adminhtml/Report/Filter/Form.php
index b7aefa2d344ef1d56b5a9797092e1542bb43a382..340a9501ef57b7eed9fe68e2024cb98ec9421f78 100644
--- a/app/code/Magento/Sales/Block/Adminhtml/Report/Filter/Form.php
+++ b/app/code/Magento/Sales/Block/Adminhtml/Report/Filter/Form.php
@@ -67,7 +67,7 @@ class Form extends \Magento\Reports\Block\Adminhtml\Filter\Form
                     'name' => 'show_order_statuses',
                     'label' => __('Order Status'),
                     'options' => ['0' => __('Any'), '1' => __('Specified')],
-                    'note' => __('Applies to Any of the Specified Order Statuses')
+                    'note' => __('Applies to Any of the Specified Order Statuses except canceled orders')
                 ],
                 'to'
             );