diff --git a/dev/tests/functional/composer.json b/dev/tests/functional/composer.json
index 6514ced02709b700ad494d85a0b8dced6a798737..5f941b700f5402a510723d4e33ae4bfb570b8467 100644
--- a/dev/tests/functional/composer.json
+++ b/dev/tests/functional/composer.json
@@ -1,6 +1,6 @@
 {
     "require": {
-        "magento/mtf": "1.0.0-rc33",
+        "magento/mtf": "1.0.0-rc35",
         "php": "~5.5.0|~5.6.0|~7.0.0",
         "phpunit/phpunit": "4.1.0",
         "phpunit/phpunit-selenium": ">=1.2"
diff --git a/dev/tests/functional/etc/events.xml b/dev/tests/functional/etc/events.xml
index 76fddfc79e67510e30f9d1b773dd16bf52214948..e838968e1c2a20a92b0431055088cf24f249aded 100644
--- a/dev/tests/functional/etc/events.xml
+++ b/dev/tests/functional/etc/events.xml
@@ -6,4 +6,9 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="events.xsd">
+    <preset name="base">
+        <observer class="Magento\Mtf\System\Observer\WebapiResponse">
+            <tag name="webapi_failed"/>
+        </observer>
+    </preset>
 </config>
diff --git a/dev/tests/functional/lib/Magento/Mtf/System/Observer/WebapiResponse.php b/dev/tests/functional/lib/Magento/Mtf/System/Observer/WebapiResponse.php
new file mode 100644
index 0000000000000000000000000000000000000000..2956d7c0269bde89c4b25d89734bbd535497ec7d
--- /dev/null
+++ b/dev/tests/functional/lib/Magento/Mtf/System/Observer/WebapiResponse.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Mtf\System\Observer;
+
+use Magento\Mtf\System\Event\Event;
+
+/**
+ * Observer for obtaining response of web api handler.
+ */
+class WebapiResponse extends AbstractObserver
+{
+    /**
+     * File name of response source.
+     */
+    const FILE_NAME = 'webapi_response.log';
+
+    /**
+     * Collect response source artifact to storage.
+     *
+     * @param Event $event
+     * @return void
+     */
+    public function process(Event $event)
+    {
+        $directory = $this->createDestinationDirectory('webapi-response');
+        $this->logger->log(json_encode($event->getSubjects()[0]), $directory . '/' . $event->getIdentifier() . '.json');
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Authorizenet/Test/TestCase/OnePageCheckoutTest.xml
index 1ccc6bde71ecff23979d44f995e55f7300d3680d..74541d4f5662e088e0aee224a14701b6ed7c4035 100644
--- a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Authorizenet/Test/TestCase/OnePageCheckoutTest.xml
@@ -7,7 +7,7 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Checkout\Test\TestCase\OnePageCheckoutTest">
-        <variation name="OnePageCheckoutTestVariation17" summary="Check Out as a Guest with Authorize.Net and Offline Shipping method" ticketId="MAGETWO-12832">
+        <variation name="OnePageCheckoutAuthorizenetTestVariation1" summary="Check Out as a Guest with Authorize.Net and Offline Shipping method" ticketId="MAGETWO-12832">
             <data name="products" xsi:type="string">catalogProductSimple::product_10_dollar, configurableProduct::with_one_option, bundleProduct::bundle_fixed_100_dollar_product</data>
             <data name="taxRule" xsi:type="string">us_ca_ny_rule</data>
             <data name="customer/dataset" xsi:type="string">default</data>
diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Cache/Additional.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Cache/Additional.php
index 605afd986421b6a62248c9c0719f59fd47d41402..291174b60bbd43f125ac243fba8b5e3a30c74518 100644
--- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Cache/Additional.php
+++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Cache/Additional.php
@@ -19,7 +19,7 @@ class Additional extends Block
      *
      * @var string
      */
-    protected $flushButton = './/div/button[normalize-space(.)= "%s"]';
+    protected $flushButton = './/button[normalize-space(.)= "%s"]';
 
     /**
      * Flush cache in 'Additional Cache Management'.
diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Page/Adminhtml/AdminCache.xml b/dev/tests/functional/tests/app/Magento/Backend/Test/Page/Adminhtml/AdminCache.xml
index ecfd99d31c1e93bfb1533143b41672d6aeae4a64..bb9fc78299f5ddecdcc0f1baa66690879baef977 100644
--- a/dev/tests/functional/tests/app/Magento/Backend/Test/Page/Adminhtml/AdminCache.xml
+++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Page/Adminhtml/AdminCache.xml
@@ -9,6 +9,6 @@
     <page name="AdminCache" area="Adminhtml" mca="admin/cache/" module="Magento_Backend">
         <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages .messages" strategy="css selector"/>
         <block name="actionsBlock" class="Magento\Backend\Test\Block\Cache" locator="div.page-actions" strategy="css selector"/>
-        <block name="additionalBlock" class="Magento\Backend\Test\Block\Cache\Additional" locator="div.fieldset.additional-cache-management" strategy="css selector"/>
+        <block name="additionalBlock" class="Magento\Backend\Test\Block\Cache\Additional" locator="div.additional-cache-management" strategy="css selector"/>
     </page>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct.xml
index 6a9b0ac7f9b8509c077a9ecb509643f4015966a0..6912520e995e2c9f315df8b7793dfd1b5e85f1d4 100644
--- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct.xml
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct.xml
@@ -7,50 +7,23 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/Magento/Mtf/Repository/etc/repository.xsd">
     <repository class="Magento\Bundle\Test\Repository\BundleProduct">
-        <dataset name="BundleDynamic_sku_1073507449">
-            <field name="sku" xsi:type="string">BundleDynamic_sku_10735074493</field>
-            <field name="name" xsi:type="string">BundleDynamic 1073507449</field>
+        <dataset name="default">
+            <field name="name" xsi:type="string">Bundle dynamic product %isolation%</field>
+            <field name="url_key" xsi:type="string">bundle-dynamic-product-%isolation%</field>
+            <field name="sku" xsi:type="string">sku_bundle_dynamic_product_%isolation%</field>
+            <field name="sku_type" xsi:type="string">Dynamic</field>
+            <field name="price_type" xsi:type="string">Dynamic</field>
             <field name="price" xsi:type="array">
-                <item name="price_from" xsi:type="string">1</item>
-                <item name="price_to" xsi:type="string">2</item>
-            </field>
-            <field name="short_description" xsi:type="string" />
-            <field name="description" xsi:type="string"/>
-            <field name="tax_class_id" xsi:type="array">
-                <item name="dataset" xsi:type="string">taxable_goods</item>
+                <item name="dataset" xsi:type="string">bundle_dynamic_with_category</item>
             </field>
-            <field name="sku_type" xsi:type="string">0</field>
-            <field name="price_type" xsi:type="string">0</field>
-            <field name="weight_type" xsi:type="string">0</field>
-            <field name="status" xsi:type="string">Product online</field>
-            <field name="shipment_type" xsi:type="string">1</field>
-            <field name="url_key" xsi:type="string">bundle-dynamic-product-%isolation%</field>
-            <field name="mtf_dataset_name" xsi:type="string">BundleDynamic_sku_1073507449</field>
             <field name="website_ids" xsi:type="array">
                 <item name="0" xsi:type="string">Main Website</item>
             </field>
-        </dataset>
-
-        <dataset name="BundleDynamic_sku_215249172">
-            <field name="sku" xsi:type="string">BundleDynamic_sku_215249172</field>
-            <field name="name" xsi:type="string">BundleDynamic 215249172</field>
-            <field name="price" xsi:type="array">
-                <item name="price_from" xsi:type="string">3</item>
-                <item name="price_to" xsi:type="string">4</item>
-            </field>
-            <field name="short_description" xsi:type="string" />
-            <field name="description" xsi:type="string" />
-            <field name="tax_class_id" xsi:type="array">
-                <item name="dataset" xsi:type="string">taxable_goods</item>
+            <field name="bundle_selections" xsi:type="array">
+                <item name="dataset" xsi:type="string">default_dynamic</item>
             </field>
-            <field name="sku_type" xsi:type="string">0</field>
-            <field name="weight_type" xsi:type="string">0</field>
-            <field name="price_type" xsi:type="string">0</field>
-            <field name="shipment_type" xsi:type="string">1</field>
-            <field name="url_key" xsi:type="string">bundle-dynamic-product-%isolation%</field>
-            <field name="mtf_dataset_name" xsi:type="string">BundleDynamic_sku_215249172</field>
-            <field name="website_ids" xsi:type="array">
-                <item name="0" xsi:type="string">Main Website</item>
+            <field name="checkout_data" xsi:type="array">
+                <item name="dataset" xsi:type="string">bundle_default</item>
             </field>
         </dataset>
 
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/DeleteProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/DeleteProductEntityTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f86da3b3a9d699120caaeba904340e2e463d03fe
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/DeleteProductEntityTest.xml
@@ -0,0 +1,25 @@
+<?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\Catalog\Test\TestCase\Product\DeleteProductEntityTest">
+        <variation name="DeleteProductEntityTestVariation4">
+            <data name="products" xsi:type="string">bundleProduct::bundle_dynamic_product</data>
+            <data name="isRequired" xsi:type="string">Yes</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" />
+        </variation>
+        <variation name="DeleteProductEntityTestVariation5">
+            <data name="products" xsi:type="string">bundleProduct::bundle_fixed_product</data>
+            <data name="isRequired" xsi:type="string">No</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..475ac884e5d4ba04d217c016c3baad7f5cd42bb8
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
@@ -0,0 +1,16 @@
+<?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\Checkout\Test\TestCase\DeleteProductFromMiniShoppingCartTest" summary="Delete Bundle Product from Mini Shopping Cart" ticketId="MAGETWO-29104">
+        <variation name="DeleteBundleProductFromMiniShoppingCartTestVariation">
+            <data name="products" xsi:type="string">bundleProduct::default</data>
+            <data name="deletedProductIndex" xsi:type="string">0</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Price.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Price.php
index 20d3e9d4f7cac01adb7bbebe555fcee453fb25fa..c8b8264673ca2e00d2783bc6eba98b42a6852d20 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Price.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Price.php
@@ -27,7 +27,7 @@ class Price extends \Magento\Catalog\Test\Block\AbstractPriceBlock
             'selector' => '.special-price .price',
         ],
         'old_price' => [
-            'selector' => '.old-price .price-wrapper',
+            'selector' => '.old-price .price-wrapper ',
         ],
         'price_from' => [
             'selector' => '.price-from .price',
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
index 1002ab12091aa4284f5d745939cf5fb3c2204b24..95af5e8d573b95ae0998c6049ef8439077fbf474 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
@@ -140,6 +140,13 @@ class View extends AbstractConfigureBlock
      */
     protected $successMessage = '[data-ui-id$=message-success]';
 
+    /**
+     * Locator for page with ajax loading state.
+     *
+     * @var string
+     */
+    protected $ajaxLoading = 'body.ajax-loading';
+
     /**
      * Get block price.
      *
@@ -393,4 +400,14 @@ class View extends AbstractConfigureBlock
     {
         $this->_rootElement->find(sprintf($this->tabSelector, $name), Locator::SELECTOR_XPATH)->click();
     }
+
+    /**
+     * Wait loading block.
+     *
+     * @return void
+     */
+    public function waitLoader()
+    {
+        $this->waitForElementNotVisible($this->ajaxLoading);
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeOptionsOnProductForm.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeOptionsOnProductForm.php
index 60f0df41ed6bb3691ce512d632457720494b3e85..ec2f9acaaad0f1593d516e047e36dfad9c60997c 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeOptionsOnProductForm.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeOptionsOnProductForm.php
@@ -6,28 +6,57 @@
 
 namespace Magento\Catalog\Test\Constraint;
 
+use Magento\Mtf\Fixture\InjectableFixture;
 use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\Catalog\Test\Fixture\CatalogProductAttribute;
+use Magento\Catalog\Test\Page\Adminhtml\CatalogProductEdit;
+use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex;
 
 /**
- * Class AssertAttributeOptionsOnProductForm
+ * Assert all product attribute options on product creation form.
  */
 class AssertAttributeOptionsOnProductForm extends AbstractConstraint
 {
     /**
      * Assert all product attribute options on product creation form.
      *
+     * @param InjectableFixture $product
+     * @param CatalogProductIndex $productGrid
+     * @param CatalogProductAttribute $attribute
+     * @param CatalogProductEdit $productEdit
      * @return void
      */
-    public function processAssert()
-    {
-        //
+    public function processAssert(
+        InjectableFixture $product,
+        CatalogProductIndex $productGrid,
+        CatalogProductAttribute $attribute,
+        CatalogProductEdit $productEdit
+    ) {
+        $productGrid->open();
+        $productGrid->getProductGrid()->searchAndOpen(['sku' => $product->getSku()]);
+
+        $attributeOptions = $attribute->getOptions();
+        $options[] = $attribute->getFrontendLabel();
+        foreach ($attributeOptions as $option) {
+            $options[] = $option['admin'];
+        }
+        $productAttributeOptions = $productEdit->getProductForm()->getAttributeElement($attribute)->getText();
+        $productOptions = explode("\n", $productAttributeOptions);
+        $diff = array_diff($options, $productOptions);
+
+        \PHPUnit_Framework_Assert::assertTrue(
+            empty($diff),
+            "Products attribute options are absent on product form: " . implode(', ', $diff)
+        );
     }
 
     /**
+     * Returns a string representation of the object.
+     *
      * @return string
      */
     public function toString()
     {
-        //
+        return 'All product attribute options are visible on product creation form.';
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSearchableByLabel.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSearchableByLabel.php
deleted file mode 100644
index fc84ae52d8a084bfdfc65444dc50cd52a2f7ca49..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSearchableByLabel.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Catalog\Test\Constraint;
-
-use Magento\Mtf\Constraint\AbstractConstraint;
-
-/**
- * Class AssertAttributeSearchableByLabel
- */
-class AssertAttributeSearchableByLabel extends AbstractConstraint
-{
-    /**
-     * Assert that product attribute is searchable on Frontend.
-     *
-     * @return void
-     */
-    public function processAssert()
-    {
-        //
-    }
-
-    /**
-     * @return string
-     */
-    public function toString()
-    {
-        //
-    }
-}
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeIsUsedPromoRules.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeIsUsedPromoRules.php
deleted file mode 100644
index a26a88439a0f53feeb7cbc1f62c78ab359e6e9f2..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeIsUsedPromoRules.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Catalog\Test\Constraint;
-
-use Magento\Mtf\Constraint\AbstractConstraint;
-
-/**
- * Class AssertProductAttributeIsUsedPromoRules
- */
-class AssertProductAttributeIsUsedPromoRules extends AbstractConstraint
-{
-    /**
-     * Assert that product attribute can be used on promo rules conditions.
-     *
-     * @return void
-     */
-    public function processAssert()
-    {
-        //
-    }
-
-    /**
-     * @return string
-     */
-    public function toString()
-    {
-        //
-    }
-}
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml
index c2606db97bb6dbeb83d5c1f47d9b9f3d22ff48ad..6c9fb2a326500be7e266b1b2114085eed7765695 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml
@@ -38,7 +38,7 @@
         <field name="is_comparable" is_required="" group="frontend-properties" />
         <field name="is_visible_on_front" is_required="" group="frontend-properties" />
         <field name="is_html_allowed_on_front" is_required="" group="frontend-properties" />
-        <field name="is_used_for_price_rules" is_required="" group="frontend-properties" />
+        <field name="is_used_for_promo_rules" is_required="" group="frontend-properties" />
         <field name="is_filterable_in_search" is_required="" group="frontend-properties" />
         <field name="used_in_product_listing" is_required="" group="frontend-properties" />
         <field name="used_for_sort_by" is_required="" group="frontend-properties" />
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductAttribute/Curl.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductAttribute/Curl.php
index 04baee216f3667fb923a20b9cec51ccf0f275294..169eb6805b3d38d984a20863933a6cc3f33d0272 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductAttribute/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductAttribute/Curl.php
@@ -42,7 +42,11 @@ class Curl extends AbstractCurl implements CatalogProductAttributeInterface
             'No' => 0,
             'Filterable (with results)' => 1,
             'Filterable (no results)' => 2
-        ]
+        ],
+        'is_used_for_promo_rules' => [
+            'No' => 0,
+            'Yes' => 1,
+        ],
     ];
 
     /**
@@ -59,10 +63,10 @@ class Curl extends AbstractCurl implements CatalogProductAttributeInterface
 
         if (isset($data['options'])) {
             foreach ($data['options'] as $key => $values) {
+                $index = 'option_' . $key;
                 if ($values['is_default'] == 'Yes') {
-                    $data['default'][] = $values['view'];
+                    $data['default'][] = $index;
                 }
-                $index = 'option_' . $key;
                 $data['option']['value'][$index] = [$values['admin'], $values['view']];
                 $data['option']['order'][$index] = $key;
             }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductSimple/Curl.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductSimple/Curl.php
index 0200bb8373530d849e38c74f8530a327fa7ae1ef..8ca825b8df56217bd1488e6f16401f403d19efeb 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductSimple/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductSimple/Curl.php
@@ -404,6 +404,9 @@ class Curl extends AbstractCurl implements CatalogProductSimpleInterface
      */
     protected function createProduct(array $data, array $config)
     {
+        $config['create_url_params']['set'] = isset($data['product']['attribute_set_id'])
+            ? $data['product']['attribute_set_id']
+            : $config['create_url_params']['set'];
         $url = $this->getUrl($config);
         $curl = new BackendDecorator(new CurlTransport(), $this->_configuration);
         $curl->addOption(CURLOPT_HEADER, 1);
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/Category/Webapi.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/Category/Webapi.php
index eaee68128cdac506c9909860b33778053e029a1c..340f0f0f8793a654095e6089e2aeb1be5fe2b661 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/Category/Webapi.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/Category/Webapi.php
@@ -78,7 +78,7 @@ class Webapi extends AbstractWebapi implements CategoryInterface
         $this->webapiTransport->close();
 
         if (empty($response['id'])) {
-            $this->eventManager->dispatchEvent(['curl_failed'], [$response]);
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
             throw new \Exception('Category creation by webapi handler was not successful!');
         }
 
@@ -147,6 +147,7 @@ class Webapi extends AbstractWebapi implements CategoryInterface
                 $this->webapiTransport->close();
 
                 if ('true' != $response) {
+                    $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
                     throw new \Exception('Assign product to category was not successful!');
                 }
             }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogAttributeSet.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogAttributeSet.xml
index 3d89c92046b048bb62f39a09f44ffeea350a9ffe..e51d91e2a6d862518511ff8bb5deb8973d2edbdc 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogAttributeSet.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogAttributeSet.xml
@@ -28,5 +28,15 @@
                 <item name="dataset" xsi:type="string">attribute_type_fpt</item>
             </field>
         </dataset>
+
+        <dataset name="custom_attribute_set_with_colors">
+            <field name="attribute_set_name" xsi:type="string">Custom_attribute_set_with_colors_%isolation%</field>
+            <field name="skeleton_set" xsi:type="array">
+                <item name="dataset" xsi:type="string">default</item>
+            </field>
+            <field name="assigned_attributes" xsi:type="array">
+                <item name="dataset" xsi:type="string">color_for_promo_rules</item>
+            </field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductAttribute.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductAttribute.xml
index 82f92677fd218755c054785d7bc40ccf9ed8eea0..9ef0bcfd31196057111439f69587c7f090dc53b0 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductAttribute.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductAttribute.xml
@@ -96,6 +96,31 @@
             </field>
         </dataset>
 
+        <dataset name="color_for_promo_rules">
+            <field name="frontend_label" xsi:type="string">color_%isolation%</field>
+            <field name="attribute_code" xsi:type="string">color_%isolation%</field>
+            <field name="frontend_input" xsi:type="string">Dropdown</field>
+            <field name="is_required" xsi:type="string">No</field>
+            <field name="is_used_for_promo_rules" xsi:type="string">Yes</field>
+            <field name="options" xsi:type="array">
+                <item name="0" xsi:type="array">
+                    <item name="is_default" xsi:type="string">Yes</item>
+                    <item name="admin" xsi:type="string">red</item>
+                    <item name="view" xsi:type="string">red_%isolation%</item>
+                </item>
+                <item name="1" xsi:type="array">
+                    <item name="is_default" xsi:type="string">No</item>
+                    <item name="admin" xsi:type="string">green</item>
+                    <item name="view" xsi:type="string">green_%isolation%</item>
+                </item>
+                <item name="2" xsi:type="array">
+                    <item name="is_default" xsi:type="string">No</item>
+                    <item name="admin" xsi:type="string">blue</item>
+                    <item name="view" xsi:type="string">blue_%isolation%</item>
+                </item>
+            </field>
+        </dataset>
+
         <dataset name="size">
             <field name="frontend_label" xsi:type="string">size_%isolation%</field>
             <field name="attribute_code" xsi:type="string">size_%isolation%</field>
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 fb8182b782d7786ef8cb3e74d31db0a66830dbf9..6be4a2275e35365d10655a382d0fdb93b265f618 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
@@ -35,6 +35,61 @@
             </field>
         </dataset>
 
+        <dataset name="product_with_special_symbols_in_name">
+            <field name="attribute_set_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">default</item>
+            </field>
+            <field name="name" xsi:type="string">Product \&#39;!@#$%^&amp;*()+:;\\|}{][?=-~` %isolation%</field>
+            <field name="sku" xsi:type="string">sku_simple_product_%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">25</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">560</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">simple-product-%isolation%</field>
+            <field name="checkout_data" xsi:type="array">
+                <item name="dataset" xsi:type="string">simple_order_default</item>
+            </field>
+        </dataset>
+
+        <dataset name="product_with_custom_color_attribute">
+            <field name="name" xsi:type="string">Simple Product %isolation%</field>
+            <field name="sku" xsi:type="string">simple_product_%isolation%</field>
+            <field name="attribute_set_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">custom_attribute_set_with_colors</item>
+            </field>
+            <field name="quantity_and_stock_status" xsi:type="array">
+                <item name="qty" xsi:type="string">25</item>
+                <item name="is_in_stock" xsi:type="string">In Stock</item>
+            </field>
+            <field name="weight" xsi:type="string">1</field>
+            <field name="price" xsi:type="array">
+                <item name="value" xsi:type="string">560</item>
+                <item name="dataset" xsi:type="string" />
+            </field>
+            <field name="category_ids" xsi:type="array">
+                <item name="dataset" xsi:type="string">default_subcategory</item>
+            </field>
+            <field name="website_ids" xsi:type="array">
+                <item name="0" xsi:type="string">Main Website</item>
+            </field>
+            <field name="checkout_data" xsi:type="array">
+                <item name="dataset" xsi:type="string">simple_order_default</item>
+            </field>
+            <field name="url_key" xsi:type="string">simple-product-%isolation%</field>
+        </dataset>
+
         <dataset name="product_10_dollar">
             <field name="attribute_set_id" xsi:type="array">
                 <item name="dataset" xsi:type="string">default</item>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual/CheckoutData.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual/CheckoutData.xml
index 7a9a25ede99799eb8a9833ee558efb6b61142d0b..8eb6be9661f11a23e0458b13b1182666914a3a99 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual/CheckoutData.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual/CheckoutData.xml
@@ -31,5 +31,9 @@
                 <item name="custom_price" xsi:type="string">100</item>
             </field>
         </dataset>
+
+        <dataset name="virtual_update_mini_shopping_cart">
+            <field name="qty" xsi:type="string">2</field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.php
index dc239565c49d01471c82b5b1a62c17ae0244605e..a14088898d976107c3c22773e7461296037f0fed 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.php
@@ -43,21 +43,21 @@ class AddCompareProductsTest extends AbstractCompareProductsTest
      * Test creation for adding compare products.
      *
      * @param string $products
-     * @param string $requireCustomerLogin
+     * @param string $isCustomerLoggedIn
      * @param AssertProductCompareSuccessAddMessage $assertProductCompareSuccessAddMessage
      * @param CatalogProductCompare $catalogProductCompare
      * @return array
      */
     public function test(
         $products,
-        $requireCustomerLogin,
+        $isCustomerLoggedIn,
         AssertProductCompareSuccessAddMessage $assertProductCompareSuccessAddMessage,
         CatalogProductCompare $catalogProductCompare
     ) {
         //Steps
         $this->catalogProductCompare = $catalogProductCompare;
         $this->cmsIndex->open();
-        if ($requireCustomerLogin == 'Yes') {
+        if ($isCustomerLoggedIn == 'Yes') {
             $this->loginCustomer();
         }
         $this->products = $this->createProducts($products);
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml
index de2da8b34bbf2b06162b4a41f0ea30a95d571dbb..7e106eb611f86ddb15c13da1611ed7bbbc64d3f0 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml
@@ -9,27 +9,27 @@
     <testCase name="Magento\Catalog\Test\TestCase\Product\AddCompareProductsTest" summary="Add Products to Compare" ticketId="MAGETWO-25843">
         <variation name="AddCompareProductsTestVariation1">
             <data name="products" xsi:type="string">catalogProductSimple::simple_for_composite_products</data>
-            <data name="requireCustomerLogin" xsi:type="string">No</data>
+            <data name="isCustomerLoggedIn" xsi:type="string">No</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareItemsLink" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductComparePage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareBlockOnCmsPage" />
         </variation>
         <variation name="AddCompareProductsTestVariation2">
             <data name="products" xsi:type="string">catalogProductSimple::simple_for_composite_products,bundleProduct::bundle_dynamic_product</data>
-            <data name="requireCustomerLogin" xsi:type="string">No</data>
+            <data name="isCustomerLoggedIn" xsi:type="string">No</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareItemsLink" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductComparePage" />
         </variation>
         <variation name="AddCompareProductsTestVariation3">
             <data name="products" xsi:type="string">configurableProduct::default</data>
-            <data name="requireCustomerLogin" xsi:type="string">Yes</data>
+            <data name="isCustomerLoggedIn" xsi:type="string">Yes</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareItemsLink" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductComparePage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareBlockOnCmsPage" />
         </variation>
         <variation name="AddCompareProductsTestVariation4">
             <data name="products" xsi:type="string">catalogProductSimple::simple_for_composite_products,catalogProductVirtual::default,downloadableProduct::default,groupedProduct::grouped_product_with_price,configurableProduct::default,bundleProduct::bundle_dynamic_product,bundleProduct::bundle_fixed_product</data>
-            <data name="requireCustomerLogin" xsi:type="string">Yes</data>
+            <data name="isCustomerLoggedIn" xsi:type="string">Yes</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareItemsLink" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductComparePage" />
         </variation>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteCompareProductsTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteCompareProductsTest.php
index c4771496cc0883bd64a33cce1f967517ae23babd..cf945dac7cbb8aa9a55e7937cc9050e39f841667 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteCompareProductsTest.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteCompareProductsTest.php
@@ -57,20 +57,20 @@ class DeleteCompareProductsTest extends AbstractCompareProductsTest
      *
      * @param string $products
      * @param string $removeProductIndex
-     * @param string $requireCustomerLogin
+     * @param string $isCustomerLoggedIn
      * @param CatalogProductCompare $catalogProductCompare
      * @return array
      */
     public function test(
         $products,
         $removeProductIndex,
-        $requireCustomerLogin,
+        $isCustomerLoggedIn,
         CatalogProductCompare $catalogProductCompare
     ) {
         //Steps
         $this->catalogProductCompare = $catalogProductCompare;
         $this->cmsIndex->open();
-        if ($requireCustomerLogin == 'Yes') {
+        if ($isCustomerLoggedIn == 'Yes') {
             $this->loginCustomer();
         }
         $this->products = $this->createProducts($products);
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteCompareProductsTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteCompareProductsTest.xml
index 78a9e6af18713cfeb28a365f8926257bbc8b002c..4a9f009213c4a195d03cc300b23b4fe03b5a691e 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteCompareProductsTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteCompareProductsTest.xml
@@ -10,14 +10,14 @@
         <variation name="DeleteCompareProductsTestVariation1">
             <data name="products" xsi:type="string">catalogProductSimple::simple_for_composite_products,catalogProductVirtual::default,downloadableProduct::default,groupedProduct::grouped_product_with_price,configurableProduct::default,bundleProduct::bundle_dynamic_product,bundleProduct::bundle_fixed_product</data>
             <data name="removeProductIndex" xsi:type="string">1</data>
-            <data name="requireCustomerLogin" xsi:type="string">No</data>
+            <data name="isCustomerLoggedIn" xsi:type="string">No</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareSuccessRemoveMessage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotVisibleInComparePage" />
         </variation>
         <variation name="DeleteCompareProductsTestVariation2">
             <data name="products" xsi:type="string">catalogProductSimple::simple_for_composite_products,catalogProductVirtual::default,downloadableProduct::default,groupedProduct::grouped_product_with_price,configurableProduct::default,bundleProduct::bundle_dynamic_product,bundleProduct::bundle_fixed_product</data>
             <data name="removeProductIndex" xsi:type="string">6</data>
-            <data name="requireCustomerLogin" xsi:type="string">Yes</data>
+            <data name="isCustomerLoggedIn" xsi:type="string">Yes</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareSuccessRemoveMessage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotVisibleInComparePage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotVisibleInCompareBlock" />
@@ -25,7 +25,7 @@
         <variation name="DeleteCompareProductsTestVariation3">
             <data name="products" xsi:type="string">bundleProduct::bundle_dynamic_product</data>
             <data name="removeProductIndex" xsi:type="string">1</data>
-            <data name="requireCustomerLogin" xsi:type="string">Yes</data>
+            <data name="isCustomerLoggedIn" xsi:type="string">Yes</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareSuccessRemoveMessage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareRemoveLastProductMessage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotVisibleInCompareBlock" />
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteProductEntityTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteProductEntityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..98c9c91b7e455f6e86a78696f4ddfcfac33848c2
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteProductEntityTest.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Test\TestCase\Product;
+
+use Magento\Catalog\Test\Fixture\Category;
+use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex;
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Mtf\TestCase\Injectable;
+
+/**
+ * Preconditions:
+ * 1. Create product according to data set.
+ *
+ * Steps:
+ * 1. Login to backend.
+ * 2. Navigate Products->Catalog.
+ * 3. Select products created in preconditions.
+ * 4. Select delete from mass-action.
+ * 5. Submit form.
+ * 6. Perform asserts.
+ *
+ * @group Products_(MX)
+ * @ZephyrId MAGETWO-23272
+ */
+class DeleteProductEntityTest extends Injectable
+{
+    /* tags */
+    const MVP = 'yes';
+    const DOMAIN = 'MX';
+    /* end tags */
+
+    /**
+     * Product page with a grid.
+     *
+     * @var CatalogProductIndex
+     */
+    protected $catalogProductIndex;
+
+    /**
+     * Prepare data.
+     *
+     * @param Category $category
+     * @return array
+     */
+    public function __prepare(Category $category)
+    {
+        $category->persist();
+        return [
+            'category' => $category
+        ];
+    }
+
+    /**
+     * Injection data.
+     *
+     * @param CatalogProductIndex $catalogProductIndexPage
+     * @return void
+     */
+    public function __inject(CatalogProductIndex $catalogProductIndexPage)
+    {
+        $this->catalogProductIndex = $catalogProductIndexPage;
+    }
+
+    /**
+     * Run delete product test.
+     *
+     * @param string $products
+     * @param FixtureFactory $fixtureFactory
+     * @param Category $category
+     * @return array
+     */
+    public function test($products, FixtureFactory $fixtureFactory, Category $category)
+    {
+        //Steps
+        $products = explode(',', $products);
+        $deleteProducts = [];
+        foreach ($products as &$product) {
+            list($fixture, $dataset) = explode('::', $product);
+            $product = $fixtureFactory->createByCode(
+                $fixture,
+                [
+                    'dataset' => $dataset,
+                    'data' => [
+                        'category_ids' => [
+                            'category' => $category,
+                        ],
+                    ]
+                ]
+            );
+            $product->persist();
+            $deleteProducts[] = ['sku' => $product->getSku()];
+        }
+        $this->catalogProductIndex->open();
+        $this->catalogProductIndex->getProductGrid()->massaction($deleteProducts, 'Delete', true);
+
+        return ['product' => $products];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteProductEntityTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..76dd8a27ab1d9b09928e375a29db9d00097f5479
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/DeleteProductEntityTest.xml
@@ -0,0 +1,32 @@
+<?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\Catalog\Test\TestCase\Product\DeleteProductEntityTest" summary="Delete products (Simple, Grouped, Configurable)" ticketId="MAGETWO-23272">
+        <variation name="DeleteProductEntityTestVariation1">
+            <data name="products" xsi:type="string">catalogProductSimple::default</data>
+            <data name="isRequired" xsi:type="string">Yes</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" />
+        </variation>
+        <variation name="DeleteProductEntityTestVariation2">
+            <data name="products" xsi:type="string">catalogProductVirtual::default</data>
+            <data name="isRequired" xsi:type="string">Yes</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" />
+        </variation>
+        <variation name="DeleteProductEntityTestVariation3">
+            <data name="products" xsi:type="string">catalogProductSimple::with_one_custom_option</data>
+            <data name="isRequired" xsi:type="string">Yes</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.xml
index 8eace54087cac573def16b1dec37b03a92c4a759..03cf25cfa8abe5a3886f025398dd4427231b3fb6 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.xml
@@ -36,7 +36,7 @@
             <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeForm" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsRequired" />
-            <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSearchableByLabel" />
+            <constraint name="Magento\CatalogSearch\Test\Constraint\AssertAttributeSearchableByLabel" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeDisplayingOnSearchForm" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsComparable" />
         </variation>
@@ -54,12 +54,13 @@
             <data name="productAttribute/data/is_comparable" xsi:type="string">No</data>
             <data name="productAttribute/data/is_visible_on_front" xsi:type="string">Yes</data>
             <data name="productAttribute/data/used_in_product_listing" xsi:type="string">Yes</data>
+            <data name="productAttribute/data/is_used_for_promo_rules" xsi:type="string">Yes</data>
             <data name="productAttribute/data/used_for_sort_by" xsi:type="string">Yes</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeInGrid" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeForm" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsUsedInSortOnFrontend" />
-            <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsUsedPromoRules" />
+            <constraint name="Magento\CatalogRule\Test\Constraint\AssertProductAttributeIsUsedPromoRules" />
         </variation>
         <variation name="CreateProductAttributeEntityTestVariation4">
             <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data>
@@ -99,7 +100,7 @@
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsComparable" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsFilterable" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsFilterableInSearch" />
-            <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSearchableByLabel" />
+            <constraint name="Magento\CatalogSearch\Test\Constraint\AssertAttributeSearchableByLabel" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeOptionsOnProductForm" />
         </variation>
         <variation name="CreateProductAttributeEntityTestVariation6">
@@ -127,7 +128,7 @@
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsGlobal" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeDisplayingOnFrontend" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeDisplayingOnSearchForm" />
-            <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSearchableByLabel" />
+            <constraint name="Magento\CatalogSearch\Test\Constraint\AssertAttributeSearchableByLabel" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsComparable" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsUsedInSortOnFrontend" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsFilterable" />
@@ -151,7 +152,7 @@
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeInGrid" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeForm" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" />
-            <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSearchableByLabel" />
+            <constraint name="Magento\CatalogSearch\Test\Constraint\AssertAttributeSearchableByLabel" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeDisplayingOnSearchForm" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsFilterable" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsFilterableInSearch" />
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Block/Adminhtml/Promo/Catalog/Edit/PromoForm.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Block/Adminhtml/Promo/Catalog/Edit/PromoForm.php
index ed6797e5656997827bc7dda19f5dcd1af66874cd..62b27d30a0738c08ee576c1caae308cc01afade3 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Block/Adminhtml/Promo/Catalog/Edit/PromoForm.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Block/Adminhtml/Promo/Catalog/Edit/PromoForm.php
@@ -9,16 +9,30 @@ namespace Magento\CatalogRule\Test\Block\Adminhtml\Promo\Catalog\Edit;
 use Magento\Backend\Test\Block\Widget\FormTabs;
 use Magento\Mtf\Client\Element\SimpleElement;
 use Magento\Mtf\Client\Element;
+use Magento\Mtf\Client\Locator;
 use Magento\Mtf\Fixture\FixtureInterface;
 
 /**
- * Class PromoForm
- * Form for creation of a Catalog Price Rule
+ * Form for creation of a Catalog Price Rule.
  */
 class PromoForm extends FormTabs
 {
     /**
-     * Fill form with tabs
+     * Add button.
+     *
+     * @var string
+     */
+    protected $addButton = '.rule-param-new-child a';
+
+    /**
+     * Locator for Customer Segment Conditions.
+     *
+     * @var string
+     */
+    protected $conditionFormat = '//*[@id="conditions__1__new_child"]//option[contains(.,"%s")]';
+
+    /**
+     * Fill form with tabs.
      *
      * @param FixtureInterface $fixture
      * @param SimpleElement $element
@@ -35,7 +49,7 @@ class PromoForm extends FormTabs
     }
 
     /**
-     * Replace placeholders in each values of data
+     * Replace placeholders in each values of data.
      *
      * @param array $tabs
      * @param array $replace
@@ -57,4 +71,19 @@ class PromoForm extends FormTabs
 
         return $tabs;
     }
+
+    /**
+     * Check if attribute is available in conditions.
+     *
+     * @param string $name
+     * @return bool
+     */
+    public function isAttributeInConditions($name)
+    {
+        $this->_rootElement->find($this->addButton)->click();
+        return $this->_rootElement->find(
+            sprintf($this->conditionFormat, $name),
+            Locator::SELECTOR_XPATH
+        )->isVisible();
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedCatalogPage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedCatalogPage.php
index 7e425f21585dc2f9474fd4593fe8d692093a9fd2..0739420ac1e9c11ac37f71606ffc1eb17cb7537e 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedCatalogPage.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedCatalogPage.php
@@ -40,7 +40,10 @@ class AssertCatalogPriceRuleAppliedCatalogPage extends AbstractConstraint
                 '\Magento\Customer\Test\TestStep\LoginCustomerOnFrontendStep',
                 ['customer' => $customer]
             )->run();
+        } else {
+            $this->objectManager->create('\Magento\Customer\Test\TestStep\LogoutCustomerOnFrontendStep')->run();
         }
+
         $cmsIndexPage->open();
         foreach ($products as $key => $product) {
             $categoryName = $product->getCategoryIds()[0];
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedProductPage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedProductPage.php
index 9b6fe9ffbafbbed143f91319ee8e8e4ae8f0d8a7..119a77cfa0085e81b6bda688e25d1f6421e983c7 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedProductPage.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedProductPage.php
@@ -41,12 +41,17 @@ class AssertCatalogPriceRuleAppliedProductPage extends AbstractConstraint
                 '\Magento\Customer\Test\TestStep\LoginCustomerOnFrontendStep',
                 ['customer' => $customer]
             )->run();
+        } else {
+            $this->objectManager->create('\Magento\Customer\Test\TestStep\LogoutCustomerOnFrontendStep')->run();
         }
+
         $cmsIndexPage->open();
         foreach ($products as $key => $product) {
             $categoryName = $product->getCategoryIds()[0];
             $cmsIndexPage->getTopmenu()->selectCategoryByName($categoryName);
             $catalogCategoryViewPage->getListProductBlock()->getProductItem($product)->open();
+
+            $catalogProductViewPage->getViewBlock()->waitLoader();
             $productPriceBlock = $catalogProductViewPage->getViewBlock()->getPriceBlock();
             $actualPrice['regular'] = $productPriceBlock->getOldPrice();
             $actualPrice['special'] = $productPriceBlock->getSpecialPrice();
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedShoppingCart.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedShoppingCart.php
index e3b15f78366b04ad70e2e0d10c46518d0ae46a50..7a4e4b605ef4b7c64a09c0ac6d613159167002c2 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedShoppingCart.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedShoppingCart.php
@@ -39,7 +39,10 @@ class AssertCatalogPriceRuleAppliedShoppingCart extends AbstractConstraint
                 '\Magento\Customer\Test\TestStep\LoginCustomerOnFrontendStep',
                 ['customer' => $customer]
             )->run();
+        } else {
+            $this->objectManager->create('\Magento\Customer\Test\TestStep\LogoutCustomerOnFrontendStep')->run();
         }
+
         $this->objectManager->create(
             '\Magento\Checkout\Test\TestStep\AddProductsToTheCartStep',
             ['products' => $products]
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertProductAttributeIsUsedPromoRules.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertProductAttributeIsUsedPromoRules.php
new file mode 100644
index 0000000000000000000000000000000000000000..c0d88eac2804e23a07c77dd111413992d5e1b79b
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertProductAttributeIsUsedPromoRules.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogRule\Test\Constraint;
+
+use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\Catalog\Test\Fixture\CatalogProductAttribute;
+use Magento\CatalogRule\Test\Page\Adminhtml\CatalogRuleNew;
+use Magento\CatalogRule\Test\Page\Adminhtml\CatalogRuleIndex;
+
+/**
+ * Create a Catalog Price Rules and check whether this attribute visible in Dropdown on Conditions tab.
+ */
+class AssertProductAttributeIsUsedPromoRules extends AbstractConstraint
+{
+    /**
+     * Assert that product attribute can be used on promo rules conditions.
+     *
+     * @param CatalogRuleIndex $catalogRuleIndex
+     * @param CatalogRuleNew $catalogRuleNew
+     * @param CatalogProductAttribute $attribute
+     * @return void
+     */
+    public function processAssert(
+        CatalogRuleIndex $catalogRuleIndex,
+        CatalogRuleNew $catalogRuleNew,
+        CatalogProductAttribute $attribute
+    ) {
+        $catalogRuleIndex->open();
+        $catalogRuleIndex->getGridPageActions()->addNew();
+        $catalogRuleNew->getEditForm()->openTab('conditions');
+
+        \PHPUnit_Framework_Assert::assertTrue(
+            $catalogRuleNew->getEditForm()->isAttributeInConditions($attribute->getFrontendLabel()),
+            'Product attribute can\'t be used on promo rules conditions.'
+        );
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Product attribute can be used on promo rules conditions.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Repository/CatalogRule.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Repository/CatalogRule.xml
index ae748f108af441345fe6420cb68940e33583c40c..bbaa64df71ac0bd2e3053abea686df5648c1bb64 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Repository/CatalogRule.xml
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Repository/CatalogRule.xml
@@ -17,7 +17,7 @@
             <field name="customer_group_ids" xsi:type="array">
                 <item name="0" xsi:type="string">NOT LOGGED IN</item>
             </field>
-            <field name="simple_action" xsi:type="string">By Percentage of the Original Price</field>
+            <field name="simple_action" xsi:type="string">Apply as percentage of original</field>
             <field name="discount_amount" xsi:type="string">50</field>
         </dataset>
 
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 72e040caa781185b32251cf15652ca989a4044de..94868c236dfdda5d5d11352167f334e0672b3403 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
@@ -37,22 +37,18 @@ class CreateCatalogRuleTest extends AbstractCatalogRuleEntityTest
      * Create Catalog Price Rule.
      *
      * @param CatalogRule $catalogPriceRule
-     * @param Customer $customer
      * @param string $product
+     * @param string $conditionEntity
+     * @param Customer $customer
      * @return array
      */
-    public function testCreate(CatalogRule $catalogPriceRule, $product, Customer $customer = null)
+    public function testCreate(CatalogRule $catalogPriceRule, $product, $conditionEntity, Customer $customer = null)
     {
+        /** @var CatalogProductSimple $productSimple */
         $productSimple = $this->fixtureFactory->createByCode('catalogProductSimple', ['dataset' => $product]);
         // Prepare data
         $catalogPriceRule = $this->applyCustomerGroup($catalogPriceRule, $customer);
-        $replace = [
-            'conditions' => [
-                'conditions' => [
-                    '%category_1%' => $productSimple->getDataFieldConfig('category_ids')['source']->getIds()[0],
-                ],
-            ],
-        ];
+        $replace = $this->prepareCondition($productSimple, $conditionEntity);
 
         // Open Catalog Price Rule page
         $this->catalogRuleIndex->open();
@@ -107,4 +103,36 @@ class CreateCatalogRuleTest extends AbstractCatalogRuleEntityTest
 
         return $catalogPriceRule;
     }
+
+    /**
+     * Prepare condition for catalog price rule.
+     *
+     * @param CatalogProductSimple $productSimple
+     * @param string $conditionEntity
+     * @return array
+     */
+    protected function prepareCondition(CatalogProductSimple $productSimple, $conditionEntity)
+    {
+        $result = [];
+
+        switch ($conditionEntity) {
+            case 'category':
+                $result['%category_id%'] = $productSimple->getDataFieldConfig('category_ids')['source']->getIds()[0];
+                break;
+            case 'attribute':
+                /** @var \Magento\Catalog\Test\Fixture\CatalogProductAttribute[] $attrs */
+                $attributes = $productSimple->getDataFieldConfig('attribute_set_id')['source']
+                    ->getAttributeSet()->getDataFieldConfig('assigned_attributes')['source']->getAttributes();
+
+                $result['%attribute_name%'] = $attributes[0]->getFrontendLabel();
+                $result['%attribute_value%'] = $attributes[0]->getOptions()[0]['view'];
+                break;
+        }
+
+        return [
+            'conditions' => [
+                'conditions' => $result,
+            ],
+        ];
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.xml
index 37f84f3977d3f5df44c12963421c15a996d71647..7f7147a08383771b6a5df5a4ab58b7f5ee63d987 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.xml
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.xml
@@ -13,7 +13,8 @@
             <data name="catalogPriceRule/data/is_active" xsi:type="string">Active</data>
             <data name="catalogPriceRule/data/website_ids" xsi:type="string">Main Website</data>
             <data name="catalogPriceRule/data/customer_group_ids" xsi:type="string">NOT LOGGED IN</data>
-            <data name="catalogPriceRule/data/conditions" xsi:type="string">[Category|is|%category_1%]</data>
+            <data name="conditionEntity" xsi:type="string">category</data>
+            <data name="catalogPriceRule/data/conditions" xsi:type="string">[Category|is|%category_id%]</data>
             <data name="catalogPriceRule/data/simple_action" xsi:type="string">Adjust final price to this percentage</data>
             <data name="catalogPriceRule/data/discount_amount" xsi:type="string">90</data>
             <data name="cartPrice/sub_total" xsi:type="string">90</data>
@@ -33,7 +34,8 @@
             <data name="catalogPriceRule/data/name" xsi:type="string">rule_name%isolation%</data>
             <data name="catalogPriceRule/data/is_active" xsi:type="string">Active</data>
             <data name="catalogPriceRule/data/website_ids" xsi:type="string">Main Website</data>
-            <data name="catalogPriceRule/data/conditions" xsi:type="string">[Category|is|%category_1%]</data>
+            <data name="conditionEntity" xsi:type="string">category</data>
+            <data name="catalogPriceRule/data/conditions" xsi:type="string">[Category|is|%category_id%]</data>
             <data name="catalogPriceRule/data/simple_action" xsi:type="string">Apply as percentage of original</data>
             <data name="catalogPriceRule/data/discount_amount" xsi:type="string">50</data>
             <data name="cartPrice/sub_total" xsi:type="string">5</data>
@@ -42,7 +44,7 @@
             <data name="productPrice/0/special" xsi:type="string">5</data>
             <data name="productPrice/0/sub_total" xsi:type="string">5</data>
             <data name="productPrice/0/regular" xsi:type="string">10</data>
-            <data name="tag" xsi:type="string">test_type:acceptance_test, stable:no</data>
+            <data name="tag" xsi:type="string">test_type:acceptance_test</data>
             <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleInGrid" />
             <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleNotAppliedCatalogPage" />
             <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleNotAppliedProductPage" />
@@ -51,5 +53,24 @@
             <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleAppliedProductPage" />
             <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleAppliedShoppingCart" />
         </variation>
+        <variation name="CreateCatalogRuleTestVariation3" summary="Create and Apply Catalog Price Rule with Product Attribute in Condition" ticketId="MAGETWO-30095">
+            <data name="product" xsi:type="string">product_with_custom_color_attribute</data>
+            <data name="catalogPriceRule/data/name" xsi:type="string">Catalog Price Rule %isolation%</data>
+            <data name="catalogPriceRule/data/is_active" xsi:type="string">Active</data>
+            <data name="catalogPriceRule/data/website_ids" xsi:type="string">Main Website</data>
+            <data name="catalogPriceRule/data/customer_group_ids/option_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="conditionEntity" xsi:type="string">attribute</data>
+            <data name="catalogPriceRule/data/conditions" xsi:type="string">[%attribute_name%|is|%attribute_value%]</data>
+            <data name="catalogPriceRule/data/simple_action" xsi:type="string">Apply as percentage of original</data>
+            <data name="catalogPriceRule/data/discount_amount" xsi:type="string">50</data>
+            <data name="cartPrice/sub_total" xsi:type="string">280</data>
+            <data name="cartPrice/grand_total" xsi:type="string">285</data>
+            <data name="productPrice/0/discount_amount" xsi:type="string">280</data>
+            <data name="productPrice/0/special" xsi:type="string">280</data>
+            <data name="productPrice/0/sub_total" xsi:type="string">280</data>
+            <data name="productPrice/0/regular" xsi:type="string">560</data>
+            <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleAppliedProductPage" />
+            <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleAppliedShoppingCart" />
+        </variation>
     </testCase>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAttributeSearchableByLabel.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAttributeSearchableByLabel.php
new file mode 100644
index 0000000000000000000000000000000000000000..52396b06ebe2b0716d764cfa40d05d4b44bc8d0f
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAttributeSearchableByLabel.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogSearch\Test\Constraint;
+
+use Magento\Cms\Test\Page\CmsIndex;
+use Magento\Mtf\Fixture\InjectableFixture;
+use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\CatalogSearch\Test\Page\CatalogsearchResult;
+use Magento\Catalog\Test\Fixture\CatalogProductAttribute;
+
+/**
+ * Assert that product attribute is searchable on Frontend.
+ */
+class AssertAttributeSearchableByLabel extends AbstractConstraint
+{
+    /**
+     * Assert that product attribute is searchable on Frontend.
+     *
+     * @param CatalogProductAttribute $attribute
+     * @param CmsIndex $cmsIndex
+     * @param InjectableFixture $product
+     * @param CatalogsearchResult $catalogSearchResult
+     * @return void
+     */
+    public function processAssert(
+        CatalogProductAttribute $attribute,
+        CmsIndex $cmsIndex,
+        InjectableFixture $product,
+        CatalogsearchResult $catalogSearchResult
+    ) {
+        $searchValue = $this->getSearchValue($attribute);
+
+        $cmsIndex->open();
+        $cmsIndex->getSearchBlock()->search($searchValue);
+
+        $isVisible = $catalogSearchResult->getListProductBlock()->getProductItem($product)->isVisible();
+        while (!$isVisible && $catalogSearchResult->getBottomToolbar()->nextPage()) {
+            $isVisible = $catalogSearchResult->getListProductBlock()->getProductItem($product)->isVisible();
+        }
+
+        \PHPUnit_Framework_Assert::assertTrue($isVisible, 'Product attribute is not searchable on Frontend.');
+    }
+
+    /**
+     * Get search value for product attribute.
+     *
+     * @param CatalogProductAttribute $attribute
+     * @return string
+     */
+    protected function getSearchValue(CatalogProductAttribute $attribute)
+    {
+        $searchValue = '';
+
+        switch ($attribute->getFrontendInput()) {
+            case 'Multiple Select':
+            case 'Dropdown':
+                foreach ($attribute->getOptions() as $option) {
+                    if ($option['is_default'] == 'Yes') {
+                        $searchValue = $option['admin'];
+                    }
+                }
+                break;
+            case 'Text Field':
+                $searchValue = $attribute->getDefaultValueText();
+                break;
+            case 'Text Area':
+                $searchValue = $attribute->getDefaultValueTextarea();
+                break;
+            case 'Date':
+                $searchValue = $attribute->getDefaultValueDate();
+                break;
+            case 'Yes/No':
+                $searchValue = $attribute->getDefaultValueYesno();
+                break;
+        }
+
+        return $searchValue;
+    }
+
+    /**
+     * Returns string representation of object.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Product attribute is searchable on Frontend.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertCatalogSearchNoResult.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertCatalogSearchNoResult.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed109f1f790b113d4c940062b1a2434773425ee5
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertCatalogSearchNoResult.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogSearch\Test\Constraint;
+
+use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\CatalogSearch\Test\Page\CatalogsearchResult;
+
+/**
+ * Assert search has no results.
+ */
+class AssertCatalogSearchNoResult extends AbstractConstraint
+{
+    /**
+     * Assert search has no results and product list in absent.
+     *
+     * @param CatalogsearchResult $catalogsearchResult
+     * @return void
+     */
+    public function processAssert(CatalogsearchResult $catalogsearchResult)
+    {
+        \PHPUnit_Framework_Assert::assertFalse(
+            $catalogsearchResult->getListProductBlock()->isVisible(),
+            'Search result has been found.'
+        );
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Search result has not been found.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertCatalogSearchNoResultMessage.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertCatalogSearchNoResultMessage.php
new file mode 100644
index 0000000000000000000000000000000000000000..752cb5346dd0fc06cb1a3d3982e676445efa16a2
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertCatalogSearchNoResultMessage.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogSearch\Test\Constraint;
+
+use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\CatalogSearch\Test\Page\CatalogsearchResult;
+
+/**
+ * Assert that notice message is visible.
+ */
+class AssertCatalogSearchNoResultMessage extends AbstractConstraint
+{
+    /**
+     * Notice message about no results on search.
+     */
+    const NOTICE_MESSAGE = 'Your search returned no results.';
+
+    /**
+     * Assert that 'Your search returned no results.' is visible.
+     *
+     * @param CatalogsearchResult $catalogSearchResult
+     * @return void
+     */
+    public function processAssert(CatalogsearchResult $catalogSearchResult)
+    {
+        \PHPUnit_Framework_Assert::assertTrue(
+            $catalogSearchResult->getSearchResultBlock()->isVisibleMessages(self::NOTICE_MESSAGE),
+            'Wrong message is displayed or no message at all.'
+        );
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Notice message is visible.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Page/CatalogsearchResult.xml b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Page/CatalogsearchResult.xml
index bca2d33440a57f9bae02de8ad2df50ce7351495d..5f594f7acf59b390313ff4519973c7b767549bfd 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Page/CatalogsearchResult.xml
+++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Page/CatalogsearchResult.xml
@@ -6,8 +6,9 @@
  */
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/pages.xsd">
-  <page name="CatalogsearchResult" mca="catalogsearch/result" module="Magento_CatalogSearch">
-    <block name="listProductBlock" class="Magento\Catalog\Test\Block\Product\ListProduct" locator=".search.results" strategy="css selector"/>
-    <block name="bottomToolbar" class="Magento\Catalog\Test\Block\Product\ProductList\BottomToolbar" locator=".//*[contains(@class,'toolbar-products')][2]" strategy="xpath"/>
-  </page>
+    <page name="CatalogsearchResult" mca="catalogsearch/result" module="Magento_CatalogSearch">
+        <block name="listProductBlock" class="Magento\Catalog\Test\Block\Product\ListProduct" locator=".search.results" strategy="css selector" />
+        <block name="bottomToolbar" class="Magento\Catalog\Test\Block\Product\ProductList\BottomToolbar" locator=".//*[contains(@class,'toolbar-products')][2]" strategy="xpath" />
+        <block name="searchResultBlock" class="Magento\CatalogSearch\Test\Block\Advanced\Result" locator=".column.main" strategy="css selector" />
+    </page>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/TestCase/SearchEntityResultsTest.xml b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/TestCase/SearchEntityResultsTest.xml
index 42ffc74b8e4e2ca928c251eb3a294adecc8842d3..7af934c5cff4c3bfda0c58e982e096cc019386ca 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/TestCase/SearchEntityResultsTest.xml
+++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/TestCase/SearchEntityResultsTest.xml
@@ -47,5 +47,18 @@
             <data name="catalogSearch/data/query_text/value" xsi:type="string">bundleProduct::bundle_fixed_product::bundle</data>
             <constraint name="Magento\CatalogSearch\Test\Constraint\AssertCatalogSearchResult" />
         </variation>
+        <variation name="SearchEntityResultsTestVariation9">
+            <data name="catalogSearch/data/query_text/value" xsi:type="string">catalogProductSimple::default::name</data>
+            <constraint name="Magento\CatalogSearch\Test\Constraint\AssertProductCanBeOpenedFromSearchResult" />
+        </variation>
+        <variation name="SearchEntityResultsTestVariation10">
+            <data name="catalogSearch/data/query_text/value" xsi:type="string">catalogProductSimple::product_with_special_symbols_in_name::name</data>
+            <constraint name="Magento\CatalogSearch\Test\Constraint\AssertProductCanBeOpenedFromSearchResult" />
+        </variation>
+        <variation name="SearchEntityResultsTestVariation11">
+            <data name="catalogSearch/data/query_text/value" xsi:type="string">TryToFindMeAndI&#39;llFindYOU</data>
+            <constraint name="Magento\CatalogSearch\Test\Constraint\AssertCatalogSearchNoResultMessage" />
+            <constraint name="Magento\CatalogSearch\Test\Constraint\AssertCatalogSearchNoResult" />
+        </variation>
     </testCase>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/etc/di.xml
index 28eeb838b406626fa6ae72e6f94ee9c82df8e0a6..66de584a1e52390abae29f3977358bb2319f5808 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/etc/di.xml
@@ -5,90 +5,96 @@
  * 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">
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSuggestSearchingResult">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertAdvancedSearchProductsResult">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertCatalogSearchResult">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermForm">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermInGrid">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermOnFrontend">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermSuccessSaveMessage">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermSynonymOnFrontend">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermSuccessDeleteMessage">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermNotInGrid">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermNotOnFrontend">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchSynonymNotOnFrontend">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermSuccessMassDeleteMessage">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermMassActionsNotInGrid">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermMassActionNotOnFrontend">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchSynonymMassActionNotOnFrontend">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
-  <type name="Magento\CatalogSearch\Test\Constraint\AssertProductCanBeOpenedFromSearchResult">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSuggestSearchingResult">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertAdvancedSearchProductsResult">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertCatalogSearchResult">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermForm">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermInGrid">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermOnFrontend">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermSuccessSaveMessage">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermSynonymOnFrontend">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermSuccessDeleteMessage">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermNotInGrid">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermNotOnFrontend">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchSynonymNotOnFrontend">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermSuccessMassDeleteMessage">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermMassActionsNotInGrid">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchTermMassActionNotOnFrontend">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertSearchSynonymMassActionNotOnFrontend">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertProductCanBeOpenedFromSearchResult">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CatalogSearch\Test\Constraint\AssertCatalogSearchNoResult">
+        <arguments>
+            <argument name="severity" xsi:type="string">high</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CmsIndex.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CmsIndex.xml
new file mode 100644
index 0000000000000000000000000000000000000000..05d380b450464ebe3f1d888c9f1c7d00d1331d06
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CmsIndex.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="CmsIndex" mca="cms/index/index">
+        <block name="cartSidebarBlock" class="Magento\Checkout\Test\Block\Cart\Sidebar" locator="[data-block='minicart']" strategy="css selector" />
+    </page>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutTest.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d9516684512359904181b06d7899f8af8f7021e
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutTest.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Checkout\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+
+/**
+ * Preconditions:
+ * 1. Configure shipping method.
+ * 2. Configure payment method.
+ * 3. Create products.
+ * 4. Create and setup customer.
+ * 5. Create sales rule according to dataset.
+ *
+ * Steps:
+ * 1. Go to Frontend.
+ * 2. Add products to the cart.
+ * 3. Apply discounts in shopping cart according to dataset.
+ * 4. In 'Estimate Shipping and Tax' section specify destination using values from Test Data
+ * 5. Click the 'Get a Quote' button
+ * 6. In the section appeared select Shipping method, click the 'Update Total' button
+ * 7. Click the 'Proceed to Checkout' button.
+ * 8. Select checkout method according to dataset.
+ * 9. Fill billing information and select the 'Ship to this address' option.
+ * 10. Select shipping method.
+ * 11. Select payment method (use reward points and store credit if available).
+ * 12. Verify order total on review step.
+ * 13. Place order.
+ * 14. Perform assertions.
+ *
+ * @group One_Page_Checkout_(CS)
+ * @ZephyrId MAGETWO-27485, MAGETWO-12412, MAGETWO-12429
+ * @ZephyrId MAGETWO-12444, MAGETWO-12848, MAGETWO-12849, MAGETWO-12850
+ */
+class OnePageCheckoutTest extends Scenario
+{
+    /* tags */
+    const MVP = 'yes';
+    const DOMAIN = 'CS';
+    const TEST_TYPE = 'acceptance_test, 3rd_party_test';
+    const TO_MAINTAIN = 'yes';
+    /* end tags */
+
+    /**
+     * Runs one page checkout test.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutTest.xml
index 582997ee52ca18bddcc064bfb632be6395d4695d..696bf1324beea2c303bda0496702588f2b70be3a 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutTest.xml
@@ -7,6 +7,101 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Checkout\Test\TestCase\OnePageCheckoutTest" summary="OnePageCheckout within Offline Payment Methods" ticketId="MAGETWO-27485">
-        <variation name="OnePageCheckoutTestVariation1" />
+        <variation name="OnePageCheckoutTestVariation1" summary="Checkout as UK guest with virtual product using coupon for not logged in customers">
+            <data name="products" xsi:type="string">catalogProductVirtual::default</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_with_percent_price_discount_coupon</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="billingAddress/dataset" xsi:type="string">UK_address</data>
+            <data name="checkoutMethod" xsi:type="string">guest</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">5.00</item>
+            </data>
+            <data name="payment/method" xsi:type="string">checkmo</data>
+            <data name="status" xsi:type="string">Pending</data>
+            <data name="orderButtonsAvailable" xsi:type="string">Back, Cancel, Send Notification, Hold, Invoice, Edit</data>
+            <data name="configData" xsi:type="string">checkmo_specificcountry_gb</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderStatusIsCorrect" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderButtonsAvailable" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
+        </variation>
+        <variation name="OnePageCheckoutTestVariation2" summary="US customer during checkout using coupon for all customer groups">
+            <data name="products" xsi:type="string">catalogProductSimple::default</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="billingAddress/dataset" xsi:type="string">US_address_1</data>
+            <data name="checkoutMethod" xsi:type="string">guest</data>
+            <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
+            <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">285.00</item>
+            </data>
+            <data name="payment/method" xsi:type="string">banktransfer</data>
+            <data name="status" xsi:type="string">Pending</data>
+            <data name="orderButtonsAvailable" xsi:type="string">Back, Cancel, Send Notification, Hold, Reorder, Invoice, Edit</data>
+            <data name="configData" xsi:type="string">banktransfer</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderStatusIsCorrect" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderButtonsAvailable" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
+        </variation>
+        <variation name="OnePageCheckoutTestVariation3" summary="Checkout as UK guest with virtual product">
+            <data name="products" xsi:type="string">catalogProductVirtual::default</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="billingAddress/dataset" xsi:type="string">UK_address</data>
+            <data name="checkoutMethod" xsi:type="string">guest</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">10.00</item>
+            </data>
+            <data name="payment/method" xsi:type="string">banktransfer</data>
+            <data name="status" xsi:type="string">Pending</data>
+            <data name="orderButtonsAvailable" xsi:type="string">Back, Cancel, Send Notification, Hold, Invoice, Edit</data>
+            <data name="configData" xsi:type="string">banktransfer_specificcountry_gb</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderStatusIsCorrect" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderButtonsAvailable" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
+        </variation>
+        <variation name="OnePageCheckoutTestVariation4" summary="One Page Checkout Products with Special Prices" ticketId="MAGETWO-12429">
+            <data name="products" xsi:type="string">catalogProductSimple::product_with_special_price, configurableProduct::product_with_special_price</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
+            <data name="checkoutMethod" xsi:type="string">login</data>
+            <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
+            <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">20.00</item>
+            </data>
+            <data name="cart/data/subtotal" xsi:type="string">10.00</data>
+            <data name="cart/data/shipping_amount" xsi:type="string">10.00</data>
+            <data name="cart/data/grand_total" xsi:type="string">20.00</data>
+            <data name="billingCheckboxState" xsi:type="string">Yes</data>
+            <data name="payment/method" xsi:type="string">checkmo</data>
+            <data name="tag" xsi:type="string">test_type:acceptance_test</data>
+            <data name="configData" xsi:type="string">checkmo</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage"/>
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal"/>
+        </variation>
+        <variation name="OnePageCheckoutTestVariation5" summary="Guest Checkout using Check/Money Order and Free Shipping with Prices/Taxes Verifications" ticketId="MAGETWO-12412">
+            <data name="products" xsi:type="string">catalogProductSimple::product_10_dollar, configurableProduct::with_one_option, bundleProduct::bundle_fixed_100_dollar_product</data>
+            <data name="taxRule" xsi:type="string">us_ca_ny_rule</data>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1</data>
+            <data name="checkoutMethod" xsi:type="string">guest</data>
+            <data name="shipping/shipping_service" xsi:type="string">Free Shipping</data>
+            <data name="shipping/shipping_method" xsi:type="string">Free</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">130.98</item>
+            </data>
+            <data name="cart/data/subtotal" xsi:type="string">121.00</data>
+            <data name="cart/data/tax_amount" xsi:type="string">9.98</data>
+            <data name="cart/data/shipping_amount" xsi:type="string">0.00</data>
+            <data name="cart/data/grand_total" xsi:type="string">130.98</data>
+            <data name="billingCheckboxState" xsi:type="string">Yes</data>
+            <data name="payment/method" xsi:type="string">checkmo</data>
+            <data name="configData" xsi:type="string">checkmo, freeshipping_minimum_order_amount_100</data>
+            <data name="tag" xsi:type="string">test_type:acceptance_test</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage"/>
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal"/>
+        </variation>
     </testCase>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateProductFromMiniShoppingCartEntityTest.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateProductFromMiniShoppingCartEntityTest.xml
index 06d7a080176c96e2389c3fdd308e20c03da1299b..95eb13b50a2f9b87ceacd0028cfddce00faeaf4c 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateProductFromMiniShoppingCartEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateProductFromMiniShoppingCartEntityTest.xml
@@ -41,5 +41,12 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertProductQtyInShoppingCart" />
             <constraint name="Magento\Checkout\Test\Constraint\AssertProductOptionsAbsentInShoppingCart" />
         </variation>
+        <variation name="UpdateProductFromMiniShoppingCartEntityTestVariation5">
+            <data name="description" xsi:type="string">Update Virtual product in mini shopping cart</data>
+            <data name="originalProduct" xsi:type="string">catalogProductVirtual::default</data>
+            <data name="checkoutData/dataset" xsi:type="string">virtual_update_mini_shopping_cart</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertProductQtyInMiniShoppingCart" />
+            <constraint name="Magento\Checkout\Test\Constraint\AssertProductQtyInShoppingCart" />
+        </variation>
     </testCase>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/CreateTermEntityTest.php b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/CreateTermEntityTest.php
index 2025417f5da0940fa84abf249f9e233d87d4e4da..ee6191a0a7d8d7802d00c786e381c66383efe0a7 100644
--- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/CreateTermEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/CreateTermEntityTest.php
@@ -20,7 +20,7 @@ use Magento\Mtf\TestCase\Scenario;
  * 5. Perform all assertions
  *
  * @group Terms_and_Conditions_(CS)
- * @ZephyrId MAGETWO-29586
+ * @ZephyrId MAGETWO-29586, MAGETWO-32499
  */
 class CreateTermEntityTest extends Scenario
 {
diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/CreateTermEntityTest.xml b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/CreateTermEntityTest.xml
index 843e26dc329231d699c346536f8452367ea49616..7471bf899ef868e8ea3ea100fcd90f33834c00cf 100644
--- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/CreateTermEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/CreateTermEntityTest.xml
@@ -79,8 +79,7 @@
             <constraint name="Magento\CheckoutAgreements\Test\Constraint\AssertTermInGrid" />
             <constraint name="Magento\CheckoutAgreements\Test\Constraint\AssertTermAbsentOnCheckout" />
         </variation>
-        <variation name="CreateTermEntityTestVariation5">
-            <data name="description" xsi:type="string">Create enabled term, check with multishipping</data>
+        <variation name="CreateTermEntityTestVariation5" summary="Terms and conditions on multishipping" ticketId="MAGETWO-32499">
             <data name="configData" xsi:type="string">checkout_term_condition</data>
             <data name="products" xsi:type="string">catalogProductSimple::default, catalogProductSimple::default</data>
             <data name="agreement/data/name" xsi:type="string">name%isolation%</data>
diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Page/CmsIndex.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/Page/CmsIndex.xml
index 94be490f81adc65a229701a7794ae5747679b139..105673dceb26d659cad816f2ec7f9764a0ae43fd 100644
--- a/dev/tests/functional/tests/app/Magento/Cms/Test/Page/CmsIndex.xml
+++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Page/CmsIndex.xml
@@ -13,7 +13,6 @@
         <block name="footerBlock" class="Magento\Theme\Test\Block\Html\Footer" locator="footer.page-footer" strategy="css selector" />
         <block name="linksBlock" class="Magento\Theme\Test\Block\Links" locator=".header .links" strategy="css selector" />
         <block name="storeSwitcherBlock" class="Magento\Store\Test\Block\Switcher" locator="[data-ui-id='language-switcher']" strategy="css selector" />
-        <block name="cartSidebarBlock" class="Magento\Checkout\Test\Block\Cart\Sidebar" locator="[data-block='minicart']" strategy="css selector" />
         <block name="currencyBlock" class="Magento\Directory\Test\Block\Currency\Switcher" locator=".switcher.currency" strategy="css selector" />
         <block name="cmsPageBlock" class="Magento\Cms\Test\Block\Page" locator=".page-main" strategy="css selector" />
         <block name="widgetView" class="Magento\Widget\Test\Block\WidgetView" locator=".widget" strategy="css selector" />
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/DeleteProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/DeleteProductEntityTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e3dfb35aa29c68699d8b58319b2f38fa76205623
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/DeleteProductEntityTest.xml
@@ -0,0 +1,25 @@
+<?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\Catalog\Test\TestCase\Product\DeleteProductEntityTest">
+        <variation name="DeleteProductEntityTestVariation9">
+            <data name="products" xsi:type="string">configurableProduct::default</data>
+            <data name="isRequired" xsi:type="string">Yes</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" />
+        </variation>
+        <variation name="DeleteProductEntityTestVariation10">
+            <data name="products" xsi:type="string">configurableProduct::with_one_option</data>
+            <data name="isRequired" xsi:type="string">Yes</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fc24de8c1c44157d3cd4a1ffb95e49dbad2f9099
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
@@ -0,0 +1,16 @@
+<?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\Checkout\Test\TestCase\DeleteProductFromMiniShoppingCartTest" summary="Delete Configurable Product from Mini Shopping Cart" ticketId="MAGETWO-29104">
+        <variation name="DeleteConfigurableProductFromMiniShoppingCartTestVariation">
+            <data name="products" xsi:type="string">configurableProduct::default</data>
+            <data name="deletedProductIndex" xsi:type="string">0</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Webapi.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Webapi.php
new file mode 100644
index 0000000000000000000000000000000000000000..1934bc456d92061105b2faae79919f69de35293f
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Webapi.php
@@ -0,0 +1,180 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Customer\Test\Handler\Customer;
+
+use Magento\Customer\Test\Fixture\Customer;
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\Handler\Webapi as AbstractWebapi;
+
+/**
+ * Webapi handler for creating customer.
+ */
+class Webapi extends AbstractWebapi implements CustomerInterface
+{
+    /**
+     * Default customer group.
+     */
+    const GENERAL_GROUP = '1';
+
+    /**
+     * Mapping values for data.
+     *
+     * @var array
+     */
+    protected $mappingData = [
+        'country_id' => [
+            'United States' => 'US',
+            'United Kingdom' => 'GB'
+        ],
+        'region_id' => [
+            'California' => 12,
+            'New York' => 43,
+            'Texas' => 57,
+        ],
+    ];
+
+    /**
+     * Create customer via Web API.
+     *
+     * @param FixtureInterface|null $customer
+     * @return array
+     * @throws \Exception
+     */
+    public function persist(FixtureInterface $customer = null)
+    {
+        /** @var Customer $customer */
+        $data = $this->prepareData($customer);
+        $url = $_ENV['app_frontend_url'] . 'rest/V1/customers';
+
+        $this->webapiTransport->write($url, $data);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+
+        if (empty($response['id'])) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Customer creation by Web API handler was not successful!');
+        }
+
+        return ['id' => $response['id']];
+    }
+
+    /**
+     * Prepare customer data for Web API.
+     *
+     * @param Customer $customer
+     * @return array
+     */
+    protected function prepareData(Customer $customer)
+    {
+        $data['customer'] = $customer->getData();
+        $data['customer']['group_id'] = $this->getCustomerGroup($customer);
+        $data['password'] = $data['customer']['password'];
+        unset($data['customer']['password']);
+        unset($data['customer']['password_confirmation']);
+        $data = $this->prepareAddressData($data);
+
+        return $data;
+    }
+
+    /**
+     * Get customer group.
+     *
+     * @param Customer $customer
+     * @return string
+     */
+    protected function getCustomerGroup(Customer $customer)
+    {
+        return $customer->hasData('group_id')
+            ? $customer->getDataFieldConfig('group_id')['source']->getCustomerGroup()->getCustomerGroupId()
+            : self::GENERAL_GROUP;
+    }
+
+    /**
+     * Prepare address data for Web API.
+     *
+     * @param array $data
+     * @return array
+     */
+    protected function prepareAddressData(array $data)
+    {
+        if (!isset($data['customer']['address'])) {
+            return $data;
+        }
+        foreach ($data['customer']['address'] as $key => $addressData) {
+            $addressData['country_id'] = $this->mappingData['country_id'][$addressData['country_id']];
+            $addressData = $this->prepareRegionData($addressData);
+            $addressData = $this->prepareStreetData($addressData);
+            $addressData = $this->prepareDefaultAddressData($addressData);
+            unset($addressData['email']);
+            $data['customer']['addresses'][$key] = $addressData;
+        }
+        unset($data['customer']['address']);
+
+        return $data;
+    }
+
+    /**
+     * Prepare region data for the address.
+     *
+     * @param array $addressData
+     * @return array
+     */
+    protected function prepareRegionData(array $addressData)
+    {
+        if (isset($addressData['region'])) {
+            $addressData['region'] = [
+                'region' => $addressData['region'],
+            ];
+        }
+        if (isset($addressData['region_id'])) {
+            $addressData['region'] = [
+                'region_id' => $this->mappingData['region_id'][$addressData['region_id']]
+            ];
+            unset($addressData['region_id']);
+        }
+
+        return $addressData;
+    }
+
+    /**
+     * Prepare street data for the address.
+     *
+     * @param array $addressData
+     * @return array
+     */
+    protected function prepareStreetData(array $addressData)
+    {
+        if (!is_array($addressData['street'])) {
+            $street[] = $addressData['street'];
+            $addressData['street'] = $street;
+        }
+
+        return $addressData;
+    }
+
+    /**
+     * Prepare default address data.
+     *
+     * @param array $addressData
+     * @return array
+     */
+    protected function prepareDefaultAddressData(array $addressData)
+    {
+        if (isset($addressData['default_billing']) && $addressData['default_billing'] === 'Yes') {
+            $addressData['default_billing'] = true;
+        } else {
+            $addressData['default_billing'] = false;
+        }
+        if (isset($addressData['default_shipping']) && $addressData['default_shipping'] === 'Yes') {
+            $addressData['default_shipping'] = true;
+        } else {
+            $addressData['default_shipping'] = false;
+        }
+
+        return $addressData;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml
index 15df2b81f2518ed677cb21e5a3b9a3692808c093..ca4a46913b3b86ccc06462b957e1a7b23bdefded 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml
@@ -118,6 +118,14 @@
             </field>
         </dataset>
 
+        <dataset name="register_customer">
+            <field name="firstname" xsi:type="string">John</field>
+            <field name="lastname" xsi:type="string">Doe</field>
+            <field name="email" xsi:type="string">JohnDoe_%isolation%@example.com</field>
+            <field name="password" xsi:type="string">123123q</field>
+            <field name="password_confirmation" xsi:type="string">123123q</field>
+        </dataset>
+
         <dataset name="backend_customer">
             <field name="firstname" xsi:type="string">John</field>
             <field name="lastname" xsi:type="string">Doe%isolation%</field>
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/etc/webapi/di.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/etc/webapi/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f6bea2a0ec5a86821934152c13ed90d4e220a6f4
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/etc/webapi/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\Customer\Test\Handler\Customer\CustomerInterface" type="\Magento\Customer\Test\Handler\Customer\Webapi" />
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Dhl/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Dhl/Test/TestCase/OnePageCheckoutTest.xml
index a6daf3cbaf38f42758a1076b933de63a36a44c87..a9e54ed517058c2711cdc2096426944a0a04be6f 100644
--- a/dev/tests/functional/tests/app/Magento/Dhl/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Dhl/Test/TestCase/OnePageCheckoutTest.xml
@@ -7,7 +7,7 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Checkout\Test\TestCase\OnePageCheckoutTest">
-        <variation name="OnePageCheckoutTestVariation20" summary="Use DHL International (EU) Online Shipping Carrier on Checkout as a Registered Customer" ticketId="MAGETWO-12850">
+        <variation name="OnePageCheckoutDhlTestVariation1" summary="Use DHL International (EU) Online Shipping Carrier on Checkout as a Registered Customer" ticketId="MAGETWO-12850">
             <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data>
             <data name="checkoutMethod" xsi:type="string">login</data>
             <data name="customer/dataset" xsi:type="string">customer_DE</data>
diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/DeleteProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/DeleteProductEntityTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3eefc2707c0aee440522a6ead9a4d6053b500418
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/DeleteProductEntityTest.xml
@@ -0,0 +1,18 @@
+<?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\Catalog\Test\TestCase\Product\DeleteProductEntityTest">
+        <variation name="DeleteProductEntityTestVariation7" firstConstraint="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" method="test">
+            <data name="products" xsi:type="string">downloadableProduct::default</data>
+            <data name="isRequired" xsi:type="string">Yes</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5b18f4e3521337ea6d90ea8d1f60732e2a7454e2
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
@@ -0,0 +1,16 @@
+<?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\Checkout\Test\TestCase\DeleteProductFromMiniShoppingCartTest" summary="Delete Downloadable Product from Mini Shopping Cart" ticketId="MAGETWO-29104">
+        <variation name="DeleteDownloadableProductFromMiniShoppingCartTestVariation">
+            <data name="products" xsi:type="string">downloadableProduct::default</data>
+            <data name="deletedProductIndex" xsi:type="string">0</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml
index 2e0864df7daba455eec74359bad4fa8f45093a13..d53852fef4800cd19fa6adbf896c89cf29c983c6 100644
--- a/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml
@@ -7,8 +7,7 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Checkout\Test\TestCase\OnePageCheckoutTest">
-        <variation name="OnePageCheckoutTestVariation22">
-            <data name="description" xsi:type="string">Check Out as Guest using FedEx with US shipping origin and UK customer</data>
+        <variation name="OnePageCheckoutFedexTestVariation1" summary="Check Out as Guest using FedEx with US shipping origin and UK customer">
             <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data>
             <data name="checkoutMethod" xsi:type="string">guest</data>
             <data name="customer/dataset" xsi:type="string">default</data>
@@ -23,7 +22,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderInOrdersGrid"/>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty"/>
         </variation>
-        <variation name="OnePageCheckoutTestVariation23" summary="MAGETWO-12849" ticketId="Use FedEx Online Shipping Carrier on Checkout as a Registered Customer">
+        <variation name="OnePageCheckoutFedexTestVariation2" summary="Use FedEx Online Shipping Carrier on Checkout as a Registered Customer" ticketId="MAGETWO-12849">
             <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data>
             <data name="checkoutMethod" xsi:type="string">login</data>
             <data name="customer/dataset" xsi:type="string">customer_DE</data>
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Cart/Sidebar.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Cart/Sidebar.php
new file mode 100644
index 0000000000000000000000000000000000000000..259eaab021c6c262c55598a9663bbf37d74fa008
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Cart/Sidebar.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\GroupedProduct\Test\Block\Cart;
+
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\GroupedProduct\Test\Fixture\GroupedProduct;
+use Magento\Checkout\Test\Block\Cart\Sidebar as MiniShoppingCart;
+
+/**
+ * Mini shopping cart block.
+ */
+class Sidebar extends MiniShoppingCart
+{
+    /**
+     * Get cart item block.
+     *
+     * @param FixtureInterface $product
+     * @return \Magento\GroupedProduct\Test\Block\Cart\Sidebar\Item
+     */
+    public function getCartItem(FixtureInterface $product)
+    {
+        return $this->blockFactory->create(
+            'Magento\GroupedProduct\Test\Block\Cart\Sidebar\Item',
+            [
+                'element' => $this->_rootElement,
+                'config' => [
+                    'associated_cart_items' => $this->findCartItems($product),
+                ]
+            ]
+        );
+    }
+
+    /**
+     * Find cart item blocks for associated products.
+     *
+     * @param FixtureInterface $product
+     * @return array
+     */
+    protected function findCartItems(FixtureInterface $product)
+    {
+        $cartItems = [];
+
+        /** @var GroupedProduct $product */
+        $associatedProducts = $product->getAssociated()['products'];
+        foreach ($associatedProducts as $product) {
+            $cartItems[$product->getSku()] = parent::getCartItem($product);
+        }
+
+        return $cartItems;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Cart/Sidebar/Item.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Cart/Sidebar/Item.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9bbf2f8ae33108f01a756380183c159f21d0fa3
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Cart/Sidebar/Item.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\GroupedProduct\Test\Block\Cart\Sidebar;
+
+use Magento\Checkout\Test\Block\Cart\Sidebar\Item as ProductItem;
+
+/**
+ * Grouped Product item block on mini Cart.
+ */
+class Item extends ProductItem
+{
+    /**
+     * Remove grouped product item from mini cart.
+     *
+     * @return void
+     */
+    public function removeItemFromMiniCart()
+    {
+        foreach ($this->config['associated_cart_items'] as $productItem) {
+            /** @var ProductItem $productItem */
+            $productItem->removeItemFromMiniCart();
+        }
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Page/CmsIndex.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Page/CmsIndex.xml
new file mode 100644
index 0000000000000000000000000000000000000000..73c7c92e6b77abc9bcfaede1fee006773d9fa97c
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Page/CmsIndex.xml
@@ -0,0 +1,14 @@
+<?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="CmsIndex" mca="cms/index/index">
+        <block name="cartSidebarBlock">
+            <render name="grouped" class="Magento\GroupedProduct\Test\Block\Cart\Sidebar"/>
+        </block>
+    </page>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/DeleteProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/DeleteProductEntityTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3f8e22cc953bc5b0c94f435dc69341da10c38893
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/DeleteProductEntityTest.xml
@@ -0,0 +1,18 @@
+<?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\Catalog\Test\TestCase\Product\DeleteProductEntityTest">
+        <variation name="DeleteProductEntityTestVariation8" firstConstraint="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" method="test">
+            <data name="products" xsi:type="string">groupedProduct::default</data>
+            <data name="isRequired" xsi:type="string">Yes</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSuccessDeleteMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..af0b284725291c71795a6ac08e8c7cdc14ba8f96
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
@@ -0,0 +1,16 @@
+<?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\Checkout\Test\TestCase\DeleteProductFromMiniShoppingCartTest" summary="Delete Grouped Product from Mini Shopping Cart" ticketId="MAGETWO-29104">
+        <variation name="DeleteGroupedProductFromMiniShoppingCartTestVariation">
+            <data name="products" xsi:type="string">groupedProduct::default</data>
+            <data name="deletedProductIndex" xsi:type="string">0</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
+        </variation>
+    </testCase>
+</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 602316510e825dda680c14eb39eaff5f18a04f45..256d0caa1d980bfe82719e296395b8ed9e89d69a 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
@@ -14,6 +14,13 @@ use Magento\Mtf\Client\Locator;
  */
 class Navigation extends Block
 {
+    /**
+     * Locator for loaded "narrow-by-list" block.
+     *
+     * @var string
+     */
+    protected $loadedNarrowByList = '#narrow-by-list[role="tablist"]';
+
     /**
      * Locator value for "Clear All" link.
      *
@@ -59,11 +66,14 @@ class Navigation extends Block
      */
     public function getFilters()
     {
+        $this->waitForElementVisible($this->loadedNarrowByList);
+
         $options = $this->_rootElement->getElements(sprintf($this->optionTitle, ''), Locator::SELECTOR_XPATH);
         $data = [];
         foreach ($options as $option) {
             $data[] = strtoupper($option->getText());
         }
+
         return $data;
     }
 
@@ -80,6 +90,7 @@ class Navigation extends Block
         $expandFilterButton = sprintf($this->optionTitle, $filter);
         $links = sprintf($this->filterLink, $filter);
 
+        $this->waitForElementVisible($this->loadedNarrowByList);
         if (!$this->_rootElement->find($links, Locator::SELECTOR_XPATH)->isVisible()) {
             $this->_rootElement->find($expandFilterButton, Locator::SELECTOR_XPATH)->click();
         }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Webapi.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Webapi.php
new file mode 100644
index 0000000000000000000000000000000000000000..a1e89784737ae43635a12599a3ff534ed65c86c4
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Webapi.php
@@ -0,0 +1,329 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Sales\Test\Handler\OrderInjectable;
+
+use Magento\Bundle\Test\Fixture\BundleProduct;
+use Magento\ConfigurableProduct\Test\Fixture\ConfigurableProduct;
+use Magento\Downloadable\Test\Fixture\DownloadableProduct;
+use Magento\Sales\Test\Fixture\OrderInjectable;
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\Util\Protocol\CurlTransport;
+use Magento\Mtf\Handler\Webapi as AbstractWebapi;
+use Magento\Mtf\Util\Protocol\CurlTransport\WebapiDecorator;
+
+/**
+ * Create new order via web API.
+ */
+class Webapi extends AbstractWebapi implements OrderInjectableInterface
+{
+    /**
+     * Mapping values for data.
+     *
+     * @var array
+     */
+    protected $mappingData = [
+        'region_id' => [
+            'California' => '12',
+        ],
+        'country_id' => [
+            'United States' => 'US',
+        ],
+    ];
+
+    /**
+     * Order quote value.
+     *
+     * @var string
+     */
+    protected $quote;
+
+    /**
+     * First part of Web API url for creating order.
+     *
+     * @var string
+     */
+    protected $url;
+
+    /**
+     * Creating order using quote via web API.
+     *
+     * @param FixtureInterface|null $fixture [optional]
+     * @return array
+     */
+    public function persist(FixtureInterface $fixture = null)
+    {
+        /** @var OrderInjectable $fixture */
+        $this->createQuote($fixture);
+        $this->url = $_ENV['app_frontend_url'] . 'rest/V1/carts/' . (int)$this->quote;
+        $this->setProducts($fixture);
+        $this->setCoupon($fixture);
+        $this->setAddress($fixture, 'billing');
+        $this->setAddress($fixture, 'shipping');
+        $this->setShippingMethod($fixture);
+        $this->setPaymentMethod($fixture);
+        $orderId = $this->placeOrder();
+
+        return ['id' => sprintf("%09d", $orderId)];
+    }
+
+    /**
+     * Create checkout quote.
+     *
+     * @param OrderInjectable $order
+     * @return void
+     * @throws \Exception
+     */
+    protected function createQuote(OrderInjectable $order)
+    {
+        $url = $_ENV['app_frontend_url'] . 'rest/V1/customers/' . $order->getCustomerId()->getId() . '/carts';
+        $data = '{"customerId": "' . $order->getCustomerId()->getId() . '"}';
+        $this->webapiTransport->write($url, $data);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+        if (!is_numeric($response)) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Could not create checkout quote viw web API!');
+        }
+        $this->quote = $response;
+    }
+
+    /**
+     * Add products to quote.
+     *
+     * @param OrderInjectable $order
+     * @return void
+     * @throws \Exception
+     */
+    protected function setProducts(OrderInjectable $order)
+    {
+        $url = $_ENV['app_frontend_url'] . 'rest/V1/carts/items';
+        $products = $order->getEntityId()['products'];
+        foreach ($products as $product) {
+            $data = [
+                'cartItem' => [
+                    'sku' => $product->getSku(),
+                    'qty' => isset($product->getCheckoutData()['qty']) ? $product->getCheckoutData()['qty'] : 1,
+                    'quote_id' => $this->quote
+                ]
+            ];
+            $methodName = 'prepare' . ucfirst($product->getDataConfig()['type_id']) . 'Options';
+            if (method_exists($this, $methodName)) {
+                $data['cartItem']['product_option'] = $this->$methodName($product);
+            }
+            $this->webapiTransport->write($url, $data);
+            $response = (array)json_decode($this->webapiTransport->read(), true);
+            $this->webapiTransport->close();
+            if (isset($response['message'])) {
+                $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+                throw new \Exception('Could not add product item to quote!');
+            }
+        }
+    }
+
+    /**
+     * Set coupon to quote.
+     *
+     * @param OrderInjectable $order
+     * @return void
+     * @throws \Exception
+     */
+    protected function setCoupon(OrderInjectable $order)
+    {
+        if (!$order->hasData('coupon_code')) {
+            return;
+        }
+        $url = $this->url . '/coupons/' . $order->getCouponCode()->getCouponCode();
+        $data = [
+            'cartId' => $this->quote,
+            'couponCode' => $order->getCouponCode()->getCouponCode()
+        ];
+        $this->webapiTransport->write($url, $data, WebapiDecorator::PUT);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+        if ($response !== true) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Could not apply coupon code!');
+        }
+    }
+
+    /**
+     * Set address to quote.
+     *
+     * @param OrderInjectable $order
+     * @param string $addressType billing|shipping
+     * @return void
+     * @throws \Exception
+     */
+    protected function setAddress(OrderInjectable $order, $addressType)
+    {
+        $url = $this->url . "/$addressType-address";
+        if ($addressType == 'billing') {
+            $address = $order->getBillingAddressId();
+        } else {
+            if (!$order->hasData('shipping_method')) {
+                return;
+            }
+            $address = $order->hasData('shipping_address_id')
+                ? $order->getShippingAddressId()
+                : $order->getBillingAddressId();
+        }
+        unset($address['default_billing']);
+        unset($address['default_shipping']);
+        foreach (array_keys($this->mappingData) as $key) {
+            if (isset($address[$key])) {
+                $address[$key] = $this->mappingData[$key][$address[$key]];
+            }
+        }
+        $data = ["address" => $address];
+        $this->webapiTransport->write($url, $data);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+        if (!is_numeric($response)) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception("Could not set $addressType addresss to quote!");
+        }
+    }
+
+    /**
+     * Set shipping method to quote.
+     *
+     * @param OrderInjectable $order
+     * @return void
+     * @throws \Exception
+     */
+    protected function setShippingMethod(OrderInjectable $order)
+    {
+        if (!$order->hasData('shipping_method')) {
+            return;
+        }
+        $url = $this->url . '/selected-shipping-method';
+        list($carrier, $method) = explode('_', $order->getShippingMethod());
+        $data = [
+            "carrierCode" => $carrier,
+            "methodCode" => $method
+        ];
+        $this->webapiTransport->write($url, $data, WebapiDecorator::PUT);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+        if ($response !== true) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Could not set shipping method to quote!');
+        }
+    }
+
+    /**
+     * Set payment method to quote.
+     *
+     * @param OrderInjectable $order
+     * @return void
+     * @throws \Exception
+     */
+    protected function setPaymentMethod(OrderInjectable $order)
+    {
+        $url = $this->url . '/selected-payment-method';
+        $data = [
+            "cartId" => $this->quote,
+            "method" => $order->getPaymentAuthExpiration()
+        ];
+        $this->webapiTransport->write($url, $data, WebapiDecorator::PUT);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+        if (!is_numeric($response)) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Could not set payment method to quote!');
+        }
+    }
+
+    /**
+     * Place order.
+     *
+     * @return array
+     * @throws \Exception
+     */
+    protected function placeOrder()
+    {
+        $url = $this->url . '/order';
+        $data = ["cartId" => $this->quote];
+        $this->webapiTransport->write($url, $data, WebapiDecorator::PUT);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+        if (!is_numeric($response)) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Could not place order via web API!');
+        }
+
+        return $response;
+    }
+
+    /**
+     * Prepare configurable product options.
+     *
+     * @param ConfigurableProduct $product
+     * @return array
+     */
+    protected function prepareConfigurableOptions(ConfigurableProduct $product)
+    {
+        $options = [];
+        $attributesData = $product->getDataFieldConfig('configurable_attributes_data')['source']->getAttributesData();
+        foreach ($product->getCheckoutData()['options']['configurable_options'] as $checkoutOption) {
+            $options[] = [
+                'option_id' => $attributesData[$checkoutOption['title']]['attribute_id'],
+                'option_value' => $attributesData[$checkoutOption['title']]['options'][$checkoutOption['value']]['id'],
+            ];
+        }
+
+        return ['extension_attributes' => ['configurable_item_options' => $options]];
+    }
+
+    /**
+     * Prepare bundle product options.
+     *
+     * @param BundleProduct $product
+     * @return array
+     */
+    protected function prepareBundleOptions(BundleProduct $product)
+    {
+        $options = [];
+        foreach ($product->getCheckoutData()['options']['bundle_options'] as $checkoutOption) {
+            foreach ($product->getBundleSelections()['bundle_options'] as $productOption) {
+                if (strpos($productOption['title'], $checkoutOption['title']) !== false) {
+                    $option = [];
+                    foreach ($productOption['assigned_products'] as $productData) {
+                        if (strpos($productData['search_data']['name'], $checkoutOption['value']['name']) !== false) {
+                            $qty = isset($checkoutOption['qty'])
+                                ? $checkoutOption['qty']
+                                : $productData['data']['selection_qty'];
+                            $option['option_id'] = $productData['option_id'];
+                            $option['option_selections'][] = $productData['selection_id'];
+                            $option['option_qty'] = $qty;
+                        }
+                    }
+                    $options[] = $option;
+                }
+            }
+        }
+
+        return ['extension_attributes' => ['bundle_options' => $options]];
+    }
+
+    /**
+     * Prepare downloadable product options.
+     *
+     * @param DownloadableProduct $product
+     * @return array
+     */
+    protected function prepareDownloadableOptions(DownloadableProduct $product)
+    {
+        $checkoutData = $product->getCheckoutData();
+        $links = [];
+        foreach ($checkoutData['options']['links'] as $link) {
+            $links[] = $link['id'];
+        }
+
+        return ['extension_attributes' => ['downloadable_option' => ['downloadable_links' => $links]]];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Repository/OrderInjectable.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Repository/OrderInjectable.xml
index 1429cfef5546424faeae806818033ebb5e03172e..8949fe1957d60a49352cd14af40215a94a697e03 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Repository/OrderInjectable.xml
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Repository/OrderInjectable.xml
@@ -221,7 +221,6 @@
             <field name="store_id" xsi:type="array">
                 <item name="dataset" xsi:type="string">default_store_view</item>
             </field>
-            <field name="shipping_method" xsi:type="string">flatrate_flatrate</field>
             <field name="payment_auth_expiration" xsi:type="array">
                 <item name="method" xsi:type="string">checkmo</item>
             </field>
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/webapi/di.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/webapi/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cfc53a1e744c0916c115a370f8aedb8613c92c70
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/webapi/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\Sales\Test\Handler\OrderInjectable\OrderInjectableInterface" type="\Magento\Sales\Test\Handler\OrderInjectable\Webapi" />
+</config>
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 d8a6445267051487c7f813a13dc62be1c8fd6981..bbfd4495e63d6844c8b2c2b764dc614a47a12dac 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
@@ -26,7 +26,7 @@ class AssertCartPriceRuleForm extends AbstractConstraint
         'actions_serialized',
         'from_date',
         'to_date',
-        'id'
+        'rule_id'
     ];
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule.xml b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule.xml
index e02f275c2dfdd37e68790c5bb936cdf3704ce7d8..c82680f07a6f4751898e3ce76a81a329a100153a 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule.xml
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Fixture/SalesRule.xml
@@ -14,7 +14,7 @@
              repository_class="Magento\SalesRule\Test\Repository\SalesRule"
              handler_interface="Magento\SalesRule\Test\Handler\SalesRule\SalesRuleInterface"
              class="Magento\SalesRule\Test\Fixture\SalesRule">
-        <field name="rule_id" is_required="1" />
+        <field name="rule_id" is_required="0" group="null"/>
         <field name="name" group="rule_information" />
         <field name="description" group="rule_information" />
         <field name="from_date" group="rule_information" source="Magento\Backend\Test\Fixture\Source\Date" />
@@ -38,7 +38,6 @@
         <field name="use_auto_generation" group="rule_information" />
         <field name="uses_per_coupon" group="rule_information" />
         <field name="simple_free_shipping" group="actions" />
-        <field name="id" />
         <field name="website_ids" group="rule_information" />
         <field name="customer_group_ids" group="rule_information" />
         <field name="store_labels" group="labels" />
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Curl.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Curl.php
index 8de3162663eb03999d0758b59ba8278e0d61f4ed..e6a910a76fa656acc36dbb993f47efb476c89d9e 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Curl.php
@@ -10,12 +10,27 @@ use Magento\Backend\Test\Handler\Conditions;
 use Magento\Mtf\Fixture\FixtureInterface;
 use Magento\Mtf\Util\Protocol\CurlTransport;
 use Magento\Mtf\Util\Protocol\CurlTransport\BackendDecorator;
+use Magento\SalesRule\Test\Fixture\SalesRule;
 
 /**
  * Curl handler for creating sales rule.
  */
 class Curl extends Conditions implements SalesRuleInterface
 {
+    /**
+     * Sales rule instance.
+     *
+     * @var SalesRule
+     */
+    protected $fixture;
+
+    /**
+     * Prepared data for request to create sales rule.
+     *
+     * @var array
+     */
+    protected $data;
+
     /**
      * Map of type parameter.
      *
@@ -69,7 +84,7 @@ class Curl extends Conditions implements SalesRuleInterface
         ],
         'is_rss' => [
             'Yes' => 1,
-            'No' => 2,
+            'No' => 0,
         ],
         'simple_action' => [
             'Percent of product price discount' => 'by_percent',
@@ -79,11 +94,11 @@ class Curl extends Conditions implements SalesRuleInterface
         ],
         'apply_to_shipping' => [
             'Yes' => 1,
-            'No' => 2,
+            'No' => 0,
         ],
         'stop_rules_processing' => [
             'Yes' => 1,
-            'No' => 2,
+            'No' => 0,
         ],
         'simple_free_shipping' => [
             'No' => 0,
@@ -123,23 +138,9 @@ class Curl extends Conditions implements SalesRuleInterface
     public function persist(FixtureInterface $fixture = null)
     {
         $this->mapTypeParams = array_merge($this->mapTypeParams, $this->additionalMapTypeParams);
-        $url = $_ENV['app_backend_url'] . 'sales_rule/promo_quote/save/';
-        $data = $this->replaceMappingData($fixture->getData());
-        $data['rule'] = [];
-        if (isset($data['conditions_serialized'])) {
-            $data['rule']['conditions'] = $this->prepareCondition($data['conditions_serialized']);
-            unset($data['conditions_serialized']);
-        }
 
-        $data['website_ids'] = $this->prepareWebsites($data);
-        $data['customer_group_ids'] = $this->prepareCustomerGroup($data);
-
-        if (isset($data['actions_serialized'])) {
-            $this->mapTypeParams['Conditions combination']['type'] =
-                'Magento\SalesRule\Model\Rule\Condition\Product\Combine';
-            $data['rule']['actions'] = $this->prepareCondition($data['actions_serialized']);
-            unset($data['actions_serialized']);
-        }
+        $data = $this->prepareData($fixture);
+        $url = $_ENV['app_backend_url'] . 'sales_rule/promo_quote/save/';
         $curl = new BackendDecorator(new CurlTransport(), $this->_configuration);
         $curl->write($url, $data);
         $response = $curl->read();
@@ -153,42 +154,70 @@ class Curl extends Conditions implements SalesRuleInterface
             throw new \Exception('Cannot find Sales Rule id');
         }
 
-        return ['id' => $matches[1]];
+        return ['rule_id' => $matches[1]];
+    }
+
+    /**
+     * Prepare data for creating sales rule request.
+     *
+     * @param FixtureInterface $fixture
+     * @return array
+     */
+    public function prepareData(FixtureInterface $fixture)
+    {
+        $this->fixture = $fixture;
+        $this->data = $this->replaceMappingData($this->fixture->getData());
+
+        $this->data['rule'] = [];
+        if (isset($this->data['conditions_serialized'])) {
+            $this->data['rule']['conditions'] = $this->prepareCondition($this->data['conditions_serialized']);
+            unset($this->data['conditions_serialized']);
+        }
+
+        $this->prepareWebsites();
+        $this->prepareCustomerGroup();
+
+        if (isset($this->data['actions_serialized'])) {
+            $this->mapTypeParams['Conditions combination']['type'] =
+                'Magento\SalesRule\Model\Rule\Condition\Product\Combine';
+            $this->data['rule']['actions'] = $this->prepareCondition($this->data['actions_serialized']);
+            unset($this->data['actions_serialized']);
+        }
+
+        return $this->data;
     }
 
     /**
      * Prepare website data for curl.
      *
-     * @param array $data
      * @return array
      */
-    protected function prepareWebsites(array $data)
+    protected function prepareWebsites()
     {
         $websiteIds = [];
-        if (!empty($data['website_ids'])) {
-            foreach ($data['website_ids'] as $name) {
+        if (!empty($this->data['website_ids'])) {
+            foreach ($this->data['website_ids'] as $name) {
                 $websiteIds[] = isset($this->websiteIds[$name]) ? $this->websiteIds[$name] : $name;
             }
         }
 
-        return $websiteIds;
+        $this->data['website_ids'] = $websiteIds;
     }
 
     /**
      * Prepare customer group data for curl.
      *
-     * @param array $data
      * @return array
      */
-    protected function prepareCustomerGroup(array $data)
+    protected function prepareCustomerGroup()
     {
         $groupIds = [];
-        if (!empty($data['customer_group_ids'])) {
-            foreach ($data['customer_group_ids'] as $name) {
+        if (!empty($this->data['customer_group_ids'])) {
+            foreach ($this->data['customer_group_ids'] as $name) {
                 $groupIds[] = isset($this->customerIds[$name]) ? $this->customerIds[$name] : $name;
             }
         }
 
-        return $groupIds;
+        $this->data['customer_group_ids'] = $groupIds;
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Webapi.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Webapi.php
new file mode 100644
index 0000000000000000000000000000000000000000..66597cf0edfcdf2d94118d8217620442c2572de2
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Handler/SalesRule/Webapi.php
@@ -0,0 +1,258 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\SalesRule\Test\Handler\SalesRule;
+
+use Magento\Mtf\Config\DataInterface;
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\System\Event\EventManagerInterface;
+use Magento\Mtf\Util\Protocol\CurlTransport;
+use Magento\Mtf\Util\Protocol\CurlTransport\WebapiDecorator;
+use Magento\Mtf\Handler\Webapi as AbstractWebapi;
+use Magento\SalesRule\Test\Fixture\SalesRule;
+
+/**
+ * Create new sales rule via webapi.
+ */
+class Webapi extends AbstractWebapi implements SalesRuleInterface
+{
+    /**
+     * Sales rule instance.
+     *
+     * @var SalesRule
+     */
+    protected $fixture;
+
+    /**
+     * Prepared data for creating sales rule.
+     *
+     * @var array
+     */
+    protected $data;
+
+    /**
+     * Curl handler instance.
+     *
+     * @var Curl
+     */
+    protected $handlerCurl;
+
+    /**
+     * List fields that only relate to coupon.
+     * 
+     * @var array
+     */
+    protected $couponFields = [
+        'coupon_code'
+    ];
+
+
+    /**
+     * @constructor
+     * @param DataInterface $configuration
+     * @param EventManagerInterface $eventManager
+     * @param WebapiDecorator $webapiTransport
+     * @param Curl $handlerCurl
+     */
+    public function __construct(
+        DataInterface $configuration,
+        EventManagerInterface $eventManager,
+        WebapiDecorator $webapiTransport,
+        Curl $handlerCurl
+    ) {
+        parent::__construct($configuration, $eventManager, $webapiTransport);
+        $this->handlerCurl = $handlerCurl;
+    }
+
+    /**
+     * Post request for creating sales rule.
+     *
+     * @param FixtureInterface|null $fixture [optional]
+     * @return array
+     * @throws \Exception
+     */
+    public function persist(FixtureInterface $fixture = null)
+    {
+        $data = $this->prepareData($fixture);
+        $url = $_ENV['app_frontend_url'] . 'rest/V1/salesRules';
+
+        $this->webapiTransport->write($url, $data);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+
+        if (empty($response['rule_id'])) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('sales rule creation by webapi handler was not successful!');
+        }
+
+        $this->createCoupon($response['rule_id']);
+
+        return ['rule_id' => $response['rule_id']];
+    }
+
+    /**
+     * Prepare sales rule data for webapi request.
+     *
+     * @param FixtureInterface $fixture
+     * @return array
+     */
+    public function prepareData(FixtureInterface $fixture)
+    {
+        $this->fixture = $fixture;
+        $this->data = $this->handlerCurl->prepareData($fixture);
+
+        $this->prepareRuleInformation();
+        $this->prepareConditions();
+        $this->prepareActions();
+        $this->prepareLabels();
+
+        unset($this->data['rule']);
+        return ['rule' => $this->data];
+    }
+
+    /**
+     * Preparation of "Rule Information" tab.
+     *
+     * @return void
+     */
+    protected function prepareRuleInformation()
+    {
+        $this->data = array_diff_key($this->data, array_flip($this->couponFields));
+        $this->data['coupon_type'] = strtoupper(str_replace(' ', '_', $this->fixture->getCouponType()));
+    }
+
+    /**
+     * Preparation of "Conditions" tab.
+     *
+     * @return void
+     */
+    protected function prepareConditions()
+    {
+        if (isset($this->data['rule']['conditions'])) {
+            $this->data['condition'] = $this->convertCondition($this->data['rule']['conditions'])[0];
+        }
+    }
+
+    /**
+     * Preparation of "Actions" tab.
+     *
+     * @return void
+     */
+    protected function prepareActions()
+    {
+        if (isset($this->data['rule']['actions'])) {
+            $this->data['action_condition'] = $this->convertCondition($this->data['rule']['actions'])[0];
+        }
+    }
+
+    /**
+     * Preparation of "Labels" tab.
+     *
+     * @return void
+     */
+    protected function prepareLabels()
+    {
+        if (isset($this->data['store_labels'])) {
+            foreach ($this->data['store_labels'] as $storeId => $label) {
+                $this->data['store_labels'][$storeId] = [
+                    'store_id' => $storeId,
+                    'store_label' => $label
+                ];
+            }
+        }
+    }
+
+    /**
+     * Create coupon related to sales rule .
+     *
+     * @param int $ruleId
+     * @return void
+     * @throws \Exception
+     */
+    protected function createCoupon($ruleId)
+    {
+        if (!$this->fixture->hasData('coupon_code')) {
+            return;
+        }
+
+        $url = $_ENV['app_frontend_url'] . 'rest/V1/coupons';
+        $data = [
+            'coupon' => array_filter([
+                'rule_id' => $ruleId,
+                'code' => $this->fixture->getCouponCode(),
+                'type' => $this->data['coupon_type'],
+                'usage_limit' => isset($this->data['uses_per_coupon'])
+                    ? $this->data['uses_per_coupon']
+                    : null,
+                'usage_per_customer' => isset($this->data['usage_per_customer'])
+                    ? $this->data['usage_per_customer']
+                    : null,
+                'is_primary' => true
+            ])
+        ];
+
+        $this->webapiTransport->write($url, $data);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+
+        if (empty($response['coupon_id'])) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Coupon creation by webapi handler was not successful!');
+        }
+    }
+
+    /**
+     * Convert condition data to webapi structure request.
+     *
+     * @param array $condition
+     * @param string $prefix [optional]
+     * @param int $indent [optional]
+     * @return array
+     *
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     */
+    protected function convertCondition(array $condition, $prefix = '', $indent = 1)
+    {
+        $result = [];
+
+        $key = "{$prefix}{$indent}";
+        $isContinue = isset($condition[$key]);
+        while ($isContinue) {
+            $childCondition = $this->convertCondition($condition, "{$prefix}{$indent}--", 1);
+            $result[] = array_filter([
+                'condition_type' => $condition[$key]['type'],
+                'aggregator_type' => isset($condition[$key]['aggregator'])
+                    ? $condition[$key]['aggregator']
+                    : null,
+                'attribute_name' => isset($condition[$key]['attribute'])
+                    ? $condition[$key]['attribute']
+                    : null,
+                'operator' => isset($condition[$key]['operator'])
+                    ? $condition[$key]['operator']
+                    : null,
+                'value' => $condition[$key]['value'],
+                'conditions' => empty($childCondition) ? null : $childCondition
+            ], [$this, 'filterCondition']);
+
+            $indent += 1;
+            $key = "{$prefix}{$indent}";
+            $isContinue = isset($condition[$key]);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Filter condition data.
+     *
+     * @param mixed $var
+     * @return bool
+     */
+    public function filterCondition($var)
+    {
+        return null !== $var;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.xml b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.xml
index 67409f56197164f79354a5d9f2c2645bce598c53..4c384ea3f8853265fa0ba9877a56492a871914dc 100644
--- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.xml
@@ -11,14 +11,14 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule1 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Sales Cart Rule labels</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Sales Cart Rule labels</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">1</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleForm" />
@@ -28,15 +28,15 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule2 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">Specific Coupon</data>
             <data name="salesRule/data/coupon_code" xsi:type="string">1A2B3C-456-zxc-%isolation%</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Fixed amount discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">35</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Coupon code+fixed amount discount</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Coupon code+fixed amount discount</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">2</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleForm" />
@@ -46,15 +46,15 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule3 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">Specific Coupon</data>
             <data name="salesRule/data/coupon_code" xsi:type="string">Lorem ipsum dolor sit amet, consectetur adipiscing elit - %isolation%</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Fixed amount discount for whole cart</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">60</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Coupon code+Fixed amount discount for whole cart</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Coupon code+Fixed amount discount for whole cart</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">3</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleForm" />
@@ -64,8 +64,8 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule4 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">Specific Coupon</data>
             <data name="salesRule/data/coupon_code" xsi:type="string">1A2B3C-456-zxc-%isolation%</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Buy X get Y free (discount amount is Y)</data>
@@ -73,7 +73,7 @@
             <data name="salesRule/data/discount_step" xsi:type="string">3</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Buy X get Y free</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Buy X get Y free</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">4</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleForm" />
@@ -84,8 +84,8 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule5 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">General</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">General</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
@@ -106,14 +106,14 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule6 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">Yes</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Apply discount to Shipping Amount</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Apply discount to Shipping Amount</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">1</data>
             <data name="productQuantity/productForSalesRule2" xsi:type="string">1</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
@@ -129,14 +129,14 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule7 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">For matching items only</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Free Shipping in conditions</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Free Shipping in conditions</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">1</data>
             <data name="productQuantity/productForSalesRule2" xsi:type="string">1</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
@@ -148,15 +148,15 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule8 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/conditions_serialized" xsi:type="string">[Subtotal|is|150]</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Sales Cart Rule labels</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Sales Cart Rule labels</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">1</data>
             <data name="productQuantity/productForSalesRule2" xsi:type="string">1</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
@@ -167,15 +167,15 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule9 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/conditions_serialized" xsi:type="string">[Subtotal|is|150]</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Subtotal Action-Condition test</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Subtotal Action-Condition test</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">2</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleForm" />
@@ -185,15 +185,15 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule10 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/conditions_serialized" xsi:type="string">[Total Items Quantity|is|2]</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Total Items Quantity is 2</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Total Items Quantity is 2</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">2</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleForm" />
@@ -203,15 +203,15 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule11 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/conditions_serialized" xsi:type="string">[Total Weight|is|150]</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Total Weight is 150</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Total Weight is 150</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">1</data>
             <data name="productQuantity/productForSalesRule2" xsi:type="string">1</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
@@ -227,15 +227,15 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule12 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/conditions_serialized" xsi:type="string">{Conditions combination:[[Shipping Method|is|\[flatrate\] Fixed][Shipping Postcode|is|95814][Shipping State/Province|is|California][Shipping Country|is|United States]]}</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Rule applied conditions combination</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Rule applied conditions combination</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">1</data>
             <data name="productQuantity/productForSalesRule2" xsi:type="string">1</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
@@ -246,15 +246,15 @@
             <data name="salesRule/data/name" xsi:type="string">Cart Price Rule13 %isolation%</data>
             <data name="salesRule/data/description" xsi:type="string">Cart Price Rule Description %isolation%</data>
             <data name="salesRule/data/is_active" xsi:type="string">Active</data>
-            <data name="salesRule/data/website_ids/website_0" xsi:type="string">Main Website</data>
-            <data name="salesRule/data/customer_group_ids/group_0" xsi:type="string">NOT LOGGED IN</data>
+            <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data>
+            <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data>
             <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data>
             <data name="salesRule/data/conditions_serialized" xsi:type="string">{Product attribute combination:[Product Template|is|Default]}</data>
             <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data>
             <data name="salesRule/data/discount_amount" xsi:type="string">50</data>
             <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data>
             <data name="salesRule/data/simple_free_shipping" xsi:type="string">No</data>
-            <data name="salesRule/data/store_labels/store_labels_0" xsi:type="string">Product attribute discount</data>
+            <data name="salesRule/data/store_labels/0" xsi:type="string">Product attribute discount</data>
             <data name="productQuantity/productForSalesRule1" xsi:type="string">1</data>
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleSuccessSaveMessage" />
             <constraint name="Magento\SalesRule\Test\Constraint\AssertCartPriceRuleForm" />
diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/etc/webapi/di.xml b/dev/tests/functional/tests/app/Magento/SalesRule/Test/etc/webapi/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d925be4507a3c05b84a14345d64c236b79ae421f
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/etc/webapi/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\SalesRule\Test\Handler\SalesRule\SalesRuleInterface" type="\Magento\SalesRule\Test\Handler\SalesRule\Webapi" />
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxClass/Webapi.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxClass/Webapi.php
new file mode 100644
index 0000000000000000000000000000000000000000..e6a1ba3568948a2d07e428b47eab0caa849a76a0
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxClass/Webapi.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Tax\Test\Handler\TaxClass;
+
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\Util\Protocol\CurlTransport;
+use Magento\Mtf\Handler\Webapi as AbstractWebapi;
+
+/**
+ * Create Tax Class via Web API.
+ */
+class Webapi extends AbstractWebapi implements TaxClassInterface
+{
+    /**
+     * Persist Tax Class using Web API handler.
+     *
+     * @param FixtureInterface $fixture
+     * @return array
+     * @throws \Exception
+     */
+    public function persist(FixtureInterface $fixture = null)
+    {
+        $data['taxClass'] = $fixture->getData();
+
+        $url = $_ENV['app_frontend_url'] . 'rest/V1/taxClasses';
+        $this->webapiTransport->write($url, $data);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+
+        if (!is_numeric($response)) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Tax class creation by Web API handler was not successful!');
+        }
+
+        return ['id' => $response];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRate/Curl.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRate/Curl.php
index 2220821ccaa1ccbe14f2b8b5ad2ea39a97e988e8..8cb4ab4f8a99053d03ab641fdd394a7df18fe1a7 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRate/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRate/Curl.php
@@ -6,53 +6,50 @@
 
 namespace Magento\Tax\Test\Handler\TaxRate;
 
+use Magento\Tax\Test\Fixture\TaxRate;
 use Magento\Mtf\Fixture\FixtureInterface;
 use Magento\Mtf\Handler\Curl as AbstractCurl;
 use Magento\Mtf\Util\Protocol\CurlTransport;
 use Magento\Mtf\Util\Protocol\CurlTransport\BackendDecorator;
 
 /**
- * Class Curl
- * Curl handler for creating Tax Rate
+ * Curl handler for creating Tax Rate.
  */
 class Curl extends AbstractCurl implements TaxRateInterface
 {
     /**
-     * Mapping for countries
+     * Mapping values for data.
      *
      * @var array
      */
-    protected $countryId = [
-        'AU' => 'Australia',
-        'US' => 'United States',
-        'GB' => 'United Kingdom',
+    protected $mappingData = [
+        'tax_country_id' => [
+            'Australia' => 'AU',
+            'United States' => 'US',
+            'United Kingdom' => 'GB',
+        ],
+        'tax_region_id' => [
+            '*' => '0',
+            'California' => '12',
+            'New York' => '43',
+            'Texas' => '57',
+        ],
+        'zip_is_range' => [
+            'Yes' => '1',
+            'No' => '0'
+        ]
     ];
 
     /**
-     * Mapping for regions
-     *
-     * @var array
-     */
-    protected $regionId = [
-        '0' => '*',
-        '12' => 'California',
-        '43' => 'New York',
-        '57' => 'Texas',
-    ];
-
-    /**
-     * Post request for creating tax rate
+     * Post request for creating tax rate.
      *
      * @param FixtureInterface $fixture [optional]
-     * @return mixed|string
+     * @return array
      */
     public function persist(FixtureInterface $fixture = null)
     {
-        $data = $fixture->getData();
-        $data['tax_country_id'] = array_search($data['tax_country_id'], $this->countryId);
-        if (isset($data['tax_region_id'])) {
-            $data['tax_region_id'] = array_search($data['tax_region_id'], $this->regionId);
-        }
+        /** @var TaxRate $fixture */
+        $data = $this->prepareData($fixture);
 
         $url = $_ENV['app_backend_url'] . 'tax/rate/ajaxSave/?isAjax=true';
         $curl = new BackendDecorator(new CurlTransport(), $this->_configuration);
@@ -65,7 +62,18 @@ class Curl extends AbstractCurl implements TaxRateInterface
     }
 
     /**
-     * Return saved tax rate id
+     * Prepare tax rate data.
+     *
+     * @param TaxRate $taxRate
+     * @return array
+     */
+    public function prepareData(TaxRate $taxRate)
+    {
+        return $this->replaceMappingData($taxRate->getData());
+    }
+
+    /**
+     * Return saved tax rate id.
      *
      * @param $response
      * @return int|null
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRate/Webapi.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRate/Webapi.php
new file mode 100644
index 0000000000000000000000000000000000000000..717e6927cc3c118faf637d485b8fae9b54724439
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRate/Webapi.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Tax\Test\Handler\TaxRate;
+
+use Magento\Tax\Test\Fixture\TaxRate;
+use Magento\Mtf\Config\DataInterface;
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\Util\Protocol\CurlTransport;
+use Magento\Mtf\Handler\Webapi as AbstractWebapi;
+use Magento\Mtf\System\Event\EventManagerInterface;
+use Magento\Mtf\Util\Protocol\CurlTransport\WebapiDecorator;
+
+/**
+ * Create Tax Rate via Web API.
+ */
+class Webapi extends AbstractWebapi implements TaxRateInterface
+{
+    /**
+     * Tax Rate cUrl handler.
+     *
+     * @var Curl
+     */
+    protected $taxRateCurl;
+
+    /**
+     * @constructor
+     * @param DataInterface $configuration
+     * @param EventManagerInterface $eventManager
+     * @param WebapiDecorator $webapiTransport
+     * @param Curl $taxRateCurl
+     */
+    public function __construct(
+        DataInterface $configuration,
+        EventManagerInterface $eventManager,
+        WebapiDecorator $webapiTransport,
+        Curl $taxRateCurl
+    ) {
+        parent::__construct($configuration, $eventManager, $webapiTransport);
+        $this->taxRateCurl = $taxRateCurl;
+    }
+
+    /**
+     * Persist Tax Rate using Web API handler.
+     *
+     * @param FixtureInterface $fixture
+     * @return array
+     * @throws \Exception
+     */
+    public function persist(FixtureInterface $fixture = null)
+    {
+        /** @var TaxRate $fixture */
+        $data['tax_rate'] = $this->taxRateCurl->prepareData($fixture);
+
+        $url = $_ENV['app_frontend_url'] . 'rest/V1/taxRates';
+        $this->webapiTransport->write($url, $data);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+
+        if (empty($response['id'])) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Tax rate creation by Web API handler was not successful!');
+        }
+
+        return ['id' => $response['id']];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRule/Curl.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRule/Curl.php
index 1e3d68e53e40f2dd391f5acaebf7f83b643c4230..3583e38bff8a5a3b1ef2258e0e6547ca87dad059 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRule/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRule/Curl.php
@@ -6,19 +6,19 @@
 
 namespace Magento\Tax\Test\Handler\TaxRule;
 
+use Magento\Tax\Test\Fixture\TaxRule;
 use Magento\Mtf\Fixture\FixtureInterface;
 use Magento\Mtf\Handler\Curl as AbstractCurl;
 use Magento\Mtf\Util\Protocol\CurlTransport;
 use Magento\Mtf\Util\Protocol\CurlTransport\BackendDecorator;
 
 /**
- * Class Curl
- * Curl handler for creating Tax Rule
+ * Curl handler for creating Tax Rule.
  */
 class Curl extends AbstractCurl implements TaxRuleInterface
 {
     /**
-     * Default Tax Class values
+     * Default Tax Class values.
      *
      * @var array
      */
@@ -28,13 +28,15 @@ class Curl extends AbstractCurl implements TaxRuleInterface
     ];
 
     /**
-     * Post request for creating tax rule
+     * Post request for creating tax rule.
      *
      * @param FixtureInterface $fixture
-     * @return mixed|null
+     * @return array
+     * @throws \Exception
      */
     public function persist(FixtureInterface $fixture = null)
     {
+        /** @var TaxRule $fixture */
         $data = $this->prepareData($fixture);
 
         $url = $_ENV['app_backend_url'] . 'tax/rule/save/?back=1';
@@ -44,42 +46,55 @@ class Curl extends AbstractCurl implements TaxRuleInterface
         $response = $curl->read();
         $curl->close();
 
+        if (!strpos($response, 'data-ui-id="messages-message-success"')) {
+            $this->_eventManager->dispatchEvent(['curl_failed'], [$response]);
+            throw new \Exception("Tax rate creation by curl handler was not successful!");
+        }
+
         preg_match("~Location: [^\s]*\/rule\/(\d+)~", $response, $matches);
         $id = isset($matches[1]) ? $matches[1] : null;
+
         return ['id' => $id];
     }
 
     /**
-     * Returns data for curl POST params
+     * Returns data for Web API params.
      *
-     * @param FixtureInterface $fixture
-     * @return mixed
-     *
-     * @SuppressWarnings(PHPMD.UnusedLocalVariable)
+     * @param TaxRule $fixture
+     * @return array
      */
-    protected function prepareData($fixture)
+    protected function prepareData(TaxRule $fixture)
     {
         $data = $fixture->getData();
-        $fields = [
-            'tax_rate',
-            'tax_customer_class',
-            'tax_product_class',
-        ];
+        $data = $this->prepareFieldData($fixture, $data, 'tax_rate');
+        $data = $this->prepareFieldData($fixture, $data, 'tax_product_class');
+        $data = $this->prepareFieldData($fixture, $data, 'tax_customer_class');
 
-        foreach ($fields as $field) {
-            if (!array_key_exists($field, $data)) {
-                $data[$field][] = $this->defaultTaxClasses[$field];
-                continue;
-            }
-            $fieldFixture = $fixture->getDataFieldConfig($field);
-            $fieldFixture = $fieldFixture['source']->getFixture();
-            foreach ($data[$field] as $key => $value) {
-                $id = $fieldFixture[$key]->getId();
-                if ($id === null) {
-                    $fieldFixture[$key]->persist();
-                    $id = $fieldFixture[$key]->getId();
+        return $data;
+    }
+
+    /**
+     * Prepare tax rule field data using new field.
+     *
+     * @param TaxRule $fixture
+     * @param array $data
+     * @param string $fixtureField
+     * @param string $newField
+     * @return array
+     */
+    public function prepareFieldData(TaxRule $fixture, array $data, $fixtureField, $newField = null)
+    {
+        $newField = $newField === null ? $fixtureField : $newField;
+        unset($data[$fixtureField]);
+
+        if (!$fixture->hasData($fixtureField)) {
+            $data[$newField][] = $this->defaultTaxClasses[$fixtureField];
+        } else {
+            foreach ($fixture->getDataFieldConfig($fixtureField)['source']->getFixture() as $taxField) {
+                if (!$taxField->hasData('id')) {
+                    $taxField->persist();
                 }
-                $data[$field][$key] = $id;
+                $data[$newField][] = $taxField->getId();
             }
         }
 
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRule/Webapi.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRule/Webapi.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a875d965d0336fb957ef769bc472ed4756152ad
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Handler/TaxRule/Webapi.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Tax\Test\Handler\TaxRule;
+
+use Magento\Tax\Test\Fixture\TaxRule;
+use Magento\Mtf\Config\DataInterface;
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\Util\Protocol\CurlTransport;
+use Magento\Mtf\Handler\Webapi as AbstractWebapi;
+use Magento\Mtf\System\Event\EventManagerInterface;
+use Magento\Mtf\Util\Protocol\CurlTransport\WebapiDecorator;
+
+/**
+ * Create Tax Rule via Web API handler.
+ */
+class Webapi extends AbstractWebapi implements TaxRuleInterface
+{
+    /**
+     * Tax Rule cUrl handler.
+     *
+     * @var Curl
+     */
+    protected $taxRuleCurl;
+
+    /**
+     * @constructor
+     * @param DataInterface $configuration
+     * @param EventManagerInterface $eventManager
+     * @param WebapiDecorator $webapiTransport
+     * @param Curl $taxRuleCurl
+     */
+    public function __construct(
+        DataInterface $configuration,
+        EventManagerInterface $eventManager,
+        WebapiDecorator $webapiTransport,
+        Curl $taxRuleCurl
+    ) {
+        parent::__construct($configuration, $eventManager, $webapiTransport);
+        $this->taxRuleCurl = $taxRuleCurl;
+    }
+
+    /**
+     * Web API request for creating Tax Rule.
+     *
+     * @param FixtureInterface $fixture
+     * @return array
+     * @throws \Exception
+     */
+    public function persist(FixtureInterface $fixture = null)
+    {
+        /** @var TaxRule $fixture */
+        $data = $this->prepareData($fixture);
+
+        $url = $_ENV['app_frontend_url'] . 'rest/V1/taxRules';
+        $this->webapiTransport->write($url, $data);
+        $response = json_decode($this->webapiTransport->read(), true);
+        $this->webapiTransport->close();
+
+        if (empty($response['id'])) {
+            $this->eventManager->dispatchEvent(['webapi_failed'], [$response]);
+            throw new \Exception('Tax rule creation by Web API handler was not successful!');
+        }
+
+        return ['id' => $response['id']];
+    }
+
+    /**
+     * Returns data for Web API params.
+     *
+     * @param TaxRule $fixture
+     * @return array
+     */
+    protected function prepareData(TaxRule $fixture)
+    {
+        $data = $fixture->getData();
+        $data = $this->taxRuleCurl->prepareFieldData($fixture, $data, 'tax_rate', 'tax_rate_ids');
+        $data = $this->taxRuleCurl->prepareFieldData($fixture, $data, 'tax_product_class', 'product_tax_class_ids');
+        $data = $this->taxRuleCurl->prepareFieldData($fixture, $data, 'tax_customer_class', 'customer_tax_class_ids');
+
+        return ['rule' => $data];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Repository/TaxRule.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/Repository/TaxRule.xml
index 33da36427e2d5bb4395042d4594e71d43abf3fc1..26d4869dbaff39e325128723044e04b15d743001 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/Repository/TaxRule.xml
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Repository/TaxRule.xml
@@ -10,7 +10,9 @@
         <dataset name="default">
             <field name="code" xsi:type="string">TaxIdentifier%isolation%</field>
             <field name="tax_rate" xsi:type="array">
-                <item name="dataset" xsi:type="string">US-CA-Rate_1</item>
+                <item name="dataset" xsi:type="array">
+                    <item name="0" xsi:type="string">US-CA-Rate_1</item>
+                </item>
             </field>
         </dataset>
 
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/etc/webapi/di.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/etc/webapi/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..decbd58959e191b1a9155347f98466161632e2e5
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/etc/webapi/di.xml
@@ -0,0 +1,12 @@
+<?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\Tax\Test\Handler\TaxRule\TaxRuleInterface" type="\Magento\Tax\Test\Handler\TaxRule\Webapi" />
+    <preference for="\Magento\Tax\Test\Handler\TaxClass\TaxClassInterface" type="\Magento\Tax\Test\Handler\TaxClass\Webapi" />
+    <preference for="\Magento\Tax\Test\Handler\TaxRate\TaxRateInterface" type="\Magento\Tax\Test\Handler\TaxRate\Webapi" />
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/DataGrid.php b/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/DataGrid.php
index 11ca409773a11262b8fb03de7692e267a2849984..f8091af4cc497cfc16cbef6222ec0e7e8c00c6d1 100644
--- a/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/DataGrid.php
+++ b/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/DataGrid.php
@@ -88,11 +88,11 @@ class DataGrid extends Grid
     protected $actionButton = '.modal-inner-wrap .action-secondary';
 
     /**
-     * Column header locator
+     * Column header locator.
      *
      * @var string
      */
-    protected $columnHeader = "//th/span[.='%s']";
+    protected $columnHeader = './/*[@data-role="grid-wrapper"]//th/span[.="%s"]';
 
     /**
      * @var string
diff --git a/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml
index 6af15ad6834b3f92e4814ee92a1d72f02fce3e26..6c3a76c5c99865bdc9bede513bd8ea350dd469b7 100644
--- a/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml
@@ -7,7 +7,7 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Checkout\Test\TestCase\OnePageCheckoutTest">
-        <variation name="OnePageCheckoutTestVariation24" summary="Use UPS Online Shipping Carrier on Checkout as a Registered Customer" ticketId="MAGETWO-12848">
+        <variation name="OnePageCheckoutUpsTestVariation1" summary="Use UPS Online Shipping Carrier on Checkout as a Registered Customer" ticketId="MAGETWO-12848">
             <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data>
             <data name="checkoutMethod" xsi:type="string">login</data>
             <data name="customer/dataset" xsi:type="string">default</data>
@@ -22,8 +22,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderInOrdersGrid"/>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty"/>
         </variation>
-        <variation name="OnePageCheckoutTestVariation25">
-            <data name="description" xsi:type="string">Check Out as Guest using UPS with US shipping origin and UK customer</data>
+        <variation name="OnePageCheckoutUpsTestVariation2" summary="Check Out as Guest using UPS with US shipping origin and UK customer">
             <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data>
             <data name="checkoutMethod" xsi:type="string">guest</data>
             <data name="customer/dataset" xsi:type="string">default</data>
diff --git a/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml
index acef9337057abceb6cf2f0715ad62315fe4b389a..7f049503781c6dd1ed7d4a5dee78fb57d79ad746 100644
--- a/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml
@@ -7,7 +7,7 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Checkout\Test\TestCase\OnePageCheckoutTest">
-        <variation name="OnePageCheckoutTestVariation26" summary="Use USPS Online Shipping Carrier on Checkout as a Registered Customer" ticketId="MAGETWO-12444">
+        <variation name="OnePageCheckoutUspsTestVariation1" summary="Use USPS Online Shipping Carrier on Checkout as a Registered Customer" ticketId="MAGETWO-12444">
             <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data>
             <data name="checkoutMethod" xsi:type="string">login</data>
             <data name="customer/dataset" xsi:type="string">default</data>
@@ -22,8 +22,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderInOrdersGrid"/>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty"/>
         </variation>
-        <variation name="OnePageCheckoutTestVariation27">
-            <data name="description" xsi:type="string">Check Out as Guest using USPS with US shipping origin and UK customer</data>
+        <variation name="OnePageCheckoutUspsTestVariation2" summary="Check Out as Guest using USPS with US shipping origin and UK customer">
             <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data>
             <data name="checkoutMethod" xsi:type="string">guest</data>
             <data name="customer/dataset" xsi:type="string">default</data>
diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Customer/Wishlist/Items/Product.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Customer/Wishlist/Items/Product.php
index 0bc0507d993637ffe221abafbe2c508964fdfee6..02014d5bf7fe03e6e925825fda2af5c02e5264fb 100644
--- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Customer/Wishlist/Items/Product.php
+++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Customer/Wishlist/Items/Product.php
@@ -161,7 +161,7 @@ class Product extends Form
      */
     public function hoverProductBlock()
     {
-        $this->_rootElement->find($this->price)->click();
+        $this->_rootElement->find($this->price)->hover();
     }
 
     /**
@@ -172,6 +172,7 @@ class Product extends Form
      */
     public function getWishlistData($qty = null)
     {
+        $this->hoverProductBlock();
         $mapping = $this->dataMapping();
         if (!is_numeric($qty)) {
             unset($mapping['qty']);