diff --git a/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php b/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php
index 04141e448fec992be6bc53f0afa82b41d6dedd2d..7249f26f18540c606d9716bbc55b17ef2312adc8 100644
--- a/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php
+++ b/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Checkout\Controller\Onepage;
 
+use Magento\Framework\Object;
 use Magento\Framework\Exception\PaymentException;
 
 class SaveOrder extends \Magento\Checkout\Controller\Onepage
@@ -26,16 +27,17 @@ class SaveOrder extends \Magento\Checkout\Controller\Onepage
             return $this->_ajaxRedirectResponse();
         }
 
-        $result = [];
+        $result = new Object();
         try {
             $agreementsValidator = $this->_objectManager->get('Magento\Checkout\Model\Agreements\AgreementsValidator');
             if (!$agreementsValidator->isValid(array_keys($this->getRequest()->getPost('agreement', [])))) {
-                $result['success'] = false;
-                $result['error'] = true;
-                $result['error_messages'] = __(
-                    'Please agree to all the terms and conditions before placing the order.'
+                $result->setData('success', false);
+                $result->setData('error', true);
+                $result->setData(
+                    'error_messages',
+                    __('Please agree to all the terms and conditions before placing the order.')
                 );
-                return $this->resultJsonFactory->create()->setData($result);
+                return $this->resultJsonFactory->create()->setData($result->getData());
             }
 
             $data = $this->getRequest()->getPost('payment', []);
@@ -54,25 +56,34 @@ class SaveOrder extends \Magento\Checkout\Controller\Onepage
             $this->getOnepage()->saveOrder();
 
             $redirectUrl = $this->getOnepage()->getCheckout()->getRedirectUrl();
-            $result['success'] = true;
-            $result['error'] = false;
+            $result->setData('success', true);
+            $result->setData('error', false);
         } catch (PaymentException $e) {
             $message = $e->getMessage();
             if (!empty($message)) {
-                $result['error_messages'] = $message;
+                $result->setData('error_messages', $message);
             }
-            $result['goto_section'] = 'payment';
-            $result['update_section'] = ['name' => 'payment-method', 'html' => $this->_getPaymentMethodsHtml()];
+            $result->setData('goto_section', 'payment');
+            $result->setData(
+                'update_section',
+                [
+                    'name' => 'payment-method',
+                    'html' => $this->_getPaymentMethodsHtml()
+                ]
+            );
         } catch (\Magento\Framework\Exception\LocalizedException $e) {
             $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);
             $this->_objectManager->get('Magento\Checkout\Helper\Data')
                 ->sendPaymentFailedEmail($this->getOnepage()->getQuote(), $e->getMessage());
-            $result['success'] = false;
-            $result['error'] = true;
-            $result['error_messages'] = $e->getMessage();
+            $result->setData(
+                'success',
+                false
+            );
+            $result->setData('error', true);
+            $result->setData('error_messages', $e->getMessage());
             $gotoSection = $this->getOnepage()->getCheckout()->getGotoSection();
             if ($gotoSection) {
-                $result['goto_section'] = $gotoSection;
+                $result->setData('goto_section', $gotoSection);
                 $this->getOnepage()->getCheckout()->setGotoSection(null);
             }
 
@@ -80,10 +91,13 @@ class SaveOrder extends \Magento\Checkout\Controller\Onepage
             if ($updateSection) {
                 if (isset($this->_sectionUpdateFunctions[$updateSection])) {
                     $updateSectionFunction = $this->_sectionUpdateFunctions[$updateSection];
-                    $result['update_section'] = [
-                        'name' => $updateSection,
-                        'html' => $this->{$updateSectionFunction}(),
-                    ];
+                    $result->setData(
+                        'update_section',
+                        [
+                            'name' => $updateSection,
+                            'html' => $this->{$updateSectionFunction}(),
+                        ]
+                    );
                 }
                 $this->getOnepage()->getCheckout()->setUpdateSection(null);
             }
@@ -91,18 +105,29 @@ class SaveOrder extends \Magento\Checkout\Controller\Onepage
             $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);
             $this->_objectManager->get('Magento\Checkout\Helper\Data')
                 ->sendPaymentFailedEmail($this->getOnepage()->getQuote(), $e->getMessage());
-            $result['success'] = false;
-            $result['error'] = true;
-            $result['error_messages'] = __('Something went wrong processing your order. Please try again later.');
+            $result->setData('success', false);
+            $result->setData('error', true);
+            $result->setData(
+                'error_messages',
+                __('Something went wrong processing your order. Please try again later.')
+            );
         }
         /**
          * when there is redirect to third party, we don't want to save order yet.
          * we will save the order in return action.
          */
         if (isset($redirectUrl)) {
-            $result['redirect'] = $redirectUrl;
+            $result->setData('redirect', $redirectUrl);
         }
 
-        return $this->resultJsonFactory->create()->setData($result);
+        $this->_eventManager->dispatch(
+            'checkout_controller_onepage_saveOrder',
+            [
+                'result' => $result,
+                'action' => $this
+            ]
+        );
+
+        return $this->resultJsonFactory->create()->setData($result->getData());
     }
 }
diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Onepage/SaveOrderTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/Onepage/SaveOrderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cef6ff863cc8d50289d6d12c92e9bfc4421f07e6
--- /dev/null
+++ b/app/code/Magento/Checkout/Test/Unit/Controller/Onepage/SaveOrderTest.php
@@ -0,0 +1,322 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Checkout\Test\Unit\Controller\Onepage;
+
+use Magento\Checkout\Controller\Onepage\SaveOrder;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+
+/**
+ * Class SaveOrderTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class SaveOrderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var SaveOrder
+     */
+    protected $controller;
+
+    /**
+     * @var \Magento\Framework\Data\Form\FormKey\Validator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $formKeyValidatorMock;
+
+    /**
+     * @var \Magento\Framework\App\Action\Context|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $contextMock;
+
+    /**
+     * @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $requestMock;
+
+    /**
+     * @var \Magento\Framework\App\ResponseInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $responseMock;
+
+    /**
+     * @var \Magento\Framework\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $objectManagerMock;
+
+    /**
+     * @var \Magento\Framework\Controller\Result\RedirectFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $resultRedirectFactoryMock;
+
+    /**
+     * @var \Magento\Framework\Controller\Result\RawFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $resultRawFactoryMock;
+
+    /**
+     * @var \Magento\Framework\Controller\Result\JsonFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $resultJsonFactoryMock;
+
+    /**
+     * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $eventManagerMock;
+
+    /**
+     * @var \Magento\Checkout\Model\Type\Onepage|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $onepageMock;
+
+    /**
+     * @var \Magento\Checkout\Model\Agreements\AgreementsValidator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $agreementsValidatorMock;
+
+    /**
+     * @var \Magento\Quote\Model\Quote|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteMock;
+
+    /**
+     * Set up
+     *
+     * @return void
+     */
+    protected function setUp()
+    {
+        $helper = new ObjectManager($this);
+
+        $contextMock = $this->getMockBuilder('Magento\Framework\App\Action\Context')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->requestMock = $this->getMockBuilder('Magento\Framework\App\RequestInterface')
+            ->disableOriginalConstructor()
+            ->setMethods(['getPost'])
+            ->getMockForAbstractClass();
+        $this->responseMock = $this->getMockBuilder('Magento\Framework\App\ResponseInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $this->objectManagerMock = $this->getMockBuilder('Magento\Framework\ObjectManagerInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $this->formKeyValidatorMock = $this->getMockBuilder('Magento\Framework\Data\Form\FormKey\Validator')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->resultRedirectFactoryMock = $this->getMockBuilder('Magento\Framework\Controller\Result\RedirectFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->resultRawFactoryMock = $this->getMockBuilder('Magento\Framework\Controller\Result\RawFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->resultJsonFactoryMock = $this->getMockBuilder('Magento\Framework\Controller\Result\JsonFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->eventManagerMock = $this->getMockBuilder('Magento\Framework\Event\ManagerInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $this->onepageMock = $this->getMockBuilder('Magento\Checkout\Model\Type\Onepage')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->agreementsValidatorMock = $this->getMockBuilder('Magento\Checkout\Model\Agreements\AgreementsValidator')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->quoteMock = $this->getMockBuilder('Magento\Quote\Model\Quote')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $contextMock->expects($this->once())
+            ->method('getRequest')
+            ->willReturn($this->requestMock);
+        $contextMock->expects($this->once())
+            ->method('getResponse')
+            ->willReturn($this->responseMock);
+        $contextMock->expects($this->once())
+            ->method('getObjectManager')
+            ->willReturn($this->objectManagerMock);
+        $contextMock->expects($this->once())
+            ->method('getResultRedirectFactory')
+            ->willReturn($this->resultRedirectFactoryMock);
+        $contextMock->expects($this->once())
+            ->method('getEventManager')
+            ->willReturn($this->eventManagerMock);
+
+        $this->controller = $helper->getObject(
+            'Magento\Checkout\Controller\Onepage\SaveOrder',
+            [
+                'context' => $contextMock,
+                'formKeyValidator' => $this->formKeyValidatorMock,
+                'resultRawFactory' => $this->resultRawFactoryMock,
+                'resultJsonFactory' => $this->resultJsonFactoryMock,
+            ]
+        );
+    }
+
+    /**
+     * Test method execution _expireAjax (call hasItems === false)
+     *
+     * @return void
+     */
+    protected function expireAjaxFlowHasItemsFalse()
+    {
+        $this->onepageMock->expects($this->atLeastOnce())
+            ->method('getQuote')
+            ->willReturn($this->quoteMock);
+
+        $this->quoteMock->expects($this->once())
+            ->method('hasItems')
+            ->willReturn(false);
+        $this->quoteMock->expects($this->never())
+            ->method('getHasError')
+            ->willReturn(true);
+        $this->quoteMock->expects($this->never())
+            ->method('validateMinimumAmount')
+            ->willReturn(false);
+
+        $this->requestMock->expects($this->never())
+            ->method('getActionName');
+    }
+
+    /**
+     * Test for execute method
+     *
+     * @return void
+     */
+    public function testExecuteWithSuccessOrderSave()
+    {
+        $testData = $this->getExecuteWithSuccessOrderSaveTestData();
+
+
+        $redirectMock = $this->getMockBuilder('Magento\Framework\Controller\Result\Redirect')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $paymentMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Payment')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $checkoutMock = $this->getMockBuilder('Magento\Checkout\Model\Session')
+            ->disableOriginalConstructor()
+            ->setMethods(['getRedirectUrl'])
+            ->getMock();
+        $resultJsonMock = $this->getMockBuilder('Magento\Framework\Controller\Result\Json')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $redirectMock->expects($this->never())
+            ->method('setPath')
+            ->with('*/*/')
+            ->willReturn('redirect');
+
+        $this->formKeyValidatorMock->expects($this->once())
+            ->method('validate')
+            ->with($this->requestMock)
+            ->willReturn(true);
+
+        $this->resultRedirectFactoryMock->expects($this->never())
+            ->method('create')
+            ->willReturn($redirectMock);
+
+        $this->objectManagerMock->expects($this->atLeastOnce())
+            ->method('get')
+            ->willReturnMap($testData['objectManager.get']);
+
+        // call _expireAjax method
+        $this->expireAjaxFlowHasItemsFalse();
+
+        $this->requestMock->expects($this->atLeastOnce())
+            ->method('getPost')
+            ->willReturnMap($testData['request.getPost']);
+
+        $this->agreementsValidatorMock->expects($this->once())
+            ->method('isValid')
+            ->with($testData['agreementsValidator.isValid'])
+            ->willReturn(true);
+
+        $this->quoteMock->expects($this->atLeastOnce())
+            ->method('getPayment')
+            ->willReturn($paymentMock);
+
+        $paymentMock->expects($this->once())
+            ->method('setQuote')
+            ->with($this->quoteMock);
+        $paymentMock->expects($this->once())
+            ->method('importData')
+            ->with($testData['payment.importData']);
+
+        $this->onepageMock->expects($this->once())
+            ->method('saveOrder');
+        $this->onepageMock->expects($this->once())
+            ->method('getCheckout')
+            ->willReturn($checkoutMock);
+
+        $checkoutMock->expects($this->once())
+            ->method('getRedirectUrl')
+            ->willReturn(null);
+
+        $this->eventManagerMock->expects($this->once())
+            ->method('dispatch')
+            ->withConsecutive(
+                $this->equalTo('checkout_controller_onepage_saveOrder'),
+                $this->countOf(2)
+            );
+
+        $this->resultJsonFactoryMock->expects($this->once())
+            ->method('create')
+            ->willReturn($resultJsonMock);
+
+        $resultJsonMock->expects($this->once())
+            ->method('setData')
+            ->with($testData['resultJson.setData'])
+            ->willReturnSelf();
+
+        $this->assertEquals($resultJsonMock, $this->controller->execute());
+    }
+
+    /**
+     * Get data for test testExecuteWithSuccessOrderSave
+     *
+     * @return array
+     */
+    protected function getExecuteWithSuccessOrderSaveTestData()
+    {
+        $data = [
+            'payment-key-1' => 'payment-value-1',
+            'checks' => [
+                \Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_CHECKOUT,
+                \Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_COUNTRY,
+                \Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_CURRENCY,
+                \Magento\Payment\Model\Method\AbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
+                \Magento\Payment\Model\Method\AbstractMethod::CHECK_ZERO_TOTAL,
+            ]
+        ];
+        $testKey = 'test-key-1';
+
+        return [
+            'resultJson.setData' => [
+                'success' => 1,
+                'error' => false
+            ],
+            'request.getPost' => [
+                [
+                    'agreement',
+                    [],
+                    [
+                        $testKey => 'test-value-1'
+                    ]
+                ],
+                [
+                    'payment',
+                    [],
+                    $data
+                ],
+            ],
+            'payment.importData' => $data,
+            'agreementsValidator.isValid' => [$testKey],
+            'objectManager.get' => [
+                ['Magento\Checkout\Model\Type\Onepage', $this->onepageMock],
+                ['Magento\Checkout\Model\Agreements\AgreementsValidator', $this->agreementsValidatorMock],
+            ]
+        ];
+    }
+}
diff --git a/dev/tests/functional/lib/Magento/Mtf/Client/Element/ConditionsElement.php b/dev/tests/functional/lib/Magento/Mtf/Client/Element/ConditionsElement.php
index 8b04e6bd56c8408b7af23580dd19600adae5d53e..d805ea841654d68eed204e683be0d18bf194b5d1 100644
--- a/dev/tests/functional/lib/Magento/Mtf/Client/Element/ConditionsElement.php
+++ b/dev/tests/functional/lib/Magento/Mtf/Client/Element/ConditionsElement.php
@@ -11,8 +11,7 @@ use Magento\Mtf\Client\Locator;
 use Magento\Mtf\Client\ElementInterface;
 
 /**
- * Class ConditionsElement
- * Typified element class for conditions
+ * Typified element class for conditions.
  *
  * Format value.
  * Add slash to symbols: "{", "}", "[", "]", ":".
@@ -39,77 +38,110 @@ use Magento\Mtf\Client\ElementInterface;
 class ConditionsElement extends SimpleElement
 {
     /**
-     * Main condition
+     * Count for trying fill condition element.
+     */
+    const TRY_COUNT = 3;
+
+    /**
+     * Main condition.
      *
      * @var string
      */
     protected $mainCondition = './/ul[contains(@id,"__1__children")]/..';
 
     /**
-     * Identification for chooser grid
+     * Identification for chooser grid.
      *
      * @var string
      */
     protected $chooserLocator = '.rule-chooser-trigger';
 
     /**
-     * Button add condition
+     * Button add condition.
      *
      * @var string
      */
     protected $addNew = './/*[contains(@class,"rule-param-new-child")]/a';
 
     /**
-     * Button remove condition
+     * Button remove condition.
      *
      * @var string
      */
     protected $remove = './/*/a[@class="rule-param-remove"]';
 
     /**
-     * New condition
+     * New condition.
      *
      * @var string
      */
     protected $newCondition = './ul/li/span[contains(@class,"rule-param-new-child")]/..';
 
     /**
-     * Type of new condition
+     * Type of new condition.
      *
      * @var string
      */
     protected $typeNew = './/*[@class="element"]/select';
 
     /**
-     * Created condition
+     * Created condition.
      *
      * @var string
      */
     protected $created = './ul/li[span[contains(@class,"rule-param-new-child")]]/preceding-sibling::li[1]';
 
     /**
-     * Children condition
+     * Children condition.
      *
      * @var string
      */
     protected $children = './/ul[contains(@id,"conditions__")]';
 
     /**
-     * Parameter of condition
+     * Parameter of condition.
      *
      * @var string
      */
     protected $param = './span[span[*[substring(@id,(string-length(@id)-%d+1))="%s"]]]';
 
     /**
-     * Key of last find param
+     * Rule param wait locator.
+     *
+     * @var string
+     */
+    protected $ruleParamWait = './/*[@class="rule-param-wait"]';
+
+    /**
+     * Rule param input selector.
+     *
+     * @var string
+     */
+    protected $ruleParamInput = '[name^="rule"]';
+
+    /**
+     * Apply rule param link.
+     *
+     * @var string
+     */
+    protected $applyRuleParam = './/*[@class="rule-param-apply"]';
+
+    /**
+     * Chooser grid locator.
+     *
+     * @var string
+     */
+    protected $chooserGridLocator = 'div[id*=chooser]';
+
+    /**
+     * Key of last find param.
      *
      * @var int
      */
     protected $findKeyParam = 0;
 
     /**
-     * Map of parameters
+     * Map of parameters.
      *
      * @var array
      */
@@ -122,7 +154,7 @@ class ConditionsElement extends SimpleElement
     ];
 
     /**
-     * Map encode special chars
+     * Map encode special chars.
      *
      * @var array
      */
@@ -135,7 +167,7 @@ class ConditionsElement extends SimpleElement
     ];
 
     /**
-     * Map decode special chars
+     * Map decode special chars.
      *
      * @var array
      */
@@ -148,34 +180,22 @@ class ConditionsElement extends SimpleElement
     ];
 
     /**
-     * Rule param wait locator
-     *
-     * @var string
-     */
-    protected $ruleParamWait = './/*[@class="rule-param-wait"]';
-
-    /**
-     * Chooser grid locator
-     *
-     * @var string
-     */
-    protected $chooserGridLocator = 'div[id*=chooser]';
-
-    /**
-     * Rule param input selector.
+     * Latest occurred exception.
      *
-     * @var string
+     * @var \Exception
      */
-    protected $ruleParamInput = '.element [name^="rule"]';
+    protected $exception;
 
     /**
-     * Set value to conditions
+     * Set value to conditions.
      *
      * @param string $value
      * @return void
      */
     public function setValue($value)
     {
+        $this->eventManager->dispatchEvent(['set_value'], [__METHOD__, $this->getAbsoluteSelector()]);
+
         $conditions = $this->decodeValue($value);
         $context = $this->find($this->mainCondition, Locator::SELECTOR_XPATH);
         $this->clear();
@@ -183,7 +203,7 @@ class ConditionsElement extends SimpleElement
     }
 
     /**
-     * Add condition combination
+     * Add conditions combination.
      *
      * @param string $condition
      * @param ElementInterface $context
@@ -192,15 +212,7 @@ class ConditionsElement extends SimpleElement
     protected function addConditionsCombination($condition, ElementInterface $context)
     {
         $condition = $this->parseCondition($condition);
-
-        $this->driver->selectWindow();
-        $newCondition = $context->find($this->newCondition, Locator::SELECTOR_XPATH);
-        $newCondition->find($this->addNew, Locator::SELECTOR_XPATH)->click();
-
-        $this->driver->selectWindow();
-        $typeNewCondition = $newCondition->find($this->typeNew, Locator::SELECTOR_XPATH, 'select');
-        $typeNewCondition->setValue($condition['type']);
-
+        $this->addCondition($condition['type'], $context);
         $createdCondition = $context->find($this->created, Locator::SELECTOR_XPATH);
         $this->waitForCondition($createdCondition);
         if (!empty($condition['rules'])) {
@@ -210,7 +222,7 @@ class ConditionsElement extends SimpleElement
     }
 
     /**
-     * Add conditions
+     * Add conditions.
      *
      * @param array $conditions
      * @param ElementInterface $context
@@ -229,7 +241,7 @@ class ConditionsElement extends SimpleElement
     }
 
     /**
-     * Add single Condition
+     * Add single Condition.
      *
      * @param string $condition
      * @param ElementInterface $context
@@ -238,36 +250,55 @@ class ConditionsElement extends SimpleElement
     protected function addSingleCondition($condition, ElementInterface $context)
     {
         $condition = $this->parseCondition($condition);
+        $this->addCondition($condition['type'], $context);
+        $createdCondition = $context->find($this->created, Locator::SELECTOR_XPATH);
+        $this->waitForCondition($createdCondition);
+        $this->fillCondition($condition['rules'], $createdCondition);
+    }
 
-        $this->driver->selectWindow();
+    /**
+     * Click to add condition button and set type.
+     *
+     * @param string $type
+     * @param ElementInterface $context
+     * @return void
+     * @throws \Exception
+     */
+    protected function addCondition($type, ElementInterface $context)
+    {
         $newCondition = $context->find($this->newCondition, Locator::SELECTOR_XPATH);
-        $newCondition->find($this->addNew, Locator::SELECTOR_XPATH)->click();
-
-        $typeNew = $this->typeNew;
-        $newCondition->waitUntil(
-            function () use ($newCondition, $typeNew) {
-                $element = $newCondition->find($typeNew, Locator::SELECTOR_XPATH, 'select');
-                if ($element->isVisible()) {
-                    return true;
-                }
-                $this->driver->selectWindow();
-                return null;
+        $count = 0;
+
+        do {
+            $newCondition->find($this->addNew, Locator::SELECTOR_XPATH)->click();
+
+            try {
+                $newCondition->find($this->typeNew, Locator::SELECTOR_XPATH, 'select')->setValue($type);
+                $isSetType = true;
+            } catch (\PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e) {
+                $isSetType = false;
+                $this->exception = $e;
+                $this->eventManager->dispatchEvent(['exception'], [__METHOD__, $this->getAbsoluteSelector()]);
             }
-        );
-        $newCondition->find($this->typeNew, Locator::SELECTOR_XPATH, 'select')->setValue($condition['type']);
+            $count++;
+        } while (!$isSetType && $count < self::TRY_COUNT);
 
-        $createdCondition = $context->find($this->created, Locator::SELECTOR_XPATH);
-        $this->waitForCondition($createdCondition);
-        $this->fillCondition($condition['rules'], $createdCondition);
+        if (!$isSetType) {
+            $exception = $this->exception ? $this->exception : (new \Exception("Can not add condition: {$type}"));
+            throw $exception;
+        }
     }
 
     /**
-     * Fill single condition
+     * Fill single condition.
      *
      * @param array $rules
      * @param ElementInterface $element
      * @return void
      * @throws \Exception
+     *
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
      */
     protected function fillCondition(array $rules, ElementInterface $element)
     {
@@ -275,52 +306,117 @@ class ConditionsElement extends SimpleElement
         foreach ($rules as $rule) {
             /** @var ElementInterface $param */
             $param = $this->findNextParam($element);
+            $isSet = false;
+            $count = 0;
+
+            do {
+                try {
+                    $openParamLink = $param->find('a');
+                    if ($openParamLink->isVisible()) {
+                        $openParamLink->click();
+                    }
+                    $this->waitUntil(function () use ($param) {
+                        return $param->find($this->ruleParamInput)->isVisible() ? true : null;
+                    });
+
+                    if ($this->fillGrid($rule, $param)) {
+                        $isSet = true;
+                    } elseif ($this->fillSelect($rule, $param)) {
+                        $isSet = true;
+                    } elseif ($this->fillText($rule, $param)) {
+                        $isSet = true;
+                    }
+                } catch (\PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e) {
+                    $isSet = false;
+                    $this->exception = $e;
+                    $this->eventManager->dispatchEvent(['exception'], [__METHOD__, $this->getAbsoluteSelector()]);
+                }
+                $count++;
+            } while (!$isSet && $count < self::TRY_COUNT);
 
-            $this->driver->selectWindow();
-            $param->find('a')->click();
-
-            if (preg_match('`%(.*?)%`', $rule, $chooserGrid)) {
-                $chooserConfig = explode('#', $chooserGrid[1]);
-                $param->find($this->chooserLocator)->click();
-                $rule = preg_replace('`%(.*?)%`', '', $rule);
-                $grid = ObjectManager::getInstance()->create(
-                    str_replace('/', '\\', $chooserConfig[0]),
-                    [
-                        'element' => $this->find($this->chooserGridLocator)
-                    ]
-                );
-                $grid->searchAndSelect([$chooserConfig[1] => $rule]);
-                continue;
+            if (!$isSet) {
+                $exception = $this->exception ? $this->exception : (new \Exception('Can not set value: ' . $rule));
+                throw $exception;
             }
-            $input = $this->ruleParamInput;
-            $param->waitUntil(
-                function () use ($param, $input) {
-                    $element = $param->find($input);
-                    return $element->isVisible() ? true : null;
-                }
+        }
+    }
+
+    /**
+     * Fill grid element.
+     *
+     * @param string $rule
+     * @param ElementInterface $param
+     * @return bool
+     */
+    protected function fillGrid($rule, ElementInterface $param)
+    {
+        if (preg_match('`%(.*?)%`', $rule, $chooserGrid)) {
+            $chooserConfig = explode('#', $chooserGrid[1]);
+            $rule = preg_replace('`%(.*?)%`', '', $rule);
+
+            $param->find($this->chooserLocator)->click();
+            $grid = ObjectManager::getInstance()->create(
+                str_replace('/', '\\', $chooserConfig[0]),
+                [
+                    'element' => $this->find($this->chooserGridLocator)
+                ]
             );
-            $value = $param->find('select', Locator::SELECTOR_TAG_NAME, 'select');
-            if ($value->isVisible()) {
-                $value->setValue($rule);
-                $this->click();
-                continue;
+            $grid->searchAndSelect([$chooserConfig[1] => $rule]);
+
+            $apply = $param->find($this->applyRuleParam, Locator::SELECTOR_XPATH);
+            if ($apply->isVisible()) {
+                $apply->click();
             }
-            $value = $param->find('input', Locator::SELECTOR_TAG_NAME);
-            if ($value->isVisible()) {
-                $value->setValue($rule);
 
-                $apply = $param->find('.//*[@class="rule-param-apply"]', Locator::SELECTOR_XPATH);
-                if ($apply->isVisible()) {
-                    $apply->click();
-                }
-                continue;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Fill select element.
+     *
+     * @param string $rule
+     * @param ElementInterface $param
+     * @return bool
+     */
+    protected function fillSelect($rule, ElementInterface $param)
+    {
+        $value = $param->find('select', Locator::SELECTOR_TAG_NAME, 'select');
+        if ($value->isVisible()) {
+            $value->setValue($rule);
+            $this->click();
+
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Fill text element.
+     *
+     * @param string $rule
+     * @param ElementInterface $param
+     * @return bool
+     */
+    protected function fillText($rule, ElementInterface $param)
+    {
+        $value = $param->find('input', Locator::SELECTOR_TAG_NAME);
+        if ($value->isVisible()) {
+            $value->setValue($rule);
+
+            $apply = $param->find('.//*[@class="rule-param-apply"]', Locator::SELECTOR_XPATH);
+            if ($apply->isVisible()) {
+                $apply->click();
             }
-            throw new \Exception('Undefined type of value ');
+
+            return true;
         }
+        return false;
     }
 
     /**
-     * Decode value
+     * Decode value.
      *
      * @param string $value
      * @return array
@@ -344,7 +440,7 @@ class ConditionsElement extends SimpleElement
     }
 
     /**
-     * Parse condition
+     * Parse condition.
      *
      * @param string $condition
      * @return array
@@ -366,7 +462,7 @@ class ConditionsElement extends SimpleElement
     }
 
     /**
-     * Find next param of condition for fill
+     * Find next param of condition for fill.
      *
      * @param ElementInterface $context
      * @return ElementInterface
@@ -387,7 +483,7 @@ class ConditionsElement extends SimpleElement
     }
 
     /**
-     * Reset key of last find param
+     * Reset key of last find param.
      *
      * @return void
      */
@@ -397,25 +493,21 @@ class ConditionsElement extends SimpleElement
     }
 
     /**
-     * Param wait loader
+     * Param wait loader.
      *
-     * @return void
+     * @param ElementInterface $element
      */
     protected function waitForCondition(ElementInterface $element)
     {
         $this->waitUntil(
             function () use ($element) {
-                if ($element->getAttribute('class') == 'rule-param-wait') {
-                    $this->driver->selectWindow();
-                    return null;
-                }
-                return true;
+                return $element->getAttribute('class') == 'rule-param-wait' ? null : true;
             }
         );
     }
 
     /**
-     * Clear conditions
+     * Clear conditions.
      *
      * @return void
      */
@@ -429,7 +521,7 @@ class ConditionsElement extends SimpleElement
     }
 
     /**
-     * Get value from conditions
+     * Get value from conditions.
      *
      * @return null
      */
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/ListProduct.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/ListProduct.php
index 535cc6ef859eaa1d2a01df74a95d2625b8025b21..c4a1925081da60591b258109dcc11ed13326b030 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/ListProduct.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/ListProduct.php
@@ -23,6 +23,13 @@ class ListProduct extends Block
      */
     protected $productItem = './/*[contains(@class,"product-item-link") and normalize-space(text())="%s"]/ancestor::li';
 
+    /**
+     * Locator for product item link.
+     *
+     * @var string
+     */
+    protected $productItemLink = '.product-item-link';
+
     /**
      * Sorter dropdown selector.
      *
@@ -46,6 +53,23 @@ class ListProduct extends Block
         );
     }
 
+    /**
+     * Get product names list.
+     *
+     * @return array
+     */
+    public function getProductNames()
+    {
+        $itemLinks = $this->_rootElement->getElements($this->productItemLink);
+        $productNames = [];
+
+        foreach ($itemLinks as $itemLink) {
+            $productNames[] = trim($itemLink->getText());
+        }
+
+        return $productNames;
+    }
+
     /**
      * Get all terms used in sort.
      *
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/Category/Curl.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/Category/Curl.php
index e684946a46f47f152fdd1d4373f31a31b1142dd4..bd7a938684dd27bf7d38724ecc1f6cd046788381 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/Category/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/Category/Curl.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Catalog\Test\Handler\Category;
 
+use Magento\Catalog\Test\Fixture\Category;
 use Magento\Mtf\Fixture\FixtureInterface;
 use Magento\Mtf\Handler\Curl as AbstractCurl;
 use Magento\Mtf\Util\Protocol\CurlInterface;
@@ -58,20 +59,24 @@ class Curl extends AbstractCurl implements CategoryInterface
      *
      * @param FixtureInterface|null $fixture [optional]
      * @return array
+     * @throws \Exception
      */
     public function persist(FixtureInterface $fixture = null)
     {
         $data = $this->prepareData($fixture);
-
         $url = $_ENV['app_backend_url'] . 'catalog/category/save/store/0/parent/' . $data['general']['parent_id'] . '/';
         $curl = new BackendDecorator(new CurlTransport(), $this->_configuration);
         $curl->write(CurlInterface::POST, $url, '1.0', [], $data);
         $response = $curl->read();
         $curl->close();
 
+        if (!strpos($response, 'data-ui-id="messages-message-success"')) {
+            $this->_eventManager->dispatchEvent(['curl_failed'], [$response]);
+            throw new \Exception('Category creation by curl handler was not successful!');
+        }
+
         preg_match('#http://.+/id/(\d+).+store/#m', $response, $matches);
         $id = isset($matches[1]) ? (int)$matches[1] : null;
-
         return ['id' => $id];
     }
 
@@ -83,12 +88,16 @@ class Curl extends AbstractCurl implements CategoryInterface
      */
     protected function prepareData(FixtureInterface $fixture)
     {
-        $data['general'] = $this->replaceMappingData($fixture->getData());
-        $data['is_anchor'] = isset($data['is_anchor']) ? $data['is_anchor'] : 0;
+        $data = ['general' => $this->replaceMappingData($fixture->getData())];
+        $data['general']['is_anchor'] = isset($data['general']['is_anchor']) ? $data['general']['is_anchor'] : 0;
+
         if ($fixture->hasData('landing_page')) {
             $data['general']['landing_page'] = $this->getBlockId($fixture->getLandingPage());
         }
 
+        $data['category_products'] = $this->prepareCategoryProducts($fixture);
+        unset($data['general']['category_products']);
+
         $diff = array_diff($this->dataUseConfig, array_keys($data['general']));
         if (!empty($diff)) {
             $data['use_config'] = $diff;
@@ -97,6 +106,28 @@ class Curl extends AbstractCurl implements CategoryInterface
         return $data;
     }
 
+    /**
+     * Prepare category products data for curl.
+     *
+     * @param FixtureInterface $category
+     * @return array
+     */
+    protected function prepareCategoryProducts(FixtureInterface $category)
+    {
+        $categoryProducts = [];
+        $defaultPosition = 0;
+
+        /** @var Category $category */
+        if ($category->hasData('category_products')) {
+            $products = $category->getDataFieldConfig('category_products')['source']->getProducts();
+            foreach ($products as $product) {
+                $categoryProducts[$product->getId()] = $defaultPosition;
+            }
+        }
+
+        return json_encode($categoryProducts);
+    }
+
     /**
      * Getting block id by name.
      *
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Page/Category/CatalogCategoryView.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Page/Category/CatalogCategoryView.xml
index 392a1ff131e7fbee4246d32285458c1c4d086030..45839712e35c673123d36d46d33b1aaa8b869979 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Page/Category/CatalogCategoryView.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Page/Category/CatalogCategoryView.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd">
     <page name="CatalogCategoryView" area="Category" mca="catalog/category/view" module="Magento_Catalog">
         <block name="titleBlock" class="Magento\Theme\Test\Block\Html\Title" locator=".page-title-wrapper h1.page-title .base" strategy="css selector"/>
-        <block name="layeredNavigationBlock" class="Magento\LayeredNavigation\Test\Block\Navigation" locator=".block.filter" strategy="css selector"/>
         <block name="widgetView" class="Magento\Widget\Test\Block\WidgetView" locator=".widget" strategy="css selector"/>
         <block name="viewBlock" class="Magento\Catalog\Test\Block\Category\View" locator="#maincontent" strategy="css selector"/>
         <block name="listProductBlock" class="Magento\Catalog\Test\Block\Product\ListProduct" locator=".products.wrapper.grid" strategy="css selector"/>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductSimple.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductSimple.xml
index 4998c9d9604744c84511a07a10c321a6cc29bd02..c4ae2d72fde4dc62c6c352172b7510b3a237138e 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductSimple.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductSimple.xml
@@ -65,6 +65,31 @@
             </field>
         </dataset>
 
+        <dataset name="product_20_dollar">
+            <field name="attribute_set_id" xsi:type="array">
+                <item name="dataSet" xsi:type="string">default</item>
+            </field>
+            <field name="name" xsi:type="string">product_20_dollar %isolation%</field>
+            <field name="sku" xsi:type="string">sku_product_20_dollar_%isolation%</field>
+            <field name="is_virtual" xsi:type="string">No</field>
+            <field name="weight" xsi:type="string">1</field>
+            <field name="quantity_and_stock_status" xsi:type="array">
+                <item name="qty" xsi:type="string">1000</item>
+                <item name="is_in_stock" xsi:type="string">In Stock</item>
+            </field>
+            <field name="price" xsi:type="array">
+                <item name="value" xsi:type="string">20</item>
+            </field>
+            <field name="tax_class_id" xsi:type="array">
+                <item name="dataSet" xsi:type="string">taxable_goods</item>
+            </field>
+            <field name="website_ids" xsi:type="array">
+                <item name="0" xsi:type="string">Main Website</item>
+            </field>
+            <field name="visibility" xsi:type="string">Catalog, Search</field>
+            <field name="url_key" xsi:type="string">product-20-dollar-%isolation%</field>
+        </dataset>
+
         <dataset name="product_with_url_key">
             <field name="name" xsi:type="string">Simple Product %isolation%</field>
             <field name="sku" xsi:type="string">sku_simple_product_%isolation%</field>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml
index b4b2da10a3d7350c0a210b8c9d4bdf3b67c8ec64..83d80113af0ae3d885bd6e2f706b904a39164dfd 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml
@@ -69,7 +69,6 @@
             <data name="category/data/available_product_listing_config" xsi:type="string">Yes</data>
             <data name="category/data/default_product_listing_config" xsi:type="string">Yes</data>
             <data name="category/data/use_config_price_range" xsi:type="string">Yes</data>
-            <data name="category/data/category_products_data/preset" xsi:type="string">default</data>
             <data name="category/data/category_products/dataSet" xsi:type="string">catalogProductSimple::default,catalogProductSimple::default</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertCategorySaveMessage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertCategoryForm" />
@@ -97,7 +96,6 @@
             <data name="category/data/default_sort_by" xsi:type="string">Price</data>
             <data name="category/data/use_config_price_range" xsi:type="string">No</data>
             <data name="category/data/layered_navigation_price_step" xsi:type="string">50</data>
-            <data name="category/data/category_products_data/preset" xsi:type="string">default</data>
             <data name="category/data/category_products/dataSet" xsi:type="string">catalogProductSimple::default,catalogProductSimple::default</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertCategorySaveMessage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertCategoryForm" />
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/AbstractCatalogRuleEntityTest.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/AbstractCatalogRuleEntityTest.php
index 8c2ab9474a2c002767159584ba680781934ade83..8cc2bbcd11900b03ac123fee638555e84de93a19 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/AbstractCatalogRuleEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/AbstractCatalogRuleEntityTest.php
@@ -38,13 +38,6 @@ abstract class AbstractCatalogRuleEntityTest extends Injectable
      */
     protected $adminCache;
 
-    /**
-     * Fixture CatalogRule.
-     *
-     * @var array
-     */
-    protected $catalogRules = [];
-
     /**
      * Fixture factory.
      *
@@ -80,12 +73,6 @@ abstract class AbstractCatalogRuleEntityTest extends Injectable
      */
     public function tearDown()
     {
-        foreach ($this->catalogRules as $catalogRule) {
-            $filter = ['name' => $catalogRule->getName()];
-            $this->catalogRuleIndex->open();
-            $this->catalogRuleIndex->getCatalogRuleGrid()->searchAndOpen($filter);
-            $this->catalogRuleNew->getFormPageActions()->delete();
-        }
-        $this->catalogRules = [];
+        $this->objectManager->create('\Magento\CatalogRule\Test\TestStep\DeleteAllCatalogRulesStep')->run();
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/ApplySeveralCatalogPriceRuleEntityTest.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/ApplySeveralCatalogPriceRuleEntityTest.php
index 84f9cd923b6ef87fa44b77d82c0874529f0362fa..1ef4e30a3e542de934a5f0b55e214460b385c8a5 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/ApplySeveralCatalogPriceRuleEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/ApplySeveralCatalogPriceRuleEntityTest.php
@@ -9,17 +9,15 @@ namespace Magento\CatalogRule\Test\TestCase;
 use Magento\Catalog\Test\Fixture\CatalogProductSimple;
 
 /**
- * Test Creation for Apply several CatalogPriceRuleEntity
- *
- * Test Flow:
  * Preconditions:
- *  1. Execute before each variation:
- *   - Delete all active catalog price rules
- *   - Create catalog price rule from dataSet using Curl
+ * 1. Execute before each variation:
+ *  - Delete all active catalog price rules
+ *  - Create catalog price rule from dataSet using Curl
+ *
  * Steps:
- *  1. Apply all created rules
- *  2. Create simple product
- *  3. Perform all assertions
+ * 1. Apply all created rules.
+ * 2. Create simple product.
+ * 3. Perform all assertions.
  *
  * @group Catalog_Price_Rules_(MX)
  * @ZephyrId MAGETWO-24780
@@ -32,7 +30,7 @@ class ApplySeveralCatalogPriceRuleEntityTest extends AbstractCatalogRuleEntityTe
     /* end tags */
 
     /**
-     * Apply several catalog price rules
+     * Apply several catalog price rules.
      *
      * @param array $catalogRulesOriginal
      * @return array
@@ -44,15 +42,15 @@ class ApplySeveralCatalogPriceRuleEntityTest extends AbstractCatalogRuleEntityTe
             if ($catalogPriceRule == '-') {
                 continue;
             }
-            $this->catalogRules[$key] = $this->fixtureFactory->createByCode(
+            $catalogRules[$key] = $this->fixtureFactory->createByCode(
                 'catalogRule',
                 ['dataSet' => $catalogPriceRule]
             );
-            $this->catalogRules[$key]->persist();
+            $catalogRules[$key]->persist();
 
             $filter = [
-                'name' => $this->catalogRules[$key]->getName(),
-                'rule_id' => $this->catalogRules[$key]->getId(),
+                'name' => $catalogRules[$key]->getName(),
+                'rule_id' => $catalogRules[$key]->getId(),
             ];
             $this->catalogRuleIndex->getCatalogRuleGrid()->searchAndOpen($filter);
             $this->catalogRuleNew->getFormPageActions()->saveAndApply();
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogPriceRuleEntityTest.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogPriceRuleEntityTest.php
index 20ddb3397e1a54e507e8dd9893b587a79caea588..be62cb21448e54bfb45f6d86c18f3019b485a66a 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogPriceRuleEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogPriceRuleEntityTest.php
@@ -9,15 +9,13 @@ namespace Magento\CatalogRule\Test\TestCase;
 use Magento\CatalogRule\Test\Fixture\CatalogRule;
 
 /**
- * Test Creation for Create CatalogPriceRuleEntity
- *
- * Test Flow:
+ * Steps:
  * 1. Log in as default admin user.
- * 2. Go to Marketing > Catalog Price Rules
- * 3. Press "+" button to start create new catalog price rule
- * 4. Fill in all data according to data set
- * 5. Save rule
- * 6. Perform appropriate assertions
+ * 2. Go to Marketing > Catalog Price Rules.
+ * 3. Press "+" button to start create new catalog price rule.
+ * 4. Fill in all data according to data set.
+ * 5. Save rule.
+ * 6. Perform appropriate assertions.
  *
  * @group Catalog_Price_Rules_(MX)
  * @ZephyrId MAGETWO-24341
@@ -42,8 +40,5 @@ class CreateCatalogPriceRuleEntityTest extends AbstractCatalogRuleEntityTest
         $this->catalogRuleIndex->getGridPageActions()->addNew();
         $this->catalogRuleNew->getEditForm()->fill($catalogPriceRule);
         $this->catalogRuleNew->getFormPageActions()->save();
-
-        // Prepare data for tear down
-        $this->catalogRules[] = $catalogPriceRule;
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.php
index 6649d45ba0e6312653b5c6766ab1727f20786aed..18815f160fa7f9f1b2ea52a6b64a8b28ad32c568 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.php
@@ -12,18 +12,16 @@ use Magento\Catalog\Test\Fixture\CatalogProductSimple;
 use Magento\Customer\Test\Fixture\CustomerGroupInjectable;
 
 /**
- * Test Coverage for Create Catalog Rule
- *
- * Test Flow:
+ * Steps:
  * 1. Log in as default admin user.
- * 2. Go to Marketing > Catalog Price Rules
- * 3. Press "+" button to start create new catalog price rule
- * 4. Fill in all data according to data set
- * 5. Save rule
- * 6. Apply newly created catalog rule
- * 7. Create simple product
- * 8. Clear cache
- * 9. Perform all assertions
+ * 2. Go to Marketing > Catalog Price Rules.
+ * 3. Press "+" button to start create new catalog price rule.
+ * 4. Fill in all data according to data set.
+ * 5. Save rule.
+ * 6. Apply newly created catalog rule.
+ * 7. Create simple product.
+ * 8. Clear cache.
+ * 9. Perform all assertions.
  *
  * @ticketId MAGETWO-23036
  */
@@ -37,7 +35,7 @@ class CreateCatalogRuleTest extends AbstractCatalogRuleEntityTest
     /* end tags */
 
     /**
-     * Create Catalog Price Rule
+     * Create Catalog Price Rule.
      *
      * @param CatalogRule $catalogPriceRule
      * @param Customer $customer
@@ -70,9 +68,6 @@ class CreateCatalogRuleTest extends AbstractCatalogRuleEntityTest
         $this->catalogRuleNew->getEditForm()->fill($catalogPriceRule, null, $replace);
         $this->catalogRuleNew->getFormPageActions()->save();
 
-        // Prepare data for tear down
-        $this->catalogRules[] = $catalogPriceRule;
-
         // Apply Catalog Price Rule
         $this->catalogRuleIndex->getGridPageActions()->applyRules();
 
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/UpdateCatalogPriceRuleEntityTest.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/UpdateCatalogPriceRuleEntityTest.php
index 29339f794b99555a85bd92961ac02a638902d344..fd30614dd24abfbdd239882132548305f5199cd0 100755
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/UpdateCatalogPriceRuleEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/UpdateCatalogPriceRuleEntityTest.php
@@ -11,19 +11,17 @@ use Magento\Catalog\Test\Fixture\CatalogProductSimple\CategoryIds;
 use Magento\CatalogRule\Test\Fixture\CatalogRule;
 
 /**
- * Test Creation for UpdateCatalogPriceRuleEntity
- *
- * Test Flow:
  * Preconditions:
- * 1. Catalog Price Rule is created
+ * 1. Catalog Price Rule is created.
+ *
  * Steps:
- * 1. Login to backend
- * 2. Navigate to MARKETING > Catalog Price Rules
- * 3. Click Catalog Price Rule from grid
- * 4. Edit test value(s) according to dataSet
- * 5. Click 'Save'/ 'Apply' button
- * 6. Create simple product with category
- * 7. Perform all asserts
+ * 1. Login to backend.
+ * 2. Navigate to MARKETING > Catalog Price Rules.
+ * 3. Click Catalog Price Rule from grid.
+ * 4. Edit test value(s) according to dataSet.
+ * 5. Click 'Save'/ 'Apply' button.
+ * 6. Create simple product with category.
+ * 7. Perform all asserts.
  *
  * @group Catalog_Price_Rules_(MX)
  * @ZephyrId MAGETWO-25187
@@ -37,7 +35,7 @@ class UpdateCatalogPriceRuleEntityTest extends AbstractCatalogRuleEntityTest
     /* end tags */
 
     /**
-     * Update catalog price rule
+     * Update catalog price rule.
      *
      * @param CatalogRule $catalogPriceRule
      * @param CatalogRule $catalogPriceRuleOriginal
@@ -81,9 +79,6 @@ class UpdateCatalogPriceRuleEntityTest extends AbstractCatalogRuleEntityTest
         $this->catalogRuleNew->getEditForm()->fill($catalogPriceRule, null, $replace);
         $this->catalogRuleNew->getFormPageActions()->$saveAction();
 
-        // Prepare data for tear down
-        $this->catalogRules[] = $catalogPriceRule;
-
         // Create simple product with category
         $productSimple->persist();
 
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestStep/DeleteAllCatalogRulesStep.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestStep/DeleteAllCatalogRulesStep.php
index a30825ebf60af09f0a09ddd652c6d9c7af830cb5..dcc06c224c0baafb2d9429ba256b7d922cbb6136 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestStep/DeleteAllCatalogRulesStep.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestStep/DeleteAllCatalogRulesStep.php
@@ -51,6 +51,7 @@ class DeleteAllCatalogRulesStep implements TestStepInterface
     public function run()
     {
         $this->catalogRuleIndex->open();
+        $this->catalogRuleIndex->getCatalogRuleGrid()->resetFilter();
         while ($this->catalogRuleIndex->getCatalogRuleGrid()->isFirstRowVisible()) {
             $this->catalogRuleIndex->getCatalogRuleGrid()->openFirstRow();
             $this->catalogRuleNew->getFormPageActions()->delete();
diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestStep/DeleteAllTermsEntityStep.php b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestStep/DeleteAllTermsEntityStep.php
index f57baf78acc59aed8fce6d8dfae84cc00ce924ed..3599882b174c192c6f0638b491a86937e7e39c8c 100644
--- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestStep/DeleteAllTermsEntityStep.php
+++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestStep/DeleteAllTermsEntityStep.php
@@ -52,6 +52,7 @@ class DeleteAllTermsEntityStep implements TestStepInterface
     public function run()
     {
         $this->agreementIndex->open();
+        $this->agreementIndex->getAgreementGridBlock()->resetFilter();
         while ($this->agreementIndex->getAgreementGridBlock()->isFirstRowVisible()) {
             $this->agreementIndex->getAgreementGridBlock()->openFirstRow();
             $this->agreementNew->getPageActionsBlock()->delete();
diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Block/CmsGrid.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Block/CmsGrid.php
index 5c4240ee3fd67be9a160807fa491b4b06ba74e66..99fe29e6517c8fe34fb3a6bc2e4113d5ff161955 100644
--- a/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Block/CmsGrid.php
+++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Block/CmsGrid.php
@@ -60,5 +60,5 @@ class CmsGrid extends Grid
      *
      * @var string
      */
-    protected $editLink = 'td[data-part="body.row.cell"]';
+    protected $editLink = '.action-menu-item';
 }
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/MainPageActions.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/MainPageActions.php
deleted file mode 100644
index 14f7bf7af1bbeb49f34f4d68fe6e2bfa046039cd..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/MainPageActions.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency;
-
-use Magento\Backend\Test\Block\PageActions;
-
-/**
- * Class MainPageActions
- * Main page actions on the SystemCurrencyIndex page
- */
-class MainPageActions extends PageActions
-{
-    /**
-     * "Save Currency Rates" button locator
-     *
-     * @var string
-     */
-    protected $saveCurrentRate = '[data-ui-id="page-actions-toolbar-save-button"]';
-
-    /**
-     * Save Currency Rates
-     *
-     * @return void
-     */
-    public function saveCurrentRate()
-    {
-        $this->_rootElement->find($this->saveCurrentRate)->click();
-    }
-}
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..d5d1c887a484c6d4c46a641cacb4213f5d4e4a58
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency\Rate;
+
+use Magento\Mtf\Block\Form;
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\Client\Element\SimpleElement;
+
+/**
+ * Currency Rate form.
+ */
+class CurrencyRateForm extends Form
+{
+    /**
+     * Fill currency rate form.
+     *
+     * @param FixtureInterface $fixture
+     * @param SimpleElement|null $element
+     * @return $this
+     */
+    public function fill(FixtureInterface $fixture, SimpleElement $element = null)
+    {
+        /** @var \Magento\Directory\Test\Fixture\CurrencyRate $fixture */
+        $this->placeholders['currency_from'] = $fixture->getCurrencyFrom();
+        $this->placeholders['currency_to'] = $fixture->getCurrencyTo();
+        $this->applyPlaceholders();
+
+        return parent::fill($fixture, $element);
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4ffc8f05740d4454c14ded3bdc171699a7d93c1c
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" ?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<mapping strict="0">
+    <wrapper>rate</wrapper>
+    <fields>
+        <rate>
+            <selector>input[name="rate[%currency_from%][%currency_to%]"]</selector>
+        </rate>
+    </fields>
+</mapping>
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/FormPageActions.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/FormPageActions.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c911026ad68cfce9ae4fd9f86caa607863ebe96
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/FormPageActions.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency\Rate;
+
+use Magento\Backend\Test\Block\FormPageActions as ParentFormPageActions;
+
+/**
+ * Form page actions on the SystemCurrencyIndex page.
+ */
+class FormPageActions extends ParentFormPageActions
+{
+    /**
+     * "Save Currency Rates" button locator.
+     *
+     * @var string
+     */
+    protected $saveButton = '.save';
+}
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/GridPageActions.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/GridPageActions.php
similarity index 68%
rename from dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/GridPageActions.php
rename to dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/GridPageActions.php
index f50f9a58386a4aa4ccada29a5115324aad6e4e57..ee7d3fcc6411632c646c08eaec8ab6ee8aa0d904 100644
--- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/GridPageActions.php
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/GridPageActions.php
@@ -4,10 +4,9 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency;
+namespace Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency\Rate;
 
 use Magento\Backend\Test\Block\PageActions;
-use Magento\Backend\Test\Block\Messages;
 
 /**
  * Grid page actions on the SystemCurrencyIndex page.
@@ -47,21 +46,5 @@ class GridPageActions extends PageActions
                 return $message->isVisible() ? true : null;
             }
         );
-        if ($this->getMessageBlock()->isVisibleMessage('warning')) {
-            throw new \Exception($this->getMessageBlock()->getWarningMessages());
-        }
-    }
-
-    /**
-     * Get message block.
-     *
-     * @return Messages
-     */
-    protected function getMessageBlock()
-    {
-        return $this->blockFactory->create(
-            'Magento\Backend\Test\Block\Messages',
-            ['element' => $this->_rootElement->find($this->message)]
-        );
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Page/Adminhtml/SystemCurrencyIndex.xml b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Page/Adminhtml/SystemCurrencyIndex.xml
index 2ab90fb8688ebec958d8c4d8f30b9c643370e1db..efcc314043ecb2c455c908f3bc051697e7a85d42 100644
--- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Page/Adminhtml/SystemCurrencyIndex.xml
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Page/Adminhtml/SystemCurrencyIndex.xml
@@ -7,7 +7,9 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd">
     <page name="SystemCurrencyIndex" area="Adminhtml" mca="admin/system_currency/index" module="Magento_CurrencySymbol">
-        <block name="gridPageActions" class="Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency\GridPageActions" locator=".grid-actions" strategy="css selector"/>
-        <block name="mainPageActions" class="Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency\MainPageActions" locator=".page-main-actions" strategy="css selector"/>
+        <block name="gridPageActions" class="Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency\Rate\GridPageActions" locator=".grid-actions" strategy="css selector"/>
+        <block name="formPageActions" class="Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency\Rate\FormPageActions" locator=".page-main-actions" strategy="css selector"/>
+        <block name="currencyRateForm" class="Magento\CurrencySymbol\Test\Block\Adminhtml\System\Currency\Rate\CurrencyRateForm" locator="#rate-form" strategy="css selector"/>
+        <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/>
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Repository/ConfigData.xml b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Repository/ConfigData.xml
index 1d7fabcdeb20a6b5c12d4fd33bb4e929bf7066bb..17373832ad976111b47b2f57bbcf04f48f9b54a4 100644
--- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Repository/ConfigData.xml
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Repository/ConfigData.xml
@@ -137,5 +137,27 @@
                 <item name="value" xsi:type="string">USD</item>
             </field>
         </dataset>
+
+        <dataset name="config_currency_symbols_usd_and_eur">
+            <field name="currency/options/allow" xsi:type="array">
+                <item name="scope" xsi:type="string">currency</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="value" xsi:type="array">
+                    <item name="US Dollar" xsi:type="string">USD</item>
+                    <item name="Euro" xsi:type="string">EUR</item>
+                </item>
+            </field>
+        </dataset>
+
+        <dataset name="config_currency_symbols_usd_and_gbp">
+            <field name="currency/options/allow" xsi:type="array">
+                <item name="scope" xsi:type="string">currency</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="value" xsi:type="array">
+                    <item name="US Dollar" xsi:type="string">USD</item>
+                    <item name="British Pound Sterling" xsi:type="string">GBP</item>
+                </item>
+            </field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/AbstractCurrencySymbolEntityTest.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/AbstractCurrencySymbolEntityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..157b6dae2e1a1be571d2e7cbd7b3adcbbed1981e
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/AbstractCurrencySymbolEntityTest.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CurrencySymbol\Test\TestCase;
+
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Mtf\TestCase\Injectable;
+use Magento\Catalog\Test\Fixture\CatalogProductSimple;
+use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencyIndex;
+use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencySymbolIndex;
+
+/**
+ * Abstract class for currency symbol tests.
+ */
+abstract class AbstractCurrencySymbolEntityTest extends Injectable
+{
+    /**
+     * System Currency Symbol grid page.
+     *
+     * @var SystemCurrencySymbolIndex
+     */
+    protected $currencySymbolIndex;
+
+    /**
+     * System currency index page.
+     *
+     * @var SystemCurrencyIndex
+     */
+    protected $currencyIndex;
+
+    /**
+     * Fixture Factory.
+     *
+     * @var FixtureFactory
+     */
+    protected $fixtureFactory;
+
+    /**
+     * Create simple product and inject pages.
+     *
+     * @param SystemCurrencySymbolIndex $currencySymbolIndex
+     * @param SystemCurrencyIndex $currencyIndex
+     * @param FixtureFactory $fixtureFactory
+     * @return array
+     */
+    public function __inject(
+        SystemCurrencySymbolIndex $currencySymbolIndex,
+        SystemCurrencyIndex $currencyIndex,
+        FixtureFactory $fixtureFactory
+    ) {
+        $this->currencySymbolIndex = $currencySymbolIndex;
+        $this->currencyIndex = $currencyIndex;
+        $this->fixtureFactory = $fixtureFactory;
+        $product = $this->fixtureFactory->createByCode(
+            'catalogProductSimple',
+            ['dataSet' => 'product_with_category']
+        );
+        $product->persist();
+
+        return ['product' => $product];
+    }
+
+    /**
+     * Import currency rates.
+     *
+     * @param string $configData
+     * @return void
+     * @throws \Exception
+     */
+    protected function importCurrencyRate($configData)
+    {
+        $this->objectManager->getInstance()->create(
+            'Magento\Config\Test\TestStep\SetupConfigurationStep',
+            ['configData' => $configData]
+        )->run();
+
+        // Import Exchange Rates for currencies
+        $this->currencyIndex->open();
+        $this->currencyIndex->getGridPageActions()->clickImportButton();
+        if ($this->currencyIndex->getMessagesBlock()->isVisibleMessage('warning')) {
+            throw new \Exception($this->currencyIndex->getMessagesBlock()->getWarningMessages());
+        }
+        $this->currencyIndex->getFormPageActions()->save();
+    }
+
+    /**
+     * Disabling currency which has been added.
+     *
+     * @return void
+     */
+    public function tearDown()
+    {
+        $this->objectManager->getInstance()->create(
+            'Magento\Config\Test\TestStep\SetupConfigurationStep',
+            ['configData' => 'config_currency_symbols_usd']
+        )->run();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/EditCurrencySymbolEntityTest.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/EditCurrencySymbolEntityTest.php
index 5d2cc6badaa78bc22e0cec669393579f8e72e42f..c1597a1fbc4e6be9be827097c659276072d8c6ab 100644
--- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/EditCurrencySymbolEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/EditCurrencySymbolEntityTest.php
@@ -6,12 +6,8 @@
 
 namespace Magento\CurrencySymbol\Test\TestCase;
 
-use Magento\Mtf\TestCase\Injectable;
-use Magento\Mtf\Fixture\FixtureFactory;
 use Magento\Catalog\Test\Fixture\CatalogProductSimple;
 use Magento\CurrencySymbol\Test\Fixture\CurrencySymbolEntity;
-use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencyIndex;
-use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencySymbolIndex;
 
 /**
  * Preconditions:
@@ -27,53 +23,13 @@ use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencySymbolIndex;
  * @group Currency_(PS)
  * @ZephyrId MAGETWO-26600
  */
-class EditCurrencySymbolEntityTest extends Injectable
+class EditCurrencySymbolEntityTest extends AbstractCurrencySymbolEntityTest
 {
     /* tags */
     const MVP = 'no';
     const DOMAIN = 'PS';
     /* end tags */
 
-    /**
-     * System Currency Symbol grid page.
-     *
-     * @var SystemCurrencySymbolIndex
-     */
-    protected $currencySymbolIndex;
-
-    /**
-     * System currency index page.
-     *
-     * @var SystemCurrencyIndex
-     */
-    protected $currencyIndex;
-
-    /**
-     * Create simple product and inject pages.
-     *
-     * @param SystemCurrencySymbolIndex $currencySymbolIndex
-     * @param SystemCurrencyIndex $currencyIndex,
-     * @param FixtureFactory $fixtureFactory
-     * @return array
-     */
-    public function __inject(
-        SystemCurrencySymbolIndex $currencySymbolIndex,
-        SystemCurrencyIndex $currencyIndex,
-        FixtureFactory $fixtureFactory
-    ) {
-        $this->currencySymbolIndex = $currencySymbolIndex;
-        $this->currencyIndex = $currencyIndex;
-
-        /**@var CatalogProductSimple $catalogProductSimple */
-        $product = $fixtureFactory->createByCode(
-            'catalogProductSimple',
-            ['dataSet' => 'product_with_category']
-        );
-        $product->persist();
-
-        return ['product' => $product];
-    }
-
     /**
      * Edit Currency Symbol Entity test.
      *
@@ -91,36 +47,4 @@ class EditCurrencySymbolEntityTest extends Injectable
         $this->currencySymbolIndex->getCurrencySymbolForm()->fill($currencySymbol);
         $this->currencySymbolIndex->getPageActions()->save();
     }
-
-    /**
-     * Import currency rates.
-     *
-     * @param string $configData
-     * @return void
-     */
-    protected function importCurrencyRate($configData)
-    {
-        $this->objectManager->getInstance()->create(
-            'Magento\Config\Test\TestStep\SetupConfigurationStep',
-            ['configData' => $configData]
-        )->run();
-
-        // Import Exchange Rates for currencies
-        $this->currencyIndex->open();
-        $this->currencyIndex->getGridPageActions()->clickImportButton();
-        $this->currencyIndex->getMainPageActions()->saveCurrentRate();
-    }
-
-    /**
-     * Disabling currency which has been added.
-     *
-     * @return void
-     */
-    public function tearDown()
-    {
-        $this->objectManager->getInstance()->create(
-            'Magento\Config\Test\TestStep\SetupConfigurationStep',
-            ['configData' => 'config_currency_symbols_usd']
-        )->run();
-    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/ResetCurrencySymbolEntityTest.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/ResetCurrencySymbolEntityTest.php
index f64c407f6aefffb4f76ccf351282c38556b079ca..96537d399ce8770887994dd6a6b7f9268f3e40f4 100644
--- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/ResetCurrencySymbolEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/TestCase/ResetCurrencySymbolEntityTest.php
@@ -6,12 +6,8 @@
 
 namespace Magento\CurrencySymbol\Test\TestCase;
 
-use Magento\Mtf\TestCase\Injectable;
-use Magento\Mtf\Fixture\FixtureFactory;
 use Magento\Catalog\Test\Fixture\CatalogProductSimple;
 use Magento\CurrencySymbol\Test\Fixture\CurrencySymbolEntity;
-use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencyIndex;
-use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencySymbolIndex;
 
 /**
  * Preconditions:
@@ -28,77 +24,13 @@ use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencySymbolIndex;
  * @group Currency_(PS)
  * @ZephyrId MAGETWO-26638
  */
-class ResetCurrencySymbolEntityTest extends Injectable
+class ResetCurrencySymbolEntityTest extends AbstractCurrencySymbolEntityTest
 {
     /* tags */
     const MVP = 'no';
     const DOMAIN = 'PS';
     /* end tags */
 
-    /**
-     * System currency symbol grid page.
-     *
-     * @var SystemCurrencySymbolIndex
-     */
-    protected $currencySymbolIndex;
-
-    /**
-     * System currency index page.
-     *
-     * @var SystemCurrencyIndex
-     */
-    protected $currencyIndex;
-
-    /**
-     * Currency symbol entity fixture.
-     *
-     * @var CurrencySymbolEntity
-     */
-    protected $currencySymbolDefault;
-
-    /**
-     * Fixture Factory.
-     *
-     * @var FixtureFactory
-     */
-    protected $fixtureFactory;
-
-    /**
-     * Prepare data. Create simple product.
-     *
-     * @param FixtureFactory $fixtureFactory
-     * @return array
-     */
-    public function __prepare(FixtureFactory $fixtureFactory)
-    {
-        $this->fixtureFactory = $fixtureFactory;
-        $product = $this->fixtureFactory->createByCode(
-            'catalogProductSimple',
-            ['dataSet' => 'product_with_category']
-        );
-        $product->persist();
-
-        return ['product' => $product];
-    }
-
-    /**
-     * Injection data.
-     *
-     * @param SystemCurrencySymbolIndex $currencySymbolIndex
-     * @param SystemCurrencyIndex $currencyIndex
-     * @param CurrencySymbolEntity $currencySymbolDefault
-     * @return array
-     */
-    public function __inject(
-        SystemCurrencySymbolIndex $currencySymbolIndex,
-        SystemCurrencyIndex $currencyIndex,
-        CurrencySymbolEntity $currencySymbolDefault
-    ) {
-        $this->currencySymbolIndex = $currencySymbolIndex;
-        $this->currencyIndex = $currencyIndex;
-        $this->currencySymbolDefault = $currencySymbolDefault;
-    }
-
     /**
      * Reset Currency Symbol Entity test.
      *
@@ -135,36 +67,4 @@ class ResetCurrencySymbolEntityTest extends Injectable
             )
         ];
     }
-
-    /**
-     * Import currency rates.
-     *
-     * @param string $configData
-     * @return void
-     */
-    protected function importCurrencyRate($configData)
-    {
-        $this->objectManager->getInstance()->create(
-            'Magento\Config\Test\TestStep\SetupConfigurationStep',
-            ['configData' => $configData]
-        )->run();
-
-        // Import Exchange Rates for currencies
-        $this->currencyIndex->open();
-        $this->currencyIndex->getGridPageActions()->clickImportButton();
-        $this->currencyIndex->getMainPageActions()->saveCurrentRate();
-    }
-
-    /**
-     * Disabling currency which has been added.
-     *
-     * @return void
-     */
-    public function tearDown()
-    {
-        $this->objectManager->getInstance()->create(
-            'Magento\Config\Test\TestStep\SetupConfigurationStep',
-            ['configData' => 'config_currency_symbols_usd']
-        )->run();
-    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php
index 61f32f55d0379cabc917871a952233fb4bdf88ca..fb1030c3143f16e5496bd47354f74826ed2c457c 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php
@@ -34,6 +34,10 @@ class Curl extends AbstractCurl implements CustomerInterface
             'United States' => 'US',
             'United Kingdom' => 'GB'
         ],
+        'gender' => [
+            'Male' => 1,
+            'Female' => 2,
+        ],
         'region_id' => [
             'California' => 12,
             'New York' => 43,
@@ -78,12 +82,11 @@ class Curl extends AbstractCurl implements CustomerInterface
      */
     public function persist(FixtureInterface $customer = null)
     {
-        $address = [];
-
         /** @var Customer $customer */
-        $url = $_ENV['app_frontend_url'] . 'customer/account/createpost/?nocookie=true';
         $data = $customer->getData();
         $data['group_id'] = $this->getCustomerGroup($customer);
+        $address = [];
+        $url = $_ENV['app_frontend_url'] . 'customer/account/createpost/?nocookie=true';
 
         if ($customer->hasData('address')) {
             $address = $customer->getAddress();
@@ -179,7 +182,7 @@ class Curl extends AbstractCurl implements CustomerInterface
         $curl->close();
 
         if (!strpos($response, 'data-ui-id="messages-message-success"')) {
-            $this->_eventManager->dispatchEvent(['curl_failed', [$response]]);
+            $this->_eventManager->dispatchEvent(['curl_failed'], [$response]);
             throw new \Exception('Failed to update customer!');
         }
     }
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAccountCreate.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAccountCreate.xml
index 783fa1ad4e1b476da685d85db7e08281163d7256..57cf9a355142c53bce686233fd8ccbf588296f45 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAccountCreate.xml
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAccountCreate.xml
@@ -6,8 +6,8 @@
  */
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/pages.xsd">
-  <page name="CustomerAccountCreate" mca="customer/account/create" module="Magento_Customer">
-    <block name="registerForm" class="Magento\Customer\Test\Block\Form\Register" locator="#form-validate" strategy="css selector"/>
-    <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator=".page.messages" strategy="css selector"/>
-  </page>
+    <page name="CustomerAccountCreate" mca="customer/account/create" module="Magento_Customer">
+        <block name="registerForm" class="Magento\Customer\Test\Block\Form\Register" locator="#form-validate[novalidate='novalidate']" strategy="css selector" />
+        <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator=".page.messages" strategy="css selector" />
+    </page>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateAppliedOnCatalogPage.php b/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateAppliedOnCatalogPage.php
new file mode 100644
index 0000000000000000000000000000000000000000..05cd0245e1a759d6162a5dca748479844cb551c8
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateAppliedOnCatalogPage.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Test\Constraint;
+
+use Magento\Cms\Test\Page\CmsIndex;
+use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\Catalog\Test\Fixture\CatalogProductSimple;
+use Magento\Catalog\Test\Page\Category\CatalogCategoryView;
+use Magento\CurrencySymbol\Test\Fixture\CurrencySymbolEntity;
+
+/**
+ * Assert currency rate applied on catalog page.
+ */
+class AssertCurrencyRateAppliedOnCatalogPage extends AbstractConstraint
+{
+    /**
+     * Assert currency rate applied on catalog page.
+     *
+     * @param CmsIndex $cmsIndex
+     * @param CatalogCategoryView $catalogCategoryView
+     * @param CatalogProductSimple $product
+     * @param CurrencySymbolEntity $currencySymbol
+     * @param string $basePrice
+     * @param string $convertedPrice
+     * @return void
+     */
+    public function processAssert(
+        CmsIndex $cmsIndex,
+        CatalogCategoryView $catalogCategoryView,
+        CatalogProductSimple $product,
+        CurrencySymbolEntity $currencySymbol,
+        $basePrice,
+        $convertedPrice
+    ) {
+        $categoryName = $product->getCategoryIds()[0];
+        $cmsIndex->open();
+        $cmsIndex->getTopmenu()->selectCategoryByName($categoryName);
+        $priceBlock = $catalogCategoryView->getListProductBlock()->getProductItem($product)->getPriceBlock();
+        $actualPrice = $priceBlock->getPrice('');
+
+        \PHPUnit_Framework_Assert::assertEquals(
+            $basePrice,
+            $actualPrice,
+            'Wrong price is displayed on Category page.'
+        );
+
+        $cmsIndex->getCurrencyBlock()->switchCurrency($currencySymbol);
+        $cmsIndex->getTopmenu()->selectCategoryByName($categoryName);
+        $actualPrice = $priceBlock->getPrice('');
+
+        \PHPUnit_Framework_Assert::assertEquals(
+            $convertedPrice,
+            $actualPrice,
+            'Wrong price is displayed on Category page.'
+        );
+    }
+
+    /**
+     * Returns a string representation of successful assertion.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return "Currency rate has been applied correctly on Catalog page.";
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateSuccessSaveMessage.php
new file mode 100644
index 0000000000000000000000000000000000000000..3a9f7e82a3943e73ece72d72fbefb3bc2e720ca5
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateSuccessSaveMessage.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Test\Constraint;
+
+use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencyIndex;
+
+/**
+ * Assert that success message is displayed.
+ */
+class AssertCurrencyRateSuccessSaveMessage extends AbstractConstraint
+{
+    const SUCCESS_MESSAGE = 'All valid rates have been saved.';
+
+    /**
+     * Assert that success message is displayed after currency rate saved.
+     *
+     * @param SystemCurrencyIndex $currencyIndexPage
+     * @return void
+     */
+    public function processAssert(SystemCurrencyIndex $currencyIndexPage)
+    {
+        $actualMessage = $currencyIndexPage->getMessagesBlock()->getSuccessMessages();
+        \PHPUnit_Framework_Assert::assertEquals(
+            self::SUCCESS_MESSAGE,
+            $actualMessage,
+            'Wrong success message is displayed.'
+            . "\nExpected: " . self::SUCCESS_MESSAGE
+            . "\nActual: " . $actualMessage
+        );
+    }
+
+    /**
+     * Returns a string representation of successful assertion.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Currency rate success create message is present.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/Fixture/CurrencyRate.xml b/dev/tests/functional/tests/app/Magento/Directory/Test/Fixture/CurrencyRate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..70fcf15c962980ade05464ff3e6a8cebb9b66c85
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Directory/Test/Fixture/CurrencyRate.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd">
+    <fixture name="currencyRate" module="Magento_Directory" type="flat" entity_type="directory_currency_rate" collection="Magento\Directory\Model\Resource\Currency" identifier="" repository_class="Magento\Directory\Test\Repository\CurrencyRate" handler_interface="Magento\Directory\Test\Handler\CurrencyRate\CurrencyRateInterface" class="Magento\Directory\Test\Fixture\CurrencyRate">
+        <dataset name="default">
+            <field name="currency_from" xsi:type="string">USD</field>
+            <field name="currency_to" xsi:type="string">EUR</field>
+            <field name="rate" xsi:type="number">0.8</field>
+        </dataset>
+
+        <field name="currency_from" is_required="1" />
+        <field name="currency_to" is_required="1" />
+        <field name="rate" is_required="1" />
+    </fixture>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/Handler/CurrencyRate/Curl.php b/dev/tests/functional/tests/app/Magento/Directory/Test/Handler/CurrencyRate/Curl.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc6fbf9895588b3ae58c5dd75779c97e54c6a7ce
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Directory/Test/Handler/CurrencyRate/Curl.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Test\Handler\CurrencyRate;
+
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\Handler\Curl as AbstractCurl;
+use Magento\Mtf\Util\Protocol\CurlInterface;
+use Magento\Mtf\Util\Protocol\CurlTransport;
+use Magento\Mtf\Util\Protocol\CurlTransport\BackendDecorator;
+
+/**
+ * Curl handler for setting currency rates.
+ */
+class Curl extends AbstractCurl implements CurrencyRateInterface
+{
+    /**
+     * Post request for setting currency rate.
+     *
+     * @param FixtureInterface $fixture [optional]
+     * @return mixed|string
+     * @throws \Exception
+     */
+    public function persist(FixtureInterface $fixture = null)
+    {
+        $data = $this->prepareData($fixture);
+
+        $url = $_ENV['app_backend_url'] . 'admin/system_currency/saveRates/';
+        $curl = new BackendDecorator(new CurlTransport(), $this->_configuration);
+        $curl->write(CurlInterface::POST, $url, '1.0', [], $data);
+        $response = $curl->read();
+        $curl->close();
+
+        if (!strpos($response, 'data-ui-id="messages-message-success"')) {
+            throw new \Exception("Currency rates setting by curl handler was not successful! Response:\n" . $response);
+        }
+    }
+
+    /**
+     * Prepare data for POST request.
+     *
+     * @param FixtureInterface $fixture
+     * @return array
+     */
+    protected function prepareData(FixtureInterface $fixture)
+    {
+        $result = [];
+        $data = $fixture->getData();
+        $result['rate'][$data['currency_from']][$data['currency_to']] = $data['rate'];
+
+        return $result;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/Handler/CurrencyRate/CurrencyRateInterface.php b/dev/tests/functional/tests/app/Magento/Directory/Test/Handler/CurrencyRate/CurrencyRateInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..99cc0f552b190d49268024a33dfa0501e97f8cc7
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Directory/Test/Handler/CurrencyRate/CurrencyRateInterface.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Test\Handler\CurrencyRate;
+
+use Magento\Mtf\Handler\HandlerInterface;
+
+/**
+ * Interface CurrencyRateInterface
+ */
+interface CurrencyRateInterface extends HandlerInterface
+{
+    //
+}
diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/Repository/CurrencyRate.xml b/dev/tests/functional/tests/app/Magento/Directory/Test/Repository/CurrencyRate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c1b6dc96e3cbb79862eb959f0325f551cb12acf2
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Directory/Test/Repository/CurrencyRate.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" ?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/Magento/Mtf/Repository/etc/repository.xsd">
+    <repository class="Magento\Directory\Test\Repository\CurrencyRate">
+        <dataset name="usd_chf_rate_0_9">
+            <field name="currency_from" xsi:type="string">USD</field>
+            <field name="currency_to" xsi:type="string">CHF</field>
+            <field name="rate" xsi:type="number">0.9</field>
+        </dataset>
+
+        <dataset name="usd_gbp_rate_0_6">
+            <field name="currency_from" xsi:type="string">USD</field>
+            <field name="currency_to" xsi:type="string">GBP</field>
+            <field name="rate" xsi:type="number">0.6</field>
+        </dataset>
+    </repository>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php b/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..04aa6c4ca73d61e4ef01e61ac9929d9a225d2b59
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Test\TestCase;
+
+use Magento\Config\Test\Fixture\ConfigData;
+use Magento\Mtf\TestCase\Injectable;
+use Magento\Directory\Test\Fixture\CurrencyRate;
+use Magento\Catalog\Test\Fixture\CatalogProductSimple;
+use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencyIndex;
+
+/**
+ * Preconditions:
+ * 1. Create Simple product and assign it to the category.
+ * 2. Configure allowed Currencies Options.
+ *
+ * Steps:
+ * 1. Login to backend.
+ * 2. Go to Stores > Currency > Currency Rates.
+ * 3. Fill currency rate according to dataSet.
+ * 4. Click on 'Save Currency Rates' button.
+ * 5. Perform assertions.
+ *
+ * @group Localization_(PS)
+ * @ZephyrId MAGETWO-12427, MAGETWO-36824
+ */
+class CreateCurrencyRateTest extends Injectable
+{
+    /* tags */
+    const TEST_TYPE = 'acceptance_test';
+    const DOMAIN = 'PS';
+    /* end tags */
+
+    /**
+     * Currency rate index page.
+     *
+     * @var SystemCurrencyIndex
+     */
+    protected $currencyIndexPage;
+
+    /**
+     * Inject data.
+     *
+     * @param SystemCurrencyIndex $currencyIndexPage
+     * @return void
+     */
+    public function __inject(SystemCurrencyIndex $currencyIndexPage)
+    {
+        $this->currencyIndexPage = $currencyIndexPage;
+    }
+
+    /**
+     * Create currency rate test.
+     *
+     * @param CurrencyRate $currencyRate
+     * @param CatalogProductSimple $product
+     * @param $config
+     * @return void
+     */
+    public function test(CurrencyRate $currencyRate, CatalogProductSimple $product, ConfigData $config)
+    {
+        // Preconditions:
+        $product->persist();
+        $config->persist();
+
+        // Steps:
+        $this->currencyIndexPage->open();
+        $this->currencyIndexPage->getCurrencyRateForm()->fill($currencyRate);
+        $this->currencyIndexPage->getFormPageActions()->save();
+    }
+
+    /**
+     * Reset currency config to default values.
+     *
+     * @return void
+     */
+    public function tearDown()
+    {
+        $this->objectManager->create(
+            'Magento\Config\Test\TestStep\SetupConfigurationStep',
+            ['configData' => 'config_currency_symbols_usd']
+        )->run();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.xml b/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..561f9307ff07f058b79e7873e4e7ed15ceb67632
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Directory\Test\TestCase\CreateCurrencyRateTest">
+        <variation name="CreateCurrencyRateTestVariation1">
+            <data name="currencyRate/data/currency_from" xsi:type="string">USD</data>
+            <data name="currencyRate/data/currency_to" xsi:type="string">EUR</data>
+            <data name="currencyRate/data/rate" xsi:type="number">0.8</data>
+            <data name="currencySymbol/dataSet" xsi:type="string">currency_symbols_eur</data>
+            <data name="product/dataSet" xsi:type="string">simple_10_dollar</data>
+            <data name="config/dataSet" xsi:type="string">config_currency_symbols_usd_and_eur</data>
+            <data name="basePrice" xsi:type="string">$10.00</data>
+            <data name="convertedPrice" xsi:type="string">€8.00</data>
+            <data name="tag" xsi:type="string">test_type:acceptance_test</data>
+            <constraint name="Magento\Directory\Test\Constraint\AssertCurrencyRateSuccessSaveMessage"/>
+            <constraint name="Magento\Directory\Test\Constraint\AssertCurrencyRateAppliedOnCatalogPage"/>
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/etc/curl/di.xml b/dev/tests/functional/tests/app/Magento/Directory/Test/etc/curl/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0962d9ed807d9206fb6e31b641e4fa133588097c
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Directory/Test/etc/curl/di.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" ?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+    <preference for="\Magento\Directory\Test\Handler\CurrencyRate\CurrencyRateInterface" type="\Magento\Directory\Test\Handler\CurrencyRate\Curl" />
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/LinkRow.php b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/LinkRow.php
index 64d1aab3f990b7d1a043a6cce9bd2bc7bd890403..774f85d7772f4f9fdd76ca895448e8045d0a2c1c 100644
--- a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/LinkRow.php
+++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/LinkRow.php
@@ -3,6 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Downloadable\Test\Block\Adminhtml\Catalog\Product\Edit\Tab\Downloadable;
 
 use Magento\Mtf\Block\Form;
@@ -19,7 +20,7 @@ class LinkRow extends Form
      *
      * @var string
      */
-    protected $deleteButton = '.action-remove';
+    protected $deleteButton = '.action-delete';
 
     /**
      * Fill item link
diff --git a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php
index 3627d161b35ab583e5f5c7ab4a1c919d473c2c6c..77d38c0eb97743553753d2f5d1ae8ba9aa75bbeb 100644
--- a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php
+++ b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php
@@ -29,11 +29,11 @@ class ItemProduct extends \Magento\Sales\Test\Block\Adminhtml\Order\Create\Items
     protected $giftMessageForm = './/*[@role="dialog"][*[@id="gift_options_configure"]]';
 
     /**
-     * Magento varienLoader.js loader.
+     * Magento loader.
      *
      * @var string
      */
-    protected $loadingMask = '//*[@id="loading-mask"]/*[@id="loading_mask_loader"]';
+    protected $loader = '[data-role="loader"]';
 
     /**
      * Fill GiftMessage form.
@@ -58,10 +58,11 @@ class ItemProduct extends \Magento\Sales\Test\Block\Adminhtml\Order\Create\Items
             ['element' => $this->browser->find($this->giftMessageForm, Locator::SELECTOR_XPATH)]
         );
         $giftMessageForm->fill($giftMessage);
-        $loadingMask = $this->browser->find($this->loadingMask, Locator::SELECTOR_XPATH);
+        $loader = $this->loader;
         $this->browser->waitUntil(
-            function () use ($loadingMask) {
-                return !$loadingMask->isVisible() ? true : null;
+            function () use ($browser, $loader) {
+                $element = $this->browser->find($loader);
+                return $element->isVisible() == false ? true : null;
             }
         );
     }
diff --git a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/etc/testcase.xml
index 3ce7af8e5be7e87a8a7173565d2b67e0740afa88..de5469059a9b89883c6210b648f0783b8af43fd8 100644
--- a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/etc/testcase.xml
+++ b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/etc/testcase.xml
@@ -22,15 +22,9 @@
         <step name="placeOrder" module="Magento_Checkout" />
     </scenario>
     <scenario name="CreateGiftMessageOnBackendTest" firstStep="setupConfiguration">
-        <step name="setupConfiguration" module="Magento_Config" next="createProducts">
-            <item name="configData" value="cashondelivery, enable_gift_messages" />
-        </step>
+        <step name="setupConfiguration" module="Magento_Config" next="createProducts" />
         <step name="createProducts" module="Magento_Catalog" next="createCustomer" />
-        <step name="createCustomer" module="Magento_Customer" next="openSalesOrders">
-            <item name="customer">
-                <item name="dataSet" value="johndoe_with_addresses" />
-            </item>
-        </step>
+        <step name="createCustomer" module="Magento_Customer" next="openSalesOrders" />
         <step name="openSalesOrders" module="Magento_Sales" next="createNewOrder" />
         <step name="createNewOrder" module="Magento_Sales" next="selectCustomerOrder" />
         <step name="selectCustomerOrder" module="Magento_Sales" next="selectStore" />
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Fixture/GroupedProduct/CheckoutData.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Fixture/GroupedProduct/CheckoutData.php
index 5c45ad254c0b02f4444547e1b95ebba7fedf2727..2871ec912db01ef8020b14699f62d95c6f7299ac 100644
--- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Fixture/GroupedProduct/CheckoutData.php
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Fixture/GroupedProduct/CheckoutData.php
@@ -57,39 +57,6 @@ class CheckoutData extends \Magento\Catalog\Test\Fixture\CatalogProductSimple\Ch
                     ],
                 ],
             ],
-            'three_simple_products_default_qty' => [
-                'options' => [
-                    [
-                        'name' => 'product_key_0',
-                        'qty' => 17,
-                    ],
-                    [
-                        'name' => 'product_key_1',
-                        'qty' => 36
-                    ],
-                    [
-                        'name' => 'product_key_2',
-                        'qty' => 20
-                    ],
-                ],
-                'cartItem' => [
-                    'price' => [
-                        'product_key_0' => 560,
-                        'product_key_1' => 40,
-                        'product_key_2' => 100,
-                    ],
-                    'qty' => [
-                        'product_key_0' => 17,
-                        'product_key_1' => 36,
-                        'product_key_2' => 20,
-                    ],
-                    'subtotal' => [
-                        'product_key_0' => 9520.00,
-                        'product_key_1' => 1440.00,
-                        'product_key_2' => 2000.00,
-                    ],
-                ],
-            ],
         ];
         return isset($presets[$name]) ? $presets[$name] : null;
     }
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct.xml
index fbf4305699a447b37e9a8d1bd756caec8f1f569e..cd0bc02b3df4ccab18c34b1876eef98e775af553 100644
--- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct.xml
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct.xml
@@ -117,34 +117,5 @@
                 <item name="preset" xsi:type="string">three_simple_products</item>
             </field>
         </dataset>
-
-        <dataset name="three_simple_products_default_qty">
-            <field name="name" xsi:type="string">Grouped product %isolation%</field>
-            <field name="sku" xsi:type="string">grouped_product_%isolation%</field>
-            <field name="category_ids" xsi:type="array">
-                <item name="presets" xsi:type="string">default</item>
-            </field>
-            <field name="associated" xsi:type="array">
-                <item name="preset" xsi:type="string">three_simple_products</item>
-            </field>
-            <field name="status" xsi:type="string">Product online</field>
-            <field name="visibility" xsi:type="string">Catalog, Search</field>
-            <field name="tax_class_id" xsi:type="array">
-                <item name="dataSet" xsi:type="string">taxable_goods</item>
-            </field>
-            <field name="url_key" xsi:type="string">test-grouped-product-%isolation%</field>
-            <field name="quantity_and_stock_status" xsi:type="array">
-                <item name="is_in_stock" xsi:type="string">In Stock</item>
-            </field>
-            <field name="website_ids" xsi:type="array">
-                <item name="0" xsi:type="string">Main Website</item>
-            </field>
-            <field name="attribute_set_id" xsi:type="array">
-                <item name="dataSet" xsi:type="string">default</item>
-            </field>
-            <field name="checkout_data" xsi:type="array">
-                <item name="preset" xsi:type="string">three_simple_products_default_qty</item>
-            </field>
-        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Block/Navigation.php b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Block/Navigation.php
index 41376ef7a3735d1af8d8dd8531397518f7f5b0a9..4dfa6dd2122c10aa6a7344210cd47d10985551c0 100644
--- a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Block/Navigation.php
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Block/Navigation.php
@@ -3,13 +3,14 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\LayeredNavigation\Test\Block;
 
 use Magento\Mtf\Block\Block;
 use Magento\Mtf\Client\Locator;
 
 /**
- * Catalog layered navigation view block
+ * Catalog layered navigation view block.
  */
 class Navigation extends Block
 {
@@ -20,20 +21,6 @@ class Navigation extends Block
      */
     protected $clearAll = '.action.clear';
 
-    /**
-     * Price range.
-     *
-     * @var string
-     */
-    protected $priceRange = "[href$='?price=%s']";
-
-    /**
-     * Attribute option.
-     *
-     * @var string
-     */
-    protected $attributeOption = "//a[contains(text(), '%s')]";
-
     /**
      * Attribute option title selector.
      *
@@ -42,11 +29,11 @@ class Navigation extends Block
     protected $optionTitle = '.filter-options-title';
 
     /**
-     * Attribute option content selector.
+     * Filter link locator.
      *
      * @var string
      */
-    protected $optionContent = '.filter-options-content';
+    protected $filterLink = './/dt[contains(text(),"%s")]/following-sibling::dd//a';
 
     /**
      * Click on 'Clear All' link.
@@ -58,28 +45,6 @@ class Navigation extends Block
         $this->_rootElement->find($this->clearAll, locator::SELECTOR_CSS)->click();
     }
 
-    /**
-     * Select product price range.
-     *
-     * @param string $range
-     * @return void
-     */
-    public function selectPriceRange($range)
-    {
-        $this->_rootElement->find(sprintf($this->priceRange, $range))->click();
-    }
-
-    /**
-     * Select attribute option.
-     *
-     * @param string $optionName
-     * @return void
-     */
-    public function selectAttributeOption($optionName)
-    {
-        $this->_rootElement->find(sprintf($this->attributeOption, $optionName), Locator::SELECTOR_XPATH)->click();
-    }
-
     /**
      * Get array of available filters.
      *
@@ -94,4 +59,25 @@ class Navigation extends Block
         }
         return $data;
     }
+
+    /**
+     * Click filter link.
+     *
+     * @param string $filter
+     * @param string $linkPattern
+     * @return void
+     * @throws \Exception
+     */
+    public function clickFilterLink($filter, $linkPattern)
+    {
+        $links = $this->_rootElement->getElements(sprintf($this->filterLink, $filter), Locator::SELECTOR_XPATH);
+
+        foreach ($links as $link) {
+            if (preg_match($linkPattern, trim($link->getText()))) {
+                $link->click();
+                return;
+            }
+        }
+        throw new \Exception("Can't find {$filter} filter link by pattern: {$linkPattern}");
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertFilterProductList.php b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertFilterProductList.php
new file mode 100644
index 0000000000000000000000000000000000000000..e2b384a26611026f3c353fd7d8f7185ecab99143
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertFilterProductList.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\LayeredNavigation\Test\Constraint;
+
+use Magento\Catalog\Test\Fixture\Category;
+use Magento\Catalog\Test\Page\Category\CatalogCategoryView;
+use Magento\Cms\Test\Page\CmsIndex;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Check whether products can be filtered in the Frontend via layered navigation.
+ */
+class AssertFilterProductList extends AbstractConstraint
+{
+    /**
+     * Available products list.
+     *
+     * @var array
+     */
+    protected $products;
+
+    /**
+     * Assertion that filtered product list via layered navigation are displayed correctly.
+     *
+     * @param Category $category
+     * @param CmsIndex $cmsIndex
+     * @param CatalogCategoryView $catalogCategoryView
+     * @param array $layeredNavigation
+     * @return void
+     */
+    public function processAssert(
+        Category $category,
+        CmsIndex $cmsIndex,
+        CatalogCategoryView $catalogCategoryView,
+        array $layeredNavigation
+    ) {
+        $this->products = $category->getDataFieldConfig('category_products')['source']->getProducts();
+        $cmsIndex->open();
+        $cmsIndex->getTopmenu()->selectCategoryByName($category->getName());
+
+        foreach ($layeredNavigation as $filters) {
+            foreach ($filters as $filter) {
+                $catalogCategoryView->getLayeredNavigationBlock()->clickFilterLink(
+                    $filter['title'],
+                    $filter['linkPattern']
+                );
+
+                $productNames = $this->getProductNames($filter['products']);
+                sort($productNames);
+                $pageProductNames = $catalogCategoryView->getListProductBlock()->getProductNames();
+                sort($pageProductNames);
+                \PHPUnit_Framework_Assert::assertEquals($productNames, $pageProductNames);
+            }
+            $catalogCategoryView->getLayeredNavigationBlock()->clearAll();
+        }
+    }
+
+    /**
+     * Get product names list by keys.
+     *
+     * @param string $productKeys
+     * @return array
+     */
+    protected function getProductNames($productKeys)
+    {
+        $keys = array_map('trim', explode(',', $productKeys));
+        $productNames = [];
+
+        foreach ($keys as $key) {
+            $key = str_replace('product_', '', $key);
+            $productNames[] = $this->products[$key]->getName();
+        }
+
+        return $productNames;
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Filtered product list via layered navigation are displayed correctly.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Page/Category/CatalogCategoryView.xml b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Page/Category/CatalogCategoryView.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c3b68e9dd74ccab2655d9d8f307cb4c634e93dfd
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Page/Category/CatalogCategoryView.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd">
+    <page name="CatalogCategoryView" area="Category" mca="catalog/category/view" module="Magento_Catalog">
+        <block name="layeredNavigationBlock" class="Magento\LayeredNavigation\Test\Block\Navigation" locator=".block.filter" strategy="css selector"/>
+    </page>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/ConfigData.xml b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/ConfigData.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2005dd8bf0cef056edf502e01fd9554e68cb8e23
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/ConfigData.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/Magento/Mtf/Repository/etc/repository.xsd">
+    <repository class="Magento\Config\Test\Repository\ConfigData">
+        <dataset name="layered_navigation_manual_range_10">
+            <field name="catalog/layered_navigation/display_product_count" xsi:type="array">
+                <item name="scope" xsi:type="string">default</item>
+                <item name="scope_id" xsi:type="number">0</item>
+                <item name="value" label="Yes" xsi:type="string">1</item>
+            </field>
+            <field name="catalog/layered_navigation/price_range_calculation" xsi:type="array">
+                <item name="scope" xsi:type="string">default</item>
+                <item name="scope_id" xsi:type="number">0</item>
+                <item name="value" label="Manual" xsi:type="string">manual</item>
+            </field>
+            <field name="catalog/layered_navigation/price_range_step" xsi:type="array">
+                <item name="scope" xsi:type="string">default</item>
+                <item name="scope_id" xsi:type="number">0</item>
+                <item name="value" xsi:type="string">10</item>
+            </field>
+            <field name="catalog/layered_navigation/price_range_max_intervals" xsi:type="array">
+                <item name="scope" xsi:type="string">default</item>
+                <item name="scope_id" xsi:type="number">0</item>
+                <item name="value" xsi:type="string">10</item>
+            </field>
+        </dataset>
+        <dataset name="layered_navigation_manual_range_10_rollback">
+            <field name="catalog/layered_navigation/display_product_count" xsi:type="array">
+                <item name="scope" xsi:type="string">default</item>
+                <item name="scope_id" xsi:type="number">0</item>
+                <item name="value" label="Yes" xsi:type="string">1</item>
+            </field>
+            <field name="catalog/layered_navigation/price_range_calculation" xsi:type="array">
+                <item name="scope" xsi:type="string">default</item>
+                <item name="scope_id" xsi:type="number">0</item>
+                <item name="value" label="Automatic (equalize price ranges)" xsi:type="string">auto</item>
+            </field>
+        </dataset>
+    </repository>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/FilterProductListTest.php b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/FilterProductListTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..dea532e69cf26dfe81ce7bb3fa281bf26a077dd8
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/FilterProductListTest.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\LayeredNavigation\Test\TestCase;
+
+use Magento\Catalog\Test\Fixture\CatalogProductSimple;
+use Magento\Catalog\Test\Fixture\Category;
+use Magento\Mtf\TestCase\Injectable;
+
+/**
+ * Preconditions:
+ * 1. Setup Layered Navigation configuration.
+ *
+ * Steps:
+ * 1. Create category.
+ * 2. Create product with created category.
+ * 3. Perform all assertions.
+ *
+ * @group Layered_Navigation_(MX)
+ * @ZephyrId MAGETWO-12419
+ */
+class FilterProductListTest extends Injectable
+{
+    /* tags */
+    const DOMAIN = 'MX';
+    const TEST_TYPE = 'acceptance_test';
+    /* end tags */
+
+    /**
+     * Configuration setting.
+     *
+     * @var string
+     */
+    protected $configData;
+
+    /**
+     * Filtering product in the Frontend via layered navigation.
+     *
+     * @param string $configData
+     * @param Category $category
+     * @return array
+     */
+    public function test($configData, Category $category)
+    {
+        $this->configData = $configData;
+
+        // Preconditions
+        $this->objectManager->create(
+            'Magento\Config\Test\TestStep\SetupConfigurationStep',
+            ['configData' => $this->configData]
+        )->run();
+
+        // Steps
+        $category->persist();
+    }
+
+    /**
+     * Clean data after running test.
+     *
+     * @return void
+     */
+    public function tearDown()
+    {
+        $this->objectManager->create(
+            'Magento\Config\Test\TestStep\SetupConfigurationStep',
+            ['configData' => $this->configData, 'rollback' => true]
+        )->run();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/FilterProductListTest.xml b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/FilterProductListTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4cfbc8d6397ff7d52133d0a2c70d129c06825b01
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/FilterProductListTest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\LayeredNavigation\Test\TestCase\FilterProductListTest">
+        <variation name="FilterProductListTestVariation1">
+            <data name="configData" xsi:type="string">layered_navigation_manual_range_10</data>
+            <data name="category/dataSet" xsi:type="string">default_anchor_subcategory</data>
+            <data name="category/data/category_products/dataSet" xsi:type="string">catalogProductSimple::product_20_dollar, configurableProduct::filterable_two_options_with_zero_price</data>
+            <data name="layeredNavigation" xsi:type="array">
+                <item name="filters_0" xsi:type="array">
+                    <item name="0" xsi:type="array">
+                        <item name="title" xsi:type="string">Price</item>
+                        <item name="linkPattern" xsi:type="string">`^.+10\.00 - .+19\.99 1$`m</item>
+                        <item name="products" xsi:type="string">product_1</item>
+                    </item>
+                </item>
+                <item name="filters_1" xsi:type="array">
+                    <item name="0" xsi:type="array">
+                        <item name="title" xsi:type="string">attribute_dropdown</item>
+                        <item name="linkPattern" xsi:type="string">`^option_0_[0-9]+ 1$`m</item>
+                        <item name="products" xsi:type="string">product_1</item>
+                    </item>
+                </item>
+            </data>
+            <data name="tag" xsi:type="string">test_type:acceptance_test</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertCategoryForAssignedProducts" />
+            <constraint name="Magento\LayeredNavigation\Test\Constraint\AssertFilterProductList" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/Edit/CustomerForm.xml b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/Edit/CustomerForm.xml
index c7a99a1c233ca0d32fb2e2703edf7b4c7f502484..32892c7138a7989b8d85d8c1092b80464054946c 100644
--- a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/Edit/CustomerForm.xml
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/Edit/CustomerForm.xml
@@ -8,7 +8,7 @@
 <tabs>
     <product_reviews>
         <class>\Magento\Review\Test\Block\Adminhtml\Customer\Edit\Tab\Reviews</class>
-        <selector>#tab_reviews</selector>
+        <selector>#tab_block_reviews</selector>
         <strategy>css selector</strategy>
     </product_reviews>
 </tabs>
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php
index e118bac1958fb0b3c9d0906bdafe181e157a9a7b..0a350725839b9e8833b90dda8003c051b0c7293c 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php
@@ -7,7 +7,7 @@
 namespace Magento\Sales\Test\Block\Adminhtml\Order\Create;
 
 use Magento\Backend\Test\Block\Widget\Form;
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\Mtf\Client\Locator;
 
 /**
@@ -32,10 +32,10 @@ class Coupons extends Form
     /**
      * Enter discount code and click apply button.
      *
-     * @param SalesRuleInjectable $code
+     * @param SalesRule $code
      * @return void
      */
-    public function applyCouponCode(SalesRuleInjectable $code)
+    public function applyCouponCode(SalesRule $code)
     {
         $this->_rootElement->find($this->couponCode)->setValue($code->getCouponCode());
         $this->_rootElement->find($this->applyButton, Locator::SELECTOR_XPATH)->click();
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Fixture/OrderInjectable/CouponCode.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Fixture/OrderInjectable/CouponCode.php
index b3d081c56d4c759fe4728523de1732c42f1477d0..0a28aff4f63e99585c420f30ca03fcd9031e1a4e 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Fixture/OrderInjectable/CouponCode.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Fixture/OrderInjectable/CouponCode.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Sales\Test\Fixture\OrderInjectable;
 
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\Mtf\Fixture\FixtureFactory;
 use Magento\Mtf\Fixture\DataSource;
 
@@ -24,12 +24,12 @@ class CouponCode extends DataSource
     public function __construct(FixtureFactory $fixtureFactory, array $data, array $params = [])
     {
         $this->params = $params;
-        if (isset($data['value']) && $data['value'] instanceof SalesRuleInjectable) {
+        if (isset($data['value']) && $data['value'] instanceof SalesRule) {
             $this->data = $data['value'];
             return;
         }
         if (isset($data['dataSet'])) {
-            $salesRule = $fixtureFactory->createByCode('salesRuleInjectable', ['dataSet' => $data['dataSet']]);
+            $salesRule = $fixtureFactory->createByCode('salesRule', ['dataSet' => $data['dataSet']]);
             $salesRule->persist();
             $this->data = $salesRule;
         }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Curl.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Curl.php
index e98f4ba0afff567f479384c0c7eaecef6543505d..7d993cb5f0094f6f9c9982314b44c83240402f88 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Curl.php
@@ -11,7 +11,7 @@ use Magento\ConfigurableProduct\Test\Fixture\ConfigurableProduct;
 use Magento\Customer\Test\Fixture\Customer;
 use Magento\Downloadable\Test\Fixture\DownloadableProduct;
 use Magento\Sales\Test\Fixture\OrderInjectable;
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\Mtf\Fixture\FixtureInterface;
 use Magento\Mtf\Handler\Curl as AbstractCurl;
 use Magento\Mtf\Util\Protocol\CurlInterface;
@@ -111,10 +111,10 @@ class Curl extends AbstractCurl implements OrderInjectableInterface
     /**
      * Prepare coupon data.
      *
-     * @param SalesRuleInjectable $data
+     * @param SalesRule $data
      * @return array
      */
-    protected function prepareCouponCode(SalesRuleInjectable $data)
+    protected function prepareCouponCode(SalesRule $data)
     {
         return ['order' => ['coupon' => ['code' => $data->getCouponCode()]]];
     }
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleApplying.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleApplying.php
index 1b573901d93ca029d529bf6c812e436b43d0ee05..a9307ce8132134ef2b9fde5dd5aa3e2f43aaffdd 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleApplying.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleApplying.php
@@ -15,7 +15,7 @@ use Magento\Customer\Test\Fixture\Address;
 use Magento\Customer\Test\Fixture\Customer;
 use Magento\Customer\Test\Page\CustomerAccountLogin;
 use Magento\Customer\Test\Page\CustomerAccountLogout;
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\Mtf\Constraint\AbstractConstraint;
 
 /**
@@ -121,8 +121,8 @@ abstract class AssertCartPriceRuleApplying extends AbstractConstraint
      * @param CatalogCategoryView $catalogCategoryView
      * @param CatalogProductView $catalogProductView
      * @param Customer $customer
-     * @param SalesRuleInjectable $salesRule
-     * @param SalesRuleInjectable $salesRuleOrigin
+     * @param SalesRule $salesRule
+     * @param SalesRule $salesRuleOrigin
      * @param array $productQuantity
      * @param CatalogProductSimple $productForSalesRule1
      * @param CatalogProductSimple $productForSalesRule2
@@ -141,8 +141,8 @@ abstract class AssertCartPriceRuleApplying extends AbstractConstraint
         CatalogCategoryView $catalogCategoryView,
         CatalogProductView $catalogProductView,
         Customer $customer,
-        SalesRuleInjectable $salesRule,
-        SalesRuleInjectable $salesRuleOrigin,
+        SalesRule $salesRule,
+        SalesRule $salesRuleOrigin,
         array $productQuantity,
         CatalogProductSimple $productForSalesRule1,
         CatalogProductSimple $productForSalesRule2 = null,
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleForm.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleForm.php
index ccd77f877ced270b43d7bcc9f2081422676f0b58..d8a6445267051487c7f813a13dc62be1c8fd6981 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleForm.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleForm.php
@@ -6,7 +6,7 @@
 
 namespace Magento\SalesRule\Test\Constraint;
 
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteEdit;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteIndex;
 use Magento\Mtf\Constraint\AbstractConstraint;
@@ -34,15 +34,15 @@ class AssertCartPriceRuleForm extends AbstractConstraint
      *
      * @param PromoQuoteIndex $promoQuoteIndex
      * @param PromoQuoteEdit $promoQuoteEdit
-     * @param SalesRuleInjectable $salesRule
-     * @param SalesRuleInjectable $salesRuleOrigin
+     * @param SalesRule $salesRule
+     * @param SalesRule $salesRuleOrigin
      * @return void
      */
     public function processAssert(
         PromoQuoteIndex $promoQuoteIndex,
         PromoQuoteEdit $promoQuoteEdit,
-        SalesRuleInjectable $salesRule,
-        SalesRuleInjectable $salesRuleOrigin = null
+        SalesRule $salesRule,
+        SalesRule $salesRuleOrigin = null
     ) {
         $filter = [
             'name' => $salesRule->hasData('name') ? $salesRule->getName() : $salesRuleOrigin->getName(),
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleIsNotPresentedInGrid.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleIsNotPresentedInGrid.php
index 4c2fd8856a08fdd1af69c5594124fef9443166f4..a0914721420c86595f74dd6b16a487175e935d74 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleIsNotPresentedInGrid.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleIsNotPresentedInGrid.php
@@ -6,7 +6,7 @@
 
 namespace Magento\SalesRule\Test\Constraint;
 
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteIndex;
 use Magento\Mtf\Constraint\AbstractConstraint;
 
@@ -19,10 +19,10 @@ class AssertCartPriceRuleIsNotPresentedInGrid extends AbstractConstraint
      * Assert that sales rule is not present in cart price rules grid.
      *
      * @param PromoQuoteIndex $promoQuoteIndex
-     * @param SalesRuleInjectable $salesRule
+     * @param SalesRule $salesRule
      * @return void
      */
-    public function processAssert(PromoQuoteIndex $promoQuoteIndex, SalesRuleInjectable $salesRule)
+    public function processAssert(PromoQuoteIndex $promoQuoteIndex, SalesRule $salesRule)
     {
         \PHPUnit_Framework_Assert::assertFalse(
             $promoQuoteIndex->getPromoQuoteGrid()->isRowVisible(['name' => $salesRule->getName()]),
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRuleInjectable.xml b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule.xml
similarity index 90%
rename from dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRuleInjectable.xml
rename to dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule.xml
index 25f432794e8432456a08e315988cfe84f60525fb..9008a93b8a36b6f82c5115afc176f113495742bc 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRuleInjectable.xml
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule.xml
@@ -6,7 +6,7 @@
  */
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd">
-    <fixture name="salesRuleInjectable" module="Magento_SalesRule" type="flat" entity_type="salesrule" collection="Magento\SalesRule\Model\Resource\Rule\Collection" repository_class="Magento\SalesRule\Test\Repository\SalesRuleInjectable" handler_interface="Magento\SalesRule\Test\Handler\SalesRuleInjectable\SalesRuleInjectableInterface" class="Magento\SalesRule\Test\Fixture\SalesRuleInjectable">
+    <fixture name="salesRule" module="Magento_SalesRule" type="flat" entity_type="salesrule" collection="Magento\SalesRule\Model\Resource\Rule\Collection" repository_class="Magento\SalesRule\Test\Repository\SalesRule" handler_interface="Magento\SalesRule\Test\Handler\SalesRule\SalesRuleInterface" class="Magento\SalesRule\Test\Fixture\SalesRule">
         <dataset name="default">
             <field name="name" xsi:type="string">Default price rule %isolation%</field>
             <field name="is_active" xsi:type="string">Active</field>
@@ -36,7 +36,7 @@
         <field name="is_active" group="rule_information">
             <default_value xsi:type="string">Active</default_value>
         </field>
-        <field name="conditions_serialized" group="conditions" source="Magento\SalesRule\Test\Fixture\SalesRuleInjectable\ConditionsSerialized" />
+        <field name="conditions_serialized" group="conditions" source="Magento\SalesRule\Test\Fixture\SalesRule\ConditionsSerialized" />
         <field name="actions_serialized" group="actions" />
         <field name="stop_rules_processing" group="actions">
             <default_value xsi:type="string">1</default_value>
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRuleInjectable/ConditionsSerialized.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule/ConditionsSerialized.php
similarity index 94%
rename from dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRuleInjectable/ConditionsSerialized.php
rename to dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule/ConditionsSerialized.php
index 4d9c65cff5333e179f7dc06f72f857f5da9baf54..d323abf4b46bd36de6a57e976c5bf1f7c8fa384d 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRuleInjectable/ConditionsSerialized.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule/ConditionsSerialized.php
@@ -4,7 +4,7 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+namespace Magento\SalesRule\Test\Fixture\SalesRule;
 
 use Magento\Mtf\Fixture\DataSource;
 
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRuleInjectable/Curl.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Curl.php
similarity index 97%
rename from dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRuleInjectable/Curl.php
rename to dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Curl.php
index 2543ccdf8197195b9cdbdc2bdb6444ef5903a784..d1c4bdee2f717d441fa26222e1eeea5045072894 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRuleInjectable/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Curl.php
@@ -4,7 +4,7 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\SalesRule\Test\Handler\SalesRuleInjectable;
+namespace Magento\SalesRule\Test\Handler\SalesRule;
 
 use Magento\Backend\Test\Handler\Conditions;
 use Magento\Mtf\Fixture\FixtureInterface;
@@ -15,7 +15,7 @@ use Magento\Mtf\Util\Protocol\CurlTransport\BackendDecorator;
 /**
  * Curl handler for creating sales rule.
  */
-class Curl extends Conditions implements SalesRuleInjectableInterface
+class Curl extends Conditions implements SalesRuleInterface
 {
     /**
      * Map of type parameter.
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRuleInjectable/SalesRuleInjectableInterface.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/SalesRuleInterface.php
similarity index 61%
rename from dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRuleInjectable/SalesRuleInjectableInterface.php
rename to dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/SalesRuleInterface.php
index 0a9c2598e8c49b16841c1efd0fda60e4d1d1d248..d638e854cf27339db2118d4ea9c9f5980ce3139b 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRuleInjectable/SalesRuleInjectableInterface.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/SalesRuleInterface.php
@@ -4,14 +4,14 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\SalesRule\Test\Handler\SalesRuleInjectable;
+namespace Magento\SalesRule\Test\Handler\SalesRule;
 
 use Magento\Mtf\Handler\HandlerInterface;
 
 /**
  * Interface SalesRuleInterface.
  */
-interface SalesRuleInjectableInterface extends HandlerInterface
+interface SalesRuleInterface extends HandlerInterface
 {
     //
 }
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Repository/SalesRuleInjectable.xml b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Repository/SalesRule.xml
similarity index 99%
rename from dev/tests/functional/tests/app/Magento/SalesRule/Test/Repository/SalesRuleInjectable.xml
rename to dev/tests/functional/tests/app/Magento/SalesRule/Test/Repository/SalesRule.xml
index 02d81f565a253de17ec04662a14bf162c330b256..897aa57c1bf7ff47a3b61b9d51e4b8782966a8ee 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Repository/SalesRuleInjectable.xml
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Repository/SalesRule.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/Magento/Mtf/Repository/etc/repository.xsd">
-    <repository class="Magento\SalesRule\Test\Repository\SalesRuleInjectable">
+    <repository class="Magento\SalesRule\Test\Repository\SalesRule">
         <dataset name="active_sales_rule_with_percent_price_discount_coupon">
             <field name="name" xsi:type="string">Shopping Cart Price Rule with Specific Coupon %isolation%</field>
             <field name="description" xsi:type="string">Description for Cart Price Rule</field>
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.php
index 24bafea36fbe42b87673f83accf39b5a70ddc666..e82c3e9bcc2c216a1185d1cb3c77f0ac9d5d6124 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.php
@@ -6,7 +6,7 @@
 
 namespace Magento\SalesRule\Test\TestCase;
 
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteEdit;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteIndex;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteNew;
@@ -115,10 +115,10 @@ class CreateSalesRuleEntityTest extends Injectable
     /**
      * Create Sales Rule Entity.
      *
-     * @param SalesRuleInjectable $salesRule
+     * @param SalesRule $salesRule
      * @return void
      */
-    public function testCreateSalesRule(SalesRuleInjectable $salesRule)
+    public function testCreateSalesRule(SalesRule $salesRule)
     {
         // Preconditions
         $this->salesRuleName = $salesRule->getName();
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/DeleteSalesRuleEntityTest.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/DeleteSalesRuleEntityTest.php
index 49f3e7655790d8cf6ec4842d2861cc55692e5a72..3dcf7ad8e3a6df646e81ade107440b57c8587887 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/DeleteSalesRuleEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/DeleteSalesRuleEntityTest.php
@@ -6,7 +6,7 @@
 
 namespace Magento\SalesRule\Test\TestCase;
 
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteEdit;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteIndex;
 use Magento\Mtf\TestCase\Injectable;
@@ -63,10 +63,10 @@ class DeleteSalesRuleEntityTest extends Injectable
     /**
      * Delete Sales Rule Entity.
      *
-     * @param SalesRuleInjectable $salesRule
+     * @param SalesRule $salesRule
      * @return void
      */
-    public function testDeleteSalesRule(SalesRuleInjectable $salesRule)
+    public function testDeleteSalesRule(SalesRule $salesRule)
     {
         // Preconditions
         $salesRule->persist();
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/UpdateSalesRuleEntityTest.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/UpdateSalesRuleEntityTest.php
index ed72d923f05b1911611a38244d9f5e2b79c5d669..93e0e862805255e0f86bb8ccd131382acc2c280f 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/UpdateSalesRuleEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/UpdateSalesRuleEntityTest.php
@@ -6,7 +6,7 @@
 
 namespace Magento\SalesRule\Test\TestCase;
 
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteEdit;
 use Magento\SalesRule\Test\Page\Adminhtml\PromoQuoteIndex;
 use Magento\Mtf\Fixture\FixtureFactory;
@@ -92,13 +92,13 @@ class UpdateSalesRuleEntityTest extends Injectable
     /**
      * Update Sales Rule Entity.
      *
-     * @param SalesRuleInjectable $salesRule
-     * @param SalesRuleInjectable $salesRuleOrigin
+     * @param SalesRule $salesRule
+     * @param SalesRule $salesRuleOrigin
      * @return void
      */
     public function testUpdateSalesRule(
-        SalesRuleInjectable $salesRule,
-        SalesRuleInjectable $salesRuleOrigin
+        SalesRule $salesRule,
+        SalesRule $salesRuleOrigin
     ) {
         // Preconditions
         $salesRuleOrigin->persist();
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/ApplySalesRuleOnBackendStep.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/ApplySalesRuleOnBackendStep.php
index 7e193a4d0ab1cc570bbbebad6dedda8c57946c6d..709e2c1644b71675224dc3941c2e4d7a1bc3ff7e 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/ApplySalesRuleOnBackendStep.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/ApplySalesRuleOnBackendStep.php
@@ -7,7 +7,7 @@
 namespace Magento\SalesRule\Test\TestStep;
 
 use Magento\Sales\Test\Page\Adminhtml\OrderCreateIndex;
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\Mtf\TestStep\TestStepInterface;
 
 /**
@@ -25,16 +25,16 @@ class ApplySalesRuleOnBackendStep implements TestStepInterface
     /**
      * SalesRule fixture.
      *
-     * @var SalesRuleInjectable
+     * @var SalesRule
      */
     protected $salesRule;
 
     /**
      * @constructor
      * @param OrderCreateIndex $orderCreateIndex
-     * @param SalesRuleInjectable $salesRule
+     * @param SalesRule $salesRule
      */
-    public function __construct(OrderCreateIndex $orderCreateIndex, SalesRuleInjectable $salesRule = null)
+    public function __construct(OrderCreateIndex $orderCreateIndex, SalesRule $salesRule = null)
     {
         $this->orderCreateIndex = $orderCreateIndex;
         $this->salesRule = $salesRule;
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/ApplySalesRuleOnFrontendStep.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/ApplySalesRuleOnFrontendStep.php
index 6bff54ec11dee9b17a78f52478fff86e8652457d..49fedf0d5d16dd7b214105d42fb4cab24e55aaa8 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/ApplySalesRuleOnFrontendStep.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/ApplySalesRuleOnFrontendStep.php
@@ -7,7 +7,7 @@
 namespace Magento\SalesRule\Test\TestStep;
 
 use Magento\Checkout\Test\Page\CheckoutCart;
-use Magento\SalesRule\Test\Fixture\SalesRuleInjectable;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 use Magento\Mtf\TestStep\TestStepInterface;
 
 /**
@@ -25,16 +25,16 @@ class ApplySalesRuleOnFrontendStep implements TestStepInterface
     /**
      * SalesRule fixture.
      *
-     * @var SalesRuleInjectable
+     * @var SalesRule
      */
     protected $salesRule;
 
     /**
      * @constructor
      * @param CheckoutCart $checkoutCart
-     * @param SalesRuleInjectable $salesRule
+     * @param SalesRule $salesRule
      */
-    public function __construct(CheckoutCart $checkoutCart, SalesRuleInjectable $salesRule = null)
+    public function __construct(CheckoutCart $checkoutCart, SalesRule $salesRule = null)
     {
         $this->checkoutCart = $checkoutCart;
         $this->salesRule = $salesRule;
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/CreateSalesRuleStep.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/CreateSalesRuleStep.php
index c458bed8659ad8e8b3d2d381a1601ecfade3e163..bda908faf26778fa05dfb90b4dac909a3d6d4902 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/CreateSalesRuleStep.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/CreateSalesRuleStep.php
@@ -51,7 +51,7 @@ class CreateSalesRuleStep implements TestStepInterface
         $result['salesRule'] = null;
         if ($this->salesRule !== null) {
             $salesRule = $this->fixtureFactory->createByCode(
-                'salesRuleInjectable',
+                'salesRule',
                 ['dataSet' => $this->salesRule]
             );
             $salesRule->persist();
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/DeleteAllSalesRuleStep.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/DeleteAllSalesRuleStep.php
index 0141a0506fd6e926987234027c894c7462c01245..98bf51e84f7c37fa0c7cf86af5024e0f7ceefe72 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/DeleteAllSalesRuleStep.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestStep/DeleteAllSalesRuleStep.php
@@ -50,6 +50,7 @@ class DeleteAllSalesRuleStep implements TestStepInterface
     public function run()
     {
         $this->promoQuoteIndex->open();
+        $this->promoQuoteIndex->getPromoQuoteGrid()->resetFilter();
         while ($this->promoQuoteIndex->getPromoQuoteGrid()->isFirstRowVisible()) {
             $this->promoQuoteIndex->getPromoQuoteGrid()->openFirstRow();
             $this->promoQuoteEdit->getFormPageActions()->delete();
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/etc/curl/di.xml b/dev/tests/functional/tests/app/Magento/SalesRule/Test/etc/curl/di.xml
index 2591249e9e02850c5123b9c66a0652a7bd5cfa00..3416929d0ab44031cbb7bef4b0d3ac7628cf9139 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/etc/curl/di.xml
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/etc/curl/di.xml
@@ -6,5 +6,5 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <preference for="Magento\SalesRule\Test\Handler\SalesRuleInjectable\SalesRuleInjectableInterface" type="\Magento\SalesRule\Test\Handler\SalesRuleInjectable\Curl" />
+    <preference for="Magento\SalesRule\Test\Handler\SalesRule\SalesRuleInterface" type="\Magento\SalesRule\Test\Handler\SalesRule\Curl" />
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleApplying.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleApplying.php
index b5631910c0d44a00f93df89cc540b56734348c1a..51476690a8897b2f9b745dc46fbab9c4a12a1955 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleApplying.php
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleApplying.php
@@ -11,15 +11,12 @@ use Magento\Catalog\Test\Page\Product\CatalogProductView;
 use Magento\Checkout\Test\Page\CheckoutCart;
 use Magento\Customer\Test\Fixture\Address;
 use Magento\Customer\Test\Fixture\Customer;
-use Magento\Customer\Test\Page\CustomerAccountLogin;
-use Magento\Customer\Test\Page\CustomerAccountLogout;
 use Magento\Tax\Test\Fixture\TaxRule;
 use Magento\Mtf\Client\BrowserInterface;
 use Magento\Mtf\Constraint\AbstractConstraint;
 use Magento\Mtf\Fixture\FixtureFactory;
 
 /**
- * Class AssertTaxRuleApplying
  * Abstract class for implementing assert applying
  */
 abstract class AssertTaxRuleApplying extends AbstractConstraint
@@ -82,8 +79,6 @@ abstract class AssertTaxRuleApplying extends AbstractConstraint
      *
      * @param FixtureFactory $fixtureFactory
      * @param TaxRule $taxRule
-     * @param CustomerAccountLogin $customerAccountLogin
-     * @param CustomerAccountLogout $customerAccountLogout
      * @param Customer $customer
      * @param CatalogProductView $catalogProductView
      * @param CheckoutCart $checkoutCart
@@ -92,14 +87,10 @@ abstract class AssertTaxRuleApplying extends AbstractConstraint
      * @param BrowserInterface $browser
      * @param TaxRule $initialTaxRule
      * @return void
-     *
-     * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function processAssert(
         FixtureFactory $fixtureFactory,
         TaxRule $taxRule,
-        CustomerAccountLogin $customerAccountLogin,
-        CustomerAccountLogout $customerAccountLogout,
         Customer $customer,
         CatalogProductView $catalogProductView,
         CheckoutCart $checkoutCart,
@@ -134,9 +125,10 @@ abstract class AssertTaxRuleApplying extends AbstractConstraint
         );
         $this->productSimple->persist();
         // Customer login
-        $customerAccountLogout->open();
-        $customerAccountLogin->open();
-        $customerAccountLogin->getLoginBlock()->login($customer);
+        $this->objectManager->create(
+            'Magento\Customer\Test\TestStep\LoginCustomerOnFrontendStep',
+            ['customer' => $customer]
+        )->run();
         // Clearing shopping cart and adding product to shopping cart
         $checkoutCart->open()->getCartBlock()->clearShoppingCart();
         $browser->open($_ENV['app_frontend_url'] . $this->productSimple->getUrlKey() . '.html');
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxCalculationTest.php b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxCalculationTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ddfd3ab0508cc3a90986eada1db016a526ba921e
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxCalculationTest.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Tax\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+use Magento\Mtf\ObjectManager;
+
+/**
+ * Steps:
+ * 1. Log in as default admin user.
+ * 2. Go to Stores > Taxes > Tax Rules.
+ * 3. Click 'Add New Tax Rule' button.
+ * 4. Assign default rates to rule.
+ * 5. Save Tax Rate.
+ * 6. Go to Products > Catalog.
+ * 7. Add new product.
+ * 8. Fill data according to dataset.
+ * 9. Save product.
+ * 10. Go to Stores > Configuration.
+ * 11. Fill Tax configuration according to data set.
+ * 12. Save tax configuration.
+ * 13. Perform all assertions.
+ *
+ * @group Tax_(CS)
+ * @ZephyrId MAGETWO-27809
+ */
+class TaxCalculationTest extends Scenario
+{
+    /* tags */
+    const MVP = 'yes';
+    const DOMAIN = 'CS';
+    /* end tags */
+
+    /**
+     * Skip failed tests.
+     *
+     * @return void
+     */
+    public static function setUpBeforeClass()
+    {
+        self::markTestIncomplete("Epic: MAGETWO-30073");
+    }
+
+    /**
+     * Runs tax calculation test.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+
+    /**
+     * Tear down after each test.
+     *
+     * @return void
+     */
+    public function tearDown()
+    {
+        $this->objectManager->create('\Magento\Tax\Test\TestStep\DeleteAllTaxRulesStep')->run();
+        $this->objectManager->create('\Magento\SalesRule\Test\TestStep\DeleteAllSalesRuleStep')->run();
+        $this->objectManager->create('\Magento\CatalogRule\Test\TestStep\DeleteAllCatalogRulesStep')->run();
+
+        // TODO: Move set default configuration to "tearDownAfterClass" method after fix bug MAGETWO-29331
+        $this->objectManager->create(
+            'Magento\Config\Test\TestStep\SetupConfigurationStep',
+            ['configData' => 'default_tax_configuration']
+        )->run();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxCalculationTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxCalculationTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9891afcdf2d0fa727302f3c047f08bea83beb05f
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxCalculationTest.xml
@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Tax\Test\TestCase\TaxCalculationTest">
+        <variation name="TaxCalculationTestVariation1">
+            <data name="description" xsi:type="string">Simple product tier price with sales rule, customer tax equals store tax and catalog price including tax</data>
+            <data name="configData" xsi:type="string">row_cat_incl_ship_excl_after_disc_on_excl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::simple_with_tier_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_equals_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">277.14</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">300.00</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">277.14</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">300.00</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">13.86</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">15.00</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">41.57</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">45.00</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">41.57</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">45.00</data>
+            <data name="prices/discount" xsi:type="string">20.79</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">15.00</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">16.24</data>
+            <data name="prices/tax" xsi:type="string">3.09</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">37.36</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">40.45</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+        <variation name="TaxCalculationTestVariation2">
+            <data name="description" xsi:type="string">Simple product group price with sales rule, customer tax greater than store tax and catalog price excluding tax</data>
+            <data name="configData" xsi:type="string">row_cat_excl_ship_incl_before_disc_on_incl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::simple_with_group_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_greater_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">90.99</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">98.61</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">90.99</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">98.61</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">90.99</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">98.61</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">272.97</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">295.83</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">272.97</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">295.83</data>
+            <data name="prices/discount" xsi:type="string">147.92</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">13.86</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">15.02</data>
+            <data name="prices/tax" xsi:type="string">24.02</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">138.91</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">162.93</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+        <variation name="TaxCalculationTestVariation3">
+            <data name="description" xsi:type="string">Simple product group price with sales rule, customer tax less than store tax and catalog price excluding tax</data>
+            <data name="configData" xsi:type="string">total_cat_excl_ship_incl_after_disc_on_excl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::simple_with_group_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_less_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">90.99</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">98.50</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">90.99</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">98.50</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">90.99</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">98.50</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">272.97</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">295.49</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">272.97</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">295.49</data>
+            <data name="prices/discount" xsi:type="string">136.49</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">13.84</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">14.98</data>
+            <data name="prices/tax" xsi:type="string">12.40</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">150.32</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">162.72</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+        <variation name="TaxCalculationTestVariation4">
+            <data name="description" xsi:type="string">Simple product special price with sales rule, customer tax less than store tax and catalog price including tax</data>
+            <data name="configData" xsi:type="string">row_cat_incl_ship_excl_before_disc_on_incl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::product_with_special_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_less_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">83.05</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">89.90</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">83.05</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">89.90</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">83.05</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">89.90</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">249.15</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">269.70</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">249.15</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">269.70</data>
+            <data name="prices/discount" xsi:type="string">134.85</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">15.00</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">16.24</data>
+            <data name="prices/tax" xsi:type="string">21.79</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">129.30</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">151.09</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+        <variation name="TaxCalculationTestVariation5">
+            <data name="description" xsi:type="string">Simple product tier price with sales rule, customer tax less than store tax and catalog price including tax</data>
+            <data name="configData" xsi:type="string">unit_cat_incl_ship_incl_before_disc_on_incl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::simple_with_tier_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_less_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">276.81</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">299.65</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">276.81</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">299.65</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">13.84</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">14.98</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">41.52</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">44.94</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">41.52</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">44.94</data>
+            <data name="prices/discount" xsi:type="string">22.47</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">13.84</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">14.98</data>
+            <data name="prices/tax" xsi:type="string">4.56</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">32.89</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">37.45</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+        <variation name="TaxCalculationTestVariation6">
+            <data name="description" xsi:type="string">Simple product special price with sales rule, customer tax equals store tax and catalog price excluding tax</data>
+            <data name="configData" xsi:type="string">total_cat_excl_ship_incl_before_disc_on_incl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::product_with_special_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_equals_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">90.00</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">97.43</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">90.00</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">97.43</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">90.00</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">97.43</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">270.00</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">292.28</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">270.00</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">292.28</data>
+            <data name="prices/discount" xsi:type="string">146.15</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">13.86</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">15.00</data>
+            <data name="prices/tax" xsi:type="string">23.42</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">137.71</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">161.13</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+        <variation name="TaxCalculationTestVariation7">
+            <data name="description" xsi:type="string">Simple product group price with sales rule, customer tax equals store tax and catalog price excluding tax</data>
+            <data name="configData" xsi:type="string">unit_cat_excl_ship_excl_after_disc_on_excl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::simple_with_group_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_equals_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">90.99</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">98.50</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">90.99</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">98.50</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">90.99</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">98.50</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">272.97</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">295.50</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">272.97</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">295.50</data>
+            <data name="prices/discount" xsi:type="string">136.49</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">15.00</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">16.24</data>
+            <data name="prices/tax" xsi:type="string">12.49</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">151.48</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">163.97</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+        <variation name="TaxCalculationTestVariation8">
+            <data name="description" xsi:type="string">Simple product special price with sales rule, customer tax greater than store tax and catalog price including tax</data>
+            <data name="configData" xsi:type="string">total_cat_incl_ship_excl_before_disc_on_excl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::simple_with_group_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_greater_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">84.06</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">91.10</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">84.06</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">91.10</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">84.06</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">91.10</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">252.18</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">273.30</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">252.18</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">273.30</data>
+            <data name="prices/discount" xsi:type="string">126.09</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">15.00</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">16.26</data>
+            <data name="prices/tax" xsi:type="string">22.38</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">141.09</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">163.47</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+        <variation name="TaxCalculationTestVariation9">
+            <data name="description" xsi:type="string">Simple product tier price with sales rule, customer tax greater than store tax and catalog price excluding tax</data>
+            <data name="configData" xsi:type="string">total_cat_excl_ship_incl_after_disc_on_incl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::simple_with_tier_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_greater_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">300.00</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">325.13</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">300.00</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">325.13</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">15.00</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">16.26</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">45.00</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">48.77</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">45.00</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">48.77</data>
+            <data name="prices/discount" xsi:type="string">24.39</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">13.86</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">15.02</data>
+            <data name="prices/tax" xsi:type="string">2.89</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">34.47</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">37.36</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+        <variation name="TaxCalculationTestVariation10">
+            <data name="description" xsi:type="string">Simple product special price with sales rule, customer tax greater than store tax and catalog price excluding tax</data>
+            <data name="configData" xsi:type="string">unit_cat_excl_ship_incl_after_disc_on_excl, display_excluding_including_tax</data>
+            <data name="product" xsi:type="string">catalogProductSimple::product_with_special_price_and_category</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="taxRule" xsi:type="string">customer_greater_store_rate</data>
+            <data name="customer/dataSet" xsi:type="string">johndoe_unique</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">90.00</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">97.54</data>
+            <data name="prices/product_view_price_excl_tax" xsi:type="string">90.00</data>
+            <data name="prices/product_view_price_incl_tax" xsi:type="string">97.54</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">90.00</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">97.54</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">270.00</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">292.62</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">270.00</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">292.62</data>
+            <data name="prices/discount" xsi:type="string">135.00</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">13.86</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">15.02</data>
+            <data name="prices/tax" xsi:type="string">12.47</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">148.86</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">161.33</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxCalculationAfterCheckoutExcludingIncludingTax" />
+            <constraint name="Magento\Tax\Test\Constraint\AssertOrderTaxOnBackendExcludingIncludingTax" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxWithCrossBorderTest.php b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxWithCrossBorderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b67edd7a4c1787025b0b0b45b126f3c3996427e4
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxWithCrossBorderTest.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Tax\Test\TestCase;
+
+use Magento\Catalog\Test\Fixture\CatalogProductSimple;
+use Magento\CatalogRule\Test\Fixture\CatalogRule;
+use Magento\Customer\Test\Fixture\Customer;
+use Magento\SalesRule\Test\Fixture\SalesRule;
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Mtf\TestCase\Injectable;
+
+/**
+ * Steps:
+ * 1. Log in as default admin user.
+ * 2. Go to Stores > Taxes > Tax Rules.
+ * 3. Click 'Add New Tax Rule' button.
+ * 4. Assign 3 different rates for different addresses
+ * 5. Save Tax Rate.
+ * 6. Go to Products > Catalog.
+ * 7. Add new product.
+ * 8. Fill data according to dataset.
+ * 9. Save product.
+ * 10. Go to Stores > Configuration.
+ * 11. Fill Tax configuration according to data set.
+ * 12. Save tax configuration.
+ * 13. Register two customers on front end that will match two different rates
+ * 14. Login with each customer and verify prices
+ *
+ * @group Tax_(CS)
+ * @ZephyrId MAGETWO-29052
+ */
+class TaxWithCrossBorderTest extends Injectable
+{
+    /* tags */
+    const MVP = 'yes';
+    const DOMAIN = 'CS';
+    /* end tags */
+
+    /**
+     * Fixture SalesRule.
+     *
+     * @var SalesRule
+     */
+    protected $salesRule;
+
+    /**
+     * Fixture CatalogRule.
+     *
+     * @var CatalogRule
+     */
+    protected $catalogRule;
+
+    /**
+     * Fixture factory.
+     *
+     * @var FixtureFactory
+     */
+    protected $fixtureFactory;
+
+    /**
+     * Prepare data.
+     *
+     * @param FixtureFactory $fixtureFactory
+     * @return array
+     */
+    public function __prepare(FixtureFactory $fixtureFactory)
+    {
+        $this->fixtureFactory = $fixtureFactory;
+
+        return ['customers' => $this->createCustomers()];
+    }
+
+    /**
+     * Injection data.
+     *
+     * @return void
+     */
+    public function __inject()
+    {
+        // TODO: Move test set up to "__prepare" method after fix bug MAGETWO-29331
+        $taxRule = $this->fixtureFactory->createByCode('taxRule', ['dataSet' => 'cross_border_tax_rule']);
+        $taxRule->persist();
+    }
+
+    /**
+     * Create customers.
+     *
+     * @return array $customers
+     */
+    protected function createCustomers()
+    {
+        $customersData = ['johndoe_unique_TX', 'johndoe_unique'];
+        $customers = [];
+        foreach ($customersData as $customerData) {
+            $customer = $this->fixtureFactory->createByCode('customer', ['dataSet' => $customerData]);
+            $customer->persist();
+            $customers[] = $customer;
+        }
+        return $customers;
+    }
+
+    /**
+     * Test product prices with tax.
+     *
+     * @param CatalogProductSimple $product
+     * @param string $configData
+     * @param SalesRule $salesRule [optional]
+     * @param CatalogRule $catalogRule [optional]
+     * @return void
+     */
+    public function test(
+        CatalogProductSimple $product,
+        $configData,
+        SalesRule $salesRule = null,
+        CatalogRule $catalogRule = null
+    ) {
+        //Preconditions
+        if ($salesRule !== null) {
+            $salesRule->persist();
+            $this->salesRule = $salesRule;
+        }
+        if ($catalogRule !== null) {
+            $catalogRule->persist();
+            $this->catalogRule = $catalogRule;
+        }
+        $this->objectManager->create(
+            'Magento\Config\Test\TestStep\SetupConfigurationStep',
+            ['configData' => $configData]
+        )->run();
+        $product->persist();
+    }
+
+    /**
+     * Tear down after test.
+     *
+     * @return void
+     */
+    public function tearDown()
+    {
+        if (isset($this->salesRule)) {
+            $this->objectManager->create('Magento\SalesRule\Test\TestStep\DeleteAllSalesRuleStep')->run();
+            $this->salesRule = null;
+        }
+        if (isset($this->catalogRule)) {
+            $this->objectManager->create('\Magento\CatalogRule\Test\TestStep\DeleteAllCatalogRulesStep')->run();
+            $this->catalogRule = null;
+        }
+
+        // TODO: Move set default configuration to "tearDownAfterClass" method after fix bug MAGETWO-29331
+        $this->objectManager->create('Magento\Tax\Test\TestStep\DeleteAllTaxRulesStep')->run();
+        $this->objectManager->create(
+            'Magento\Config\Test\TestStep\SetupConfigurationStep',
+            ['configData' => 'default_tax_configuration']
+        )->run();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxWithCrossBorderTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxWithCrossBorderTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..82218491cf409382415251e998b235429a4364c5
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/TaxWithCrossBorderTest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Tax\Test\TestCase\TaxWithCrossBorderTest">
+        <variation name="TaxWithCrossBorderTestVariation1">
+            <data name="product/dataSet" xsi:type="string">with_one_custom_option_and_category</data>
+            <data name="configData" xsi:type="string">cross_border_enabled_price_incl_tax, display_excluding_including_tax</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxWithCrossBorderApplied" />
+        </variation>
+        <variation name="TaxWithCrossBorderTestVariation2">
+            <data name="product/dataSet" xsi:type="string">product_with_category</data>
+            <data name="salesRule/dataSet" xsi:type="string">cart_rule</data>
+            <data name="configData" xsi:type="string">cross_border_enabled_price_incl_tax, display_excluding_including_tax</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxWithCrossBorderApplied" />
+        </variation>
+        <variation name="TaxWithCrossBorderTestVariation3">
+            <data name="product/dataSet" xsi:type="string">product_with_category</data>
+            <data name="catalogRule/dataSet" xsi:type="string">catalog_price_rule_priority_0</data>
+            <data name="configData" xsi:type="string">cross_border_enabled_price_incl_tax, display_excluding_including_tax</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxWithCrossBorderApplied" />
+        </variation>
+        <variation name="TaxWithCrossBorderTestVariation4">
+            <data name="product/dataSet" xsi:type="string">product_with_special_price_and_category</data>
+            <data name="configData" xsi:type="string">cross_border_enabled_price_incl_tax, display_excluding_including_tax</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxWithCrossBorderApplied" />
+        </variation>
+        <variation name="TaxWithCrossBorderTestVariation5">
+            <data name="product/dataSet" xsi:type="string">product_with_category</data>
+            <data name="configData" xsi:type="string">cross_border_enabled_price_excl_tax, display_excluding_including_tax</data>
+            <constraint name="Magento\Tax\Test\Constraint\AssertTaxWithCrossBorderNotApplied" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestStep/DeleteAllTaxRulesStep.php b/dev/tests/functional/tests/app/Magento/Tax/Test/TestStep/DeleteAllTaxRulesStep.php
index 69b0cb8e48754397a8a3d56873fcc721f7e6269a..d24b2ca4c4de8cd5cb362704b3c78c2ad4905fb4 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestStep/DeleteAllTaxRulesStep.php
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestStep/DeleteAllTaxRulesStep.php
@@ -51,6 +51,7 @@ class DeleteAllTaxRulesStep implements TestStepInterface
     public function run()
     {
         $this->taxRuleIndexPage->open();
+        $this->taxRuleIndexPage->getTaxRuleGrid()->resetFilter();
         while ($this->taxRuleIndexPage->getTaxRuleGrid()->isFirstRowVisible()) {
             $this->taxRuleIndexPage->getTaxRuleGrid()->openFirstRow();
             $this->taxRuleNewPage->getFormPageActions()->delete();
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/etc/testcase.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c47afe1a6a889a0df215473b24539396e0ff8b77
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/etc/testcase.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/Magento/Mtf/TestCase/etc/testcase.xsd">
+    <scenario name="TaxCalculationTest" firstStep="setupConfiguration">
+        <step name="setupConfiguration" module="Magento_Config" next="createSalesRule" />
+        <step name="createSalesRule" module="Magento_SalesRule" next="createCatalogRule" />
+        <step name="createCatalogRule" module="Magento_CatalogRule" next="createTaxRule" />
+        <step name="createTaxRule" module="Magento_Tax" next="createProduct" />
+        <step name="createProduct" module="Magento_Catalog" next="createCustomer" />
+        <step name="createCustomer" module="Magento_Customer" next="loginCustomerOnFrontend" />
+        <step name="loginCustomerOnFrontend" module="Magento_Customer" />
+    </scenario>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Adminhtml/Edit/CustomerForm.xml b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Adminhtml/Edit/CustomerForm.xml
index c00338cd02750df3c73fca736d49307814d8e286..d6a8abbf78b151df64f7fee7e5dcd34d1674c15a 100644
--- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Adminhtml/Edit/CustomerForm.xml
+++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Adminhtml/Edit/CustomerForm.xml
@@ -8,7 +8,7 @@
 <tabs>
     <wishlist>
         <class>\Magento\Wishlist\Test\Block\Adminhtml\Customer\Edit\Tab\Wishlist</class>
-        <selector>#tab_wishlist</selector>
+        <selector>#tab_block_wishlist</selector>
         <strategy>css selector</strategy>
     </wishlist>
 </tabs>
diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AddProductsToCartFromCustomerWishlistOnFrontendTest.xml b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AddProductsToCartFromCustomerWishlistOnFrontendTest.xml
index 1cf13be71e2cd00324fbc5303d2a6bd31230fa33..d88f6d3054641ffa76b70d4b5593bcd59f3aede1 100644
--- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AddProductsToCartFromCustomerWishlistOnFrontendTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AddProductsToCartFromCustomerWishlistOnFrontendTest.xml
@@ -27,7 +27,7 @@
             <constraint name="Magento\Wishlist\Test\Constraint\AssertWishlistIsEmpty" />
         </variation>
         <variation name="AddProductsToCartFromCustomerWishlistOnFrontendTestVariation4">
-            <data name="products" xsi:type="string">groupedProduct::three_simple_products_default_qty</data>
+            <data name="products" xsi:type="string">groupedProduct::three_simple_products</data>
             <data name="qty" xsi:type="string">-</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertProductQtyInShoppingCart" />
             <constraint name="Magento\Wishlist\Test\Constraint\AssertProductsIsAbsentInWishlist" />
diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/ShareWishlistEntityTest.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/ShareWishlistEntityTest.php
index cce7949f993f63e0312573a558e50510fee1fc84..2b96619bcae14f8186d73bd61782a213238bd33e 100644
--- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/ShareWishlistEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/ShareWishlistEntityTest.php
@@ -11,34 +11,26 @@ use Magento\Catalog\Test\Page\Product\CatalogProductView;
 use Magento\Cms\Test\Page\CmsIndex;
 use Magento\Customer\Test\Fixture\Customer;
 use Magento\Customer\Test\Page\CustomerAccountIndex;
-use Magento\Customer\Test\Page\CustomerAccountLogin;
-use Magento\Customer\Test\Page\CustomerAccountLogout;
 use Magento\Wishlist\Test\Page\WishlistIndex;
 use Magento\Wishlist\Test\Page\WishlistShare;
 use Magento\Mtf\Client\BrowserInterface;
 use Magento\Mtf\TestCase\Injectable;
 
 /**
- * Test Creation for ShareWishlistEntity
- *
- * Test Flow:
- *
  * Preconditions:
- * 1. Create Customer Account
- * 2. Create product
+ * 1. Create Customer Account.
+ * 2. Create product.
  *
  * Steps:
- * 1. Login to frontend as a Customer
- * 2. Add product to Wish List
- * 3. Click "Share Wish List" button
- * 4. Fill in all data according to data set
- * 5. Click "Share Wishlist" button
- * 6. Perform all assertions
+ * 1. Login to frontend as a Customer.
+ * 2. Add product to Wish List.
+ * 3. Click "Share Wish List" button.
+ * 4. Fill in all data according to data set.
+ * 5. Click "Share Wishlist" button.
+ * 6. Perform all assertions.
  *
  * @group Wishlist_(CS)
  * @ZephyrId MAGETWO-23394
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class ShareWishlistEntityTest extends Injectable
 {
@@ -49,56 +41,42 @@ class ShareWishlistEntityTest extends Injectable
     /* end tags */
 
     /**
-     * Cms index page
+     * Cms index page.
      *
      * @var CmsIndex
      */
     protected $cmsIndex;
 
     /**
-     * Customer login page
-     *
-     * @var CustomerAccountLogin
-     */
-    protected $customerAccountLogin;
-
-    /**
-     * Customer account index page
+     * Customer account index page.
      *
      * @var CustomerAccountIndex
      */
     protected $customerAccountIndex;
 
     /**
-     * Product view page
+     * Product view page.
      *
      * @var CatalogProductView
      */
     protected $catalogProductView;
 
     /**
-     * Page CustomerAccountLogout
-     *
-     * @var CustomerAccountLogout
-     */
-    protected $customerAccountLogout;
-
-    /**
-     * Wishlist index page
+     * Wishlist index page.
      *
      * @var WishlistIndex
      */
     protected $wishlistIndex;
 
     /**
-     * Wishlist share page
+     * Wishlist share page.
      *
      * @var WishlistShare
      */
     protected $wishlistShare;
 
     /**
-     * Prepare data
+     * Prepare data.
      *
      * @param Customer $customer
      * @param CatalogProductSimple $product
@@ -118,12 +96,10 @@ class ShareWishlistEntityTest extends Injectable
     }
 
     /**
-     * Injection data
+     * Inject pages.
      *
      * @param CmsIndex $cmsIndex
-     * @param CustomerAccountLogin $customerAccountLogin
      * @param CustomerAccountIndex $customerAccountIndex
-     * @param CustomerAccountLogout $customerAccountLogout
      * @param CatalogProductView $catalogProductView
      * @param WishlistIndex $wishlistIndex
      * @param WishlistShare $wishlistShare
@@ -131,24 +107,20 @@ class ShareWishlistEntityTest extends Injectable
      */
     public function __inject(
         CmsIndex $cmsIndex,
-        CustomerAccountLogin $customerAccountLogin,
         CustomerAccountIndex $customerAccountIndex,
-        CustomerAccountLogout $customerAccountLogout,
         CatalogProductView $catalogProductView,
         WishlistIndex $wishlistIndex,
         WishlistShare $wishlistShare
     ) {
         $this->cmsIndex = $cmsIndex;
-        $this->customerAccountLogin = $customerAccountLogin;
         $this->customerAccountIndex = $customerAccountIndex;
-        $this->customerAccountLogout = $customerAccountLogout;
         $this->catalogProductView = $catalogProductView;
         $this->wishlistIndex = $wishlistIndex;
         $this->wishlistShare = $wishlistShare;
     }
 
     /**
-     * Share wish list
+     * Share wish list.
      *
      * @param BrowserInterface $browser
      * @param Customer $customer
@@ -174,27 +146,16 @@ class ShareWishlistEntityTest extends Injectable
     }
 
     /**
-     * Login customer
+     * Login customer.
      *
      * @param Customer $customer
      * @return void
      */
     protected function loginCustomer(Customer $customer)
     {
-        $this->cmsIndex->open();
-        if (!$this->cmsIndex->getLinksBlock()->isLinkVisible('Log Out')) {
-            $this->cmsIndex->getLinksBlock()->openLink("Log In");
-            $this->customerAccountLogin->getLoginBlock()->login($customer);
-        }
-    }
-
-    /**
-     * Log out after test
-     *
-     * @return void
-     */
-    public function tearDown()
-    {
-        $this->customerAccountLogout->open();
+        $this->objectManager->create(
+            'Magento\Customer\Test\TestStep\LoginCustomerOnFrontendStep',
+            ['customer' => $customer]
+        )->run();
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/ShareWishlistEntityTest.xml b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/ShareWishlistEntityTest.xml
index 59dccc42d293c1a3a1259565da59e9408c390de5..8dd654cf89bbd1065185ba2a345c5fe44f3cf65f 100644
--- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/ShareWishlistEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/ShareWishlistEntityTest.xml
@@ -6,11 +6,11 @@
  */
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
-  <testCase name="Magento\Wishlist\Test\TestCase\ShareWishlistEntityTest">
-    <variation name="ShareWishlistEntityTestVariation1">
-      <data name="sharingInfo/emails" xsi:type="string">JohnDoe123456789@example.com,JohnDoe987654321@example.com,JohnDoe123456abc@example.com</data>
-      <data name="sharingInfo/message" xsi:type="string">Sharing message.</data>
-      <constraint name="Magento\Wishlist\Test\Constraint\AssertWishlistShareMessage"/>
-    </variation>
-  </testCase>
+    <testCase name="Magento\Wishlist\Test\TestCase\ShareWishlistEntityTest">
+        <variation name="ShareWishlistEntityTestVariation1">
+            <data name="sharingInfo/emails" xsi:type="string">JohnDoe123456789@example.com,JohnDoe987654321@example.com,JohnDoe123456abc@example.com</data>
+            <data name="sharingInfo/message" xsi:type="string">Sharing message.</data>
+            <constraint name="Magento\Wishlist\Test\Constraint\AssertWishlistShareMessage" />
+        </variation>
+    </testCase>
 </config>
diff --git a/dev/tests/functional/utils/config/ee_modules.yml.dist b/dev/tests/functional/utils/config/ee_modules.yml.dist
deleted file mode 100644
index 33bd56450a7a26ceb8241a97495dbc1c23675c6e..0000000000000000000000000000000000000000
--- a/dev/tests/functional/utils/config/ee_modules.yml.dist
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright © 2015 Magento. All rights reserved.
-# See COPYING.txt for license details.
-- Magento_Backend
-- Magento_Catalog
-- Magento_Customer
\ No newline at end of file
diff --git a/dev/tests/functional/utils/config/generator_config.yml.dist b/dev/tests/functional/utils/config/generator_config.yml.dist
deleted file mode 100644
index 14dffd2306b796de983017366d6b6b26e2f863e9..0000000000000000000000000000000000000000
--- a/dev/tests/functional/utils/config/generator_config.yml.dist
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright © 2015 Magento. All rights reserved.
-# See COPYING.txt for license details.
-# Generator running options, in case "generate_specified_modules" is set to "yes" then specified file is used
-generate_specified_modules: no
-specified_modules: dev\tests\functional\utils\config\ee_modules.yml.dist
-
-# Fallback path configurations
-tests_fallback:
-    1:
-        path: tests/app
-
-# Handler priority configuration
-handler_fallback:
-    1: Curl
-    2: Direct
-    3: Ui
\ No newline at end of file