diff --git a/app/code/Magento/Authorizenet/composer.json b/app/code/Magento/Authorizenet/composer.json
index b93cb6688f56d826a8d981518612897aae6f1ac8..f4acc4504604d0625543812ecec21b1d90286e59 100644
--- a/app/code/Magento/Authorizenet/composer.json
+++ b/app/code/Magento/Authorizenet/composer.json
@@ -12,6 +12,9 @@
         "magento/module-catalog": "101.1.*",
         "magento/framework": "100.2.*"
     },
+    "suggest": {
+        "magento/module-config": "100.2.*"
+    },
     "type": "magento2-module",
     "version": "100.2.0-dev",
     "license": [
diff --git a/app/code/Magento/Authorizenet/etc/di.xml b/app/code/Magento/Authorizenet/etc/di.xml
index f5e595fb450e83a60a4ce9b45196018cad335f3d..287cdec6fa0f7f62d68e20bfb49254209ef16ca9 100644
--- a/app/code/Magento/Authorizenet/etc/di.xml
+++ b/app/code/Magento/Authorizenet/etc/di.xml
@@ -16,4 +16,14 @@
             <argument name="storage" xsi:type="object">Magento\Authorizenet\Model\Directpost\Session\Storage</argument>
         </arguments>
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="payment/authorizenet_directpost/login" xsi:type="string">1</item>
+                <item name="payment/authorizenet_directpost/trans_key" xsi:type="string">1</item>
+                <item name="payment/authorizenet_directpost/trans_md5" xsi:type="string">1</item>
+                <item name="payment/authorizenet_directpost/merchant_email" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Backend/Block/Cache/Grid/Massaction/ProductionModeVisibilityChecker.php b/app/code/Magento/Backend/Block/Cache/Grid/Massaction/ProductionModeVisibilityChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..70a125e399ab3034669c011ee24c3877154469e9
--- /dev/null
+++ b/app/code/Magento/Backend/Block/Cache/Grid/Massaction/ProductionModeVisibilityChecker.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Backend\Block\Cache\Grid\Massaction;
+
+use Magento\Backend\Block\Widget\Grid\Massaction\VisibilityCheckerInterface;
+use Magento\Framework\App\State;
+
+/**
+ * Class checks that action can be displayed on massaction list
+ */
+class ProductionModeVisibilityChecker implements VisibilityCheckerInterface
+{
+    /**
+     * @var State
+     */
+    private $state;
+
+    /**
+     * @param State $state
+     */
+    public function __construct(State $state)
+    {
+        $this->state = $state;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isVisible()
+    {
+        return $this->state->getMode() !== State::MODE_PRODUCTION;
+    }
+}
diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Massaction.php b/app/code/Magento/Backend/Block/Widget/Grid/Massaction.php
index ffe12c6cff46ee17442f7a69293172c02e206d30..c86907cc98042b30f6bac68ea0b0d2977ae87591 100644
--- a/app/code/Magento/Backend/Block/Widget/Grid/Massaction.php
+++ b/app/code/Magento/Backend/Block/Widget/Grid/Massaction.php
@@ -3,14 +3,11 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+namespace Magento\Backend\Block\Widget\Grid;
 
 /**
  * Grid widget massaction default block
- *
- * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Backend\Block\Widget\Grid;
-
 class Massaction extends \Magento\Backend\Block\Widget\Grid\Massaction\AbstractMassaction
 {
 }
diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/AbstractMassaction.php b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/AbstractMassaction.php
index 2f3df1377b395de426cc573f4d48016de82d7229..7f697599c7003583d08bc6c2f40ff138971bd4c0 100644
--- a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/AbstractMassaction.php
+++ b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/AbstractMassaction.php
@@ -5,14 +5,14 @@
  */
 namespace Magento\Backend\Block\Widget\Grid\Massaction;
 
-use Magento\Framework\View\Element\Template;
+use Magento\Backend\Block\Widget\Grid\Massaction\VisibilityCheckerInterface as VisibilityChecker;
+use Magento\Framework\DataObject;
 
 /**
  * Grid widget massaction block
  *
  * @method \Magento\Quote\Model\Quote setHideFormElement(boolean $value) Hide Form element to prevent IE errors
  * @method boolean getHideFormElement()
- * @author      Magento Core Team <core@magentocommerce.com>
  */
 abstract class AbstractMassaction extends \Magento\Backend\Block\Widget
 {
@@ -73,20 +73,21 @@ abstract class AbstractMassaction extends \Magento\Backend\Block\Widget
      *      'complete' => string, // Only for ajax enabled grid (optional)
      *      'url'      => string,
      *      'confirm'  => string, // text of confirmation of this action (optional)
-     *      'additional' => string // (optional)
+     *      'additional' => string, // (optional)
+     *      'visible' => object // instance of VisibilityCheckerInterface (optional)
      * );
      *
      * @param string $itemId
-     * @param array|\Magento\Framework\DataObject $item
+     * @param array|DataObject $item
      * @return $this
      */
     public function addItem($itemId, $item)
     {
         if (is_array($item)) {
-            $item = new \Magento\Framework\DataObject($item);
+            $item = new DataObject($item);
         }
 
-        if ($item instanceof \Magento\Framework\DataObject) {
+        if ($item instanceof DataObject && $this->isVisible($item)) {
             $item->setId($itemId);
             $item->setUrl($this->getUrl($item->getUrl()));
             $this->_items[$itemId] = $item;
@@ -95,6 +96,19 @@ abstract class AbstractMassaction extends \Magento\Backend\Block\Widget
         return $this;
     }
 
+    /**
+     * Check that item can be added to list
+     *
+     * @param DataObject $item
+     * @return bool
+     */
+    private function isVisible(DataObject $item)
+    {
+        /** @var VisibilityChecker $checker */
+        $checker = $item->getData('visible');
+        return (!$checker instanceof VisibilityChecker) || $checker->isVisible();
+    }
+
     /**
      * Retrieve massaction item with id $itemId
      *
diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/VisibilityCheckerInterface.php b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/VisibilityCheckerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..934c4a84d145f349e028fc5497b9db62b2cdac54
--- /dev/null
+++ b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/VisibilityCheckerInterface.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Backend\Block\Widget\Grid\Massaction;
+
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
+interface VisibilityCheckerInterface extends ArgumentInterface
+{
+    /**
+     * Check that action can be displayed on massaction list
+     *
+     * @return bool
+     */
+    public function isVisible();
+}
diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php
index 7266775959fc348796fabbb150f9e49b2ae9f7ad..42cbe229815aef16e13005ebdc802ec9b9bbd5c5 100644
--- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php
+++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php
@@ -8,15 +8,41 @@ namespace Magento\Backend\Controller\Adminhtml\Cache;
 
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Controller\ResultFactory;
+use Magento\Framework\App\State;
+use Magento\Framework\App\ObjectManager;
 
+/**
+ * Controller disables some types of cache
+ */
 class MassDisable extends \Magento\Backend\Controller\Adminhtml\Cache
 {
+    /**
+     * @var State
+     */
+    private $state;
+
     /**
      * Mass action for cache disabling
      *
      * @return \Magento\Backend\Model\View\Result\Redirect
      */
     public function execute()
+    {
+        if ($this->getState()->getMode() === State::MODE_PRODUCTION) {
+            $this->messageManager->addErrorMessage(__('You can\'t change status of cache type(s) in production mode'));
+        } else {
+            $this->disableCache();
+        }
+
+        return $this->resultFactory->create(ResultFactory::TYPE_REDIRECT)->setPath('adminhtml/*');
+    }
+
+    /**
+     * Disable cache
+     *
+     * @return void
+     */
+    private function disableCache()
     {
         try {
             $types = $this->getRequest()->getParam('types');
@@ -41,9 +67,20 @@ class MassDisable extends \Magento\Backend\Controller\Adminhtml\Cache
         } catch (\Exception $e) {
             $this->messageManager->addException($e, __('An error occurred while disabling cache.'));
         }
+    }
+
+    /**
+     * Get State Instance
+     *
+     * @return State
+     * @deprecated
+     */
+    private function getState()
+    {
+        if ($this->state === null) {
+            $this->state = ObjectManager::getInstance()->get(State::class);
+        }
 
-        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
-        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
-        return $resultRedirect->setPath('adminhtml/*');
+        return $this->state;
     }
 }
diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php
index 6c8bccfee166a5f746fd138c1b4e043ac1834542..8c4117831e8c8d7463b3112ac495cdede04f13d5 100644
--- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php
+++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php
@@ -8,15 +8,41 @@ namespace Magento\Backend\Controller\Adminhtml\Cache;
 
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Controller\ResultFactory;
+use Magento\Framework\App\State;
+use Magento\Framework\App\ObjectManager;
 
+/**
+ * Controller enables some types of cache
+ */
 class MassEnable extends \Magento\Backend\Controller\Adminhtml\Cache
 {
+    /**
+     * @var State
+     */
+    private $state;
+
     /**
      * Mass action for cache enabling
      *
      * @return \Magento\Backend\Model\View\Result\Redirect
      */
     public function execute()
+    {
+        if ($this->getState()->getMode() === State::MODE_PRODUCTION) {
+            $this->messageManager->addErrorMessage(__('You can\'t change status of cache type(s) in production mode'));
+        } else {
+            $this->enableCache();
+        }
+
+        return $this->resultFactory->create(ResultFactory::TYPE_REDIRECT)->setPath('adminhtml/*');
+    }
+
+    /**
+     * Enable cache
+     *
+     * @return void
+     */
+    private function enableCache()
     {
         try {
             $types = $this->getRequest()->getParam('types');
@@ -40,9 +66,20 @@ class MassEnable extends \Magento\Backend\Controller\Adminhtml\Cache
         } catch (\Exception $e) {
             $this->messageManager->addException($e, __('An error occurred while enabling cache.'));
         }
+    }
+
+    /**
+     * Get State Instance
+     *
+     * @return State
+     * @deprecated
+     */
+    private function getState()
+    {
+        if ($this->state === null) {
+            $this->state = ObjectManager::getInstance()->get(State::class);
+        }
 
-        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
-        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
-        return $resultRedirect->setPath('adminhtml/*');
+        return $this->state;
     }
 }
diff --git a/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/MassactionTest.php b/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/MassactionTest.php
index 234e9d857549e073cb2fdba1bc39b3e4c7248349..79ecb388873eba21ed9fbfd166a651987194aa52 100644
--- a/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/MassactionTest.php
+++ b/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/MassactionTest.php
@@ -9,6 +9,8 @@
  */
 namespace Magento\Backend\Test\Unit\Block\Widget\Grid;
 
+use Magento\Backend\Block\Widget\Grid\Massaction\VisibilityCheckerInterface as VisibilityChecker;
+
 class MassactionTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -17,12 +19,12 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
     protected $_block;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\View\Layout|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_layoutMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Backend\Block\Widget\Grid|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_gridMock;
 
@@ -32,63 +34,63 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
     protected $_eventManagerMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Backend\Model\Url|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_urlModelMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\Request\Http|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_requestMock;
 
+    /**
+     * @var VisibilityChecker|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $visibilityCheckerMock;
+
     protected function setUp()
     {
-        $this->_gridMock = $this->getMock(
-            \Magento\Backend\Block\Widget\Grid::class,
-            ['getId', 'getCollection'],
-            [],
-            '',
-            false
-        );
-        $this->_gridMock->expects($this->any())->method('getId')->will($this->returnValue('test_grid'));
-
-        $this->_layoutMock = $this->getMock(
-            \Magento\Framework\View\Layout::class,
-            ['getParentName', 'getBlock', 'helper'],
-            [],
-            '',
-            false,
-            false
-        );
+        $this->_gridMock = $this->getMockBuilder(\Magento\Backend\Block\Widget\Grid::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->setMethods(['getId', 'getCollection'])
+            ->getMock();
+        $this->_gridMock->expects($this->any())
+            ->method('getId')
+            ->willReturn('test_grid');
 
-        $this->_layoutMock->expects(
-            $this->any()
-        )->method(
-            'getParentName'
-        )->with(
-            'test_grid_massaction'
-        )->will(
-            $this->returnValue('test_grid')
-        );
-        $this->_layoutMock->expects(
-            $this->any()
-        )->method(
-            'getBlock'
-        )->with(
-            'test_grid'
-        )->will(
-            $this->returnValue($this->_gridMock)
-        );
+        $this->_layoutMock = $this->getMockBuilder(\Magento\Framework\View\Layout::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->setMethods(['getParentName', 'getBlock', 'helper'])
+            ->getMock();
+        $this->_layoutMock->expects($this->any())
+            ->method('getParentName')
+            ->with('test_grid_massaction')
+            ->willReturn('test_grid');
+        $this->_layoutMock->expects($this->any())
+            ->method('getBlock')
+            ->with('test_grid')
+            ->willReturn($this->_gridMock);
+
+        $this->_requestMock = $this->getMockBuilder(\Magento\Framework\App\Request\Http::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
 
-        $this->_requestMock = $this->getMock(\Magento\Framework\App\Request\Http::class, [], [], '', false);
+        $this->_urlModelMock = $this->getMockBuilder(\Magento\Backend\Model\Url::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
 
-        $this->_urlModelMock = $this->getMock(\Magento\Backend\Model\Url::class, [], [], '', false);
+        $this->visibilityCheckerMock = $this->getMockBuilder(VisibilityChecker::class)
+            ->getMockForAbstractClass();
 
         $arguments = [
             'layout' => $this->_layoutMock,
             'request' => $this->_requestMock,
             'urlBuilder' => $this->_urlModelMock,
-            'data' => ['massaction_id_field' => 'test_id', 'massaction_id_filter' => 'test_id'],
+            'data' => ['massaction_id_field' => 'test_id', 'massaction_id_filter' => 'test_id']
         ];
 
         $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -124,26 +126,24 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @param $itemId
-     * @param $item
+     * @param string $itemId
+     * @param \Magento\Framework\DataObject $item
      * @param $expectedItem \Magento\Framework\DataObject
-     * @dataProvider itemsDataProvider
+     * @dataProvider itemsProcessingDataProvider
      */
     public function testItemsProcessing($itemId, $item, $expectedItem)
     {
-        $this->_urlModelMock->expects(
-            $this->any()
-        )->method(
-            'getBaseUrl'
-        )->will(
-            $this->returnValue('http://localhost/index.php')
-        );
+        $this->_urlModelMock->expects($this->any())
+            ->method('getBaseUrl')
+            ->willReturn('http://localhost/index.php');
 
         $urlReturnValueMap = [
             ['*/*/test1', [], 'http://localhost/index.php/backend/admin/test/test1'],
             ['*/*/test2', [], 'http://localhost/index.php/backend/admin/test/test2'],
         ];
-        $this->_urlModelMock->expects($this->any())->method('getUrl')->will($this->returnValueMap($urlReturnValueMap));
+        $this->_urlModelMock->expects($this->any())
+            ->method('getUrl')
+            ->willReturnMap($urlReturnValueMap);
 
         $this->_block->addItem($itemId, $item);
         $this->assertEquals(1, $this->_block->getCount());
@@ -157,7 +157,10 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
         $this->assertNull($this->_block->getItem($itemId));
     }
 
-    public function itemsDataProvider()
+    /**
+     * @return array
+     */
+    public function itemsProcessingDataProvider()
     {
         return [
             [
@@ -186,22 +189,17 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @param $param
-     * @param $expectedJson
-     * @param $expected
+     * @param string $param
+     * @param string $expectedJson
+     * @param array $expected
      * @dataProvider selectedDataProvider
      */
     public function testSelected($param, $expectedJson, $expected)
     {
-        $this->_requestMock->expects(
-            $this->any()
-        )->method(
-            'getParam'
-        )->with(
-            $this->_block->getFormFieldNameInternal()
-        )->will(
-            $this->returnValue($param)
-        );
+        $this->_requestMock->expects($this->any())
+            ->method('getParam')
+            ->with($this->_block->getFormFieldNameInternal())
+            ->willReturn($param);
 
         $this->assertEquals($expectedJson, $this->_block->getSelectedJson());
         $this->assertEquals($expected, $this->_block->getSelected());
@@ -262,6 +260,9 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($result, $this->_block->getGridIdsJson());
     }
 
+    /**
+     * @return array
+     */
     public function dataProviderGetGridIdsJsonWithUseSelectAll()
     {
         return [
@@ -279,4 +280,71 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
             ],
         ];
     }
+
+    /**
+     * @param string $itemId
+     * @param array|\Magento\Framework\DataObject $item
+     * @param int $count
+     * @param bool $withVisibilityChecker
+     * @param bool $isVisible
+     * @dataProvider addItemDataProvider
+     */
+    public function testAddItem($itemId, $item, $count, $withVisibilityChecker, $isVisible)
+    {
+        $this->visibilityCheckerMock->expects($this->any())
+            ->method('isVisible')
+            ->willReturn($isVisible);
+
+        if ($withVisibilityChecker) {
+            $item['visible'] = $this->visibilityCheckerMock;
+        }
+
+        $urlReturnValueMap = [
+            ['*/*/test1', [], 'http://localhost/index.php/backend/admin/test/test1'],
+            ['*/*/test2', [], 'http://localhost/index.php/backend/admin/test/test2'],
+        ];
+        $this->_urlModelMock->expects($this->any())
+            ->method('getUrl')
+            ->willReturnMap($urlReturnValueMap);
+
+        $this->_block->addItem($itemId, $item);
+        $this->assertEquals($count, $this->_block->getCount());
+    }
+
+    /**
+     * @return array
+     */
+    public function addItemDataProvider()
+    {
+        return [
+            [
+                'itemId' => 'test1',
+                'item' => ['label' => 'Test 1', 'url' => '*/*/test1'],
+                'count' => 1,
+                'withVisibilityChecker' => false,
+                '$isVisible' => false,
+            ],
+            [
+                'itemId' => 'test2',
+                'item' => ['label' => 'Test 2', 'url' => '*/*/test2'],
+                'count' => 1,
+                'withVisibilityChecker' => false,
+                'isVisible' => true,
+            ],
+            [
+                'itemId' => 'test1',
+                'item' => ['label' => 'Test 1. Hide', 'url' => '*/*/test1'],
+                'count' => 0,
+                'withVisibilityChecker' => true,
+                'isVisible' => false,
+            ],
+            [
+                'itemId' => 'test2',
+                'item' => ['label' => 'Test 2. Does not hide', 'url' => '*/*/test2'],
+                'count' => 1,
+                'withVisibilityChecker' => true,
+                'isVisible' => true,
+            ]
+        ];
+    }
 }
diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassDisableTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassDisableTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2fc808b0e237b8bbeb5b323fb173ecff67d8071
--- /dev/null
+++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassDisableTest.php
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Backend\Test\Unit\Controller\Adminhtml\Cache;
+
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
+use Magento\Backend\Controller\Adminhtml\Cache\MassDisable;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+use Magento\Framework\App\State;
+use Magento\Backend\App\Action\Context;
+use Magento\Framework\Message\ManagerInterface as MessageManager;
+use Magento\Framework\Controller\ResultFactory;
+use Magento\Backend\Model\View\Result\Redirect;
+use Magento\Framework\App\RequestInterface as Request;
+use Magento\Framework\App\Cache\TypeListInterface as CacheTypeList;
+use Magento\Framework\App\Cache\StateInterface as CacheState;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class MassDisableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var MassDisable
+     */
+    private $controller;
+
+    /**
+     * @var State|MockObject
+     */
+    private $stateMock;
+
+    /**
+     * @var MessageManager|MockObject
+     */
+    private $messageManagerMock;
+
+    /**
+     * @var Redirect|MockObject
+     */
+    private $redirectMock;
+
+    /**
+     * @var Request|MockObject
+     */
+    private $requestMock;
+
+    /**
+     * @var CacheTypeList|MockObject
+     */
+    private $cacheTypeListMock;
+
+    /**
+     * @var CacheState|MockObject
+     */
+    private $cacheStateMock;
+
+    protected function setUp()
+    {
+        $objectManagerHelper = new ObjectManagerHelper($this);
+
+        $this->stateMock = $this->getMockBuilder(State::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+
+        $this->messageManagerMock = $this->getMockBuilder(MessageManager::class)
+            ->getMockForAbstractClass();
+
+        $this->requestMock = $this->getMockBuilder(Request::class)
+            ->getMockForAbstractClass();
+
+        $this->cacheTypeListMock = $this->getMockBuilder(CacheTypeList::class)
+            ->getMockForAbstractClass();
+
+        $this->cacheStateMock = $this->getMockBuilder(CacheState::class)
+            ->getMockForAbstractClass();
+
+        $this->redirectMock = $this->getMockBuilder(Redirect::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $this->redirectMock->expects($this->once())
+            ->method('setPath')
+            ->with('adminhtml/*')
+            ->willReturnSelf();
+        $resultFactoryMock = $this->getMockBuilder(ResultFactory::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $resultFactoryMock->expects($this->once())
+            ->method('create')
+            ->with(ResultFactory::TYPE_REDIRECT)
+            ->willReturn($this->redirectMock);
+
+        $contextMock = $this->getMockBuilder(Context::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $contextMock->expects($this->once())
+            ->method('getMessageManager')
+            ->willReturn($this->messageManagerMock);
+        $contextMock->expects($this->once())
+            ->method('getResultFactory')
+            ->willReturn($resultFactoryMock);
+        $contextMock->expects($this->once())
+            ->method('getRequest')
+            ->willReturn($this->requestMock);
+
+        $this->controller = $objectManagerHelper->getObject(
+            MassDisable::class,
+            [
+                'context' => $contextMock,
+                'cacheTypeList' => $this->cacheTypeListMock,
+                'cacheState' => $this->cacheStateMock
+            ]
+        );
+        $objectManagerHelper->setBackwardCompatibleProperty($this->controller, 'state', $this->stateMock);
+    }
+
+    public function testExecuteInProductionMode()
+    {
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_PRODUCTION);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addErrorMessage')
+            ->with('You can\'t change status of cache type(s) in production mode', null)
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteInvalidTypeCache()
+    {
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->cacheTypeListMock->expects($this->once())
+            ->method('getTypes')
+            ->willReturn([
+                'pageCache' => [
+                    'id' => 'pageCache',
+                    'label' => 'Cache of Page'
+                ]
+            ]);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->with('types')
+            ->willReturn(['someCache']);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addError')
+            ->with('Specified cache type(s) don\'t exist: someCache')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteWithException()
+    {
+        $exception = new \Exception();
+
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->willThrowException($exception);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addException')
+            ->with($exception, 'An error occurred while disabling cache.')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteSuccess()
+    {
+        $cacheType = 'pageCache';
+
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->cacheTypeListMock->expects($this->once())
+            ->method('getTypes')
+            ->willReturn([
+                'pageCache' => [
+                    'id' => 'pageCache',
+                    'label' => 'Cache of Page'
+                ]
+            ]);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->with('types')
+            ->willReturn([$cacheType]);
+
+        $this->cacheStateMock->expects($this->once())
+            ->method('isEnabled')
+            ->with($cacheType)
+            ->willReturn(true);
+        $this->cacheStateMock->expects($this->once())
+            ->method('setEnabled')
+            ->with($cacheType, false);
+        $this->cacheStateMock->expects($this->once())
+            ->method('persist');
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addSuccess')
+            ->with('1 cache type(s) disabled.')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+}
diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassEnableTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassEnableTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c1b9f1718ab924379cf3e5440a942c0be5502d7
--- /dev/null
+++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassEnableTest.php
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Backend\Test\Unit\Controller\Adminhtml\Cache;
+
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
+use Magento\Backend\Controller\Adminhtml\Cache\MassEnable;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+use Magento\Framework\App\State;
+use Magento\Backend\App\Action\Context;
+use Magento\Framework\Message\ManagerInterface as MessageManager;
+use Magento\Framework\Controller\ResultFactory;
+use Magento\Backend\Model\View\Result\Redirect;
+use Magento\Framework\App\RequestInterface as Request;
+use Magento\Framework\App\Cache\TypeListInterface as CacheTypeList;
+use Magento\Framework\App\Cache\StateInterface as CacheState;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class MassEnableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var MassEnable
+     */
+    private $controller;
+
+    /**
+     * @var State|MockObject
+     */
+    private $stateMock;
+
+    /**
+     * @var MessageManager|MockObject
+     */
+    private $messageManagerMock;
+
+    /**
+     * @var Redirect|MockObject
+     */
+    private $redirectMock;
+
+    /**
+     * @var Request|MockObject
+     */
+    private $requestMock;
+
+    /**
+     * @var CacheTypeList|MockObject
+     */
+    private $cacheTypeListMock;
+
+    /**
+     * @var CacheState|MockObject
+     */
+    private $cacheStateMock;
+
+    protected function setUp()
+    {
+        $objectManagerHelper = new ObjectManagerHelper($this);
+
+        $this->stateMock = $this->getMockBuilder(State::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+
+        $this->messageManagerMock = $this->getMockBuilder(MessageManager::class)
+            ->getMockForAbstractClass();
+
+        $this->requestMock = $this->getMockBuilder(Request::class)
+            ->getMockForAbstractClass();
+
+        $this->cacheTypeListMock = $this->getMockBuilder(CacheTypeList::class)
+            ->getMockForAbstractClass();
+
+        $this->cacheStateMock = $this->getMockBuilder(CacheState::class)
+            ->getMockForAbstractClass();
+
+        $this->redirectMock = $this->getMockBuilder(Redirect::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $this->redirectMock->expects($this->once())
+            ->method('setPath')
+            ->with('adminhtml/*')
+            ->willReturnSelf();
+        $resultFactoryMock = $this->getMockBuilder(ResultFactory::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $resultFactoryMock->expects($this->once())
+            ->method('create')
+            ->with(ResultFactory::TYPE_REDIRECT)
+            ->willReturn($this->redirectMock);
+
+        $contextMock = $this->getMockBuilder(Context::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $contextMock->expects($this->once())
+            ->method('getMessageManager')
+            ->willReturn($this->messageManagerMock);
+        $contextMock->expects($this->once())
+            ->method('getResultFactory')
+            ->willReturn($resultFactoryMock);
+        $contextMock->expects($this->once())
+            ->method('getRequest')
+            ->willReturn($this->requestMock);
+
+        $this->controller = $objectManagerHelper->getObject(
+            MassEnable::class,
+            [
+                'context' => $contextMock,
+                'cacheTypeList' => $this->cacheTypeListMock,
+                'cacheState' => $this->cacheStateMock
+            ]
+        );
+        $objectManagerHelper->setBackwardCompatibleProperty($this->controller, 'state', $this->stateMock);
+    }
+
+    public function testExecuteInProductionMode()
+    {
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_PRODUCTION);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addErrorMessage')
+            ->with('You can\'t change status of cache type(s) in production mode', null)
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteInvalidTypeCache()
+    {
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->cacheTypeListMock->expects($this->once())
+            ->method('getTypes')
+            ->willReturn([
+                'pageCache' => [
+                    'id' => 'pageCache',
+                    'label' => 'Cache of Page'
+                ]
+            ]);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->with('types')
+            ->willReturn(['someCache']);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addError')
+            ->with('Specified cache type(s) don\'t exist: someCache')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteWithException()
+    {
+        $exception = new \Exception();
+
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->willThrowException($exception);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addException')
+            ->with($exception, 'An error occurred while enabling cache.')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteSuccess()
+    {
+        $cacheType = 'pageCache';
+
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->cacheTypeListMock->expects($this->once())
+            ->method('getTypes')
+            ->willReturn([
+                'pageCache' => [
+                    'id' => 'pageCache',
+                    'label' => 'Cache of Page'
+                ]
+            ]);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->with('types')
+            ->willReturn([$cacheType]);
+
+        $this->cacheStateMock->expects($this->once())
+            ->method('isEnabled')
+            ->with($cacheType)
+            ->willReturn(false);
+        $this->cacheStateMock->expects($this->once())
+            ->method('setEnabled')
+            ->with($cacheType, true);
+        $this->cacheStateMock->expects($this->once())
+            ->method('persist');
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addSuccess')
+            ->with('1 cache type(s) enabled.')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+}
diff --git a/app/code/Magento/Backend/etc/di.xml b/app/code/Magento/Backend/etc/di.xml
index 8b52d08da48fbbd8fd1cf450bb8a2db66ca75b62..c0c5a0ec5b8a7ff217fcf0bb1772cb932f14bc55 100644
--- a/app/code/Magento/Backend/etc/di.xml
+++ b/app/code/Magento/Backend/etc/di.xml
@@ -213,4 +213,22 @@
             </argument>
         </arguments>
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="trans_email/ident_general/name" xsi:type="string">1</item>
+                <item name="trans_email/ident_general/email" xsi:type="string">1</item>
+                <item name="trans_email/ident_sales/name" xsi:type="string">1</item>
+                <item name="trans_email/ident_sales/email" xsi:type="string">1</item>
+                <item name="trans_email/ident_support/name" xsi:type="string">1</item>
+                <item name="trans_email/ident_support/email" xsi:type="string">1</item>
+                <item name="trans_email/ident_custom1/name" xsi:type="string">1</item>
+                <item name="trans_email/ident_custom1/email" xsi:type="string">1</item>
+                <item name="trans_email/ident_custom2/name" xsi:type="string">1</item>
+                <item name="trans_email/ident_custom2/email" xsi:type="string">1</item>
+                <item name="admin/url/custom" xsi:type="string">1</item>
+                <item name="admin/url/custom_path" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml b/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml
index decc26f331c8298d16b4a76d4a74d82c5808c651..98f9ca89ba18accc9013c7b0851e39abafa517b2 100644
--- a/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml
+++ b/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml
@@ -23,10 +23,12 @@
                             <item name="enable" xsi:type="array">
                                 <item name="label" xsi:type="string" translate="true">Enable</item>
                                 <item name="url" xsi:type="string">adminhtml/*/massEnable</item>
+                                <item name="visible" xsi:type="object">Magento\Backend\Block\Cache\Grid\Massaction\ProductionModeVisibilityChecker</item>
                             </item>
                             <item name="disable" xsi:type="array">
                                 <item name="label" xsi:type="string" translate="true">Disable</item>
                                 <item name="url" xsi:type="string">adminhtml/*/massDisable</item>
+                                <item name="visible" xsi:type="object">Magento\Backend\Block\Cache\Grid\Massaction\ProductionModeVisibilityChecker</item>
                             </item>
                             <item name="refresh" xsi:type="array">
                                 <item name="label" xsi:type="string" translate="true">Refresh</item>
diff --git a/app/code/Magento/Braintree/etc/di.xml b/app/code/Magento/Braintree/etc/di.xml
index d051ef78cfcd22424fa359e47be3efc0ee8dcc2b..5417c96ba677204a0c3c3ffc69cefdc27f148ee3 100644
--- a/app/code/Magento/Braintree/etc/di.xml
+++ b/app/code/Magento/Braintree/etc/di.xml
@@ -365,7 +365,7 @@
         </arguments>
     </virtualType>
     <!-- END PayPal commands -->
-    
+
     <!-- Value handlers infrastructure -->
     <type name="Magento\Braintree\Gateway\Response\VaultDetailsHandler">
         <arguments>
@@ -452,7 +452,7 @@
         </arguments>
     </virtualType>
     <!-- END PayPal value handlers infrastructure -->
-    
+
     <!-- Void Command -->
     <virtualType name="BraintreeVoidCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
         <arguments>
@@ -544,4 +544,16 @@
         </arguments>
     </type>
     <!-- END Settlement Report Section -->
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="payment/braintree/merchant_id" xsi:type="string">1</item>
+                <item name="payment/braintree/public_key" xsi:type="string">1</item>
+                <item name="payment/braintree/private_key" xsi:type="string">1</item>
+                <item name="payment/braintree/merchant_account_id" xsi:type="string">1</item>
+                <item name="payment/braintree/kount_id" xsi:type="string">1</item>
+                <item name="payment/braintree_paypal/merchant_name_override" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Bundle/Model/Product/Price.php b/app/code/Magento/Bundle/Model/Product/Price.php
index 83bfcbbabc2536ab0ee2f84525dcb4cca12aa883..d0aee24945f9d21df7c3d73350093206065b0429 100644
--- a/app/code/Magento/Bundle/Model/Product/Price.php
+++ b/app/code/Magento/Bundle/Model/Product/Price.php
@@ -533,6 +533,10 @@ class Price extends \Magento\Catalog\Model\Product\Type\Price
             $prevGroup = $allCustomersGroupId;
 
             foreach ($prices as $price) {
+                if (empty($price['percentage_value'])) {
+                    // can use only percentage tier price
+                    continue;
+                }
                 if ($price['cust_group'] != $custGroup && $price['cust_group'] != $allCustomersGroupId) {
                     // tier not for current customer group nor is for all groups
                     continue;
@@ -553,8 +557,8 @@ class Price extends \Magento\Catalog\Model\Product\Type\Price
                     continue;
                 }
 
-                if ($price['website_price'] > $prevPrice) {
-                    $prevPrice = $price['website_price'];
+                if ($price['percentage_value'] > $prevPrice) {
+                    $prevPrice = $price['percentage_value'];
                     $prevQty = $price['price_qty'];
                     $prevGroup = $price['cust_group'];
                 }
diff --git a/app/code/Magento/Bundle/Pricing/Price/TierPrice.php b/app/code/Magento/Bundle/Pricing/Price/TierPrice.php
index cbbf45e2dbb5f01187760b73f96c251fae49c1c5..fab49292d9bdea9f2ee02e1762385b979e15bdb0 100644
--- a/app/code/Magento/Bundle/Pricing/Price/TierPrice.php
+++ b/app/code/Magento/Bundle/Pricing/Price/TierPrice.php
@@ -8,6 +8,7 @@ namespace Magento\Bundle\Pricing\Price;
 
 use Magento\Catalog\Pricing\Price\RegularPrice;
 use Magento\Framework\Pricing\Amount\AmountInterface;
+use Magento\Framework\Pricing\PriceInfoInterface;
 
 /**
  * Bundle tier prices model
@@ -32,8 +33,25 @@ class TierPrice extends \Magento\Catalog\Pricing\Price\TierPrice implements Disc
     public function getDiscountPercent()
     {
         if ($this->percent === null) {
-            $percent = parent::getValue();
-            $this->percent = ($percent) ? max(0, min(100, 100 - $percent)) : null;
+            $prices = $this->getStoredTierPrices();
+            $prevQty = PriceInfoInterface::PRODUCT_QUANTITY_DEFAULT;
+            $this->value = $prevPrice = false;
+            $priceGroup = $this->groupManagement->getAllCustomersGroup()->getId();
+
+            foreach ($prices as $price) {
+                if (!$this->canApplyTierPrice($price, $priceGroup, $prevQty)
+                    || !isset($price['percentage_value'])
+                    || !is_numeric($price['percentage_value'])
+                ) {
+                    continue;
+                }
+                if (false === $prevPrice || $this->isFirstPriceBetter($price['website_price'], $prevPrice)) {
+                    $prevPrice = $price['website_price'];
+                    $prevQty = $price['price_qty'];
+                    $priceGroup = $price['cust_group'];
+                    $this->percent = max(0, min(100, 100 - $price['percentage_value']));
+                }
+            }
         }
         return $this->percent;
     }
@@ -90,13 +108,4 @@ class TierPrice extends \Magento\Catalog\Pricing\Price\TierPrice implements Disc
     {
         return true;
     }
-
-    /**
-     * @param AmountInterface $amount
-     * @return float
-     */
-    public function getSavePercent(AmountInterface $amount)
-    {
-        return round($amount->getBaseAmount());
-    }
 }
diff --git a/app/code/Magento/Bundle/Test/Unit/Model/Product/PriceTest.php b/app/code/Magento/Bundle/Test/Unit/Model/Product/PriceTest.php
index e97f0bbc1558dc3c63e02ef2c894b0d4423a61b2..9f7952e7ae8c882a5b747f9fd24855feea7c380e 100644
--- a/app/code/Magento/Bundle/Test/Unit/Model/Product/PriceTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Model/Product/PriceTest.php
@@ -90,7 +90,6 @@ class PriceTest extends \PHPUnit_Framework_TestCase
             false
         );
         $scopeConfig = $this->getMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
-
         $objectManagerHelper = new ObjectManagerHelper($this);
         $this->model = $objectManagerHelper->getObject(
             \Magento\Bundle\Model\Product\Price::class,
@@ -191,7 +190,6 @@ class PriceTest extends \PHPUnit_Framework_TestCase
         $dataObjectMock->expects($this->once())
             ->method('getValue')
             ->willReturn($value);
-
         $this->assertEquals(0, $this->model->getTotalBundleItemsPrice($productMock));
     }
 
@@ -245,7 +243,6 @@ class PriceTest extends \PHPUnit_Framework_TestCase
         $dataObjectMock->expects($this->once())
             ->method('getValue')
             ->willReturn('a:1:{i:0;s:1:"1";}');
-
         $productTypeMock->expects($this->once())
             ->method('getSelectionsByIds')
             ->with([1], $productMock)
diff --git a/app/code/Magento/Bundle/Test/Unit/Pricing/Price/TierPriceTest.php b/app/code/Magento/Bundle/Test/Unit/Pricing/Price/TierPriceTest.php
index 7b1f6181bb6f8ddc5951ce69e7564b7e2d1b1536..15bc06c2c6437d450ca480479b08a2cf1900d0de 100644
--- a/app/code/Magento/Bundle/Test/Unit/Pricing/Price/TierPriceTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Pricing/Price/TierPriceTest.php
@@ -188,9 +188,17 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetSavePercent($baseAmount, $savePercent)
     {
+        $basePrice = 10.;
         $amount = $this->getMockForAbstractClass(\Magento\Framework\Pricing\Amount\AmountInterface::class);
         $amount->expects($this->once())->method('getBaseAmount')->willReturn($baseAmount);
+        $price = $this->getMock(\Magento\Framework\Pricing\Price\PriceInterface::class);
+        $price->expects($this->any())
+            ->method('getValue')
+            ->will($this->returnValue($basePrice));
 
+        $this->priceInfo->expects($this->any())
+            ->method('getPrice')
+            ->will($this->returnValue($price));
         $this->assertEquals($savePercent, $this->model->getSavePercent($amount));
     }
 
@@ -200,10 +208,8 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase
     public function providerForTestGetSavePercent()
     {
         return [
-            'no fraction' => [10.0000, 10],
-            'lower half'  => [10.1234, 10],
-            'half way'    => [10.5000, 11],
-            'upper half'  => [10.6789, 11],
+            'no fraction' => [9.0000, 10],
+            'lower half'  => [9.1234, 9],
         ];
     }
 }
diff --git a/app/code/Magento/Bundle/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php b/app/code/Magento/Bundle/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php
index 538c80d9b1cf27af4ba14c911b0d0a6913c403c7..4012af357e2c50e31c1052adae15ee1b1a4931bf 100644
--- a/app/code/Magento/Bundle/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php
+++ b/app/code/Magento/Bundle/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php
@@ -14,6 +14,8 @@ use Magento\Ui\Component\Container;
 use Magento\Ui\Component\DynamicRows;
 use Magento\Ui\Component\Form;
 use Magento\Ui\Component\Modal;
+use Magento\Catalog\Api\Data\ProductAttributeInterface;
+use Magento\Catalog\Model\Config\Source\ProductPriceOptionsInterface;
 
 /**
  * Create Ship Bundle Items and Affect Bundle Product Selections fields
@@ -73,6 +75,7 @@ class BundlePanel extends AbstractModifier
      */
     public function modifyMeta(array $meta)
     {
+        $meta = $this->removeFixedTierPrice($meta);
         $path = $this->arrayManager->findPath(static::CODE_BUNDLE_DATA, $meta, null, 'children');
 
         $meta = $this->arrayManager->merge(
@@ -178,6 +181,43 @@ class BundlePanel extends AbstractModifier
         return $meta;
     }
 
+    /**
+     * Remove option with fixed tier price from config.
+     *
+     * @param array $meta
+     * @return array
+     */
+    private function removeFixedTierPrice(array $meta)
+    {
+        $tierPricePath = $this->arrayManager->findPath(
+            ProductAttributeInterface::CODE_TIER_PRICE,
+            $meta,
+            null,
+            'children'
+        );
+        $pricePath =  $this->arrayManager->findPath(
+            ProductAttributeInterface::CODE_TIER_PRICE_FIELD_PRICE,
+            $meta,
+            $tierPricePath
+        );
+        $pricePath = $this->arrayManager->slicePath($pricePath, 0, -1) . '/value_type/arguments/data/options';
+
+        $price = $this->arrayManager->get($pricePath, $meta);
+        $meta = $this->arrayManager->remove($pricePath, $meta);
+        foreach ($price as $key => $item) {
+            if ($item['value'] == ProductPriceOptionsInterface::VALUE_FIXED) {
+                unset($price[$key]);
+            }
+        }
+        $meta = $this->arrayManager->merge(
+            $this->arrayManager->slicePath($pricePath, 0, -1),
+            $meta,
+            ['options' => $price]
+        );
+
+        return $meta;
+    }
+
     /**
      * {@inheritdoc}
      */
diff --git a/app/code/Magento/Bundle/etc/adminhtml/di.xml b/app/code/Magento/Bundle/etc/adminhtml/di.xml
index ca93dd5365160fd84372425a11fd5aff32972851..19b683027dfa14062883d4d80430f68a7c6ce49e 100644
--- a/app/code/Magento/Bundle/etc/adminhtml/di.xml
+++ b/app/code/Magento/Bundle/etc/adminhtml/di.xml
@@ -27,11 +27,11 @@
             <argument name="modifiers" xsi:type="array">
                 <item name="bundle" xsi:type="array">
                     <item name="class" xsi:type="string">Magento\Bundle\Ui\DataProvider\Product\Form\Modifier\Composite</item>
-                    <item name="sortOrder" xsi:type="number">125</item>
+                    <item name="sortOrder" xsi:type="number">180</item>
                 </item>
                 <item name="bundle_stock_data" xsi:type="array">
                     <item name="class" xsi:type="string">Magento\Bundle\Ui\DataProvider\Product\Form\Modifier\StockData</item>
-                    <item name="sortOrder" xsi:type="number">126</item>
+                    <item name="sortOrder" xsi:type="number">190</item>
                 </item>
             </argument>
         </arguments>
diff --git a/app/code/Magento/Bundle/etc/di.xml b/app/code/Magento/Bundle/etc/di.xml
index 2d3913d72e579302ac9cd1f0e23d6b235f9c6b23..3425b9323ed4d4e18fd8be5342a4139be87291f3 100644
--- a/app/code/Magento/Bundle/etc/di.xml
+++ b/app/code/Magento/Bundle/etc/di.xml
@@ -130,4 +130,5 @@
             </argument>
         </arguments>
     </type>
+
 </config>
diff --git a/app/code/Magento/Bundle/view/base/templates/product/price/tier_prices.phtml b/app/code/Magento/Bundle/view/base/templates/product/price/tier_prices.phtml
index 3285603c431a219f76698b9e5e8d41571b285c11..63f090acf34dfb477521f992b2ee0f8d1eb6ff17 100644
--- a/app/code/Magento/Bundle/view/base/templates/product/price/tier_prices.phtml
+++ b/app/code/Magento/Bundle/view/base/templates/product/price/tier_prices.phtml
@@ -22,7 +22,7 @@ $tierPrices = $tierPriceModel->getTierPriceList();
                 <?php /* @escapeNotVerified */ echo __(
                     'Buy %1 with %2 discount each',
                     $price['price_qty'],
-                    '<strong class="benefit">' . $tierPriceModel->getSavePercent($price['price']) . '%</strong>'
+                    '<strong class="benefit">' . round($price['percentage_value']) . '%</strong>'
                 ); ?>
             </li>
         <?php endforeach; ?>
diff --git a/app/code/Magento/Catalog/Block/Product/View/Gallery.php b/app/code/Magento/Catalog/Block/Product/View/Gallery.php
index 0edeba7d807ac8e4c1be154d236bbff7c93a87b5..97909ffaa889f283d8a07c3f87be508f0c855c0a 100644
--- a/app/code/Magento/Catalog/Block/Product/View/Gallery.php
+++ b/app/code/Magento/Catalog/Block/Product/View/Gallery.php
@@ -63,15 +63,13 @@ class Gallery extends \Magento\Catalog\Block\Product\View\AbstractView
                 );
                 $image->setData(
                     'medium_image_url',
-                    $this->_imageHelper->init($product, 'product_page_image_medium')
-                        ->constrainOnly(true)->keepAspectRatio(true)->keepFrame(false)
+                    $this->_imageHelper->init($product, 'product_page_image_medium_no_frame')
                         ->setImageFile($image->getFile())
                         ->getUrl()
                 );
                 $image->setData(
                     'large_image_url',
-                    $this->_imageHelper->init($product, 'product_page_image_large')
-                        ->constrainOnly(true)->keepAspectRatio(true)->keepFrame(false)
+                    $this->_imageHelper->init($product, 'product_page_image_large_no_frame')
                         ->setImageFile($image->getFile())
                         ->getUrl()
                 );
diff --git a/app/code/Magento/Catalog/Helper/Image.php b/app/code/Magento/Catalog/Helper/Image.php
index eb5e7142d3094f5457fde615bc4987a8df912ab1..6f13e9077f4732af3714ae2af50ca804a22f0aa2 100644
--- a/app/code/Magento/Catalog/Helper/Image.php
+++ b/app/code/Magento/Catalog/Helper/Image.php
@@ -195,7 +195,6 @@ class Image extends AbstractHelper
     protected function setImageProperties()
     {
         $this->_getModel()->setDestinationSubdir($this->getType());
-
         $this->_getModel()->setWidth($this->getWidth());
         $this->_getModel()->setHeight($this->getHeight());
 
@@ -241,25 +240,25 @@ class Image extends AbstractHelper
     {
         $this->setWatermark(
             $this->scopeConfig->getValue(
-                "design/watermark/{$this->_getModel()->getDestinationSubdir()}_image",
+                "design/watermark/{$this->getType()}_image",
                 \Magento\Store\Model\ScopeInterface::SCOPE_STORE
             )
         );
         $this->setWatermarkImageOpacity(
             $this->scopeConfig->getValue(
-                "design/watermark/{$this->_getModel()->getDestinationSubdir()}_imageOpacity",
+                "design/watermark/{$this->getType()}_imageOpacity",
                 \Magento\Store\Model\ScopeInterface::SCOPE_STORE
             )
         );
         $this->setWatermarkPosition(
             $this->scopeConfig->getValue(
-                "design/watermark/{$this->_getModel()->getDestinationSubdir()}_position",
+                "design/watermark/{$this->getType()}_position",
                 \Magento\Store\Model\ScopeInterface::SCOPE_STORE
             )
         );
         $this->setWatermarkSize(
             $this->scopeConfig->getValue(
-                "design/watermark/{$this->_getModel()->getDestinationSubdir()}_size",
+                "design/watermark/{$this->getType()}_size",
                 \Magento\Store\Model\ScopeInterface::SCOPE_STORE
             )
         );
@@ -500,10 +499,7 @@ class Image extends AbstractHelper
     protected function isScheduledActionsAllowed()
     {
         $model = $this->_getModel();
-        if ($model->isBaseFilePlaceholder()
-            && $model->getNewFile() === true
-            || $model->isCached()
-        ) {
+        if ($model->isBaseFilePlaceholder() || $model->isCached()) {
             return false;
         }
         return true;
diff --git a/app/code/Magento/Catalog/Model/Category/DataProvider.php b/app/code/Magento/Catalog/Model/Category/DataProvider.php
index 8aa7216a6b63928ba9dcdd415b1745ed404321f1..6ce2dd98f89c6c707782ee1338e248a1f01abb77 100644
--- a/app/code/Magento/Catalog/Model/Category/DataProvider.php
+++ b/app/code/Magento/Catalog/Model/Category/DataProvider.php
@@ -15,6 +15,8 @@ use Magento\Eav\Model\Config;
 use Magento\Eav\Model\Entity\Type;
 use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory as CategoryCollectionFactory;
 use Magento\Framework\Stdlib\ArrayManager;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Filesystem;
 use Magento\Store\Model\Store;
 use Magento\Store\Model\StoreManagerInterface;
 use Magento\Ui\Component\Form\Field;
@@ -126,6 +128,11 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
      */
     private $arrayManager;
 
+    /**
+     * @var Filesystem
+     */
+    private $fileInfo;
+
     /**
      * DataProvider constructor
      *
@@ -483,8 +490,16 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
             if ($attribute->getBackend() instanceof ImageBackendModel) {
                 unset($categoryData[$attributeCode]);
 
-                $categoryData[$attributeCode][0]['name'] = $category->getData($attributeCode);
-                $categoryData[$attributeCode][0]['url'] = $category->getImageUrl($attributeCode);
+                $fileName = $category->getData($attributeCode);
+                if ($this->getFileInfo()->isExist($fileName)) {
+                    $stat = $this->getFileInfo()->getStat($fileName);
+                    $mime = $this->getFileInfo()->getMimeType($fileName);
+
+                    $categoryData[$attributeCode][0]['name'] = $fileName;
+                    $categoryData[$attributeCode][0]['url'] = $category->getImageUrl($attributeCode);
+                    $categoryData['image'][0]['size'] = isset($stat) ? $stat['size'] : 0;
+                    $categoryData['image'][0]['type'] = $mime;
+                }
             }
         }
 
@@ -605,4 +620,19 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
 
         return $this->arrayManager;
     }
+
+    /**
+     * Get FileInfo instance
+     *
+     * @return FileInfo
+     *
+     * @deprecated
+     */
+    private function getFileInfo()
+    {
+        if ($this->fileInfo === null) {
+            $this->fileInfo = ObjectManager::getInstance()->get(FileInfo::class);
+        }
+        return $this->fileInfo;
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Category/FileInfo.php b/app/code/Magento/Catalog/Model/Category/FileInfo.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e4d852e579afb66ac071b530494bfdad23f36e2
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Category/FileInfo.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Model\Category;
+
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\File\Mime;
+use Magento\Framework\Filesystem;
+use Magento\Framework\Filesystem\Directory\WriteInterface;
+
+/**
+ * Class FileInfo
+ *
+ * Provides information about requested file
+ */
+class FileInfo
+{
+    /**
+     * Path in /pub/media directory
+     */
+    const ENTITY_MEDIA_PATH = '/catalog/category';
+
+    /**
+     * @var Filesystem
+     */
+    private $filesystem;
+
+    /**
+     * @var Mime
+     */
+    private $mime;
+
+    /**
+     * @var WriteInterface
+     */
+    private $mediaDirectory;
+
+    /**
+     * @param Filesystem $filesystem
+     * @param Mime $mime
+     */
+    public function __construct(
+        Filesystem $filesystem,
+        Mime $mime
+    ) {
+        $this->filesystem = $filesystem;
+        $this->mime = $mime;
+    }
+
+    /**
+     * Get WriteInterface instance
+     *
+     * @return WriteInterface
+     */
+    private function getMediaDirectory()
+    {
+        if ($this->mediaDirectory === null) {
+            $this->mediaDirectory = $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA);
+        }
+        return $this->mediaDirectory;
+    }
+
+    /**
+     * Retrieve MIME type of requested file
+     *
+     * @param string $fileName
+     * @return string
+     */
+    public function getMimeType($fileName)
+    {
+        $filePath = self::ENTITY_MEDIA_PATH . '/' . ltrim($fileName, '/');
+        $absoluteFilePath = $this->getMediaDirectory()->getAbsolutePath($filePath);
+
+        $result = $this->mime->getMimeType($absoluteFilePath);
+        return $result;
+    }
+
+    /**
+     * Get file statistics data
+     *
+     * @param string $fileName
+     * @return array
+     */
+    public function getStat($fileName)
+    {
+        $filePath = self::ENTITY_MEDIA_PATH . '/' . ltrim($fileName, '/');
+
+        $result = $this->getMediaDirectory()->stat($filePath);
+        return $result;
+    }
+
+    /**
+     * Check if the file exists
+     *
+     * @param string $fileName
+     * @return bool
+     */
+    public function isExist($fileName)
+    {
+        $filePath = self::ENTITY_MEDIA_PATH . '/' . ltrim($fileName, '/');
+
+        $result = $this->getMediaDirectory()->isExist($filePath);
+        return $result;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Config/Source/Product/Options/Price.php b/app/code/Magento/Catalog/Model/Config/Source/Product/Options/Price.php
index b994c787bee7aa76f8a4baa3648bcbb2c0e4ee27..5e518df37db1a574f25fe008510e75742cdffa9c 100644
--- a/app/code/Magento/Catalog/Model/Config/Source/Product/Options/Price.php
+++ b/app/code/Magento/Catalog/Model/Config/Source/Product/Options/Price.php
@@ -23,7 +23,7 @@ class Price implements ProductPriceOptionsInterface
     {
         return [
             ['value' => self::VALUE_FIXED, 'label' => __('Fixed')],
-            ['value' => self::VALUE_PERCENT, 'label' => __('Percent')],
+            ['value' => self::VALUE_PERCENT, 'label' => __('Discount')],
         ];
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Tierprice.php b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Tierprice.php
index 480f8e8942e87f200ce3829641ea026d351b1967..460204a478d9d75ac86dbaa4e8d3684ea26b8812 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Tierprice.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Tierprice.php
@@ -157,6 +157,7 @@ class Tierprice extends \Magento\Catalog\Model\Product\Attribute\Backend\GroupPr
         $data = parent::modifyPriceData($object, $data);
         foreach ($data as $key => $tierPrice) {
             if ($this->getPercentage($tierPrice)) {
+                $data[$key]['price'] = $object->getPrice() * (1 - $this->getPercentage($tierPrice) / 100);
                 $data[$key]['website_price'] = $object->getPrice() * (1 - $this->getPercentage($tierPrice) / 100);
             }
         }
diff --git a/app/code/Magento/Catalog/Model/Product/Image.php b/app/code/Magento/Catalog/Model/Product/Image.php
index 34e1ad30ad434add33508bb63c7b8b1a78ddc9fb..769faa682f422b569dd6673df819f05d7371aeb8 100644
--- a/app/code/Magento/Catalog/Model/Product/Image.php
+++ b/app/code/Magento/Catalog/Model/Product/Image.php
@@ -12,8 +12,8 @@
 namespace Magento\Catalog\Model\Product;
 
 use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Image as MagentoImage;
-use Magento\Store\Model\Store;
 
 /**
  * @SuppressWarnings(PHPMD.TooManyFields)
@@ -170,6 +170,21 @@ class Image extends \Magento\Framework\Model\AbstractModel
      */
     protected $_storeManager;
 
+    /**
+     * @var \Magento\Catalog\Model\View\Asset\ImageFactory
+     */
+    private $viewAssetImageFactory;
+
+    /**
+     * @var \Magento\Catalog\Model\View\Asset\PlaceholderFactory
+     */
+    private $viewAssetPlaceholderFactory;
+
+    /**
+     * @var \Magento\Framework\View\Asset\LocalInterface
+     */
+    private $imageAsset;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -207,7 +222,6 @@ class Image extends \Magento\Framework\Model\AbstractModel
         $this->_coreFileStorageDatabase = $coreFileStorageDatabase;
         parent::__construct($context, $registry, $resource, $resourceCollection, $data);
         $this->_mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
-        $result = $this->_mediaDirectory->create($this->_catalogProductMediaConfig->getBaseMediaPath());
         $this->_imageFactory = $imageFactory;
         $this->_assetRepo = $assetRepo;
         $this->_viewFileSystem = $viewFileSystem;
@@ -450,85 +464,29 @@ class Image extends \Magento\Framework\Model\AbstractModel
      * @param string $file
      * @return $this
      * @throws \Exception
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     * @SuppressWarnings(PHPMD.NPathComplexity)
      */
     public function setBaseFile($file)
     {
         $this->_isBaseFilePlaceholder = false;
 
-        if ($file && 0 !== strpos($file, '/', 0)) {
-            $file = '/' . $file;
-        }
-        $baseDir = $this->_catalogProductMediaConfig->getBaseMediaPath();
-
-        if ('/no_selection' == $file) {
-            $file = null;
-        }
-        if ($file) {
-            if (!$this->_fileExists($baseDir . $file) || !$this->_checkMemory($baseDir . $file)) {
-                $file = null;
-            }
-        }
-        if (!$file) {
+        $this->imageAsset = $this->getViewAssetImageFactory()->create(
+            [
+                'miscParams' => $this->getMiscParams(),
+                'filePath' => $file,
+            ]
+        );
+        if ($file == 'no_selection' || !$this->_fileExists($this->imageAsset->getSourceFile())
+            || !$this->_checkMemory($this->imageAsset->getSourceFile())
+        ) {
             $this->_isBaseFilePlaceholder = true;
-            // check if placeholder defined in config
-            $isConfigPlaceholder = $this->_scopeConfig->getValue(
-                "catalog/placeholder/{$this->getDestinationSubdir()}_placeholder",
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE
+            $this->imageAsset = $this->getViewAssetPlaceholderFactory()->create(
+                [
+                    'type' => $this->getDestinationSubdir(),
+                ]
             );
-            $configPlaceholder = '/placeholder/' . $isConfigPlaceholder;
-            if (!empty($isConfigPlaceholder) && $this->_fileExists($baseDir . $configPlaceholder)) {
-                $file = $configPlaceholder;
-            } else {
-                $this->_newFile = true;
-                return $this;
-            }
-        }
-
-        $baseFile = $baseDir . $file;
-
-        if (!$file || !$this->_mediaDirectory->isFile($baseFile)) {
-            throw new \Exception(__('We can\'t find the image file.'));
         }
 
-        $this->_baseFile = $baseFile;
-
-        // build new filename (most important params)
-        $path = [
-            $this->_catalogProductMediaConfig->getBaseMediaPath(),
-            'cache',
-            $this->getDestinationSubdir(),
-        ];
-        if (!empty($this->_width) || !empty($this->_height)) {
-            $path[] = "{$this->_width}x{$this->_height}";
-        }
-
-        // add misk params as a hash
-        $miscParams = [
-            ($this->_keepAspectRatio ? '' : 'non') . 'proportional',
-            ($this->_keepFrame ? '' : 'no') . 'frame',
-            ($this->_keepTransparency ? '' : 'no') . 'transparency',
-            ($this->_constrainOnly ? 'do' : 'not') . 'constrainonly',
-            $this->_rgbToString($this->_backgroundColor),
-            'angle' . $this->_angle,
-            'quality' . $this->_quality,
-        ];
-
-        // if has watermark add watermark params to hash
-        if ($this->getWatermarkFile()) {
-            $miscParams[] = $this->getWatermarkFile();
-            $miscParams[] = $this->getWatermarkImageOpacity();
-            $miscParams[] = $this->getWatermarkPosition();
-            $miscParams[] = $this->getWatermarkWidth();
-            $miscParams[] = $this->getWatermarkHeight();
-        }
-
-        $path[] = md5(implode('_', $miscParams));
-
-        // append prepared filename
-        $this->_newFile = implode('/', $path) . $file;
-        // the $file contains heading slash
+        $this->_baseFile = $this->imageAsset->getSourceFile();
 
         return $this;
     }
@@ -542,6 +500,7 @@ class Image extends \Magento\Framework\Model\AbstractModel
     }
 
     /**
+     * @deprecated
      * @return bool|string
      */
     public function getNewFile()
@@ -690,10 +649,10 @@ class Image extends \Magento\Framework\Model\AbstractModel
      */
     public function saveFile()
     {
-        if ($this->_isBaseFilePlaceholder && $this->_newFile === true) {
+        if ($this->_isBaseFilePlaceholder) {
             return $this;
         }
-        $filename = $this->_mediaDirectory->getAbsolutePath($this->getNewFile());
+        $filename = $this->getBaseFile() ? $this->imageAsset->getPath() : null;
         $this->getImageProcessor()->save($filename);
         $this->_coreFileStorageDatabase->saveFile($filename);
         return $this;
@@ -704,17 +663,7 @@ class Image extends \Magento\Framework\Model\AbstractModel
      */
     public function getUrl()
     {
-        if ($this->_newFile === true) {
-            $url = $this->_assetRepo->getUrl(
-                "Magento_Catalog::images/product/placeholder/{$this->getDestinationSubdir()}.jpg"
-            );
-        } else {
-            $url = $this->_storeManager->getStore()->getBaseUrl(
-                \Magento\Framework\UrlInterface::URL_TYPE_MEDIA
-            ) . $this->_newFile;
-        }
-
-        return $url;
+        return $this->imageAsset->getUrl();
     }
 
     /**
@@ -740,9 +689,7 @@ class Image extends \Magento\Framework\Model\AbstractModel
      */
     public function isCached()
     {
-        if (is_string($this->_newFile)) {
-            return $this->_fileExists($this->_newFile);
-        }
+        return file_exists($this->imageAsset->getPath());
     }
 
     /**
@@ -939,18 +886,72 @@ class Image extends \Magento\Framework\Model\AbstractModel
      */
     public function getResizedImageInfo()
     {
-        $fileInfo = null;
-        if ($this->_newFile === true) {
-            $asset = $this->_assetRepo->createAsset(
-                "Magento_Catalog::images/product/placeholder/{$this->getDestinationSubdir()}.jpg"
-            );
-            $img = $asset->getSourceFile();
-            $fileInfo = getimagesize($img);
+        if ($this->isBaseFilePlaceholder() == true) {
+            $image = $this->imageAsset->getSourceFile();
         } else {
-            if ($this->_mediaDirectory->isFile($this->_mediaDirectory->getAbsolutePath($this->_newFile))) {
-                $fileInfo = getimagesize($this->_mediaDirectory->getAbsolutePath($this->_newFile));
-            }
+            $image = $this->imageAsset->getPath();
         }
-        return $fileInfo;
+        return getimagesize($image);
+    }
+
+    /**
+     * @return \Magento\Catalog\Model\View\Asset\ImageFactory
+     */
+    private function getViewAssetImageFactory()
+    {
+        if ($this->viewAssetImageFactory == null) {
+            $this->viewAssetImageFactory = ObjectManager::getInstance()->get(
+                \Magento\Catalog\Model\View\Asset\ImageFactory::class
+            );
+        }
+
+        return $this->viewAssetImageFactory;
+    }
+
+    /**
+     * @return \Magento\Catalog\Model\View\Asset\PlaceholderFactory
+     */
+    private function getViewAssetPlaceholderFactory()
+    {
+        if ($this->viewAssetPlaceholderFactory == null) {
+            $this->viewAssetPlaceholderFactory = ObjectManager::getInstance()->get(
+                \Magento\Catalog\Model\View\Asset\PlaceholderFactory::class
+            );
+        }
+
+        return $this->viewAssetPlaceholderFactory;
+    }
+
+    /**
+     * Retrieve misc params based on all image attributes
+     *
+     * @return array
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     */
+    private function getMiscParams()
+    {
+        $miscParams = [
+            'image_type' => $this->getDestinationSubdir(),
+            'image_height' => $this->getHeight(),
+            'image_width' => $this->getWidth(),
+            'keep_aspect_ratio' => ($this->_keepAspectRatio ? '' : 'non') . 'proportional',
+            'keep_frame' => ($this->_keepFrame ? '' : 'no') . 'frame',
+            'keep_transparency' => ($this->_keepTransparency ? '' : 'no') . 'transparency',
+            'constrain_only' => ($this->_constrainOnly ? 'do' : 'not') . 'constrainonly',
+            'background' => $this->_rgbToString($this->_backgroundColor),
+            'angle' => $this->_angle,
+            'quality' => $this->_quality,
+        ];
+
+        // if has watermark add watermark params to hash
+        if ($this->getWatermarkFile()) {
+            $miscParams['watermark_file'] = $this->getWatermarkFile();
+            $miscParams['watermark_image_opacity'] = $this->getWatermarkImageOpacity();
+            $miscParams['watermark_position'] = $this->getWatermarkPosition();
+            $miscParams['watermark_width'] = $this->getWatermarkWidth();
+            $miscParams['watermark_height'] = $this->getWatermarkHeight();
+        }
+
+        return $miscParams;
     }
 }
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Eav/Attribute.php b/app/code/Magento/Catalog/Model/ResourceModel/Eav/Attribute.php
index 8e93868dc7e51916a1c44997ad98045edbe1bd4f..8fdb867c9dbd84a2903a9a3372144d05c54922f4 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Eav/Attribute.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Eav/Attribute.php
@@ -417,6 +417,9 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute implements
         if ($this->getAttributeCode() == 'price') {
             return false;
         }
+        if ($this->getAttributeCode() == 'visibility') {
+            return true;
+        }
 
         if (!$this->getIsFilterableInSearch() && !$this->getIsVisibleInAdvancedSearch() && !$this->getIsFilterable()) {
             return false;
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/StatusBaseSelectProcessor.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/StatusBaseSelectProcessor.php
index 656998113fdb92e50e5177db4876651cfcd2023a..b4293a39895850fb349a6232e0c5b95fc1dfa50f 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/StatusBaseSelectProcessor.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/StatusBaseSelectProcessor.php
@@ -11,6 +11,8 @@ use Magento\Catalog\Model\Product\Attribute\Source\Status;
 use Magento\Eav\Model\Config;
 use Magento\Framework\DB\Select;
 use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Store\Api\StoreResolverInterface;
+use Magento\Store\Model\Store;
 
 /**
  * Class StatusBaseSelectProcessor
@@ -27,16 +29,24 @@ class StatusBaseSelectProcessor implements BaseSelectProcessorInterface
      */
     private $metadataPool;
 
+    /**
+     * @var StoreResolverInterface
+     */
+    private $storeResolver;
+
     /**
      * @param Config $eavConfig
      * @param MetadataPool $metadataPool
+     * @param StoreResolverInterface $storeResolver
      */
     public function __construct(
         Config $eavConfig,
-        MetadataPool $metadataPool
+        MetadataPool $metadataPool,
+        StoreResolverInterface $storeResolver
     ) {
         $this->eavConfig = $eavConfig;
         $this->metadataPool = $metadataPool;
+        $this->storeResolver = $storeResolver;
     }
 
     /**
@@ -48,13 +58,23 @@ class StatusBaseSelectProcessor implements BaseSelectProcessorInterface
         $linkField = $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField();
         $statusAttribute = $this->eavConfig->getAttribute(Product::ENTITY, ProductInterface::STATUS);
 
-        $select->join(
+        $select->joinLeft(
+            ['status_global_attr' => $statusAttribute->getBackendTable()],
+            "status_global_attr.{$linkField} = " . self::PRODUCT_TABLE_ALIAS . ".{$linkField}"
+            . ' AND status_global_attr.attribute_id = ' . (int)$statusAttribute->getAttributeId()
+            . ' AND status_global_attr.store_id = ' . Store::DEFAULT_STORE_ID,
+            []
+        );
+
+        $select->joinLeft(
             ['status_attr' => $statusAttribute->getBackendTable()],
-            sprintf('status_attr.%s = %s.%1$s', $linkField, self::PRODUCT_TABLE_ALIAS),
+            "status_attr.{$linkField} = " . self::PRODUCT_TABLE_ALIAS . ".{$linkField}"
+            . ' AND status_attr.attribute_id = ' . (int)$statusAttribute->getAttributeId()
+            . ' AND status_attr.store_id = ' . $this->storeResolver->getCurrentStoreId(),
             []
-        )
-            ->where('status_attr.attribute_id = ?', $statusAttribute->getAttributeId())
-            ->where('status_attr.value = ?', Status::STATUS_ENABLED);
+        );
+
+        $select->where('IFNULL(status_attr.value, status_global_attr.value) = ?', Status::STATUS_ENABLED);
 
         return $select;
     }
diff --git a/app/code/Magento/Catalog/Model/View/Asset/Image.php b/app/code/Magento/Catalog/Model/View/Asset/Image.php
new file mode 100644
index 0000000000000000000000000000000000000000..31129d7d892d2a3737b4263beb127a37c6e0217b
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/View/Asset/Image.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Model\View\Asset;
+
+use Magento\Catalog\Model\Product\Media\ConfigInterface;
+use Magento\Framework\Encryption\Encryptor;
+use Magento\Framework\Encryption\EncryptorInterface;
+use Magento\Framework\View\Asset\ContextInterface;
+use Magento\Framework\View\Asset\LocalInterface;
+
+/**
+ * A locally available image file asset that can be referred with a file path
+ *
+ * This class is a value object with lazy loading of some of its data (content, physical file path)
+ */
+class Image implements LocalInterface
+{
+    /**
+     * @var string
+     */
+    private $filePath;
+
+    /**
+     * @var string
+     */
+    private $contentType = 'image';
+
+    /**
+     * @var ContextInterface
+     */
+    private $context;
+
+    /**
+     * Misc image params depend on size, transparency, quality, watermark etc.
+     *
+     * @var array
+     */
+    private $miscParams;
+
+    /**
+     * @var ConfigInterface
+     */
+    private $mediaConfig;
+
+    /**
+     * @var EncryptorInterface
+     */
+    private $encryptor;
+
+    /**
+     * Image constructor.
+     *
+     * @param ConfigInterface $mediaConfig
+     * @param ContextInterface $context
+     * @param EncryptorInterface $encryptor
+     * @param string $filePath
+     * @param array $miscParams
+     */
+    public function __construct(
+        ConfigInterface $mediaConfig,
+        ContextInterface $context,
+        EncryptorInterface $encryptor,
+        $filePath,
+        array $miscParams = []
+    ) {
+        $this->mediaConfig = $mediaConfig;
+        $this->context = $context;
+        $this->filePath = $filePath;
+        $this->miscParams = $miscParams;
+        $this->encryptor = $encryptor;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUrl()
+    {
+        return $this->context->getBaseUrl() . $this->getRelativePath(DIRECTORY_SEPARATOR);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getContentType()
+    {
+        return $this->contentType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPath()
+    {
+        return $this->getRelativePath($this->context->getPath());
+    }
+
+    /**
+     * Subroutine for building path
+     *
+     * @param string $path
+     * @param string $item
+     * @return string
+     */
+    private function join($path, $item)
+    {
+        return trim(
+            $path . ($item ? DIRECTORY_SEPARATOR . ltrim($item, DIRECTORY_SEPARATOR) : ''),
+            DIRECTORY_SEPARATOR
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSourceFile()
+    {
+        return $this->mediaConfig->getBaseMediaPath()
+            . DIRECTORY_SEPARATOR . ltrim($this->filePath, DIRECTORY_SEPARATOR);
+    }
+
+    /**
+     * Get source content type
+     *
+     * @return string
+     */
+    public function getSourceContentType()
+    {
+        return $this->contentType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getContent()
+    {
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilePath()
+    {
+        return $this->filePath;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return ContextInterface
+     */
+    public function getContext()
+    {
+        return $this->context;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getModule()
+    {
+        return 'cache';
+    }
+
+    /**
+     * Retrieve part of path based on misc params
+     *
+     * @return string
+     */
+    private function getMiscPath()
+    {
+        return $this->encryptor->hash(implode('_', $this->miscParams), Encryptor::HASH_VERSION_MD5);
+    }
+
+    /**
+     * Generate relative path
+     *
+     * @param string $result
+     * @return string
+     */
+    private function getRelativePath($result)
+    {
+        $result = $this->join($result, $this->getModule());
+        $result = $this->join($result, $this->getMiscPath());
+        $result = $this->join($result, $this->getFilePath());
+        return DIRECTORY_SEPARATOR . $result;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/View/Asset/Image/Context.php b/app/code/Magento/Catalog/Model/View/Asset/Image/Context.php
new file mode 100644
index 0000000000000000000000000000000000000000..33f0adb70c94113f51321ecce40cdffdee1ef769
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/View/Asset/Image/Context.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Model\View\Asset\Image;
+
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\View\Asset\ContextInterface;
+
+/**
+ * A basic path context for assets that includes a directory path
+ */
+class Context implements ContextInterface
+{
+    /**
+     * @var \Magento\Framework\Filesystem\Directory\WriteInterface
+     */
+    private $mediaDirectory;
+
+    /**
+     * @var \Magento\Catalog\Model\Product\Media\ConfigInterface
+     */
+    private $mediaConfig;
+
+    /**
+     * @var \Magento\Framework\Filesystem
+     */
+    private $filesystem;
+
+    /**
+     */
+    public function __construct(
+        \Magento\Catalog\Model\Product\Media\ConfigInterface $mediaConfig,
+        \Magento\Framework\Filesystem $filesystem
+    ) {
+        $this->mediaConfig = $mediaConfig;
+        $this->filesystem = $filesystem;
+        $this->mediaDirectory = $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA);
+        $this->mediaDirectory->create($this->mediaConfig->getBaseMediaPath());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPath()
+    {
+        return $this->mediaDirectory->getAbsolutePath($this->mediaConfig->getBaseMediaPath());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBaseUrl()
+    {
+        return $this->mediaConfig->getBaseMediaUrl();
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/View/Asset/Placeholder.php b/app/code/Magento/Catalog/Model/View/Asset/Placeholder.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd7dcd1c4692ec76af97bdfb782e756345985d4b
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/View/Asset/Placeholder.php
@@ -0,0 +1,181 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Model\View\Asset;
+
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\View\Asset\ContextInterface;
+use Magento\Framework\View\Asset\File\NotFoundException;
+use Magento\Framework\View\Asset\LocalInterface;
+use Magento\Framework\View\Asset\Repository;
+
+/**
+ * A locally available image placeholder file asset that can be referred with a file type
+ */
+class Placeholder implements LocalInterface
+{
+    /**
+     * Type of placeholder
+     *
+     * @var string
+     */
+    private $type;
+
+    /**
+     * Filevpath of placeholder
+     *
+     * @var string
+     */
+    private $filePath;
+
+    /**
+     * @var string
+     */
+    private $contentType = 'image';
+
+    /**
+     * @var ContextInterface
+     */
+    private $context;
+
+    /**
+     * @var Repository
+     */
+    private $assetRepo;
+
+    /**
+     * Core store config
+     *
+     * @var ScopeConfigInterface
+     */
+    private $scopeConfig;
+
+    /**
+     * Placeholder constructor.
+     *
+     * @param ContextInterface $context
+     * @param ScopeConfigInterface $scopeConfig
+     * @param Repository $assetRepo
+     * @param string $type
+     */
+    public function __construct(
+        ContextInterface $context,
+        ScopeConfigInterface $scopeConfig,
+        Repository $assetRepo,
+        $type
+    ) {
+        $this->context = $context;
+        $this->scopeConfig = $scopeConfig;
+        $this->assetRepo = $assetRepo;
+        $this->type = $type;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUrl()
+    {
+        if ($this->getFilePath() !== null) {
+            $result = $this->context->getBaseUrl() . '/' . $this->getModule() . '/' . $this->getFilePath();
+        } else {
+            $result = $this->assetRepo->getUrl("Magento_Catalog::images/product/placeholder/{$this->type}.jpg");
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getContentType()
+    {
+        return $this->contentType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPath()
+    {
+        if ($this->getFilePath() !== null) {
+            $result = $this->getContext()->getPath()
+                . DIRECTORY_SEPARATOR . $this->getModule()
+                . DIRECTORY_SEPARATOR . $this->getFilePath();
+        } else {
+            $defaultPlaceholder = $this->assetRepo->createAsset(
+                "Magento_Catalog::images/product/placeholder/{$this->type}.jpg"
+            );
+            try {
+                $result = $defaultPlaceholder->getSourceFile();
+            } catch (NotFoundException $e) {
+                $result = null;
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSourceFile()
+    {
+        return $this->getPath();
+    }
+
+    /**
+     * Get source content type
+     *
+     * @return string
+     */
+    public function getSourceContentType()
+    {
+        return $this->contentType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getContent()
+    {
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilePath()
+    {
+        if ($this->filePath !== null) {
+            return $this->filePath;
+        }
+        // check if placeholder defined in config
+        $isConfigPlaceholder = $this->scopeConfig->getValue(
+            "catalog/placeholder/{$this->type}_placeholder",
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
+        );
+        $this->filePath = $isConfigPlaceholder;
+
+        return $this->filePath;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return ContextInterface
+     */
+    public function getContext()
+    {
+        return $this->context;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getModule()
+    {
+        return 'placeholder';
+    }
+}
diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
index 2e3a896d956d9cdd1dd82ccee58873bcf6131460..3aee622b5e3b3a48910318157a33faf8498cfd37 100644
--- a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
@@ -111,8 +111,8 @@ class GalleryTest extends \PHPUnit_Framework_TestCase
             ->method('init')
             ->willReturnMap([
                 [$productMock, 'product_page_image_small', [], $this->imageHelper],
-                [$productMock, 'product_page_image_medium', [], $this->imageHelper],
-                [$productMock, 'product_page_image_large', [], $this->imageHelper],
+                [$productMock, 'product_page_image_medium_no_frame', [], $this->imageHelper],
+                [$productMock, 'product_page_image_large_no_frame', [], $this->imageHelper],
             ])
             ->willReturnSelf();
         $this->imageHelper->expects($this->exactly(3))
@@ -129,19 +129,6 @@ class GalleryTest extends \PHPUnit_Framework_TestCase
             ->method('getUrl')
             ->willReturn('product_page_image_large_url');
 
-        $this->imageHelper->expects($this->exactly(2))
-            ->method('constrainOnly')
-            ->with(true)
-            ->willReturnSelf();
-        $this->imageHelper->expects($this->exactly(2))
-            ->method('keepAspectRatio')
-            ->with(true)
-            ->willReturnSelf();
-         $this->imageHelper->expects($this->exactly(2))
-            ->method('keepFrame')
-            ->with(false)
-            ->willReturnSelf();
-
         $images = $this->model->getGalleryImages();
         $this->assertInstanceOf(\Magento\Framework\Data\Collection::class, $images);
     }
diff --git a/app/code/Magento/Catalog/Test/Unit/Helper/ImageTest.php b/app/code/Magento/Catalog/Test/Unit/Helper/ImageTest.php
index 206f20bc98179db80af5fb45014b061149dec8d7..4ed3495f9e34812788baf408632e5af29d521044 100644
--- a/app/code/Magento/Catalog/Test/Unit/Helper/ImageTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Helper/ImageTest.php
@@ -424,7 +424,6 @@ class ImageTest extends \PHPUnit_Framework_TestCase
      * @param string $imageId
      * @param string $imageFile
      * @param string $baseFile
-     * @param string $newFile
      * @param string $destination
      * @param boolean $setImageFile
      * @param boolean $isCached
@@ -436,7 +435,6 @@ class ImageTest extends \PHPUnit_Framework_TestCase
         $imageId,
         $imageFile,
         $baseFile,
-        $newFile,
         $destination,
         $setImageFile,
         $isCached,
@@ -477,9 +475,6 @@ class ImageTest extends \PHPUnit_Framework_TestCase
         $this->image->expects($this->any())
             ->method('isBaseFilePlaceholder')
             ->willReturn($isBaseFilePlaceholder);
-        $this->image->expects($this->any())
-            ->method('getNewFile')
-            ->willReturn($newFile);
 
         $this->prepareAttributes([], $imageId);
 
@@ -502,7 +497,6 @@ class ImageTest extends \PHPUnit_Framework_TestCase
                 'image_id' => 'test_image_id',
                 'image_file' => '/path/to/test_image_id.png',
                 'base_file' => '/path/to/base_image.png',
-                'new_file' => '/path/to/base_image.png',
                 'destination' => 'small_image',
                 'set_image_file' => true,
                 'is_cached' => false,
@@ -516,7 +510,6 @@ class ImageTest extends \PHPUnit_Framework_TestCase
                 'image_id' => 'test_image_id',
                 'image_file' => '/path/to/test_image_id.png',
                 'base_file' => null,
-                'new_file' => true,
                 'destination' => 'small_image',
                 'set_image_file' => false,
                 'is_cached' => false,
@@ -530,7 +523,6 @@ class ImageTest extends \PHPUnit_Framework_TestCase
                 'image_id' => 'test_image_id',
                 'image_file' => '/path/to/test_image_id.png',
                 'base_file' => null,
-                'new_file' => false,
                 'destination' => 'small_image',
                 'set_image_file' => true,
                 'is_cached' => false,
@@ -544,7 +536,6 @@ class ImageTest extends \PHPUnit_Framework_TestCase
                 'image_id' => 'test_image_id',
                 'image_file' => '/path/to/test_image_id.png',
                 'base_file' => null,
-                'new_file' => true,
                 'destination' => 'small_image',
                 'set_image_file' => true,
                 'is_cached' => false,
@@ -558,7 +549,6 @@ class ImageTest extends \PHPUnit_Framework_TestCase
                 'image_id' => 'test_image_id',
                 'image_file' => '/path/to/test_image_id.png',
                 'base_file' => null,
-                'new_file' => '/path/to/test_image_id.png',
                 'destination' => 'small_image',
                 'set_image_file' => true,
                 'is_cached' => false,
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Category/DataProviderTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Category/DataProviderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4a7971afbbb5074e3338a06a0c61366353dd73b5
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Category/DataProviderTest.php
@@ -0,0 +1,320 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Test\Unit\Model\Category;
+
+use Magento\Catalog\Model\Category\DataProvider;
+use Magento\Catalog\Model\Category\FileInfo;
+use Magento\Catalog\Model\CategoryFactory;
+use Magento\Catalog\Model\ResourceModel\Category\Collection;
+use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory;
+use Magento\Eav\Model\Config;
+use Magento\Eav\Model\Entity\Type;
+use Magento\Framework\App\RequestInterface;
+use Magento\Framework\Registry;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\Ui\DataProvider\EavValidationRules;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class DataProviderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var EavValidationRules|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $eavValidationRules;
+
+    /**
+     * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $categoryCollectionFactory;
+
+    /**
+     * @var StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeManager;
+
+    /**
+     * @var Registry|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $registry;
+
+    /**
+     * @var Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $eavConfig;
+
+    /**
+     * @var RequestInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $request;
+
+    /**
+     * @var CategoryFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $categoryFactory;
+
+    /**
+     * @var Collection|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collection;
+
+    /**
+     * @var Type|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $eavEntityMock;
+
+    /**
+     * @var FileInfo|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $fileInfo;
+
+    protected function setUp()
+    {
+        $this->eavValidationRules = $this->getMockBuilder(EavValidationRules::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->collection = $this->getMockBuilder(Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->collection->expects($this->any())
+            ->method('addAttributeToSelect')
+            ->with('*')
+            ->willReturnSelf();
+
+        $this->categoryCollectionFactory = $this->getMockBuilder(CollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->categoryCollectionFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->collection);
+
+        $this->storeManager = $this->getMockBuilder(StoreManagerInterface::class)
+            ->getMockForAbstractClass();
+
+        $this->registry = $this->getMockBuilder(Registry::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->eavEntityMock = $this->getMockBuilder(Type::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->eavConfig = $this->getMockBuilder(Config::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->request = $this->getMockBuilder(RequestInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->categoryFactory = $this->getMockBuilder(CategoryFactory::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->fileInfo = $this->getMockBuilder(FileInfo::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+    }
+
+    /**
+     * @return DataProvider
+     */
+    private function getModel()
+    {
+        $this->eavEntityMock->expects($this->any())
+            ->method('getAttributeCollection')
+            ->willReturn([]);
+
+        $this->eavConfig->expects($this->any())
+            ->method('getEntityType')
+            ->with('catalog_category')
+            ->willReturn($this->eavEntityMock);
+
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $model = $objectManager->getObject(
+            DataProvider::class,
+            [
+                'eavValidationRules' => $this->eavValidationRules,
+                'categoryCollectionFactory' => $this->categoryCollectionFactory,
+                'storeManager' => $this->storeManager,
+                'registry' => $this->registry,
+                'eavConfig' => $this->eavConfig,
+                'request' => $this->request,
+                'categoryFactory' => $this->categoryFactory,
+            ]
+        );
+
+        $objectManager->setBackwardCompatibleProperty(
+            $model,
+            'fileInfo',
+            $this->fileInfo
+        );
+
+        return $model;
+    }
+
+    public function testGetDataNoCategory()
+    {
+        $this->registry->expects($this->once())
+            ->method('registry')
+            ->with('category')
+            ->willReturn(null);
+
+        $model = $this->getModel();
+        $this->assertNull($model->getData());
+    }
+
+    public function testGetDataNoFileExists()
+    {
+        $fileName = 'filename.ext1';
+        $categoryId = 1;
+
+        $categoryData = [
+            'image' => $fileName,
+        ];
+
+        $imageBackendMock = $this->getMockBuilder(\Magento\Catalog\Model\Category\Attribute\Backend\Image::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $attributeMock = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $attributeMock->expects($this->once())
+            ->method('getBackend')
+            ->willReturn($imageBackendMock);
+
+        $categoryMock = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $categoryMock->expects($this->exactly(2))
+            ->method('getData')
+            ->willReturnMap([
+                ['', null, $categoryData],
+                ['image', null, $categoryData['image']],
+            ]);
+        $categoryMock->expects($this->any())
+            ->method('getExistsStoreValueFlag')
+            ->with('url_key')
+            ->willReturn(false);
+        $categoryMock->expects($this->any())
+            ->method('getStoreId')
+            ->willReturn(\Magento\Store\Model\Store::DEFAULT_STORE_ID);
+        $categoryMock->expects($this->once())
+            ->method('getId')
+            ->willReturn($categoryId);
+        $categoryMock->expects($this->once())
+            ->method('getAttributes')
+            ->willReturn(['image' => $attributeMock]);
+
+        $this->registry->expects($this->once())
+            ->method('registry')
+            ->with('category')
+            ->willReturn($categoryMock);
+
+        $this->fileInfo->expects($this->once())
+            ->method('isExist')
+            ->with($fileName)
+            ->willReturn(false);
+
+        $model = $this->getModel();
+        $result = $model->getData();
+
+        $this->assertTrue(is_array($result));
+        $this->assertArrayHasKey($categoryId, $result);
+        $this->assertArrayNotHasKey('image', $result[$categoryId]);
+    }
+
+    public function testGetData()
+    {
+        $fileName = 'filename.png';
+        $mime = 'image/png';
+        $size = 1;
+
+        $categoryId = 1;
+        $categoryUrl = 'category_url';
+
+        $categoryData = [
+            'image' => $fileName,
+        ];
+
+        $expects = [
+            [
+                'name' => $fileName,
+                'url' => $categoryUrl,
+                'size' => $size,
+                'type' => $mime,
+            ],
+        ];
+
+        $imageBackendMock = $this->getMockBuilder(\Magento\Catalog\Model\Category\Attribute\Backend\Image::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $attributeMock = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $attributeMock->expects($this->once())
+            ->method('getBackend')
+            ->willReturn($imageBackendMock);
+
+        $categoryMock = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $categoryMock->expects($this->exactly(2))
+            ->method('getData')
+            ->willReturnMap([
+                ['', null, $categoryData],
+                ['image', null, $categoryData['image']],
+            ]);
+        $categoryMock->expects($this->any())
+            ->method('getExistsStoreValueFlag')
+            ->with('url_key')
+            ->willReturn(false);
+        $categoryMock->expects($this->any())
+            ->method('getStoreId')
+            ->willReturn(\Magento\Store\Model\Store::DEFAULT_STORE_ID);
+        $categoryMock->expects($this->once())
+            ->method('getId')
+            ->willReturn($categoryId);
+        $categoryMock->expects($this->once())
+            ->method('getAttributes')
+            ->willReturn(['image' => $attributeMock]);
+        $categoryMock->expects($this->once())
+            ->method('getImageUrl')
+            ->willReturn($categoryUrl);
+
+        $this->registry->expects($this->once())
+            ->method('registry')
+            ->with('category')
+            ->willReturn($categoryMock);
+
+        $this->fileInfo->expects($this->once())
+            ->method('isExist')
+            ->with($fileName)
+            ->willReturn(true);
+        $this->fileInfo->expects($this->once())
+            ->method('getStat')
+            ->with($fileName)
+            ->willReturn(['size' => $size]);
+        $this->fileInfo->expects($this->once())
+            ->method('getMimeType')
+            ->with($fileName)
+            ->willReturn($mime);
+
+        $model = $this->getModel();
+        $result = $model->getData();
+
+        $this->assertTrue(is_array($result));
+        $this->assertArrayHasKey($categoryId, $result);
+        $this->assertArrayHasKey('image', $result[$categoryId]);
+
+        $this->assertEquals($expects, $result[$categoryId]['image']);
+    }
+}
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Category/FileInfoTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Category/FileInfoTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..abc07425a079a21741e4b4474bca45d907cb10f7
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Category/FileInfoTest.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Test\Unit\Model\Category;
+
+use Magento\Catalog\Model\Category\FileInfo;
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\File\Mime;
+use Magento\Framework\Filesystem;
+use Magento\Framework\Filesystem\Directory\WriteInterface;
+
+class FileInfoTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Filesystem|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $filesystem;
+
+    /**
+     * @var Mime|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $mime;
+
+    /**
+     * @var WriteInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $mediaDirectory;
+
+    /**
+     * @var FileInfo
+     */
+    private $model;
+
+    protected function setUp()
+    {
+        $this->mediaDirectory = $this->getMockBuilder(WriteInterface::class)
+            ->getMockForAbstractClass();
+
+        $this->filesystem = $this->getMockBuilder(Filesystem::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->filesystem->expects($this->any())
+            ->method('getDirectoryWrite')
+            ->with(DirectoryList::MEDIA)
+            ->willReturn($this->mediaDirectory);
+
+        $this->mime = $this->getMockBuilder(Mime::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->model = new FileInfo(
+            $this->filesystem,
+            $this->mime
+        );
+    }
+
+    public function testGetMimeType()
+    {
+        $mediaPath = '/catalog/category';
+
+        $fileName = '/filename.ext1';
+        $absoluteFilePath = '/absolute_path/catalog/category/filename.ext1';
+
+        $expected = 'ext1';
+
+        $this->mediaDirectory->expects($this->once())
+            ->method('getAbsolutePath')
+            ->with($mediaPath. '/' . ltrim($fileName, '/'))
+            ->willReturn($absoluteFilePath);
+
+        $this->mime->expects($this->once())
+            ->method('getMimeType')
+            ->with($absoluteFilePath)
+            ->willReturn($expected);
+
+        $this->assertEquals($expected, $this->model->getMimeType($fileName));
+    }
+
+    public function testGetStat()
+    {
+        $mediaPath = '/catalog/category';
+
+        $fileName = '/filename.ext1';
+
+        $expected = ['size' => 1];
+
+        $this->mediaDirectory->expects($this->once())
+            ->method('stat')
+            ->with($mediaPath . $fileName)
+            ->willReturn($expected);
+
+        $result = $this->model->getStat($fileName);
+
+        $this->assertTrue(is_array($result));
+        $this->assertArrayHasKey('size', $result);
+        $this->assertEquals(1, $result['size']);
+    }
+
+    public function testIsExist()
+    {
+        $mediaPath = '/catalog/category';
+
+        $fileName = '/filename.ext1';
+
+        $this->mediaDirectory->expects($this->once())
+            ->method('isExist')
+            ->with($mediaPath . $fileName)
+            ->willReturn(true);
+
+        $this->assertTrue($this->model->isExist($fileName));
+    }
+}
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/ImageTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/ImageTest.php
index 44f7f87cc2c62afc2c09d262bbd2721683fcfea3..8ee875dad17b1c8fb09a99449c039825f9e1344c 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/ImageTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/ImageTest.php
@@ -6,12 +6,17 @@
 
 namespace Magento\Catalog\Test\Unit\Model\Product;
 
+use Magento\Catalog\Model\View\Asset\Image\ContextFactory;
+use Magento\Catalog\Model\View\Asset\ImageFactory;
+use Magento\Catalog\Model\View\Asset\PlaceholderFactory;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
 use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\View\Asset\ContextInterface;
 
 /**
  * Class ImageTest
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * @SuppressWarnings(PHPMD.TooManyFields)
  */
 class ImageTest extends \PHPUnit_Framework_TestCase
 {
@@ -75,6 +80,21 @@ class ImageTest extends \PHPUnit_Framework_TestCase
      */
     protected $mediaDirectory;
 
+    /**
+     * @var \Magento\Framework\View\Asset\LocalInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $imageAsset;
+
+    /**
+     * @var ImageFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $viewAssetImageFactory;
+
+    /**
+     * @var PlaceholderFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $viewAssetPlaceholderFactory;
+
     protected function setUp()
     {
         $this->context = $this->getMock(\Magento\Framework\Model\Context::class, [], [], '', false);
@@ -99,7 +119,6 @@ class ImageTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->setMethods(['create', 'isFile', 'isExist', 'getAbsolutePath'])
             ->getMock();
-        $this->mediaDirectory->expects($this->once())->method('create')->will($this->returnValue(true));
 
         $this->filesystem = $this->getMock(\Magento\Framework\Filesystem::class, [], [], '', false);
         $this->filesystem->expects($this->once())->method('getDirectoryWrite')
@@ -110,20 +129,49 @@ class ImageTest extends \PHPUnit_Framework_TestCase
         $this->fileSystem = $this->getMock(\Magento\Framework\View\FileSystem::class, [], [], '', false);
         $this->scopeConfigInterface = $this->getMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
 
+        $context = $this->getMockBuilder(\Magento\Framework\Model\Context::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->image = new \Magento\Catalog\Model\Product\Image(
+            $context,
+            $this->registry,
+            $this->storeManager,
+            $this->config,
+            $this->coreFileHelper,
+            $this->filesystem,
+            $this->factory,
+            $this->repository,
+            $this->fileSystem,
+            $this->scopeConfigInterface
+        );
+        //Settings for backward compatible property
         $objectManagerHelper = new ObjectManagerHelper($this);
-        $this->image = $objectManagerHelper->getObject(
-            \Magento\Catalog\Model\Product\Image::class,
-            [
-                'registry' => $this->registry,
-                'storeManager' => $this->storeManager,
-                'catalogProductMediaConfig' => $this->config,
-                'coreFileStorageDatabase' => $this->coreFileHelper,
-                'filesystem' => $this->filesystem,
-                'imageFactory' => $this->factory,
-                'assetRepo' => $this->repository,
-                'viewFileSystem' => $this->fileSystem,
-                'scopeConfig' => $this->scopeConfigInterface
-            ]
+        $this->imageAsset = $this->getMockBuilder(\Magento\Framework\View\Asset\LocalInterface::class)
+            ->getMockForAbstractClass();
+        $objectManagerHelper->setBackwardCompatibleProperty(
+            $this->image,
+            'imageAsset',
+            $this->imageAsset
+        );
+
+        $this->viewAssetImageFactory = $this->getMockBuilder(ImageFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $objectManagerHelper->setBackwardCompatibleProperty(
+            $this->image,
+            'viewAssetImageFactory',
+            $this->viewAssetImageFactory
+        );
+
+        $this->viewAssetPlaceholderFactory = $this->getMockBuilder(PlaceholderFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $objectManagerHelper->setBackwardCompatibleProperty(
+            $this->image,
+            'viewAssetPlaceholderFactory',
+            $this->viewAssetPlaceholderFactory
         );
     }
 
@@ -177,18 +225,39 @@ class ImageTest extends \PHPUnit_Framework_TestCase
         $absolutePath = dirname(dirname(__DIR__)) . '/_files/catalog/product/somefile.png';
         $this->mediaDirectory->expects($this->any())->method('getAbsolutePath')
             ->will($this->returnValue($absolutePath));
+        $this->viewAssetImageFactory->expects($this->any())
+            ->method('create')
+            ->with(
+                [
+                    'miscParams' => [
+                        'image_type' => null,
+                        'image_height' => null,
+                        'image_width' => null,
+                        'keep_aspect_ratio' => 'proportional',
+                        'keep_frame' => 'frame',
+                        'keep_transparency' => 'transparency',
+                        'constrain_only' => 'doconstrainonly',
+                        'background' => 'ffffff',
+                        'angle' => null,
+                        'quality' => 80,
+                    ],
+                    'filePath' => '/somefile.png',
+                ]
+            )
+            ->willReturn($this->imageAsset);
+        $this->viewAssetPlaceholderFactory->expects($this->never())->method('create');
+
+        $this->imageAsset->expects($this->any())->method('getSourceFile')->willReturn('catalog/product/somefile.png');
         $this->image->setBaseFile('/somefile.png');
         $this->assertEquals('catalog/product/somefile.png', $this->image->getBaseFile());
-        $this->assertEquals(
-            'catalog/product/cache//beff4985b56e3afdbeabfc89641a4582/somefile.png',
-            $this->image->getNewFile()
-        );
     }
 
     public function testSetBaseNoSelectionFile()
     {
-        $this->image->setBaseFile('/no_selection');
-        $this->assertTrue($this->image->getNewFile());
+        $this->viewAssetPlaceholderFactory->expects($this->once())->method('create')->willReturn($this->imageAsset);
+        $this->imageAsset->expects($this->any())->method('getSourceFile')->willReturn('Default Placeholder Path');
+        $this->image->setBaseFile('no_selection');
+        $this->assertEquals('Default Placeholder Path', $this->image->getBaseFile());
     }
 
     public function testSetGetImageProcessor()
@@ -284,45 +353,45 @@ class ImageTest extends \PHPUnit_Framework_TestCase
         )->disableOriginalConstructor()->getMock();
         $this->image->setImageProcessor($imageProcessor);
         $this->coreFileHelper->expects($this->once())->method('saveFile')->will($this->returnValue(true));
-        $absolutePath = dirname(dirname(__DIR__)) . '/_files/catalog/product/somefile.png';
-        $this->mediaDirectory->expects($this->once())->method('getAbsolutePath')
-            ->will($this->returnValue($absolutePath));
 
         $this->image->saveFile();
     }
 
     public function testSaveFileNoSelection()
     {
-        $this->testSetBaseNoSelectionFile();
+        $imageProcessor = $this->getMockBuilder(
+            \Magento\Framework\Image::class
+        )->disableOriginalConstructor()->getMock();
+        $this->image->setImageProcessor($imageProcessor);
         $this->assertSame($this->image, $this->image->saveFile());
     }
 
     public function testGetUrl()
     {
         $this->testSetGetBaseFile();
-        $url = $this->image->getUrl();
-        $this->assertEquals(
-            'http://magento.com/media/catalog/product/cache//beff4985b56e3afdbeabfc89641a4582/somefile.png',
-            $url
-        );
+        $this->imageAsset->expects($this->any())->method('getUrl')->will($this->returnValue('url of exist image'));
+        $this->assertEquals('url of exist image', $this->image->getUrl());
     }
 
     public function testGetUrlNoSelection()
     {
-        $this->testSetBaseNoSelectionFile();
-        $this->repository->expects($this->once())->method('getUrl')->will($this->returnValue('someurl'));
-        $this->assertEquals('someurl', $this->image->getUrl());
+        $this->viewAssetPlaceholderFactory->expects($this->once())->method('create')->willReturn($this->imageAsset);
+        $this->imageAsset->expects($this->any())->method('getUrl')->will($this->returnValue('Default Placeholder URL'));
+        $this->image->setBaseFile('no_selection');
+        $this->assertEquals('Default Placeholder URL', $this->image->getUrl());
     }
 
     public function testSetGetDestinationSubdir()
     {
-        $this->image->setDestinationSubdir('somesubdir');
-        $this->assertEquals('somesubdir', $this->image->getDestinationSubdir());
+        $this->image->setDestinationSubdir('image_type');
+        $this->assertEquals('image_type', $this->image->getDestinationSubdir());
     }
 
     public function testIsCached()
     {
         $this->testSetGetBaseFile();
+        $absolutePath = dirname(dirname(__DIR__)) . '/_files/catalog/product/watermark/somefile.png';
+        $this->imageAsset->expects($this->any())->method('getPath')->willReturn($absolutePath);
         $this->assertTrue($this->image->isCached());
     }
 
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/StatusBaseSelectProcessorTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/StatusBaseSelectProcessorTest.php
index 0909f754a01c2c937e8c3692c52b1a256a27b0c3..1fada997913b620de06ddedcbffb3fdcdea92620 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/StatusBaseSelectProcessorTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/StatusBaseSelectProcessorTest.php
@@ -16,7 +16,12 @@ use Magento\Framework\DB\Select;
 use Magento\Framework\EntityManager\EntityMetadataInterface;
 use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Store\Api\StoreResolverInterface;
+use Magento\Store\Model\Store;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class StatusBaseSelectProcessorTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -29,6 +34,11 @@ class StatusBaseSelectProcessorTest extends \PHPUnit_Framework_TestCase
      */
     private $metadataPool;
 
+    /**
+     * @var StoreResolverInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeResolver;
+
     /**
      * @var Select|\PHPUnit_Framework_MockObject_MockObject
      */
@@ -43,11 +53,13 @@ class StatusBaseSelectProcessorTest extends \PHPUnit_Framework_TestCase
     {
         $this->eavConfig = $this->getMockBuilder(Config::class)->disableOriginalConstructor()->getMock();
         $this->metadataPool = $this->getMockBuilder(MetadataPool::class)->disableOriginalConstructor()->getMock();
+        $this->storeResolver = $this->getMockBuilder(StoreResolverInterface::class)->getMock();
         $this->select = $this->getMockBuilder(Select::class)->disableOriginalConstructor()->getMock();
 
         $this->statusBaseSelectProcessor =  (new ObjectManager($this))->getObject(StatusBaseSelectProcessor::class, [
             'eavConfig' => $this->eavConfig,
             'metadataPool' => $this->metadataPool,
+            'storeResolver' => $this->storeResolver,
         ]);
     }
 
@@ -55,7 +67,8 @@ class StatusBaseSelectProcessorTest extends \PHPUnit_Framework_TestCase
     {
         $linkField = 'link_field';
         $backendTable = 'backend_table';
-        $attributeId = 'attribute_id';
+        $attributeId = 2;
+        $currentStoreId = 1;
 
         $metadata = $this->getMock(EntityMetadataInterface::class);
         $metadata->expects($this->once())
@@ -66,13 +79,14 @@ class StatusBaseSelectProcessorTest extends \PHPUnit_Framework_TestCase
             ->with(ProductInterface::class)
             ->willReturn($metadata);
 
+        /** @var AttributeInterface|\PHPUnit_Framework_MockObject_MockObject $statusAttribute */
         $statusAttribute = $this->getMockBuilder(AttributeInterface::class)
             ->setMethods(['getBackendTable', 'getAttributeId'])
             ->getMock();
-        $statusAttribute->expects($this->once())
+        $statusAttribute->expects($this->atLeastOnce())
             ->method('getBackendTable')
             ->willReturn($backendTable);
-        $statusAttribute->expects($this->once())
+        $statusAttribute->expects($this->atLeastOnce())
             ->method('getAttributeId')
             ->willReturn($attributeId);
         $this->eavConfig->expects($this->once())
@@ -80,21 +94,34 @@ class StatusBaseSelectProcessorTest extends \PHPUnit_Framework_TestCase
             ->with(Product::ENTITY, ProductInterface::STATUS)
             ->willReturn($statusAttribute);
 
-        $this->select->expects($this->once())
-            ->method('join')
+        $this->storeResolver->expects($this->once())
+            ->method('getCurrentStoreId')
+            ->willReturn($currentStoreId);
+
+        $this->select->expects($this->at(0))
+            ->method('joinLeft')
             ->with(
-                ['status_attr' => $backendTable],
-                sprintf('status_attr.%s = %s.%1$s', $linkField, BaseSelectProcessorInterface::PRODUCT_TABLE_ALIAS),
+                ['status_global_attr' => $backendTable],
+                "status_global_attr.{$linkField} = "
+                . BaseSelectProcessorInterface::PRODUCT_TABLE_ALIAS . ".{$linkField}"
+                . " AND status_global_attr.attribute_id = {$attributeId}"
+                . ' AND status_global_attr.store_id = ' . Store::DEFAULT_STORE_ID,
                 []
             )
             ->willReturnSelf();
         $this->select->expects($this->at(1))
-            ->method('where')
-            ->with('status_attr.attribute_id = ?', $attributeId)
+            ->method('joinLeft')
+            ->with(
+                ['status_attr' => $backendTable],
+                "status_attr.{$linkField} = " . BaseSelectProcessorInterface::PRODUCT_TABLE_ALIAS . ".{$linkField}"
+                . " AND status_attr.attribute_id = {$attributeId}"
+                . " AND status_attr.store_id = {$currentStoreId}",
+                []
+            )
             ->willReturnSelf();
         $this->select->expects($this->at(2))
             ->method('where')
-            ->with('status_attr.value = ?', Status::STATUS_ENABLED)
+            ->with('IFNULL(status_attr.value, status_global_attr.value) = ?', Status::STATUS_ENABLED)
             ->willReturnSelf();
 
         $this->assertEquals($this->select, $this->statusBaseSelectProcessor->process($this->select));
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/View/Asset/Image/ContextTest.php b/app/code/Magento/Catalog/Test/Unit/Model/View/Asset/Image/ContextTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cdc1296486eef202a6410b6a3fd3a1d738ca60f9
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Unit/Model/View/Asset/Image/ContextTest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Test\Unit\Model\View\Asset\Image;
+
+use Magento\Catalog\Model\Product\Media\ConfigInterface;
+use Magento\Catalog\Model\View\Asset\Image\Context;
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\Filesystem;
+use Magento\Framework\Filesystem\Directory\WriteInterface;
+
+/**
+ * Class ContextTest
+ */
+class ContextTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Context
+     */
+    protected $model;
+
+    /**
+     * @var WriteInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $mediaDirectory;
+
+    /**
+     * @var ContextInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $mediaConfig;
+
+    /**
+     * @var Filesystem|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $filesystem;
+
+    protected function setUp()
+    {
+        $this->mediaConfig = $this->getMockBuilder(ConfigInterface::class)->getMockForAbstractClass();
+        $this->mediaConfig->expects($this->any())->method('getBaseMediaPath')->willReturn('catalog/product');
+        $this->mediaDirectory = $this->getMockBuilder(WriteInterface::class)->getMockForAbstractClass();
+        $this->mediaDirectory->expects($this->once())->method('create')->with('catalog/product');
+        $this->filesystem = $this->getMockBuilder(Filesystem::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->filesystem->expects($this->once())
+            ->method('getDirectoryWrite')
+            ->with(DirectoryList::MEDIA)
+            ->willReturn($this->mediaDirectory);
+        $this->model = new Context(
+            $this->mediaConfig,
+            $this->filesystem
+        );
+    }
+
+    public function testGetPath()
+    {
+        $path = '/var/www/html/magento2ce/pub/media/catalog/product';
+        $this->mediaDirectory->expects($this->once())
+            ->method('getAbsolutePath')
+            ->with('catalog/product')
+            ->willReturn($path);
+
+        $this->assertEquals($path, $this->model->getPath());
+    }
+
+    public function testGetUrl()
+    {
+        $baseUrl = 'http://localhost/pub/media/catalog/product';
+        $this->mediaConfig->expects($this->once())->method('getBaseMediaUrl')->willReturn($baseUrl);
+
+        $this->assertEquals($baseUrl, $this->model->getBaseUrl());
+    }
+}
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/View/Asset/ImageTest.php b/app/code/Magento/Catalog/Test/Unit/Model/View/Asset/ImageTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5e96cdb1c3395182049e78ae29cd3b44bd0baf17
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Unit/Model/View/Asset/ImageTest.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Test\Unit\Model\View\Asset;
+
+use Magento\Catalog\Model\Product\Media\ConfigInterface;
+use Magento\Catalog\Model\View\Asset\Image;
+use Magento\Framework\Encryption\EncryptorInterface;
+use Magento\Framework\View\Asset\ContextInterface;
+
+/**
+ * Class ImageTest
+ */
+class ImageTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\View\Asset\Image
+     */
+    protected $model;
+
+    /**
+     * @var ContextInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $mediaConfig;
+
+    /**
+     * @var EncryptorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $encryptor;
+
+    /**
+     * @var ContextInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $imageContext;
+
+    protected function setUp()
+    {
+        $this->mediaConfig = $this->getMockBuilder(ConfigInterface::class)->getMockForAbstractClass();
+        $this->encryptor = $this->getMockBuilder(EncryptorInterface::class)->getMockForAbstractClass();
+        $this->imageContext = $this->getMockBuilder(ContextInterface::class)->getMockForAbstractClass();
+        $this->model = new Image(
+            $this->mediaConfig,
+            $this->imageContext,
+            $this->encryptor,
+            '/somefile.png'
+        );
+    }
+
+    public function testModuleAndContentAndContentType()
+    {
+        $contentType = 'image';
+        $this->assertEquals($contentType, $this->model->getContentType());
+        $this->assertEquals($contentType, $this->model->getSourceContentType());
+        $this->assertNull($this->model->getContent());
+        $this->assertEquals('cache', $this->model->getModule());
+    }
+
+    public function testGetFilePath()
+    {
+        $this->assertEquals('/somefile.png', $this->model->getFilePath());
+    }
+
+    public function testGetSoureFile()
+    {
+        $this->mediaConfig->expects($this->once())->method('getBaseMediaPath')->willReturn('catalog/product');
+        $this->assertEquals('catalog/product/somefile.png', $this->model->getSourceFile());
+    }
+
+    public function testGetContext()
+    {
+        $this->assertInstanceOf(ContextInterface::class, $this->model->getContext());
+    }
+
+    /**
+     * @param string $filePath
+     * @param array $miscParams
+     * @dataProvider getPathDataProvider
+     */
+    public function testGetPath($filePath, $miscParams)
+    {
+        $imageModel = new Image(
+            $this->mediaConfig,
+            $this->imageContext,
+            $this->encryptor,
+            $filePath,
+            $miscParams
+        );
+        $absolutePath = '/var/www/html/magento2ce/pub/media/catalog/product';
+        $hashPath = md5(implode('_', $miscParams));
+        $this->imageContext->expects($this->once())->method('getPath')->willReturn($absolutePath);
+        $this->encryptor->expects($this->once())->method('hash')->willReturn($hashPath);
+        $this->assertEquals(
+            $absolutePath . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . $hashPath . $filePath,
+            $imageModel->getPath()
+        );
+    }
+
+    /**
+     * @param string $filePath
+     * @param array $miscParams
+     * @dataProvider getPathDataProvider
+     */
+    public function testGetUrl($filePath, $miscParams)
+    {
+        $imageModel = new Image(
+            $this->mediaConfig,
+            $this->imageContext,
+            $this->encryptor,
+            $filePath,
+            $miscParams
+        );
+        $absolutePath = 'http://localhost/pub/media/catalog/product';
+        $hashPath = md5(implode('_', $miscParams));
+        $this->imageContext->expects($this->once())->method('getBaseUrl')->willReturn($absolutePath);
+        $this->encryptor->expects($this->once())->method('hash')->willReturn($hashPath);
+        $this->assertEquals(
+            $absolutePath . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . $hashPath . $filePath,
+            $imageModel->getUrl()
+        );
+    }
+
+    public function getPathDataProvider()
+    {
+        return [
+            [
+                '/some_file.png',
+                [], //default value for miscParams
+            ],
+            [
+                '/some_file_2.png',
+                [
+                    'image_type' => 'thumbnail',
+                    'image_height' => 75,
+                    'image_width' => 75,
+                    'keep_aspect_ratio' => 'proportional',
+                    'keep_frame' => 'frame',
+                    'keep_transparency' => 'transparency',
+                    'constrain_only' => 'doconstrainonly',
+                    'background' => 'ffffff',
+                    'angle' => null,
+                    'quality' => 80,
+                ],
+            ]
+        ];
+    }
+}
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/View/Asset/PlaceholderTest.php b/app/code/Magento/Catalog/Test/Unit/Model/View/Asset/PlaceholderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..38d5ceb16e6b5b17e8e7cbaa1171513d68027e3c
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Unit/Model/View/Asset/PlaceholderTest.php
@@ -0,0 +1,163 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Test\Unit\Model\View\Asset;
+
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Catalog\Model\View\Asset\Placeholder;
+use Magento\Framework\View\Asset\ContextInterface;
+use Magento\Framework\View\Asset\Repository;
+
+/**
+ * Class PlaceholderTest
+ */
+class PlaceholderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\View\Asset\Placeholder
+     */
+    protected $model;
+
+    /**
+     * @var ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfig;
+
+    /**
+     * @var Repository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $repository;
+
+    /**
+     * @var ContextInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $imageContext;
+
+    protected function setUp()
+    {
+        $this->scopeConfig = $this->getMockBuilder(ScopeConfigInterface::class)->getMockForAbstractClass();
+        $this->imageContext = $this->getMockBuilder(ContextInterface::class)->getMockForAbstractClass();
+        $this->repository = $this->getMockBuilder(Repository::class)->disableOriginalConstructor()->getMock();
+        $this->model = new Placeholder(
+            $this->imageContext,
+            $this->scopeConfig,
+            $this->repository,
+            'thumbnail'
+        );
+    }
+
+    public function testModuleAndContentAndContentType()
+    {
+        $contentType = 'image';
+        $this->assertEquals($contentType, $this->model->getContentType());
+        $this->assertEquals($contentType, $this->model->getSourceContentType());
+        $this->assertNull($this->model->getContent());
+        $this->assertEquals('placeholder', $this->model->getModule());
+    }
+
+    public function testGetFilePath()
+    {
+        $this->assertNull($this->model->getFilePath());
+        $this->scopeConfig->expects($this->once())->method('getValue')->willReturn('default/thumbnail.jpg');
+        $this->assertEquals('default/thumbnail.jpg', $this->model->getFilePath());
+    }
+
+    public function testGetContext()
+    {
+        $this->assertInstanceOf(ContextInterface::class, $this->model->getContext());
+    }
+
+    /**
+     * @param string $imageType
+     * @param string $placeholderPath
+     * @dataProvider getPathDataProvider
+     */
+    public function testGetPathAndGetSourceFile($imageType, $placeholderPath)
+    {
+        $imageModel = new Placeholder(
+            $this->imageContext,
+            $this->scopeConfig,
+            $this->repository,
+            $imageType
+        );
+        $absolutePath = '/var/www/html/magento2ce/pub/media/catalog/product';
+
+        $this->scopeConfig->expects($this->any())
+            ->method('getValue')
+            ->with(
+                "catalog/placeholder/{$imageType}_placeholder",
+                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+                null
+            )->willReturn($placeholderPath);
+
+        if ($placeholderPath == null) {
+            $this->imageContext->expects($this->never())->method('getPath');
+            $assetMock = $this->getMockBuilder(\Magento\Framework\View\Asset\MergeableInterface::class)
+                ->getMockForAbstractClass();
+            $expectedResult = 'path/to_default/placeholder/by_type';
+            $assetMock->expects($this->any())->method('getSourceFile')->willReturn($expectedResult);
+            $this->repository->expects($this->any())->method('createAsset')->willReturn($assetMock);
+        } else {
+            $this->imageContext->expects($this->any())->method('getPath')->willReturn($absolutePath);
+            $expectedResult = $absolutePath
+                . DIRECTORY_SEPARATOR . $imageModel->getModule()
+                . DIRECTORY_SEPARATOR . $placeholderPath;
+        }
+
+        $this->assertEquals($expectedResult, $imageModel->getPath());
+        $this->assertEquals($expectedResult, $imageModel->getSourceFile());
+    }
+
+    /**
+     * @param string $imageType
+     * @param string $placeholderPath
+     * @dataProvider getPathDataProvider
+     */
+    public function testGetUrl($imageType, $placeholderPath)
+    {
+        $imageModel = new Placeholder(
+            $this->imageContext,
+            $this->scopeConfig,
+            $this->repository,
+            $imageType
+        );
+
+        $this->scopeConfig->expects($this->any())
+            ->method('getValue')
+            ->with(
+                "catalog/placeholder/{$imageType}_placeholder",
+                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+                null
+            )->willReturn($placeholderPath);
+
+        if ($placeholderPath == null) {
+            $this->imageContext->expects($this->never())->method('getBaseUrl');
+            $expectedResult = 'http://localhost/pub/media/catalog/product/to_default/placeholder/by_type';
+            $this->repository->expects($this->any())->method('getUrl')->willReturn($expectedResult);
+        } else {
+            $baseUrl = 'http://localhost/pub/media/catalog/product';
+            $this->imageContext->expects($this->any())->method('getBaseUrl')->willReturn($baseUrl);
+            $expectedResult = $baseUrl
+                . DIRECTORY_SEPARATOR . $imageModel->getModule()
+                . DIRECTORY_SEPARATOR . $placeholderPath;
+        }
+
+        $this->assertEquals($expectedResult, $imageModel->getUrl());
+    }
+
+    public function getPathDataProvider()
+    {
+        return [
+            [
+                'thumbnail',
+                'default/thumbnail.jpg',
+            ],
+            [
+                'non_exist',
+                null,
+            ],
+        ];
+    }
+}
diff --git a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/TierPrice.php b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/TierPrice.php
index ac511edcf2e5338eba6b83c60cf38a749406cf89..9b382464e8e2392fb07d81c070bae66cce7c203f 100644
--- a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/TierPrice.php
+++ b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/TierPrice.php
@@ -109,6 +109,7 @@ class TierPrice extends AbstractModifier
                             'label' => __('Price'),
                             'enableLabel' => true,
                             'dataScope' => '',
+                            'additionalClasses' => 'control-grouped',
                             'sortOrder' => isset($priceMeta['arguments']['data']['config']['sortOrder'])
                                 ? $priceMeta['arguments']['data']['config']['sortOrder'] : 40,
                         ],
diff --git a/app/code/Magento/Catalog/etc/di.xml b/app/code/Magento/Catalog/etc/di.xml
index 047c3f2fc7cabb19974f7d20fdc77952f06ebcd6..27b9a19065e99f22fccf4f2f42076c69d0f1e0c2 100644
--- a/app/code/Magento/Catalog/etc/di.xml
+++ b/app/code/Magento/Catalog/etc/di.xml
@@ -49,6 +49,8 @@
     <preference for="Magento\Catalog\Model\Config\Source\ProductPriceOptionsInterface" type="Magento\Catalog\Model\Config\Source\Product\Options\Price"/>
     <preference for="Magento\Catalog\Model\Indexer\Product\Flat\Table\BuilderInterface" type="Magento\Catalog\Model\Indexer\Product\Flat\Table\Builder"/>
     <preference for="Magento\Catalog\Model\Product\Pricing\Renderer\SalableResolverInterface" type="Magento\Catalog\Model\Product\Pricing\Renderer\SalableResolver"/>
+    <preference for="Magento\Catalog\Model\Product\Media\ConfigInterface" type="Magento\Catalog\Model\Product\Media\Config"/>
+    <preference for="Magento\Framework\View\Asset\ContextInterface" type="Magento\Catalog\Model\View\Asset\Image\Context"/>
     <type name="Magento\Customer\Model\ResourceModel\Visitor">
         <plugin name="catalogLog" type="Magento\Catalog\Model\Plugin\Log" />
     </type>
diff --git a/app/code/Magento/Catalog/view/adminhtml/web/template/image-preview.html b/app/code/Magento/Catalog/view/adminhtml/web/template/image-preview.html
index fa8a4fec7cc78c6211194558421400c49660914a..3bc6e0a359c5ea710fdb7605a931464d7c26af17 100644
--- a/app/code/Magento/Catalog/view/adminhtml/web/template/image-preview.html
+++ b/app/code/Magento/Catalog/view/adminhtml/web/template/image-preview.html
@@ -31,5 +31,6 @@
     <div class="file-uploader-filename" text="$file.name"/>
     <div class="file-uploader-meta">
         <text args="$file.previewWidth"/>x<text args="$file.previewHeight"/>
+        <text args="$parent.formatSize($file.size)"/>
     </div>
 </div>
diff --git a/app/code/Magento/CatalogInventory/Setup/InstallSchema.php b/app/code/Magento/CatalogInventory/Setup/InstallSchema.php
index a19eb9d1cc57344e6f2fcce5f94b81be113cc84f..cbe1aa3d066651a7d90f75b655da1ef79c95cf49 100644
--- a/app/code/Magento/CatalogInventory/Setup/InstallSchema.php
+++ b/app/code/Magento/CatalogInventory/Setup/InstallSchema.php
@@ -254,10 +254,10 @@ class InstallSchema implements InstallSchemaInterface
             ->addIndex(
                 $installer->getIdxName(
                     'cataloginventory_stock_item',
-                    ['product_id', 'website_id'],
+                    ['product_id', 'stock_id'],
                     \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
                 ),
-                ['product_id', 'website_id'],
+                ['product_id', 'stock_id'],
                 ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
             )
             ->addIndex(
diff --git a/app/code/Magento/CatalogInventory/Setup/UpgradeSchema.php b/app/code/Magento/CatalogInventory/Setup/UpgradeSchema.php
new file mode 100644
index 0000000000000000000000000000000000000000..8fd3d264ee67d6a5bef74cebb829f82b9a324e92
--- /dev/null
+++ b/app/code/Magento/CatalogInventory/Setup/UpgradeSchema.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogInventory\Setup;
+
+use Magento\Framework\Setup\UpgradeSchemaInterface;
+use Magento\Framework\Setup\ModuleContextInterface;
+use Magento\Framework\Setup\SchemaSetupInterface;
+use Magento\CatalogInventory\Model\Stock\Item as StockItem;
+
+class UpgradeSchema implements UpgradeSchemaInterface
+{
+    /**
+     * @var string
+     */
+    private $productCompositeKeyVersion = '2.2.0';
+
+    /**
+     * {@inheritdoc}
+     */
+    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
+    {
+        $setup->startSetup();
+
+        if (version_compare($context->getVersion(), $this->productCompositeKeyVersion, '<')) {
+            $this->upgradeProductCompositeKey($setup);
+        }
+
+        $setup->endSetup();
+    }
+
+    /**
+     * @param SchemaSetupInterface $setup
+     * @return void
+     */
+    private function upgradeProductCompositeKey(SchemaSetupInterface $setup)
+    {
+        $oldCompositeKeyColumns = ['product_id', 'website_id'];
+        $newCompositeKeyColumns = ['product_id', 'stock_id'];
+
+        $foreignKeys = $this->getForeignKeys($setup, $oldCompositeKeyColumns);
+        // drop foreign keys
+        $this->dropForeignKeys($setup, $foreignKeys);
+
+        $oldIndexName = $setup->getIdxName(
+            $setup->getTable(StockItem::ENTITY),
+            $oldCompositeKeyColumns,
+            \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
+        );
+
+        $newIndexName = $setup->getIdxName(
+            $setup->getTable(StockItem::ENTITY),
+            $newCompositeKeyColumns,
+            \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
+        );
+
+        // Drop a key based on the following columns: "product_id","website_id"
+        $setup->getConnection()->dropIndex($setup->getTable(StockItem::ENTITY), $oldIndexName);
+
+        // Create a key based on the following columns: "product_id","stock_id"
+        $setup->getConnection()
+            ->addIndex(
+                $setup->getTable(StockItem::ENTITY),
+                $newIndexName,
+                $newCompositeKeyColumns,
+                \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
+            );
+        // restore deleted foreign keys
+        $this->createForeignKeys($setup, $foreignKeys);
+    }
+
+    /**
+     * @param SchemaSetupInterface $setup
+     * @param array                $keys
+     * @return void
+     */
+    private function dropForeignKeys(SchemaSetupInterface $setup, array $keys)
+    {
+        foreach ($keys as $key) {
+            $setup->getConnection()->dropForeignKey($key['TABLE_NAME'], $key['FK_NAME']);
+        }
+    }
+
+    /**
+     * @param SchemaSetupInterface $setup
+     * @param array                $keys
+     * @return void
+     */
+    private function createForeignKeys(SchemaSetupInterface $setup, array $keys)
+    {
+        foreach ($keys as $key) {
+            $setup->getConnection()->addForeignKey(
+                $key['FK_NAME'],
+                $key['TABLE_NAME'],
+                $key['COLUMN_NAME'],
+                $key['REF_TABLE_NAME'],
+                $key['REF_COLUMN_NAME'],
+                $key['ON_DELETE']
+            );
+        }
+    }
+
+    /**
+     * @param SchemaSetupInterface $setup
+     * @param array                $compositeKeys
+     * @return array
+     */
+    private function getForeignKeys(SchemaSetupInterface $setup, array $compositeKeys)
+    {
+        $foreignKeys = [];
+        $allForeignKeys = $setup->getConnection()->getForeignKeys($setup->getTable(StockItem::ENTITY));
+        foreach ($allForeignKeys as $key) {
+            if (in_array($key['COLUMN_NAME'], $compositeKeys)) {
+                $foreignKeys[] = $key;
+            }
+        }
+
+        return $foreignKeys;
+    }
+}
diff --git a/app/code/Magento/Checkout/Block/Checkout/AttributeMerger.php b/app/code/Magento/Checkout/Block/Checkout/AttributeMerger.php
index e7686e4bea58b3a5f4db81e1b11f2e17770744c8..bbb2c69cc39027ee962a64917c46131d65f7a278 100644
--- a/app/code/Magento/Checkout/Block/Checkout/AttributeMerger.php
+++ b/app/code/Magento/Checkout/Block/Checkout/AttributeMerger.php
@@ -23,6 +23,8 @@ class AttributeMerger
         'textarea'    => 'Magento_Ui/js/form/element/textarea',
         'multiline'   => 'Magento_Ui/js/form/components/group',
         'multiselect' => 'Magento_Ui/js/form/element/multiselect',
+        'image' => 'Magento_Ui/js/form/element/media',
+        'file' => 'Magento_Ui/js/form/element/media',
     ];
 
     /**
@@ -32,6 +34,7 @@ class AttributeMerger
      */
     protected $templateMap = [
         'image' => 'media',
+        'file' => 'media',
     ];
 
     /**
diff --git a/app/code/Magento/Checkout/etc/di.xml b/app/code/Magento/Checkout/etc/di.xml
index a2243b33a04edc0af4dc71ed79b802eac68f4cc2..81a430d52c49933cf70013f8856a96f5b6c26377 100644
--- a/app/code/Magento/Checkout/etc/di.xml
+++ b/app/code/Magento/Checkout/etc/di.xml
@@ -42,4 +42,11 @@
             </argument>
         </arguments>
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="checkout/payment_failed/copy_to" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Checkout/view/frontend/web/template/billing-address/details.html b/app/code/Magento/Checkout/view/frontend/web/template/billing-address/details.html
index da625c51d4b7734ccc4808fd9161502e15acf1a9..798be1f978f54e3cd7e4c51bfb0e3e20e8ae82e2 100644
--- a/app/code/Magento/Checkout/view/frontend/web/template/billing-address/details.html
+++ b/app/code/Magento/Checkout/view/frontend/web/template/billing-address/details.html
@@ -15,7 +15,12 @@
     <!-- /ko --><br/>
     <!-- ko foreach: { data: currentBillingAddress().customAttributes, as: 'element' } -->
         <!-- ko foreach: { data: Object.keys(element), as: 'attribute' } -->
-            <!-- ko text: element[attribute].value --><!-- /ko -->
+            <!-- ko if: (typeof element[attribute] === "object") -->
+                <!-- ko text: element[attribute].value --><!-- /ko -->
+            <!-- /ko -->
+            <!-- ko if: (typeof element[attribute] === "string") -->
+                <!-- ko text: element[attribute] --><!-- /ko -->
+            <!-- /ko --><br/>
         <!-- /ko -->
     <!-- /ko -->
     <button type="button"
diff --git a/app/code/Magento/Checkout/view/frontend/web/template/shipping-address/address-renderer/default.html b/app/code/Magento/Checkout/view/frontend/web/template/shipping-address/address-renderer/default.html
index a2b83ead6b354451b99a4a1003a0f04df905dbbc..92469fdec3d7fcc8660d7d5a385cfa9c28c18252 100644
--- a/app/code/Magento/Checkout/view/frontend/web/template/shipping-address/address-renderer/default.html
+++ b/app/code/Magento/Checkout/view/frontend/web/template/shipping-address/address-renderer/default.html
@@ -15,7 +15,12 @@
     <!-- /ko --><br/>
     <!-- ko foreach: { data: address().customAttributes, as: 'element' } -->
         <!-- ko foreach: { data: Object.keys(element), as: 'attribute' } -->
-            <!-- ko text: element[attribute].value --><!-- /ko -->
+            <!-- ko if: (typeof element[attribute] === "object") -->
+                <!-- ko text: element[attribute].value --><!-- /ko -->
+            <!-- /ko -->
+            <!-- ko if: (typeof element[attribute] === "string") -->
+                <!-- ko text: element[attribute] --><!-- /ko -->
+            <!-- /ko --><br/>
         <!-- /ko -->
     <!-- /ko -->
     <!-- ko if: (address().isEditable()) -->
diff --git a/app/code/Magento/Checkout/view/frontend/web/template/shipping-information/address-renderer/default.html b/app/code/Magento/Checkout/view/frontend/web/template/shipping-information/address-renderer/default.html
index 440a2c7fc468fc493d10eb0cb57320c5593e1bf8..36ea556ae9ec95f09496094771a1340305ffdd43 100644
--- a/app/code/Magento/Checkout/view/frontend/web/template/shipping-information/address-renderer/default.html
+++ b/app/code/Magento/Checkout/view/frontend/web/template/shipping-information/address-renderer/default.html
@@ -15,7 +15,12 @@
     <!-- /ko --><br/>
     <!-- ko foreach: { data: address().customAttributes, as: 'element' } -->
         <!-- ko foreach: { data: Object.keys(element), as: 'attribute' } -->
-            <!-- ko text: element[attribute].value --><!-- /ko -->
+            <!-- ko if: (typeof element[attribute] === "object") -->
+                <!-- ko text: element[attribute].value --><!-- /ko -->
+            <!-- /ko -->
+            <!-- ko if: (typeof element[attribute] === "string") -->
+                <!-- ko text: element[attribute] --><!-- /ko -->
+            <!-- /ko --><br/>
         <!-- /ko -->
     <!-- /ko -->
 <!-- /ko -->
diff --git a/app/code/Magento/Checkout/view/frontend/web/template/summary/cart-items.html b/app/code/Magento/Checkout/view/frontend/web/template/summary/cart-items.html
index ed7ad193a12fde35dd2226afdf11f1233887afd8..498a9f852d06be2cc5787091aca7b641b7a45e8a 100644
--- a/app/code/Magento/Checkout/view/frontend/web/template/summary/cart-items.html
+++ b/app/code/Magento/Checkout/view/frontend/web/template/summary/cart-items.html
@@ -4,8 +4,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<!-- ko ifnot: isItemsBlockExpanded() -->
-<div class="block items-in-cart" data-bind="mageInit: {'collapsible':{'openedState': 'active'}}">
+<div class="block items-in-cart" data-bind="mageInit: {'collapsible':{'openedState': 'active', 'active': isItemsBlockExpanded()}}">
     <div class="title" data-role="title">
         <strong role="heading"><span data-bind="text: getItemsQty()"></span>
             <!-- ko if: getItemsQty() == 1 -->
@@ -32,33 +31,3 @@
         </div>
     </div>
 </div>
-<!-- /ko -->
-<!-- ko if: isItemsBlockExpanded() -->
-<div class="block items-in-cart" data-bind="mageInit: {'collapsible':{'openedState': 'active', 'active': true}}">
-    <div class="title" data-role="title">
-        <strong role="heading"><span data-bind="text: getItemsQty()"></span>
-            <!-- ko if: getItemsQty() == 1 -->
-            <!-- ko i18n: 'Item in Cart' --><!-- /ko -->
-            <!-- /ko -->
-            <!-- ko if: getItemsQty() > 1 -->
-            <!-- ko i18n: 'Items in Cart' --><!-- /ko -->
-            <!-- /ko -->
-        </strong>
-    </div>
-    <div class="content minicart-items" data-role="content">
-        <div class="minicart-items-wrapper overflowed">
-            <ol class="minicart-items">
-                <!-- ko foreach: getItems() -->
-                <li class="product-item">
-                    <div class="product">
-                        <!-- ko foreach: $parent.elems() -->
-                        <!-- ko template: getTemplate() --><!-- /ko -->
-                        <!-- /ko -->
-                    </div>
-                </li>
-                <!-- /ko -->
-            </ol>
-        </div>
-    </div>
-</div>
-<!-- /ko -->
diff --git a/app/code/Magento/Config/App/Config/Source/DumpConfigSourceAggregated.php b/app/code/Magento/Config/App/Config/Source/DumpConfigSourceAggregated.php
new file mode 100644
index 0000000000000000000000000000000000000000..80567d0504ee9c31d8cadef957c1d12dad9f1508
--- /dev/null
+++ b/app/code/Magento/Config/App/Config/Source/DumpConfigSourceAggregated.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\App\Config\Source;
+
+use Magento\Config\Model\Config\Export\ExcludeList;
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+
+/**
+ * Class DumpConfigSourceAggregated aggregates configurations from all available sources
+ */
+class DumpConfigSourceAggregated implements DumpConfigSourceInterface
+{
+    /**
+     * @var ExcludeList
+     */
+    private $excludeList;
+
+    /**
+     * @var ConfigSourceInterface[]
+     */
+    private $sources;
+
+    /**
+     * @var array
+     */
+    private $excludedFields;
+
+    /**
+     * @var array
+     */
+    private $data;
+
+    /**
+     * @param ExcludeList $excludeList
+     * @param array $sources
+     */
+    public function __construct(ExcludeList $excludeList, array $sources = [])
+    {
+        $this->excludeList = $excludeList;
+        $this->sources = $sources;
+    }
+
+    /**
+     * Retrieve aggregated configuration from all available sources.
+     *
+     * @param string $path
+     * @return array
+     */
+    public function get($path = '')
+    {
+        $path = (string)$path;
+        $data = [];
+
+        if (isset($this->data[$path])) {
+            return $this->data[$path];
+        }
+
+        $this->sortSources();
+
+        foreach ($this->sources as $sourceConfig) {
+            /** @var ConfigSourceInterface $source */
+            $source = $sourceConfig['source'];
+            $data = array_replace_recursive($data, $source->get($path));
+        }
+
+        $this->excludedFields = [];
+        $this->filterChain($path, $data);
+
+        return $this->data[$path] = $data;
+    }
+
+    /**
+     * Recursive filtering of sensitive data
+     *
+     * @param string $path
+     * @param array $data
+     * @return void
+     */
+    private function filterChain($path, &$data)
+    {
+        foreach ($data as $subKey => &$subData) {
+            $newPath = $path ? $path . '/' . $subKey : $subKey;
+            $filteredPath = $this->filterPath($newPath);
+
+            if (
+                $filteredPath
+                && !is_array($data[$subKey])
+                && $this->excludeList->isPresent($filteredPath)
+            ) {
+                $this->excludedFields[$newPath] = $filteredPath;
+
+                unset($data[$subKey]);
+            } elseif (is_array($subData)) {
+                $this->filterChain($newPath, $subData);
+            }
+        }
+    }
+
+    /**
+     * Eliminating scope info from path
+     *
+     * @param string $path
+     * @return null|string
+     */
+    private function filterPath($path)
+    {
+        $parts = explode('/', $path);
+
+        // Check if there are enough parts to recognize scope
+        if (count($parts) < 3) {
+            return null;
+        }
+
+        if ($parts[0] === ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
+            unset($parts[0]);
+        } else {
+            unset($parts[0], $parts[1]);
+        }
+
+        return implode('/', $parts);
+    }
+
+    /**
+     * Sort sources ASC from higher priority to lower
+     *
+     * @return void
+     */
+    private function sortSources()
+    {
+        uasort($this->sources, function ($firstItem, $secondItem) {
+            return $firstItem['sortOrder'] > $secondItem['sortOrder'];
+        });
+    }
+
+    /**
+     * Retrieves list of field paths were excluded from config dump
+     * @return array
+     */
+    public function getExcludedFields()
+    {
+        $this->get();
+
+        $fields = array_values($this->excludedFields);
+        $fields = array_unique($fields);
+
+        return $fields;
+    }
+}
diff --git a/app/code/Magento/Config/App/Config/Source/DumpConfigSourceInterface.php b/app/code/Magento/Config/App/Config/Source/DumpConfigSourceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf0ce492b7d5265a5445a3fbe3f4e6d68ec384a4
--- /dev/null
+++ b/app/code/Magento/Config/App/Config/Source/DumpConfigSourceInterface.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\App\Config\Source;
+
+use Magento\Framework\App\Config\ConfigSourceInterface;
+
+/**
+ * Interface DumpConfigSourceInterface
+ */
+interface DumpConfigSourceInterface extends ConfigSourceInterface
+{
+    /**
+     * Retrieves list of field paths were excluded from config dump
+     *
+     * @return array
+     */
+    public function getExcludedFields();
+}
diff --git a/app/code/Magento/Config/App/Config/Type/System.php b/app/code/Magento/Config/App/Config/Type/System.php
index 4a3c6da8379153a240e4869592fcef31788df608..a0fc0f1f10ebdfbbcd78695ee223e48efdd21b7a 100644
--- a/app/code/Magento/Config/App/Config/Type/System.php
+++ b/app/code/Magento/Config/App/Config/Type/System.php
@@ -6,18 +6,10 @@
 namespace Magento\Config\App\Config\Type;
 
 use Magento\Framework\App\Config\ConfigTypeInterface;
-use Magento\Framework\App\Config\ConfigSourceInterface;
-use Magento\Framework\App\Config\Spi\PostProcessorInterface;
-use Magento\Framework\Cache\FrontendInterface;
 use Magento\Framework\DataObject;
-use Magento\Framework\Serialize\Serializer\Serialize;
-use Magento\Framework\Serialize\SerializerInterface;
-use Magento\Store\Model\Config\Processor\Fallback;
 
 /**
  * Class process source, cache them and retrieve value by path
- *
- * @package Magento\Config\App\Config\Type
  */
 class System implements ConfigTypeInterface
 {
@@ -26,7 +18,7 @@ class System implements ConfigTypeInterface
     const CONFIG_TYPE = 'system';
 
     /**
-     * @var ConfigSourceInterface
+     * @var \Magento\Framework\App\Config\ConfigSourceInterface
      */
     private $source;
 
@@ -36,12 +28,17 @@ class System implements ConfigTypeInterface
     private $data;
 
     /**
-     * @var PostProcessorInterface
+     * @var \Magento\Framework\App\Config\Spi\PostProcessorInterface
      */
     private $postProcessor;
 
     /**
-     * @var FrontendInterface
+     * @var \Magento\Framework\App\Config\Spi\PreProcessorInterface
+     */
+    private $preProcessor;
+
+    /**
+     * @var \Magento\Framework\Cache\FrontendInterface
      */
     private $cache;
 
@@ -51,34 +48,36 @@ class System implements ConfigTypeInterface
     private $cachingNestedLevel;
 
     /**
-     * @var Fallback
+     * @var \Magento\Store\Model\Config\Processor\Fallback
      */
     private $fallback;
 
     /**
-     * @var Serialize
+     * @var \Magento\Framework\Serialize\SerializerInterface
      */
     private $serializer;
 
     /**
-     * System constructor.
-     * @param ConfigSourceInterface $source
-     * @param PostProcessorInterface $postProcessor
-     * @param Fallback $fallback
-     * @param FrontendInterface $cache
+     * @param \Magento\Framework\App\Config\ConfigSourceInterface $source
+     * @param \Magento\Framework\App\Config\Spi\PostProcessorInterface $postProcessor
+     * @param \Magento\Store\Model\Config\Processor\Fallback $fallback
+     * @param \Magento\Framework\Cache\FrontendInterface $cache
+     * @param \Magento\Framework\Serialize\SerializerInterface $serializer
+     * @param \Magento\Framework\App\Config\Spi\PreProcessorInterface $preProcessor
      * @param int $cachingNestedLevel
-     * @param Serialize $serializer
      */
     public function __construct(
-        ConfigSourceInterface $source,
-        PostProcessorInterface $postProcessor,
-        Fallback $fallback,
-        FrontendInterface $cache,
-        Serialize $serializer,
+        \Magento\Framework\App\Config\ConfigSourceInterface $source,
+        \Magento\Framework\App\Config\Spi\PostProcessorInterface $postProcessor,
+        \Magento\Store\Model\Config\Processor\Fallback $fallback,
+        \Magento\Framework\Cache\FrontendInterface $cache,
+        \Magento\Framework\Serialize\SerializerInterface $serializer,
+        \Magento\Framework\App\Config\Spi\PreProcessorInterface $preProcessor,
         $cachingNestedLevel = 1
     ) {
         $this->source = $source;
         $this->postProcessor = $postProcessor;
+        $this->preProcessor = $preProcessor;
         $this->cache = $cache;
         $this->cachingNestedLevel = $cachingNestedLevel;
         $this->fallback = $fallback;
@@ -96,7 +95,9 @@ class System implements ConfigTypeInterface
         if (!$this->data) {
             $data = $this->cache->load(self::CONFIG_TYPE);
             if (!$data) {
-                $data = $this->fallback->process($this->source->get());
+                $data = $this->preProcessor->process($this->source->get());
+                $this->data = new DataObject($data);
+                $data = $this->fallback->process($data);
                 $this->data = new DataObject($data);
                 //Placeholder processing need system config - so we need to save intermediate result
                 $data = $this->postProcessor->process($data);
diff --git a/app/code/Magento/Config/Block/System/Config/Form.php b/app/code/Magento/Config/Block/System/Config/Form.php
index d1a0da2a700a3f628c83ac2d61029bc915cd3ba6..f0ad7e4a28b1a365b6596f7175ae34434e09e59c 100644
--- a/app/code/Magento/Config/Block/System/Config/Form.php
+++ b/app/code/Magento/Config/Block/System/Config/Form.php
@@ -7,8 +7,10 @@ namespace Magento\Config\Block\System\Config;
 
 use Magento\Config\App\Config\Type\System;
 use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
+use Magento\Framework\App\Config\ScopeConfigInterface;
 use Magento\Framework\App\DeploymentConfig;
 use Magento\Framework\App\ObjectManager;
+use Magento\Framework\DataObject;
 
 /**
  * System config form block
@@ -331,29 +333,9 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         $fieldPrefix = '',
         $labelPrefix = ''
     ) {
-        $inherit = true;
-        $data = $this->getAppConfigDataValue($path);
-        if ($data === null) {
-            if (array_key_exists($path, $this->_configData)) {
-                $data = $this->_configData[$path];
-                $inherit = false;
+        $inherit = !array_key_exists($path, $this->_configData);
+        $data = $this->getFieldData($field, $path);
 
-                if ($field->hasBackendModel()) {
-                    $backendModel = $field->getBackendModel();
-                    $backendModel->setPath($path)
-                        ->setValue($data)
-                        ->setWebsite($this->getWebsiteCode())
-                        ->setStore($this->getStoreCode())
-                        ->afterLoad();
-                    $data = $backendModel->getValue();
-                }
-
-            } elseif ($field->getConfigPath() !== null) {
-                $data = $this->getConfigValue($field->getConfigPath());
-            } else {
-                $data = $this->getConfigValue($path);
-            }
-        }
         $fieldRendererClass = $field->getFrontendModel();
         if ($fieldRendererClass) {
             $fieldRenderer = $this->_layout->getBlockSingleton($fieldRendererClass);
@@ -373,9 +355,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         $sharedClass = $this->_getSharedCssClass($field);
         $requiresClass = $this->_getRequiresCssClass($field, $fieldPrefix);
 
-        $isReadOnly = $this->getSettingChecker()->isReadOnly($path, $this->getScope(), $this->getScopeCode());
-        $canUseDefault = $this->canUseDefaultValue($field->showInDefault());
-        $canUseWebsite = $this->canUseWebsiteValue($field->showInWebsite());
+        $isReadOnly = $this->getSettingChecker()->isReadOnly($path, $this->getScope(), $this->getStringScopeCode());
         $formField = $fieldset->addField(
             $elementId,
             $field->getType(),
@@ -392,8 +372,8 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
                 'scope' => $this->getScope(),
                 'scope_id' => $this->getScopeId(),
                 'scope_label' => $this->getScopeLabel($field),
-                'can_use_default_value' => $canUseDefault,
-                'can_use_website_value' => $canUseWebsite,
+                'can_use_default_value' => $this->canUseDefaultValue($field->showInDefault()),
+                'can_use_website_value' => $this->canUseWebsiteValue($field->showInWebsite()),
                 'can_restore_to_default' => $this->isCanRestoreToDefault($field->canRestore()),
                 'disabled' => $isReadOnly,
                 'is_disable_inheritance' => $isReadOnly
@@ -413,6 +393,74 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         $formField->setRenderer($fieldRenderer);
     }
 
+    /**
+     * Get data of field by path
+     *
+     * @param \Magento\Config\Model\Config\Structure\Element\Field $field
+     * @param string $path
+     * @return mixed|null|string
+     */
+    private function getFieldData(\Magento\Config\Model\Config\Structure\Element\Field $field, $path)
+    {
+        $data = $this->getAppConfigDataValue($path);
+
+        $placeholderValue = $this->getSettingChecker()->getPlaceholderValue(
+            $path,
+            $this->getScope(),
+            $this->getStringScopeCode()
+        );
+
+        if ($placeholderValue) {
+            $data = $placeholderValue;
+        }
+        if ($data === null) {
+            if (array_key_exists($path, $this->_configData)) {
+                $data = $this->_configData[$path];
+
+                if ($field->hasBackendModel()) {
+                    $backendModel = $field->getBackendModel();
+                    $backendModel->setPath($path)
+                        ->setValue($data)
+                        ->setWebsite($this->getWebsiteCode())
+                        ->setStore($this->getStoreCode())
+                        ->afterLoad();
+                    $data = $backendModel->getValue();
+                }
+
+            } elseif ($field->getConfigPath() !== null) {
+                $data = $this->getConfigValue($field->getConfigPath());
+            } else {
+                $data = $this->getConfigValue($path);
+            }
+        }
+
+        return $data;
+    }
+
+    /**
+     * Retrieve Scope string code
+     *
+     * @return string
+     */
+    private function getStringScopeCode()
+    {
+        $scopeCode = $this->getData('scope_string_code');
+
+        if (null === $scopeCode) {
+            if ($this->getStoreCode()) {
+                $scopeCode = $this->_storeManager->getStore($this->getStoreCode())->getCode();
+            } elseif ($this->getWebsiteCode()) {
+                $scopeCode = $this->_storeManager->getWebsite($this->getWebsiteCode())->getCode();
+            } else {
+                $scopeCode = '';
+            }
+
+            $this->setData('scope_string_code', $scopeCode);
+        }
+
+        return $scopeCode;
+    }
+
     /**
      * Populate dependencies block
      *
@@ -748,14 +796,13 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
     {
         $appConfig = $this->getAppConfig()->get(System::CONFIG_TYPE);
         $scope = $this->getScope();
-        $scopeId = $this->getScopeId();
-        if ($scope === 'default') {
-            $data = isset($appConfig[$scope][$path]) ? $appConfig[$scope][$path] : null;
+        $scopeCode = $this->getStringScopeCode();
+
+        if ($scope === ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
+            $data = new DataObject(isset($appConfig[$scope]) ? $appConfig[$scope] : []);
         } else {
-            $data = isset($appConfig[$scope][$scopeId][$path])
-                ? $appConfig[$scope][$scopeId][$path]
-                : null;
+            $data = new DataObject(isset($appConfig[$scope][$scopeCode]) ? $appConfig[$scope][$scopeCode] : []);
         }
-        return $data;
+        return $data->getData($path);
     }
 }
diff --git a/app/code/Magento/Config/Model/Config/Export/Comment.php b/app/code/Magento/Config/Model/Config/Export/Comment.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae0431c82daa031523f464ea1539209ca324996c
--- /dev/null
+++ b/app/code/Magento/Config/Model/Config/Export/Comment.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Model\Config\Export;
+
+use Magento\Config\App\Config\Source\DumpConfigSourceInterface;
+use Magento\Config\Model\Placeholder\PlaceholderFactory;
+use Magento\Config\Model\Placeholder\PlaceholderInterface;
+use Magento\Framework\App\Config\CommentInterface;
+
+/**
+ * Class Comment. Is used to retrieve comment for config dump file
+ */
+class Comment implements CommentInterface
+{
+    /**
+     * @var PlaceholderInterface
+     */
+    private $placeholder;
+
+    /**
+     * @var DumpConfigSourceInterface
+     */
+    private $source;
+
+    /**
+     * @param PlaceholderFactory $placeholderFactory
+     * @param DumpConfigSourceInterface $source
+     */
+    public function __construct(
+        PlaceholderFactory $placeholderFactory,
+        DumpConfigSourceInterface $source
+    ) {
+        $this->placeholder = $placeholderFactory->create(PlaceholderFactory::TYPE_ENVIRONMENT);
+        $this->source = $source;
+    }
+
+    /**
+     * Retrieves comments for config export file.
+     *
+     * @return string
+     */
+    public function get()
+    {
+        $comment = '';
+        $fields = $this->source->getExcludedFields();
+        foreach ($fields as $path) {
+            $comment .= "\n" . $this->placeholder->generate($path) . ' for ' . $path ;
+        }
+        if ($comment) {
+            $comment = 'The configuration file doesn\'t contain sensitive data for security reasons. '
+                . 'Sensitive data can be stored in the following environment variables:'
+                . $comment;
+        }
+        return $comment;
+    }
+}
diff --git a/app/code/Magento/Config/Model/Config/Export/ExcludeList.php b/app/code/Magento/Config/Model/Config/Export/ExcludeList.php
new file mode 100644
index 0000000000000000000000000000000000000000..f3c10b4100ed3a068b56873553c96e2e5852073b
--- /dev/null
+++ b/app/code/Magento/Config/Model/Config/Export/ExcludeList.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Model\Config\Export;
+
+use Magento\Framework\App\Config\ScopeConfigInterface;
+
+/**
+ * Class ExcludeList contains list of config fields which should be excluded from config export file
+ */
+class ExcludeList
+{
+    /**
+     * @var array
+     */
+    private $configs;
+
+    /**
+     * @param array $configs
+     */
+    public function __construct(array $configs = [])
+    {
+        $this->configs = $configs;
+    }
+
+    /**
+     * Check whether config item is excluded from export
+     *
+     * @param string $path
+     * @return bool
+     */
+    public function isPresent($path)
+    {
+        return !empty($this->configs[$path]) ;
+    }
+
+    /**
+     * Retrieves all excluded field paths for export
+     *
+     * @return array
+     */
+    public function get()
+    {
+        return array_keys(
+            array_filter(
+                $this->configs,
+                function ($value) {
+                    return filter_var($value, FILTER_VALIDATE_BOOLEAN);
+                }
+            )
+        );
+    }
+}
diff --git a/app/code/Magento/Config/Model/Config/Processor/EnvironmentPlaceholder.php b/app/code/Magento/Config/Model/Config/Processor/EnvironmentPlaceholder.php
new file mode 100644
index 0000000000000000000000000000000000000000..efbe888f2ebd62e0376e567e4046080af6ba8658
--- /dev/null
+++ b/app/code/Magento/Config/Model/Config/Processor/EnvironmentPlaceholder.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Model\Config\Processor;
+
+use Magento\Config\Model\Placeholder\PlaceholderFactory;
+use Magento\Config\Model\Placeholder\PlaceholderInterface;
+use Magento\Framework\App\Config\Spi\PreProcessorInterface;
+use Magento\Framework\Stdlib\ArrayManager;
+
+/**
+ * Allows to extract configurations from environment variables.
+ */
+class EnvironmentPlaceholder implements PreProcessorInterface
+{
+    /**
+     * @var PlaceholderFactory
+     */
+    private $placeholderFactory;
+
+    /**
+     * @var ArrayManager
+     */
+    private $arrayManager;
+
+    /**
+     * @var PlaceholderInterface
+     */
+    private $placeholder;
+
+    /**
+     * @param PlaceholderFactory $placeholderFactory
+     * @param ArrayManager $arrayManager
+     */
+    public function __construct(
+        PlaceholderFactory $placeholderFactory,
+        ArrayManager $arrayManager
+    ) {
+        $this->placeholderFactory = $placeholderFactory;
+        $this->arrayManager = $arrayManager;
+        $this->placeholder = $placeholderFactory->create(PlaceholderFactory::TYPE_ENVIRONMENT);
+    }
+
+    /**
+     * Method extracts environment variables.
+     * If environment variable is matching the desired rule - it's being used as value.
+     *
+     * {@inheritdoc}
+     */
+    public function process(array $config)
+    {
+        $environmentVariables = $_ENV;
+
+        foreach ($environmentVariables as $template => $value) {
+            if (!$this->placeholder->isApplicable($template)) {
+                continue;
+            }
+
+            $config = $this->arrayManager->set(
+                $this->placeholder->restore($template),
+                $config,
+                $value
+            );
+        }
+
+        return $config;
+    }
+}
diff --git a/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php b/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php
index 48b82086ad8b10d3b0241d2502b6199ab2584ab1..7e673401c7348c0721d917b5417c9940ceae16e3 100644
--- a/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php
+++ b/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php
@@ -6,10 +6,11 @@
 namespace Magento\Config\Model\Config\Reader\Source\Deployed;
 
 use Magento\Config\Model\Config\Reader;
-use Magento\Framework\App\Config\ScopeCodeResolver;
 use Magento\Framework\App\Config\ScopeConfigInterface;
 use Magento\Framework\App\DeploymentConfig;
-use Magento\Framework\App\ObjectManager;
+use Magento\Config\Model\Placeholder\PlaceholderInterface;
+use Magento\Config\Model\Placeholder\PlaceholderFactory;
+use Magento\Framework\App\Config\ScopeCodeResolver;
 
 /**
  * Class for checking settings that defined in config file
@@ -21,6 +22,11 @@ class SettingChecker
      */
     private $config;
 
+    /**
+     * @var PlaceholderInterface
+     */
+    private $placeholder;
+
     /**
      * @var ScopeCodeResolver
      */
@@ -28,45 +34,86 @@ class SettingChecker
 
     /**
      * @param DeploymentConfig $config
+     * @param PlaceholderFactory $placeholderFactory
      * @param ScopeCodeResolver $scopeCodeResolver
      */
     public function __construct(
         DeploymentConfig $config,
+        PlaceholderFactory $placeholderFactory,
         ScopeCodeResolver $scopeCodeResolver
     ) {
         $this->config = $config;
         $this->scopeCodeResolver = $scopeCodeResolver;
+        $this->placeholder = $placeholderFactory->create(PlaceholderFactory::TYPE_ENVIRONMENT);
     }
 
     /**
-     * Resolve path by scope and scope code
+     * Check that setting defined in deployed configuration
      *
+     * @param string $path
      * @param string $scope
-     * @param string $scopeCode
-     * @return string
+     * @param string|null $scopeCode
+     * @return boolean
      */
-    private function resolvePath($scope, $scopeCode)
+    public function isReadOnly($path, $scope, $scopeCode = null)
     {
-        $scopePath = 'system/' . $scope;
+        $config = $this->getEnvValue(
+            $this->placeholder->generate($path, $scope, $scopeCode)
+        );
 
-        if ($scope != ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
-            $scopePath .= '/' . $this->scopeCodeResolver->resolve($scope, $scopeCode);
+        if (null === $config) {
+            $config = $this->config->get($this->resolvePath($scope, $scopeCode) . "/" . $path);
         }
 
-        return $scopePath;
+        return $config !== null;
     }
 
     /**
-     * Check that setting defined in deployed configuration
+     * Check that there is value for generated placeholder
+     *
+     * Placeholder is generated from values of $path, $scope and $scopeCode
      *
      * @param string $path
      * @param string $scope
      * @param string $scopeCode
-     * @return boolean
+     * @param string|null $scopeCode
+     * @return string|null
      */
-    public function isReadOnly($path, $scope, $scopeCode)
+    public function getPlaceholderValue($path, $scope, $scopeCode = null)
     {
-        $config = $this->config->get($this->resolvePath($scope, $scopeCode) . "/" . $path);
-        return $config !== null;
+        return $this->getEnvValue($this->placeholder->generate($path, $scope, $scopeCode));
+    }
+
+    /**
+     * Retrieve value of environment variable by placeholder
+     *
+     * @param string $placeholder
+     * @return string|null
+     */
+    public function getEnvValue($placeholder)
+    {
+        if ($this->placeholder->isApplicable($placeholder) && isset($_ENV[$placeholder])) {
+            return $_ENV[$placeholder];
+        }
+
+        return null;
+    }
+
+    /**
+     * Resolve path by scope and scope code
+     *
+     * @param string $scope
+     * @param string $scopeCode
+     * @return string
+     */
+    private function resolvePath($scope, $scopeCode)
+    {
+        $scopePath = 'system/' . $scope;
+
+        if ($scope != ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
+            $scopePath .= '/' . $this->scopeCodeResolver->resolve($scope, $scopeCode);
+        }
+
+        return $scopePath;
     }
 }
diff --git a/app/code/Magento/Config/Model/Placeholder/Environment.php b/app/code/Magento/Config/Model/Placeholder/Environment.php
new file mode 100644
index 0000000000000000000000000000000000000000..96ffadc96c6f9a958ebc61e6626bcc02ac178237
--- /dev/null
+++ b/app/code/Magento/Config/Model/Placeholder/Environment.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Model\Placeholder;
+
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\DeploymentConfig;
+
+/**
+ * Class is used to work with placeholders for environment variables names based on config paths
+ */
+class Environment implements PlaceholderInterface
+{
+    /**
+     * @const string Prefix for placeholder
+     */
+    const PREFIX = 'CONFIG__';
+
+    /**
+     * @var DeploymentConfig
+     */
+    private $deploymentConfig;
+
+    /**
+     * @param DeploymentConfig $deploymentConfig
+     */
+    public function __construct(DeploymentConfig $deploymentConfig)
+    {
+        $this->deploymentConfig = $deploymentConfig;
+    }
+
+    /**
+     * Generates placeholder like CONFIG__DEFAULT__TEST__TEST_VALUE
+     *
+     * @inheritdoc
+     */
+    public function generate($path, $scopeType = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null)
+    {
+        $parts = $scopeType ? [$scopeType] : [];
+
+        if ($scopeType !== ScopeConfigInterface::SCOPE_TYPE_DEFAULT && $scopeCode) {
+            $parts[] = $scopeCode;
+        }
+
+        $parts[] = $path;
+
+        $template = implode('__', $parts);
+        $template = str_replace('/', '__', $template);
+        $template = static::PREFIX . $template;
+        $template = strtoupper($template);
+
+        return $template;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function restore($template)
+    {
+        $template = preg_replace('/^' . static::PREFIX . '/', '', $template);
+        $template = str_replace('__', '/', $template);
+        $template = strtolower($template);
+
+        return $template;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function isApplicable($placeholder)
+    {
+        return 1 === preg_match('/^' . static::PREFIX . '([a-zA-Z]+)([a-zA-Z0-9_])*$/', $placeholder);
+    }
+}
diff --git a/app/code/Magento/Config/Model/Placeholder/PlaceholderFactory.php b/app/code/Magento/Config/Model/Placeholder/PlaceholderFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f88bc2a289c4b32e47f24ef43223a868ea99267
--- /dev/null
+++ b/app/code/Magento/Config/Model/Placeholder/PlaceholderFactory.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Model\Placeholder;
+
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\ObjectManagerInterface;
+
+class PlaceholderFactory
+{
+    /**
+     * @const string Environment type
+     */
+    const TYPE_ENVIRONMENT = 'environment';
+
+    /**
+     * @var ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var array
+     */
+    private $types;
+
+    /**
+     * @param ObjectManagerInterface $objectManager
+     * @param array $types
+     */
+    public function __construct(ObjectManagerInterface $objectManager, array $types = [])
+    {
+        $this->objectManager = $objectManager;
+        $this->types = $types;
+    }
+
+    /**
+     * Create placeholder
+     *
+     * @param string $type
+     * @return PlaceholderInterface
+     * @throws LocalizedException
+     */
+    public function create($type)
+    {
+        if (!isset($this->types[$type])) {
+            throw new LocalizedException(__('There is no defined type ' . $type));
+        }
+
+        $object = $this->objectManager->create($this->types[$type]);
+
+        if (!$object instanceof PlaceholderInterface) {
+            throw new LocalizedException(__('Object is not instance of ' . PlaceholderInterface::class));
+        }
+
+        return $object;
+    }
+}
diff --git a/app/code/Magento/Config/Model/Placeholder/PlaceholderInterface.php b/app/code/Magento/Config/Model/Placeholder/PlaceholderInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..286eb0034a55063b8dcbf35cc13474ef144fd656
--- /dev/null
+++ b/app/code/Magento/Config/Model/Placeholder/PlaceholderInterface.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Model\Placeholder;
+
+use Magento\Framework\App\Config\ScopeConfigInterface;
+
+/**
+ * Interface PlaceholderInterface
+ */
+interface PlaceholderInterface
+{
+    /**
+     * Generating placeholder from value
+     *
+     * @param string $path
+     * @param string $scopeType
+     * @param string $scopeCode
+     * @return string
+     */
+    public function generate($path, $scopeType = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null);
+
+    /**
+     * Restoring path parts from template.
+     *
+     * @param string $template
+     * @return string
+     */
+    public function restore($template);
+
+    /**
+     * Check whether provided string is placeholder
+     *
+     * @param string $placeholder
+     * @return bool
+     */
+    public function isApplicable($placeholder);
+}
diff --git a/app/code/Magento/Config/Test/Unit/App/Config/Source/DumpConfigSourceAggregatedTest.php b/app/code/Magento/Config/Test/Unit/App/Config/Source/DumpConfigSourceAggregatedTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c6aef37540e5d69f071b8f4f9ccb465f69233ff
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/App/Config/Source/DumpConfigSourceAggregatedTest.php
@@ -0,0 +1,171 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\App\Config\Source;
+
+use Magento\Config\App\Config\Source\DumpConfigSourceAggregated;
+use Magento\Config\Model\Config\Export\ExcludeList;
+use Magento\Framework\App\Config\ConfigSourceInterface;
+
+class DumpConfigSourceAggregatedTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $sourceMock;
+
+    /**
+     * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $sourceMockTwo;
+
+    /**
+     * @var DumpConfigSourceAggregated
+     */
+    private $model;
+
+    /**
+     * @var ExcludeList|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $excludeListMock;
+
+    public function setUp()
+    {
+        $this->sourceMock = $this->getMockBuilder(ConfigSourceInterface::class)
+            ->getMockForAbstractClass();
+        $this->sourceMockTwo = $this->getMockBuilder(ConfigSourceInterface::class)
+            ->getMockForAbstractClass();
+        $this->excludeListMock = $this->getMockBuilder(ExcludeList::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $sources = [
+            [
+                'source' => $this->sourceMockTwo,
+                'sortOrder' => 100
+            ],
+            [
+                'source' => $this->sourceMock,
+                'sortOrder' => 10
+            ],
+
+        ];
+
+        $this->model = new DumpConfigSourceAggregated($this->excludeListMock, $sources);
+    }
+
+    public function testGet()
+    {
+        $path = '';
+        $data = [
+            'default' => [
+                'web' => [
+                    'unsecure' => [
+                        'base_url' => 'http://test.local',
+                    ],
+                    'secure' => [
+                        'base_url' => 'https://test.local',
+                    ]
+                ]
+            ],
+            'test' => [
+                'test' => [
+                    'test1' => [
+                        'test2' => [
+                            'test3' => 5,
+                        ]
+                    ]
+                ]
+            ]
+        ];
+
+        $this->sourceMock->expects($this->once())
+            ->method('get')
+            ->with($path)
+            ->willReturn($data);
+        $this->sourceMockTwo->expects($this->once())
+            ->method('get')
+            ->with($path)
+            ->willReturn(['key' => 'value2']);
+        $this->excludeListMock->expects($this->any())
+            ->method('isPresent')
+            ->willReturnMap([
+                ['web/unsecure/base_url', false],
+                ['web/secure/base_url', true],
+                ['test1/test2/test/3', false]
+            ]);
+
+        $this->assertEquals(
+            [
+                'test' => [
+                    'test' => [
+                        'test1' => [
+                            'test2' => [
+                                'test3' => 5,
+                            ]
+                        ]
+                    ],
+                ],
+                'key' => 'value2',
+                'default' => [
+                    'web' => [
+                        'unsecure' => [
+                            'base_url' => 'http://test.local',
+                        ],
+                        'secure' => []
+                    ]
+                ],
+            ],
+            $this->model->get($path)
+        );
+    }
+
+    public function testGetExcludedFields()
+    {
+        $path = '';
+        $data = [
+            'default' => [
+                'web' => [
+                    'unsecure' => [
+                        'base_url' => 'http://test.local',
+                    ],
+                    'secure' => [
+                        'base_url' => 'https://test.local',
+                    ]
+                ]
+            ],
+            'test' => [
+                'test' => [
+                    'test1' => [
+                        'test2' => [
+                            'test3' => 5,
+                        ]
+                    ]
+                ]
+            ]
+        ];
+
+        $this->sourceMock->expects($this->once())
+            ->method('get')
+            ->with($path)
+            ->willReturn($data);
+        $this->sourceMockTwo->expects($this->once())
+            ->method('get')
+            ->with($path)
+            ->willReturn(['key' => 'value2']);
+        $this->excludeListMock->expects($this->any())
+            ->method('isPresent')
+            ->willReturnMap([
+                ['web/unsecure/base_url', false],
+                ['web/secure/base_url', true],
+                ['test1/test2/test/3', false]
+            ]);
+
+        $this->assertEquals(
+            ['web/secure/base_url'],
+            $this->model->getExcludedFields()
+        );
+    }
+}
diff --git a/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php b/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php
index be541228bf6d88a5ad7e459ba77a34e896c863a1..8409e96db552e61a8ee3a8a4ec788d457d84ba5c 100644
--- a/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php
+++ b/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php
@@ -8,9 +8,9 @@ namespace Magento\Config\Test\Unit\App\Config\Type;
 use Magento\Config\App\Config\Type\System;
 use Magento\Framework\App\Config\ConfigSourceInterface;
 use Magento\Framework\App\Config\Spi\PostProcessorInterface;
-use Magento\Framework\App\ObjectManager;
+use Magento\Framework\App\Config\Spi\PreProcessorInterface;
 use Magento\Framework\Cache\FrontendInterface;
-use Magento\Framework\Serialize\Serializer\Serialize;
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Store\Model\Config\Processor\Fallback;
 
 /**
@@ -29,6 +29,11 @@ class SystemTest extends \PHPUnit_Framework_TestCase
      */
     private $postProcessor;
 
+    /**
+     * @var PreProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $preProcessor;
+
     /**
      * @var Fallback|\PHPUnit_Framework_MockObject_MockObject
      */
@@ -45,7 +50,7 @@ class SystemTest extends \PHPUnit_Framework_TestCase
     private $configType;
 
     /**
-     * @var Serialize|\PHPUnit_Framework_MockObject_MockObject
+     * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
     private $serializer;
 
@@ -60,7 +65,9 @@ class SystemTest extends \PHPUnit_Framework_TestCase
             ->getMock();
         $this->cache = $this->getMockBuilder(FrontendInterface::class)
             ->getMockForAbstractClass();
-        $this->serializer = $this->getMockBuilder(Serialize::class)
+        $this->preProcessor = $this->getMockBuilder(PreProcessorInterface::class)
+            ->getMockForAbstractClass();
+        $this->serializer = $this->getMockBuilder(SerializerInterface::class)
             ->disableOriginalConstructor()
             ->getMock();
         $this->configType = new System(
@@ -68,7 +75,8 @@ class SystemTest extends \PHPUnit_Framework_TestCase
             $this->postProcessor,
             $this->fallback,
             $this->cache,
-            $this->serializer
+            $this->serializer,
+            $this->preProcessor
         );
     }
 
@@ -112,6 +120,10 @@ class SystemTest extends \PHPUnit_Framework_TestCase
                 ->method('process')
                 ->with($data)
                 ->willReturnArgument(0);
+            $this->preProcessor->expects($this->once())
+                ->method('process')
+                ->with($data)
+                ->willReturnArgument(0);
             $this->postProcessor->expects($this->once())
                 ->method('process')
                 ->with($data)
diff --git a/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php b/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php
index 2c671914f264b04ec34508d919a23c67bf64abad..5c7bf92f954285571bc6620a1726d2ccfd9432f4 100644
--- a/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php
+++ b/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php
@@ -10,6 +10,7 @@ namespace Magento\Config\Test\Unit\Block\System\Config;
 
 use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
 use Magento\Framework\App\DeploymentConfig;
+use Magento\Store\Model\StoreManagerInterface;
 
 /**
  * Test System config form block
@@ -72,6 +73,11 @@ class FormTest extends \PHPUnit_Framework_TestCase
      */
     protected $_fieldsetFactoryMock;
 
+    /**
+     * @var StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeManagerMock;
+
     /**
      * @return void
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
@@ -161,6 +167,9 @@ class FormTest extends \PHPUnit_Framework_TestCase
             false
         );
 
+        $this->storeManagerMock = $this->getMockBuilder(StoreManagerInterface::class)
+            ->getMockForAbstractClass();
+
         $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
 
         $context = $helper->getObject(
@@ -168,7 +177,8 @@ class FormTest extends \PHPUnit_Framework_TestCase
             [
                 'scopeConfig' => $this->_coreConfigMock,
                 'request' => $requestMock,
-                'urlBuilder' => $this->_urlModelMock
+                'urlBuilder' => $this->_urlModelMock,
+                'storeManager' => $this->storeManagerMock
             ]
         );
 
@@ -423,6 +433,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
      * @param string|null $configPath
      * @param bool $inherit
      * @param string $expectedValue
+     * @param string|null $placeholderValue
      * @param int $hasBackendModel
      *
      * @dataProvider initFieldsDataProvider
@@ -434,6 +445,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
         $configPath,
         $inherit,
         $expectedValue,
+        $placeholderValue,
         $hasBackendModel
     ) {
         // Parameters initialization
@@ -503,6 +515,18 @@ class FormTest extends \PHPUnit_Framework_TestCase
             $this->returnValue($configValue)
         );
 
+        /** @var \Magento\Store\Api\Data\StoreInterface|\PHPUnit_Framework_MockObject_MockObject $storeMock */
+        $storeMock = $this->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class)
+            ->getMockForAbstractClass();
+        $storeMock->expects($this->once())
+            ->method('getCode')
+            ->willReturn('store_code');
+
+        $this->storeManagerMock->expects($this->atLeastOnce())
+            ->method('getStore')
+            ->with('store_code')
+            ->willReturn($storeMock);
+
         // Field mock configuration
         $fieldMock = $this->getMock(
             \Magento\Config\Model\Config\Structure\Element\Field::class,
@@ -596,17 +620,20 @@ class FormTest extends \PHPUnit_Framework_TestCase
 
         $fieldMock->expects($this->once())->method('populateInput');
 
-
-        $settingChecker = $this->getMockBuilder(SettingChecker::class)
+        $settingCheckerMock = $this->getMockBuilder(SettingChecker::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $settingChecker->expects($this->once())
+        $settingCheckerMock->expects($this->once())
             ->method('isReadOnly')
             ->willReturn(false);
-        $reflection = new \ReflectionClass(get_class($this->object));
-        $reflectionProperty = $reflection->getProperty('settingChecker');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->object, $settingChecker);
+
+        $settingCheckerMock->expects($this->once())
+            ->method('getPlaceholderValue')
+            ->willReturn($placeholderValue);
+
+        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $helper->setBackwardCompatibleProperty($this->object, 'settingChecker', $settingCheckerMock);
 
         $this->object->initFields($fieldsetMock, $groupMock, $sectionMock, $fieldPrefix, $labelPrefix);
     }
@@ -617,8 +644,9 @@ class FormTest extends \PHPUnit_Framework_TestCase
     public function initFieldsDataProvider()
     {
         return [
-            [['section1/group1/field1' => 'some_value'], false, null, false, 'some_value', 1],
-            [[], 'Config Value', 'some/config/path', true, 'Config Value', 0]
+            [['section1/group1/field1' => 'some_value'], false, null, false, 'some_value', null, 1],
+            [[], 'Config Value', 'some/config/path', true, 'Config Value', null, 0],
+            [[], 'Config Value', 'some/config/path', true, 'Placeholder Value', 'Placeholder Value', 0]
         ];
     }
 }
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Export/CommentTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Export/CommentTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c8b10bcf4ddcd5393a62307c873646f87d1419e8
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Export/CommentTest.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\Model\Config\Export;
+
+use Magento\Config\Model\Config\Export\Comment;
+use Magento\Config\App\Config\Source\DumpConfigSourceInterface;
+use Magento\Config\Model\Placeholder\PlaceholderFactory;
+use Magento\Config\Model\Placeholder\PlaceholderInterface;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+
+class CommentTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var DumpConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $configSourceMock;
+
+    /**
+     * @var PlaceholderInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $placeholderMock;
+
+    /**
+     * @var Comment
+     */
+    private $model;
+
+    protected function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+
+        $this->placeholderMock = $this->getMockBuilder(PlaceholderInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $placeholderFactoryMock = $this->getMockBuilder(PlaceholderFactory::class)
+            ->setMethods(['create'])
+            ->disableOriginalConstructor()
+            ->getMock();
+        $placeholderFactoryMock->expects($this->once())
+            ->method('create')
+            ->with(PlaceholderFactory::TYPE_ENVIRONMENT)
+            ->willReturn($this->placeholderMock);
+
+        $this->configSourceMock = $this->getMockBuilder(DumpConfigSourceInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $this->model = $objectManager->getObject(
+            Comment::class,
+            [
+                'placeholderFactory' => $placeholderFactoryMock,
+                'source' => $this->configSourceMock
+            ]
+        );
+    }
+
+    public function testGetEmpty()
+    {
+        $this->configSourceMock->expects($this->once())
+            ->method('getExcludedFields')
+            ->willReturn([]);
+        $this->assertEmpty($this->model->get());
+    }
+
+    public function testGet()
+    {
+        $path = 'one/two';
+        $placeholder = 'one__two';
+        $expectedResult = 'The configuration file doesn\'t contain sensitive data for security reasons. '
+            . 'Sensitive data can be stored in the following environment variables:'
+            . "\n$placeholder for $path";
+
+        $this->configSourceMock->expects($this->once())
+            ->method('getExcludedFields')
+            ->willReturn([$path]);
+
+        $this->placeholderMock->expects($this->once())
+            ->method('generate')
+            ->with($path)
+            ->willReturn($placeholder);
+
+        $this->assertEquals($expectedResult, $this->model->get());
+    }
+}
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Export/ExcludeListTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Export/ExcludeListTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3156ad1ec549325839bbf9470c6396d101ee557f
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Export/ExcludeListTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\Model\Config\Export;
+
+use Magento\Config\Model\Config\Export\ExcludeList;
+
+class ExcludeListTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ExcludeList
+     */
+    private $model;
+
+    protected function setUp()
+    {
+        $this->model = new ExcludeList(
+            [
+                'web/unsecure/base_url' => '',
+                'web/test/test_value' => '0',
+                'web/test/test_sensitive' => '1',
+            ]
+        );
+    }
+
+    public function testGet()
+    {
+        $this->assertEquals(['web/test/test_sensitive'], $this->model->get());
+    }
+
+    public function testIsPresent()
+    {
+        $this->assertFalse($this->model->isPresent('some/new/path'));
+        $this->assertFalse($this->model->isPresent('web/unsecure/base_url'));
+        $this->assertFalse($this->model->isPresent('web/test/test_value'));
+        $this->assertTrue($this->model->isPresent('web/test/test_sensitive'));
+    }
+}
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Processor/EnvironmentPlaceholderTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Processor/EnvironmentPlaceholderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..25f9f6b3cb83222dd9c196114729e8b10465072b
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Processor/EnvironmentPlaceholderTest.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\Model\Config\Processor;
+
+use Magento\Config\Model\Config\Processor\EnvironmentPlaceholder;
+use Magento\Config\Model\Placeholder\PlaceholderFactory;
+use Magento\Config\Model\Placeholder\PlaceholderInterface;
+use Magento\Framework\Stdlib\ArrayManager;
+use \PHPUnit_Framework_MockObject_MockObject as Mock;
+
+class EnvironmentPlaceholderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var EnvironmentPlaceholder
+     */
+    private $model;
+
+    /**
+     * @var PlaceholderFactory|Mock
+     */
+    private $placeholderFactoryMock;
+
+    /**
+     * @var ArrayManager|Mock
+     */
+    private $arrayManagerMock;
+
+    /**
+     * @var PlaceholderInterface|Mock
+     */
+    private $placeholderMock;
+
+    /**
+     * @var array
+     */
+    private $env;
+
+    protected function setUp()
+    {
+        $this->placeholderFactoryMock = $this->getMockBuilder(PlaceholderFactory::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->arrayManagerMock = $this->getMockBuilder(ArrayManager::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->placeholderMock = $this->getMockBuilder(PlaceholderInterface::class)
+            ->getMockForAbstractClass();
+        $this->env = $_ENV;
+
+        $this->placeholderFactoryMock->expects($this->any())
+            ->method('create')
+            ->with(PlaceholderFactory::TYPE_ENVIRONMENT)
+            ->willReturn($this->placeholderMock);
+
+        $this->model = new EnvironmentPlaceholder(
+            $this->placeholderFactoryMock,
+            $this->arrayManagerMock
+        );
+    }
+
+    public function testProcess()
+    {
+        $_ENV = array_merge(
+            $this->env,
+            [
+                'CONFIG_DEFAULT_TEST' => 1,
+                'CONFIG_DEFAULT_TEST2' => 2,
+                'BAD_CONFIG' => 3,
+            ]
+        );
+
+        $this->placeholderMock->expects($this->any())
+            ->method('isApplicable')
+            ->willReturnMap(
+                [
+                    ['CONFIG_DEFAULT_TEST', true],
+                    ['CONFIG_DEFAULT_TEST2', true],
+                    ['BAD_CONFIG', false],
+                ]
+            );
+        $this->placeholderMock->expects($this->any())
+            ->method('restore')
+            ->willReturnMap(
+                [
+                    ['CONFIG_DEFAULT_TEST', 'default/test'],
+                    ['CONFIG_DEFAULT_TEST2', 'default/test2'],
+                ]
+            );
+        $this->arrayManagerMock->expects($this->any())
+            ->method('set')
+            ->willReturnMap(
+                [
+                    ['default/test', [], 1, '/', ['default' => ['test' => 1]]],
+                    [
+                        'default/test2',
+                        [
+                            'default' => [
+                                'test' => 1
+                            ]
+                        ],
+                        2,
+                        '/',
+                        [
+                            'default' => [
+                                'test' => 1,
+                                'test2' => 2
+                            ]
+                        ],
+                    ]
+                ]
+            );
+
+        $this->assertSame(
+            [
+                'default' => [
+                    'test' => 1,
+                    'test2' => 2
+                ]
+            ],
+            $this->model->process([])
+        );
+    }
+
+    protected function tearDown()
+    {
+        $_ENV = $this->env;
+    }
+}
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php
index 2e746eae410f414788a7b5277e331be7075e6655..75bfab85616b588975175abe8976a8e57ec65e04 100644
--- a/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php
@@ -7,21 +7,30 @@ namespace Magento\Config\Test\Unit\Model\Config\Reader\Source\Deployed;
 
 use Magento\Config\Model\Config\Reader;
 use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
-use Magento\Framework\App\Config\ScopeCodeResolver;
 use Magento\Framework\App\Config;
 use Magento\Framework\App\DeploymentConfig;
+use Magento\Config\Model\Placeholder\PlaceholderInterface;
+use Magento\Config\Model\Placeholder\PlaceholderFactory;
 
 /**
  * Test class for checking settings that defined in config file
- *
- * @package Magento\Config\Test\Unit\Model\Config\Reader\Source\Deployed
  */
 class SettingCheckerTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @var Config|\PHPUnit_Framework_MockObject_MockObject
      */
-    private $config;
+    private $configMock;
+
+    /**
+     * @var PlaceholderInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $placeholderMock;
+
+    /**
+     * @var Config\ScopeCodeResolver|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scopeCodeResolverMock;
 
     /**
      * @var SettingChecker
@@ -29,43 +38,109 @@ class SettingCheckerTest extends \PHPUnit_Framework_TestCase
     private $checker;
 
     /**
-     * @var ScopeCodeResolver | \PHPUnit_Framework_MockObject_MockObject
+     * @var array
      */
-    private $scopeCodeResolver;
+    private $env;
 
     public function setUp()
     {
-        $this->config = $this->getMockBuilder(DeploymentConfig::class)
+        $this->configMock = $this->getMockBuilder(DeploymentConfig::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->scopeCodeResolver = $this->getMockBuilder(ScopeCodeResolver::class)
+        $this->placeholderMock = $this->getMockBuilder(PlaceholderInterface::class)
+            ->getMockForAbstractClass();
+        $this->scopeCodeResolverMock = $this->getMockBuilder(Config\ScopeCodeResolver::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->checker = new SettingChecker($this->config, $this->scopeCodeResolver);
+        $placeholderFactoryMock = $this->getMockBuilder(PlaceholderFactory::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->env = $_ENV;
+
+        $placeholderFactoryMock->expects($this->once())
+            ->method('create')
+            ->with(PlaceholderFactory::TYPE_ENVIRONMENT)
+            ->willReturn($this->placeholderMock);
+
+        $this->checker = new SettingChecker($this->configMock, $placeholderFactoryMock, $this->scopeCodeResolverMock);
     }
 
-    public function testIsDefined()
+    /**
+     * @param string $path
+     * @param string $scope
+     * @param string $scopeCode
+     * @param string|null $confValue
+     * @param array $variables
+     * @param bool $expectedResult
+     * @dataProvider isReadonlyDataProvider
+     */
+    public function testIsReadonly($path, $scope, $scopeCode, $confValue, array $variables, $expectedResult)
     {
-        $path = 'general/web/locale';
-        $scope = 'website';
-        $scopeCode = 'myWebsite';
-        $scopeCodeId = '4';
+        $this->placeholderMock->expects($this->once())
+            ->method('isApplicable')
+            ->willReturn(true);
+        $this->placeholderMock->expects($this->once())
+            ->method('generate')
+            ->with($path, $scope, $scopeCode)
+            ->willReturn('SOME_PLACEHOLDER');
+        $this->scopeCodeResolverMock->expects($this->any())
+            ->method('resolve')
+            ->willReturnMap(
+                [
+                    ['website', 'myWebsite', ($scopeCode ? $scopeCode : '')]
+                ]
+            );
+
+        $_ENV = array_merge($this->env, $variables);
 
-        $this->config->expects($this->once())
+        $this->configMock->expects($this->any())
             ->method('get')
-            ->willReturn([
-                $scope => [
-                    $scopeCode => [
-                        $path => 'value'
-                    ],
+            ->willReturnMap([
+                [
+                    'system/' . $scope . "/" . ($scopeCode ? $scopeCode . '/' : '') . $path,
+                    null,
+                    $confValue
                 ],
             ]);
 
-        $this->scopeCodeResolver->expects($this->once())
-            ->method('resolve')
-            ->with($scope, $scopeCodeId)
-            ->willReturn($scopeCode);
+        $this->assertSame($expectedResult, $this->checker->isReadOnly($path, $scope, $scopeCode));
+    }
 
-        $this->assertTrue($this->checker->isReadOnly($path, $scope, $scopeCodeId));
+    /**
+     * @return array
+     */
+    public function isReadonlyDataProvider()
+    {
+        return [
+            [
+                'path' => 'general/web/locale',
+                'scope' => 'website',
+                'scopeCode' => 'myWebsite',
+                'confValue' => 'value',
+                'variables' => [],
+                'expectedResult' => true,
+            ],
+            [
+                'path' => 'general/web/locale',
+                'scope' => 'website',
+                'scopeCode' => 'myWebsite',
+                'confValue' => null,
+                'variables' => ['SOME_PLACEHOLDER' => 'value'],
+                'expectedResult' => true,
+            ],
+            [
+                'path' => 'general/web/locale',
+                'scope' => 'website',
+                'scopeCode' => 'myWebsite',
+                'confValue' => null,
+                'variables' => [],
+                'expectedResult' => false,
+            ]
+        ];
+    }
+
+    protected function tearDown()
+    {
+        $_ENV = $this->env;
     }
 }
diff --git a/app/code/Magento/Config/Test/Unit/Model/Placeholder/EnvironmentTest.php b/app/code/Magento/Config/Test/Unit/Model/Placeholder/EnvironmentTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..64b4e6e37fb94867854da15f8e0f72d9b0ccbf3c
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/Model/Placeholder/EnvironmentTest.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\Model\Placeholder;
+
+use Magento\Config\Model\Placeholder\Environment;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\DeploymentConfig;
+use Magento\Framework\Config\ConfigOptionsListConstants;
+use \PHPUnit_Framework_MockObject_MockObject as Mock;
+
+/**
+ * Class EnvironmentTest
+ */
+class EnvironmentTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Environment
+     */
+    private $model;
+
+    /**
+     * @var DeploymentConfig|Mock
+     */
+    private $deploymentConfigMock;
+
+    protected function setUp()
+    {
+        $this->deploymentConfigMock = $this->getMockBuilder(DeploymentConfig::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->model = new Environment(
+            $this->deploymentConfigMock
+        );
+    }
+
+    /**
+     * @param string $path
+     * @param string $scope
+     * @param string $scopeId
+     * @param string $expected
+     * @dataProvider getGenerateDataProvider
+     */
+    public function testGenerate($path, $scope, $scopeId, $expected)
+    {
+        $this->assertSame(
+            $expected,
+            $this->model->generate($path, $scope, $scopeId)
+        );
+    }
+
+    public function getGenerateDataProvider()
+    {
+        return [
+            [
+                'web/unsecure/base_url',
+                ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
+                null,
+                Environment::PREFIX . 'DEFAULT__WEB__UNSECURE__BASE_URL'
+            ],
+            [
+                'web/unsecure/base_url',
+                'web',
+                'test',
+                Environment::PREFIX . 'WEB__TEST__WEB__UNSECURE__BASE_URL'
+            ],
+            [
+                'web/unsecure/base_url',
+                'web',
+                null,
+                Environment::PREFIX . 'WEB__WEB__UNSECURE__BASE_URL'
+            ],
+        ];
+    }
+
+    /**
+     * @param string $placeholder
+     * @param bool $expected
+     * @dataProvider getIsPlaceholderDataProvider
+     */
+    public function testIsApplicable($placeholder, $expected)
+    {
+        $this->assertSame(
+            $expected,
+            $this->model->isApplicable($placeholder)
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function getIsPlaceholderDataProvider()
+    {
+        return [
+            [Environment::PREFIX . 'TEST', true],
+            ['TEST', false],
+            [Environment::PREFIX . 'TEST_test', true],
+            [Environment::PREFIX . '-:A', false],
+            [Environment::PREFIX . '_A', false],
+            [Environment::PREFIX . 'A@#$', false]
+        ];
+    }
+
+    /**
+     * @param string $template
+     * @param string $expected
+     * @dataProvider restoreDataProvider
+     */
+    public function testRestore($template, $expected)
+    {
+        $this->assertSame(
+            $expected,
+            $this->model->restore($template)
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function restoreDataProvider()
+    {
+        return [
+            [Environment::PREFIX . 'TEST__CONFIG', 'test/config'],
+            [Environment::PREFIX . 'TEST__CONFIG__VALUE', 'test/config/value'],
+            [Environment::PREFIX . 'TEST__CONFIG_VALUE', 'test/config_value'],
+        ];
+    }
+}
diff --git a/app/code/Magento/Config/Test/Unit/Model/Placeholder/PlaceholderFactoryTest.php b/app/code/Magento/Config/Test/Unit/Model/Placeholder/PlaceholderFactoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e8f646e984187ed49ffc7df0798c8efa689ba767
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/Model/Placeholder/PlaceholderFactoryTest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\Model\Placeholder;
+
+use Magento\Config\Model\Placeholder\Environment;
+use Magento\Config\Model\Placeholder\PlaceholderFactory;
+use Magento\Framework\ObjectManagerInterface;
+
+class PlaceholderFactoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var PlaceholderFactory
+     */
+    private $model;
+
+    /**
+     * @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $objectManagerMock;
+
+    /**
+     * @var Environment|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $environmentMock;
+
+    protected function setUp()
+    {
+        $this->objectManagerMock = $this->getMockBuilder(ObjectManagerInterface::class)
+            ->getMockForAbstractClass();
+        $this->environmentMock = $this->getMockBuilder(Environment::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->model = new PlaceholderFactory(
+            $this->objectManagerMock,
+            [
+                PlaceholderFactory::TYPE_ENVIRONMENT => Environment::class,
+                'wrongClass' => \stdClass::class,
+            ]
+        );
+    }
+
+    public function testCreate()
+    {
+        $this->objectManagerMock->expects($this->once())
+            ->method('create')
+            ->with(Environment::class)
+            ->willReturn($this->environmentMock);
+
+        $this->assertInstanceOf(
+            Environment::class,
+            $this->model->create(PlaceholderFactory::TYPE_ENVIRONMENT)
+        );
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\LocalizedException
+     * @expectedExceptionMessage There is no defined type dummyClass
+     */
+    public function testCreateNonExisted()
+    {
+        $this->model->create('dummyClass');
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\LocalizedException
+     * @expectedExceptionMessage Object is not instance of Magento\Config\Model\Placeholder\PlaceholderInterface
+     */
+    public function testCreateWrongImplementation()
+    {
+        $this->model->create('wrongClass');
+    }
+}
diff --git a/app/code/Magento/Config/etc/di.xml b/app/code/Magento/Config/etc/di.xml
index 4f9eae24b55f611db54f3f5423c3944f7d93a7f6..3e2fa4fbecf6da0a712a1df313eb5b63812a5a20 100644
--- a/app/code/Magento/Config/etc/di.xml
+++ b/app/code/Magento/Config/etc/di.xml
@@ -81,6 +81,8 @@
             <argument name="source" xsi:type="object">systemConfigSourceAggregatedProxy</argument>
             <argument name="postProcessor" xsi:type="object">systemConfigPostProcessorCompositeProxy</argument>
             <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument>
+            <argument name="preProcessor" xsi:type="object">systemConfigPreProcessorComposite</argument>
+            <argument name="serializer" xsi:type="object">Magento\Framework\Serialize\Serializer\Serialize</argument>
         </arguments>
     </type>
     <virtualType name="modulesDataProviderProxy" type="Magento\Framework\App\Config\InitialConfigSource\Proxy">
@@ -113,6 +115,13 @@
             </argument>
         </arguments>
     </virtualType>
+    <virtualType name="systemConfigPreProcessorComposite" type="Magento\Framework\App\Config\PreProcessorComposite">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="environmentPlaceholder" xsi:type="object">Magento\Config\Model\Config\Processor\EnvironmentPlaceholder</item>
+            </argument>
+        </arguments>
+    </virtualType>
     <virtualType name="systemConfigSourceAggregated" type="Magento\Framework\App\Config\ConfigSourceAggregated">
         <arguments>
             <argument name="sources" xsi:type="array">
@@ -138,15 +147,15 @@
             <argument name="fileKey" xsi:type="const">Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG</argument>
         </arguments>
     </virtualType>
-    <virtualType name="appDumpSystemSource" type="Magento\Framework\App\Config\ConfigSourceAggregated">
+    <virtualType name="appDumpSystemSource" type="Magento\Config\App\Config\Source\DumpConfigSourceAggregated">
         <arguments>
             <argument name="sources" xsi:type="array">
-                <item name="initial" xsi:type="array">
-                    <item name="source" xsi:type="object">systemConfigInitialDataProvider</item>
-                    <item name="sortOrder" xsi:type="string">10</item>
-                </item>
                 <item name="dynamic" xsi:type="array">
                     <item name="source" xsi:type="object">Magento\Config\App\Config\Source\RuntimeConfigSource</item>
+                    <item name="sortOrder" xsi:type="string">100</item>
+                </item>
+                <item name="initial" xsi:type="array">
+                    <item name="source" xsi:type="object">systemConfigInitialDataProvider</item>
                     <item name="sortOrder" xsi:type="string">1000</item>
                 </item>
             </argument>
@@ -158,8 +167,21 @@
                 <item name="system" xsi:type="array">
                     <item name="source" xsi:type="object">appDumpSystemSource</item>
                     <item name="namespace" xsi:type="const">Magento\Config\App\Config\Type\System::CONFIG_TYPE</item>
+                    <item name="comment" xsi:type="object">Magento\Config\Model\Config\Export\Comment</item>
                 </item>
             </argument>
         </arguments>
     </type>
+    <type name="Magento\Config\Model\Config\Export\Comment">
+        <arguments>
+            <argument name="source" xsi:type="object">appDumpSystemSource</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Config\Model\Placeholder\PlaceholderFactory">
+        <arguments>
+            <argument name="types" xsi:type="array">
+                <item name="environment" xsi:type="string">Magento\Config\Model\Placeholder\Environment</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/ConfigurableProduct/Helper/Data.php b/app/code/Magento/ConfigurableProduct/Helper/Data.php
index 079aee7b23750bbb08d01ecae4c672c50bf1eeb2..4c1370b1a0d7aed1c786d318c3c65382277e2afe 100644
--- a/app/code/Magento/ConfigurableProduct/Helper/Data.php
+++ b/app/code/Magento/ConfigurableProduct/Helper/Data.php
@@ -50,15 +50,13 @@ class Data
                 );
                 $image->setData(
                     'medium_image_url',
-                    $this->imageHelper->init($product, 'product_page_image_medium')
-                        ->constrainOnly(true)->keepAspectRatio(true)->keepFrame(false)
+                    $this->imageHelper->init($product, 'product_page_image_medium_no_frame')
                         ->setImageFile($image->getFile())
                         ->getUrl()
                 );
                 $image->setData(
                     'large_image_url',
-                    $this->imageHelper->init($product, 'product_page_image_large')
-                        ->constrainOnly(true)->keepAspectRatio(true)->keepFrame(false)
+                    $this->imageHelper->init($product, 'product_page_image_large_no_frame')
                         ->setImageFile($image->getFile())
                         ->getUrl()
                 );
diff --git a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/Configurable.php
index fbb69798ff94fbdf8caafc7486e564da662cf655..ed4863342a9670699fd544b7c7838697dd06eef7 100644
--- a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/Configurable.php
@@ -9,9 +9,45 @@ namespace Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Catalog\Model\Product\Attribute\Source\Status as ProductStatus;
+use Magento\Catalog\Model\Product\Attribute\Source\Status;
+use Magento\Store\Api\StoreResolverInterface;
+use Magento\Store\Model\Store;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class Configurable extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice
 {
+    /**
+     * @var StoreResolverInterface
+     */
+    private $storeResolver;
+
+    /**
+     * Class constructor
+     *
+     * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
+     * @param \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy
+     * @param \Magento\Eav\Model\Config $eavConfig
+     * @param \Magento\Framework\Event\ManagerInterface $eventManager
+     * @param \Magento\Framework\Module\Manager $moduleManager
+     * @param string $connectionName
+     * @param StoreResolverInterface $storeResolver
+     */
+    public function __construct(
+        \Magento\Framework\Model\ResourceModel\Db\Context $context,
+        \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy,
+        \Magento\Eav\Model\Config $eavConfig,
+        \Magento\Framework\Event\ManagerInterface $eventManager,
+        \Magento\Framework\Module\Manager $moduleManager,
+        $connectionName = null,
+        StoreResolverInterface $storeResolver = null
+    ) {
+        parent::__construct($context, $tableStrategy, $eavConfig, $eventManager, $moduleManager, $connectionName);
+        $this->storeResolver = $storeResolver ?:
+            \Magento\Framework\App\ObjectManager::getInstance()->get(StoreResolverInterface::class);
+    }
+
     /**
      * Reindex temporary (price result data) for all products
      *
@@ -190,16 +226,21 @@ class Configurable extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\
             []
         )->where(
             'le.required_options=0'
-        )->join(
-            ['product_status' => $this->getTable($statusAttribute->getBackend()->getTable())],
-            sprintf(
-                'le.%1$s = product_status.%1$s AND product_status.attribute_id = %2$s',
-                $linkField,
-                $statusAttribute->getAttributeId()
-            ),
+        )->joinLeft(
+            ['status_global_attr' => $statusAttribute->getBackendTable()],
+            "status_global_attr.{$linkField} = le.{$linkField}"
+            . ' AND status_global_attr.attribute_id  = ' . (int)$statusAttribute->getAttributeId()
+            . ' AND status_global_attr.store_id  = ' . Store::DEFAULT_STORE_ID,
+            []
+        )->joinLeft(
+            ['status_attr' => $statusAttribute->getBackendTable()],
+            "status_attr.{$linkField} = le.{$linkField}"
+            . ' AND status_attr.attribute_id  = ' . (int)$statusAttribute->getAttributeId()
+            . ' AND status_attr.store_id  = ' . $this->storeResolver->getCurrentStoreId(),
             []
         )->where(
-            'product_status.value=' . ProductStatus::STATUS_ENABLED
+            'IFNULL(status_attr.value, status_global_attr.value) = ?',
+            Status::STATUS_ENABLED
         )->group(
             ['e.entity_id', 'i.customer_group_id', 'i.website_id', 'l.product_id']
         );
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Helper/DataTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Helper/DataTest.php
index be1f4c76a4f45e3051c4d39f87c4619ffac1de3a..efb11e6b13a1d63d4fb9fbb37b5d5a89f5a8f511 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Helper/DataTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Helper/DataTest.php
@@ -35,7 +35,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
 
     public function testGetAllowAttributes()
     {
-        $typeInstanceMock = $this->getMock(
+        $typeInstanceMock = $this->getMock(
             \Magento\ConfigurableProduct\Model\Product\Type\Configurable::class, [], [], '', false
         );
         $typeInstanceMock->expects($this->once())
@@ -91,7 +91,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
      */
     public function getOptionsDataProvider()
     {
-        $currentProductMock = $this->getMock(
+        $currentProductMock = $this->getMock(
             \Magento\Catalog\Model\Product::class, ['getTypeInstance', '__wakeup'], [], '', false
         );
         $provider = [];
@@ -106,10 +106,10 @@ class DataTest extends \PHPUnit_Framework_TestCase
         $attributesCount = 3;
         $attributes = [];
         for ($i = 1; $i < $attributesCount; $i++) {
-            $attribute = $this->getMock(
+            $attribute = $this->getMock(
                 \Magento\Framework\DataObject::class, ['getProductAttribute'], [], '', false
             );
-            $productAttribute = $this->getMock(
+            $productAttribute = $this->getMock(
                 \Magento\Framework\DataObject::class,
                 ['getId', 'getAttributeCode'],
                 [],
@@ -127,7 +127,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
                 ->will($this->returnValue($productAttribute));
             $attributes[] = $attribute;
         }
-        $typeInstanceMock = $this->getMock(
+        $typeInstanceMock = $this->getMock(
             \Magento\ConfigurableProduct\Model\Product\Type\Configurable::class, [], [], '', false
         );
         $typeInstanceMock->expects($this->any())
@@ -138,7 +138,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnValue($typeInstanceMock));
         $allowedProducts = [];
         for ($i = 1; $i <= 2; $i++) {
-            $productMock = $this->getMock(
+            $productMock = $this->getMock(
                 \Magento\Catalog\Model\Product::class, ['getData', 'getImage', 'getId', '__wakeup', 'getMediaGalleryImages'], [], '', false
             );
             $productMock->expects($this->any())
@@ -195,4 +195,64 @@ class DataTest extends \PHPUnit_Framework_TestCase
         }
         return $map[$key];
     }
+
+    public function testGetGalleryImages()
+    {
+        $productMock = $this->getMockBuilder(\Magento\Catalog\Api\Data\ProductInterface::class)
+            ->setMethods(['getMediaGalleryImages'])
+            ->getMockForAbstractClass();
+        $productMock->expects($this->once())
+            ->method('getMediaGalleryImages')
+            ->willReturn($this->getImagesCollection());
+
+        $this->_imageHelperMock->expects($this->exactly(3))
+            ->method('init')
+            ->willReturnMap([
+                [$productMock, 'product_page_image_small', [], $this->_imageHelperMock],
+                [$productMock, 'product_page_image_medium_no_frame', [], $this->_imageHelperMock],
+                [$productMock, 'product_page_image_large_no_frame', [], $this->_imageHelperMock],
+            ])
+            ->willReturnSelf();
+        $this->_imageHelperMock->expects($this->exactly(3))
+            ->method('setImageFile')
+            ->with('test_file')
+            ->willReturnSelf();
+        $this->_imageHelperMock->expects($this->at(0))
+            ->method('getUrl')
+            ->willReturn('product_page_image_small_url');
+        $this->_imageHelperMock->expects($this->at(1))
+            ->method('getUrl')
+            ->willReturn('product_page_image_medium_url');
+        $this->_imageHelperMock->expects($this->at(2))
+            ->method('getUrl')
+            ->willReturn('product_page_image_large_url');
+
+        $this->assertInstanceOf(
+            \Magento\Framework\Data\Collection::class,
+            $this->_model->getGalleryImages($productMock)
+        );
+
+    }
+
+    /**
+     * @return \Magento\Framework\Data\Collection
+     */
+    private function getImagesCollection()
+    {
+        $collectionMock = $this->getMockBuilder(\Magento\Framework\Data\Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $items = [
+            new \Magento\Framework\DataObject([
+                'file' => 'test_file'
+            ]),
+        ];
+
+        $collectionMock->expects($this->any())
+            ->method('getIterator')
+            ->willReturn(new \ArrayIterator($items));
+
+        return $collectionMock;
+    }
 }
diff --git a/app/code/Magento/Contact/etc/di.xml b/app/code/Magento/Contact/etc/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..95cd40cb55e3171e025e3482a290168799395212
--- /dev/null
+++ b/app/code/Magento/Contact/etc/di.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="contact/email/recipient_email" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
+</config>
diff --git a/app/code/Magento/Cron/Console/Command/CronInstallCommand.php b/app/code/Magento/Cron/Console/Command/CronInstallCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..2835244599d38943fea5b2162814bbd6b9edb32e
--- /dev/null
+++ b/app/code/Magento/Cron/Console/Command/CronInstallCommand.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cron\Console\Command;
+
+use Magento\Framework\Crontab\CrontabManagerInterface;
+use Magento\Framework\Crontab\TasksProviderInterface;
+use Magento\Framework\Exception\LocalizedException;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Magento\Framework\Console\Cli;
+use Symfony\Component\Console\Input\InputOption;
+
+/**
+ * CronInstallCommand installs Magento cron tasks
+ */
+class CronInstallCommand extends Command
+{
+    /**
+     * @var CrontabManagerInterface
+     */
+    private $crontabManager;
+
+    /**
+     * @var TasksProviderInterface
+     */
+    private $tasksProvider;
+
+    /**
+     * @param CrontabManagerInterface $crontabManager
+     * @param TasksProviderInterface $tasksProvider
+     */
+    public function __construct(
+        CrontabManagerInterface $crontabManager,
+        TasksProviderInterface $tasksProvider
+    ) {
+        $this->crontabManager = $crontabManager;
+        $this->tasksProvider = $tasksProvider;
+
+        parent::__construct();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->setName('cron:install')
+            ->setDescription('Generates and installs crontab for current user')
+            ->addOption('force', 'f', InputOption::VALUE_NONE, 'Force install tasks');
+
+        parent::configure();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        if ($this->crontabManager->getTasks() && !$input->getOption('force')) {
+            $output->writeln('<error>Crontab has already been generated and saved</error>');
+            return Cli::RETURN_FAILURE;
+        }
+
+        try {
+            $this->crontabManager->saveTasks($this->tasksProvider->getTasks());
+        } catch (LocalizedException $e) {
+            $output->writeln('<error>' . $e->getMessage() . '</error>');
+            return Cli::RETURN_FAILURE;
+        }
+
+        $output->writeln('<info>Crontab has been generated and saved</info>');
+
+        return Cli::RETURN_SUCCESS;
+    }
+}
diff --git a/app/code/Magento/Cron/Console/Command/CronRemoveCommand.php b/app/code/Magento/Cron/Console/Command/CronRemoveCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..11c666a556f899e9d7c6358c09291ee9df904998
--- /dev/null
+++ b/app/code/Magento/Cron/Console/Command/CronRemoveCommand.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cron\Console\Command;
+
+use Magento\Framework\Crontab\CrontabManagerInterface;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Magento\Framework\Console\Cli;
+use Magento\Framework\Exception\LocalizedException;
+
+/**
+ * CronRemoveCommand removes Magento cron tasks
+ */
+class CronRemoveCommand extends Command
+{
+    /**
+     * @var CrontabManagerInterface
+     */
+    private $crontabManager;
+
+    /**
+     * @param CrontabManagerInterface $crontabManager
+     */
+    public function __construct(CrontabManagerInterface $crontabManager)
+    {
+        $this->crontabManager = $crontabManager;
+
+        parent::__construct();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->setName('cron:remove')
+            ->setDescription('Removes tasks from crontab');
+
+        parent::configure();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        try {
+            $this->crontabManager->removeTasks();
+        } catch (LocalizedException $e) {
+            $output->writeln('<error>' . $e->getMessage() . '</error>');
+            return Cli::RETURN_FAILURE;
+        }
+
+        $output->writeln('<info>Magento cron tasks have been removed</info>');
+
+        return Cli::RETURN_SUCCESS;
+    }
+}
diff --git a/app/code/Magento/Cron/Test/Unit/Console/Command/CronInstallCommandTest.php b/app/code/Magento/Cron/Test/Unit/Console/Command/CronInstallCommandTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..09949cf78dc8f267fe2bb668d91f2b28032ed8c1
--- /dev/null
+++ b/app/code/Magento/Cron/Test/Unit/Console/Command/CronInstallCommandTest.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cron\Test\Unit\Console\Command;
+
+use Symfony\Component\Console\Tester\CommandTester;
+use Magento\Cron\Console\Command\CronInstallCommand;
+use Magento\Framework\Crontab\CrontabManagerInterface;
+use Magento\Framework\Crontab\TasksProviderInterface;
+use Magento\Framework\Console\Cli;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Phrase;
+
+class CronInstallCommandTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var CrontabManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $crontabManagerMock;
+
+    /**
+     * @var TasksProviderInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $tasksProviderMock;
+
+    /**
+     * @var CommandTester
+     */
+    private $commandTester;
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $this->crontabManagerMock = $this->getMockBuilder(CrontabManagerInterface::class)
+            ->getMockForAbstractClass();
+        $this->tasksProviderMock = $this->getMockBuilder(TasksProviderInterface::class)
+            ->getMockForAbstractClass();
+
+        $this->commandTester = new CommandTester(
+            new CronInstallCommand($this->crontabManagerMock, $this->tasksProviderMock)
+        );
+    }
+
+    /**
+     * @return void
+     */
+    public function testExecuteAlreadyInstalled()
+    {
+        $this->crontabManagerMock->expects($this->once())
+            ->method('getTasks')
+            ->willReturn([['* * * * * /bin/php /var/run.php']]);
+        $this->tasksProviderMock->expects($this->never())
+            ->method('getTasks');
+
+        $this->commandTester->execute([]);
+        $this->assertEquals(
+            'Crontab has already been generated and saved' . PHP_EOL,
+            $this->commandTester->getDisplay()
+        );
+        $this->assertEquals(Cli::RETURN_FAILURE, $this->commandTester->getStatusCode());
+    }
+
+    /**
+     * @return void
+     */
+    public function testExecuteWithException()
+    {
+        $this->crontabManagerMock->expects($this->once())
+            ->method('getTasks')
+            ->willReturn([]);
+        $this->tasksProviderMock->expects($this->once())
+            ->method('getTasks')
+            ->willReturn([]);
+        $this->crontabManagerMock->expects($this->once())
+            ->method('saveTasks')
+            ->willThrowException(new LocalizedException(new Phrase('Some error')));
+
+        $this->commandTester->execute([]);
+        $this->assertEquals(
+            'Some error' . PHP_EOL,
+            $this->commandTester->getDisplay()
+        );
+        $this->assertEquals(Cli::RETURN_FAILURE, $this->commandTester->getStatusCode());
+    }
+
+    /**
+     * @param array $existingTasks
+     * @param array $options
+     * @return void
+     * @dataProvider executeDataProvider
+     */
+    public function testExecute($existingTasks, $options)
+    {
+        $this->crontabManagerMock->expects($this->once())
+            ->method('getTasks')
+            ->willReturn($existingTasks);
+        $this->tasksProviderMock->expects($this->once())
+            ->method('getTasks')
+            ->willReturn([]);
+        $this->crontabManagerMock->expects($this->once())
+            ->method('saveTasks')
+            ->with([]);
+
+        $this->commandTester->execute($options);
+        $this->assertEquals(
+            'Crontab has been generated and saved' . PHP_EOL,
+            $this->commandTester->getDisplay()
+        );
+        $this->assertEquals(Cli::RETURN_SUCCESS, $this->commandTester->getStatusCode());
+    }
+
+    /**
+     * @return array
+     */
+    public function executeDataProvider()
+    {
+        return [
+            ['existingTasks' => [], 'options' => []],
+            ['existingTasks' => ['* * * * * /bin/php /var/www/run.php'], 'options' => ['-f'=> true]]
+        ];
+    }
+}
diff --git a/app/code/Magento/Cron/Test/Unit/Console/Command/CronRemoveCommandTest.php b/app/code/Magento/Cron/Test/Unit/Console/Command/CronRemoveCommandTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cd017b26d758578482bffa137a3f221650619bae
--- /dev/null
+++ b/app/code/Magento/Cron/Test/Unit/Console/Command/CronRemoveCommandTest.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cron\Test\Unit\Console\Command;
+
+use Symfony\Component\Console\Tester\CommandTester;
+use Magento\Cron\Console\Command\CronRemoveCommand;
+use Magento\Framework\Crontab\CrontabManagerInterface;
+use Magento\Framework\Console\Cli;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Phrase;
+
+class CronRemoveCommandTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var CrontabManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $crontabManagerMock;
+
+    /**
+     * @var CommandTester
+     */
+    private $commandTester;
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $this->crontabManagerMock = $this->getMockBuilder(CrontabManagerInterface::class)
+            ->getMockForAbstractClass();
+
+        $this->commandTester = new CommandTester(
+            new CronRemoveCommand($this->crontabManagerMock)
+        );
+    }
+
+    /**
+     * @return void
+     */
+    public function testExecute()
+    {
+        $this->crontabManagerMock->expects($this->once())
+            ->method('RemoveTasks');
+
+        $this->commandTester->execute([]);
+        $this->assertEquals(
+            'Magento cron tasks have been removed' . PHP_EOL,
+            $this->commandTester->getDisplay()
+        );
+        $this->assertEquals(Cli::RETURN_SUCCESS, $this->commandTester->getStatusCode());
+    }
+
+    /**
+     * @return void
+     */
+    public function testExecuteFailed()
+    {
+        $this->crontabManagerMock->expects($this->once())
+            ->method('RemoveTasks')
+            ->willThrowException(new LocalizedException(new Phrase('Some error')));
+
+        $this->commandTester->execute([]);
+        $this->assertEquals(
+            'Some error' . PHP_EOL,
+            $this->commandTester->getDisplay()
+        );
+        $this->assertEquals(Cli::RETURN_FAILURE, $this->commandTester->getStatusCode());
+    }
+}
diff --git a/app/code/Magento/Cron/etc/di.xml b/app/code/Magento/Cron/etc/di.xml
index d5624e96765c58bd699eebc29c14c7fe76037b7a..6abc9096f24012309a3b56cb0b84912d3a8d1e26 100644
--- a/app/code/Magento/Cron/etc/di.xml
+++ b/app/code/Magento/Cron/etc/di.xml
@@ -8,6 +8,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
     <preference for="Magento\Cron\Model\ConfigInterface" type="Magento\Cron\Model\Config" />
     <preference for="Magento\Framework\Shell\CommandRendererInterface" type="Magento\Framework\Shell\CommandRenderer" />
+    <preference for="Magento\Framework\Crontab\CrontabManagerInterface" type="Magento\Framework\Crontab\CrontabManager" />
+    <preference for="Magento\Framework\Crontab\TasksProviderInterface" type="Magento\Framework\Crontab\TasksProvider" />
     <type name="Magento\Config\Model\Config\Structure\Converter">
         <plugin name="cron_backend_config_structure_converter_plugin" type="Magento\Cron\Model\Backend\Config\Structure\Converter" />
     </type>
@@ -28,6 +30,8 @@
         <arguments>
             <argument name="commands" xsi:type="array">
                 <item name="cronCommand" xsi:type="object">Magento\Cron\Console\Command\CronCommand</item>
+                <item name="cronInstall" xsi:type="object">Magento\Cron\Console\Command\CronInstallCommand</item>
+                <item name="cronRemove" xsi:type="object">Magento\Cron\Console\Command\CronRemoveCommand</item>
             </argument>
         </arguments>
     </type>
@@ -38,4 +42,24 @@
             </argument>
         </arguments>
     </type>
+    <type name="Magento\Framework\Crontab\CrontabManager">
+        <arguments>
+            <argument name="shell" xsi:type="object">Magento\Framework\App\Shell</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\Crontab\TasksProviderInterface">
+        <arguments>
+            <argument name="tasks" xsi:type="array">
+                <item name="cronMagento" xsi:type="array">
+                    <item name="command" xsi:type="string">{magentoRoot}bin/magento cron:run | grep -v "Ran jobs by schedule" >> {magentoLog}magento.cron.log</item>
+                </item>
+                <item name="cronUpdate" xsi:type="array">
+                    <item name="command" xsi:type="string">{magentoRoot}update/cron.php >> {magentoLog}update.cron.log</item>
+                </item>
+                <item name="cronSetup" xsi:type="array">
+                    <item name="command" xsi:type="string">{magentoRoot}bin/magento setup:cron:run >> {magentoLog}setup.cron.log</item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Customer/Model/Address/AbstractAddress.php b/app/code/Magento/Customer/Model/Address/AbstractAddress.php
index 7b32da94ddedb476eda579521c1a19c002618ec4..786c5f9770a2e56123983c7b82c63ea369bec0a4 100644
--- a/app/code/Magento/Customer/Model/Address/AbstractAddress.php
+++ b/app/code/Magento/Customer/Model/Address/AbstractAddress.php
@@ -554,6 +554,8 @@ class AbstractAddress extends AbstractExtensibleModel implements AddressModelInt
     /**
      * Validate address attribute values
      *
+     *
+     *
      * @return bool|array
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
@@ -562,23 +564,24 @@ class AbstractAddress extends AbstractExtensibleModel implements AddressModelInt
     {
         $errors = [];
         if (!\Zend_Validate::is($this->getFirstname(), 'NotEmpty')) {
-            $errors[] = __('Please enter the first name.');
+            $errors[] = __('%fieldName is a required field.', ['fieldName' => 'firstname']);
         }
 
         if (!\Zend_Validate::is($this->getLastname(), 'NotEmpty')) {
-            $errors[] = __('Please enter the last name.');
+            $errors[] = __('%fieldName is a required field.', ['fieldName' => 'lastname']);
         }
 
         if (!\Zend_Validate::is($this->getStreetLine(1), 'NotEmpty')) {
-            $errors[] = __('Please enter the street.');
+            $errors[] = __('%fieldName is a required field.', ['fieldName' => 'street']);
         }
 
         if (!\Zend_Validate::is($this->getCity(), 'NotEmpty')) {
-            $errors[] = __('Please enter the city.');
+            $errors[] = __('%fieldName is a required field.', ['fieldName' => 'city']);
         }
 
         if (!\Zend_Validate::is($this->getTelephone(), 'NotEmpty')) {
-            $errors[] = __('Please enter the phone number.');
+            $errors[] = __('%fieldName is a required field.', ['fieldName' => 'telephone']);
+
         }
 
         $_havingOptionalZip = $this->_directoryData->getCountriesWithOptionalZip();
@@ -590,11 +593,11 @@ class AbstractAddress extends AbstractExtensibleModel implements AddressModelInt
             'NotEmpty'
         )
         ) {
-            $errors[] = __('Please enter the zip/postal code.');
+            $errors[] = __('%fieldName is a required field.', ['fieldName' => 'postcode']);
         }
 
         if (!\Zend_Validate::is($this->getCountryId(), 'NotEmpty')) {
-            $errors[] = __('Please enter the country.');
+            $errors[] = __('%fieldName is a required field.', ['fieldName' => 'countryId']);
         }
 
         if ($this->getCountryModel()->getRegionCollection()->getSize() && !\Zend_Validate::is(
@@ -604,7 +607,7 @@ class AbstractAddress extends AbstractExtensibleModel implements AddressModelInt
             $this->getCountryId()
         )
         ) {
-            $errors[] = __('Please enter the state/province.');
+            $errors[] = __('%fieldName is a required field.', ['fieldName' => 'regionId']);
         }
 
         if (empty($errors) || $this->getShouldIgnoreValidation()) {
diff --git a/app/code/Magento/Customer/Model/Customer/DataProvider.php b/app/code/Magento/Customer/Model/Customer/DataProvider.php
index 2f46459a794eca284e91c1dddf3c2e39def0cd9f..b01b8b7d833e278d8d8f157910f9056e20099222 100644
--- a/app/code/Magento/Customer/Model/Customer/DataProvider.php
+++ b/app/code/Magento/Customer/Model/Customer/DataProvider.php
@@ -271,23 +271,18 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
         ) {
             $stat = $fileProcessor->getStat($file);
             $viewUrl = $fileProcessor->getViewUrl($file, $attribute->getFrontendInput());
-        }
-
-        $fileName = $file;
-        if (strrpos($fileName, '/') !== false) {
-            $fileName = substr($fileName, strrpos($fileName, '/') + 1);
-        }
 
-        if (!empty($file)) {
             return [
                 [
                     'file' => $file,
                     'size' => isset($stat) ? $stat['size'] : 0,
                     'url' => isset($viewUrl) ? $viewUrl : '',
-                    'name' => $fileName,
+                    'name' => basename($file),
+                    'type' => $fileProcessor->getMimeType($file),
                 ],
             ];
         }
+
         return [];
     }
 
diff --git a/app/code/Magento/Customer/Model/FileProcessor.php b/app/code/Magento/Customer/Model/FileProcessor.php
index c98a85cc18463306b3360982b336a945ed63de3c..3e0ae375fcff132cb90d85ddfff0b71b04aa66e4 100644
--- a/app/code/Magento/Customer/Model/FileProcessor.php
+++ b/app/code/Magento/Customer/Model/FileProcessor.php
@@ -5,17 +5,6 @@
  */
 namespace Magento\Customer\Model;
 
-use Magento\Customer\Api\AddressMetadataInterface;
-use Magento\Customer\Api\CustomerMetadataInterface;
-use Magento\Framework\App\Filesystem\DirectoryList;
-use Magento\Framework\Exception\LocalizedException;
-use Magento\Framework\Filesystem;
-use Magento\Framework\Filesystem\Directory\WriteInterface;
-use Magento\Framework\Url\EncoderInterface;
-use Magento\Framework\UrlInterface;
-use Magento\MediaStorage\Model\File\Uploader;
-use Magento\MediaStorage\Model\File\UploaderFactory;
-
 class FileProcessor
 {
     /**
@@ -24,22 +13,22 @@ class FileProcessor
     const TMP_DIR = 'tmp';
 
     /**
-     * @var WriteInterface
+     * @var \Magento\Framework\Filesystem\Directory\WriteInterface
      */
     private $mediaDirectory;
 
     /**
-     * @var UploaderFactory
+     * @var \Magento\MediaStorage\Model\File\UploaderFactory
      */
     private $uploaderFactory;
 
     /**
-     * @var UrlInterface
+     * @var \Magento\Framework\UrlInterface
      */
     private $urlBuilder;
 
     /**
-     * @var EncoderInterface
+     * @var \Magento\Framework\Url\EncoderInterface
      */
     private $urlEncoder;
 
@@ -54,26 +43,34 @@ class FileProcessor
     private $allowedExtensions = [];
 
     /**
-     * @param Filesystem $filesystem
-     * @param UploaderFactory $uploaderFactory
-     * @param UrlInterface $urlBuilder
-     * @param EncoderInterface $urlEncoder
+     * @var \Magento\Framework\File\Mime
+     */
+    private $mime;
+
+    /**
+     * @param \Magento\Framework\Filesystem $filesystem
+     * @param \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory
+     * @param \Magento\Framework\UrlInterface $urlBuilder
+     * @param \Magento\Framework\Url\EncoderInterface $urlEncoder
      * @param string $entityTypeCode
+     * @param \Magento\Framework\File\Mime $mime
      * @param array $allowedExtensions
      */
     public function __construct(
-        Filesystem $filesystem,
-        UploaderFactory $uploaderFactory,
-        UrlInterface $urlBuilder,
-        EncoderInterface $urlEncoder,
+        \Magento\Framework\Filesystem $filesystem,
+        \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory,
+        \Magento\Framework\UrlInterface $urlBuilder,
+        \Magento\Framework\Url\EncoderInterface $urlEncoder,
         $entityTypeCode,
+        \Magento\Framework\File\Mime $mime,
         array $allowedExtensions = []
     ) {
-        $this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
+        $this->mediaDirectory = $filesystem->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA);
         $this->uploaderFactory = $uploaderFactory;
         $this->urlBuilder = $urlBuilder;
         $this->urlEncoder = $urlEncoder;
         $this->entityTypeCode = $entityTypeCode;
+        $this->mime = $mime;
         $this->allowedExtensions = $allowedExtensions;
     }
 
@@ -107,6 +104,21 @@ class FileProcessor
         return $result;
     }
 
+    /**
+     * Retrieve MIME type of requested file
+     *
+     * @param string $fileName
+     * @return string
+     */
+    public function getMimeType($fileName)
+    {
+        $filePath = $this->entityTypeCode . '/' . ltrim($fileName, '/');
+        $absoluteFilePath = $this->mediaDirectory->getAbsolutePath($filePath);
+
+        $result = $this->mime->getMimeType($absoluteFilePath);
+        return $result;
+    }
+
     /**
      * Check if the file exists
      *
@@ -132,13 +144,13 @@ class FileProcessor
     {
         $viewUrl = '';
 
-        if ($this->entityTypeCode == AddressMetadataInterface::ENTITY_TYPE_ADDRESS) {
+        if ($this->entityTypeCode == \Magento\Customer\Api\AddressMetadataInterface::ENTITY_TYPE_ADDRESS) {
             $filePath = $this->entityTypeCode . '/' . ltrim($filePath, '/');
-            $viewUrl = $this->urlBuilder->getBaseUrl(['_type' => UrlInterface::URL_TYPE_MEDIA])
+            $viewUrl = $this->urlBuilder->getBaseUrl(['_type' => \Magento\Framework\UrlInterface::URL_TYPE_MEDIA])
                 . $this->mediaDirectory->getRelativePath($filePath);
         }
 
-        if ($this->entityTypeCode == CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER) {
+        if ($this->entityTypeCode == \Magento\Customer\Api\CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER) {
             $viewUrl = $this->urlBuilder->getUrl(
                 'customer/index/viewfile',
                 [$type => $this->urlEncoder->encode(ltrim($filePath, '/'))]
@@ -153,11 +165,11 @@ class FileProcessor
      *
      * @param string $fileId
      * @return \string[]
-     * @throws LocalizedException
+     * @throws \Magento\Framework\Exception\LocalizedException
      */
     public function saveTemporaryFile($fileId)
     {
-        /** @var Uploader $uploader */
+        /** @var \Magento\MediaStorage\Model\File\Uploader $uploader */
         $uploader = $this->uploaderFactory->create(['fileId' => $fileId]);
         $uploader->setFilesDispersion(false);
         $uploader->setFilenamesCaseSensitivity(false);
@@ -170,7 +182,9 @@ class FileProcessor
 
         $result = $uploader->save($path);
         if (!$result) {
-            throw new LocalizedException(__('File can not be saved to the destination folder.'));
+            throw new \Magento\Framework\Exception\LocalizedException(
+                __('File can not be saved to the destination folder.')
+            );
         }
 
         return $result;
@@ -181,28 +195,28 @@ class FileProcessor
      *
      * @param string $fileName
      * @return string
-     * @throws LocalizedException
+     * @throws \Magento\Framework\Exception\LocalizedException
      */
     public function moveTemporaryFile($fileName)
     {
         $fileName = ltrim($fileName, '/');
 
-        $dispersionPath = Uploader::getDispretionPath($fileName);
+        $dispersionPath = \Magento\MediaStorage\Model\File\Uploader::getDispretionPath($fileName);
         $destinationPath = $this->entityTypeCode . $dispersionPath;
 
         if (!$this->mediaDirectory->create($destinationPath)) {
-            throw new LocalizedException(
+            throw new \Magento\Framework\Exception\LocalizedException(
                 __('Unable to create directory %1.', $destinationPath)
             );
         }
 
         if (!$this->mediaDirectory->isWritable($destinationPath)) {
-            throw new LocalizedException(
+            throw new \Magento\Framework\Exception\LocalizedException(
                 __('Destination folder is not writable or does not exists.')
             );
         }
 
-        $destinationFileName = Uploader::getNewFileName(
+        $destinationFileName = \Magento\MediaStorage\Model\File\Uploader::getNewFileName(
             $this->mediaDirectory->getAbsolutePath($destinationPath) . '/' . $fileName
         );
 
@@ -212,7 +226,7 @@ class FileProcessor
                 $destinationPath . '/' . $destinationFileName
             );
         } catch (\Exception $e) {
-            throw new LocalizedException(
+            throw new \Magento\Framework\Exception\LocalizedException(
                 __('Something went wrong while saving the file.')
             );
         }
diff --git a/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php b/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
index 67d4ea32369ba8a37fef329d2aec809037fcac75..24df57e07e84826dcd7a19cdd84e5e6ca70ac37c 100644
--- a/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
+++ b/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
@@ -124,8 +124,12 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf
             $addressModel->updateData($address);
         }
 
-        $inputException = $this->_validate($addressModel);
-        if ($inputException->wasErrorAdded()) {
+        $errors = $addressModel->validate();
+        if ($errors !== true) {
+            $inputException = new InputException();
+            foreach ($errors as $error) {
+                $inputException->addError($error);
+            }
             throw $inputException;
         }
         $addressModel->save();
@@ -255,70 +259,6 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf
         return true;
     }
 
-    /**
-     * Validate Customer Addresses attribute values.
-     *
-     * @param CustomerAddressModel $customerAddressModel the model to validate
-     * @return InputException
-     *
-     * @SuppressWarnings(PHPMD.NPathComplexity)
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     */
-    private function _validate(CustomerAddressModel $customerAddressModel)
-    {
-        $exception = new InputException();
-        if ($customerAddressModel->getShouldIgnoreValidation()) {
-            return $exception;
-        }
-
-        if (!\Zend_Validate::is($customerAddressModel->getFirstname(), 'NotEmpty')) {
-            $exception->addError(__('%fieldName is a required field.', ['fieldName' => 'firstname']));
-        }
-
-        if (!\Zend_Validate::is($customerAddressModel->getLastname(), 'NotEmpty')) {
-            $exception->addError(__('%fieldName is a required field.', ['fieldName' => 'lastname']));
-        }
-
-        if (!\Zend_Validate::is($customerAddressModel->getStreetLine(1), 'NotEmpty')) {
-            $exception->addError(__('%fieldName is a required field.', ['fieldName' => 'street']));
-        }
-
-        if (!\Zend_Validate::is($customerAddressModel->getCity(), 'NotEmpty')) {
-            $exception->addError(__('%fieldName is a required field.', ['fieldName' => 'city']));
-        }
-
-        if (!\Zend_Validate::is($customerAddressModel->getTelephone(), 'NotEmpty')) {
-            $exception->addError(__('%fieldName is a required field.', ['fieldName' => 'telephone']));
-        }
-
-        $havingOptionalZip = $this->directoryData->getCountriesWithOptionalZip();
-        if (!in_array($customerAddressModel->getCountryId(), $havingOptionalZip)
-            && !\Zend_Validate::is($customerAddressModel->getPostcode(), 'NotEmpty')
-        ) {
-            $exception->addError(__('%fieldName is a required field.', ['fieldName' => 'postcode']));
-        }
-
-        if (!\Zend_Validate::is($customerAddressModel->getCountryId(), 'NotEmpty')) {
-            $exception->addError(__('%fieldName is a required field.', ['fieldName' => 'countryId']));
-        }
-
-        if ($this->directoryData->isRegionRequired($customerAddressModel->getCountryId())) {
-            $regionCollection = $customerAddressModel->getCountryModel()->getRegionCollection();
-            if (!$regionCollection->count() && empty($customerAddressModel->getRegion())) {
-                $exception->addError(__('%fieldName is a required field.', ['fieldName' => 'region']));
-            } elseif (
-                $regionCollection->count()
-                && !in_array(
-                    $customerAddressModel->getRegionId(),
-                    array_column($regionCollection->getData(), 'region_id')
-                )
-            ) {
-                $exception->addError(__('%fieldName is a required field.', ['fieldName' => 'regionId']));
-            }
-        }
-        return $exception;
-    }
-
     /**
      * Retrieve collection processor
      *
diff --git a/app/code/Magento/Customer/Test/Unit/Model/Address/AbstractAddressTest.php b/app/code/Magento/Customer/Test/Unit/Model/Address/AbstractAddressTest.php
index 32112ccdeb1aec053955226a49eb1838f8c4276b..ba833221aba18cb2b4f2b1e90a9c8b59d78327f5 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/Address/AbstractAddressTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/Address/AbstractAddressTest.php
@@ -336,31 +336,31 @@ class AbstractAddressTest extends \PHPUnit_Framework_TestCase
         return [
             'firstname' => [
                 array_merge(array_diff_key($data, ['firstname' => '']), ['country_id' => $countryId++]),
-                ['Please enter the first name.'],
+                ['firstname is a required field.'],
             ],
             'lastname' => [
                 array_merge(array_diff_key($data, ['lastname' => '']), ['country_id' => $countryId++]),
-                ['Please enter the last name.'],
+                ['lastname is a required field.'],
             ],
             'street' => [
                 array_merge(array_diff_key($data, ['street' => '']), ['country_id' => $countryId++]),
-                ['Please enter the street.'],
+                ['street is a required field.'],
             ],
             'city' => [
                 array_merge(array_diff_key($data, ['city' => '']), ['country_id' => $countryId++]),
-                ['Please enter the city.'],
+                ['city is a required field.'],
             ],
             'telephone' => [
                 array_merge(array_diff_key($data, ['telephone' => '']), ['country_id' => $countryId++]),
-                ['Please enter the phone number.'],
+                ['telephone is a required field.'],
             ],
             'postcode' => [
                 array_merge(array_diff_key($data, ['postcode' => '']), ['country_id' => $countryId++]),
-                ['Please enter the zip/postal code.'],
+                ['postcode is a required field.'],
             ],
             'country_id' => [
                 array_diff_key($data, ['country_id' => '']),
-                ['Please enter the country.'],
+                ['countryId is a required field.'],
             ],
             'validated' => [array_merge($data, ['country_id' => $countryId++]), true],
         ];
diff --git a/app/code/Magento/Customer/Test/Unit/Model/Customer/DataProviderTest.php b/app/code/Magento/Customer/Test/Unit/Model/Customer/DataProviderTest.php
index e594432b5bd66358a2ed13f3d93d41f26f73a7bd..1077736bd44651d470591141fd1cdb230de8cb1e 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/Customer/DataProviderTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/Customer/DataProviderTest.php
@@ -688,6 +688,7 @@ class DataProviderTest extends \PHPUnit_Framework_TestCase
 
         $filename = '/filename.ext1';
         $viewUrl = 'viewUrl';
+        $mime = 'image/png';
 
         $expectedData = [
             $customerId => [
@@ -699,6 +700,7 @@ class DataProviderTest extends \PHPUnit_Framework_TestCase
                             'size' => 1,
                             'url' => $viewUrl,
                             'name' => 'filename.ext1',
+                            'type' => $mime,
                         ],
                     ],
                 ],
@@ -778,6 +780,10 @@ class DataProviderTest extends \PHPUnit_Framework_TestCase
             ->method('getViewUrl')
             ->with('/filename.ext1', 'image')
             ->willReturn($viewUrl);
+        $this->fileProcessor->expects($this->once())
+            ->method('getMimeType')
+            ->with($filename)
+            ->willReturn($mime);
 
         $objectManager = new ObjectManager($this);
         $dataProvider = $objectManager->getObject(
diff --git a/app/code/Magento/Customer/Test/Unit/Model/FileProcessorTest.php b/app/code/Magento/Customer/Test/Unit/Model/FileProcessorTest.php
index 69064dbc1a420106a26bc6daba0a35db4b82800d..8a0cacf02baa2d20d9187acb9240d28a39b1a374 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/FileProcessorTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/FileProcessorTest.php
@@ -37,6 +37,11 @@ class FileProcessorTest extends \PHPUnit_Framework_TestCase
      */
     private $mediaDirectory;
 
+    /**
+     * @var \Magento\Framework\File\Mime|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $mime;
+
     protected function setUp()
     {
         $this->mediaDirectory = $this->getMockBuilder(\Magento\Framework\Filesystem\Directory\WriteInterface::class)
@@ -60,6 +65,10 @@ class FileProcessorTest extends \PHPUnit_Framework_TestCase
 
         $this->urlEncoder = $this->getMockBuilder(\Magento\Framework\Url\EncoderInterface::class)
             ->getMockForAbstractClass();
+
+        $this->mime = $this->getMockBuilder(\Magento\Framework\File\Mime::class)
+            ->disableOriginalConstructor()
+            ->getMock();
     }
 
     private function getModel($entityTypeCode, array $allowedExtensions = [])
@@ -70,6 +79,7 @@ class FileProcessorTest extends \PHPUnit_Framework_TestCase
             $this->urlBuilder,
             $this->urlEncoder,
             $entityTypeCode,
+            $this->mime,
             $allowedExtensions
         );
         return $model;
@@ -376,4 +386,26 @@ class FileProcessorTest extends \PHPUnit_Framework_TestCase
         $model = $this->getModel(CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER);
         $model->moveTemporaryFile($filePath);
     }
+
+    public function testGetMimeType()
+    {
+        $fileName = '/filename.ext1';
+        $absoluteFilePath = '/absolute_path/customer/filename.ext1';
+
+        $expected = 'ext1';
+
+        $this->mediaDirectory->expects($this->once())
+            ->method('getAbsolutePath')
+            ->with(CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER . '/' . ltrim($fileName, '/'))
+            ->willReturn($absoluteFilePath);
+
+        $this->mime->expects($this->once())
+            ->method('getMimeType')
+            ->with($absoluteFilePath)
+            ->willReturn($expected);
+
+        $model = $this->getModel(CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER);
+
+        $this->assertEquals($expected, $model->getMimeType($fileName));
+    }
 }
diff --git a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/AddressRepositoryTest.php b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/AddressRepositoryTest.php
index b72a5f6a417d4ab77d2c025e1f43b6e58f72ccc2..5f6bc315acd16f6a79d82c5ee2566e240c6572a6 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/AddressRepositoryTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/AddressRepositoryTest.php
@@ -128,6 +128,7 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
                 'setCustomer',
                 'getCountryModel',
                 'getShouldIgnoreValidation',
+                'validate',
                 'save',
                 'getDataModel',
                 'getCustomerId',
@@ -191,6 +192,9 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->address->expects($this->once())
             ->method('setCustomer')
             ->with($this->customer);
+        $this->address->expects($this->once())
+            ->method('validate')
+            ->willReturn(true);
         $this->address->expects($this->once())
             ->method('save');
         $this->addressRegistry->expects($this->once())
@@ -208,9 +212,6 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->address->expects($this->once())
             ->method('getDataModel')
             ->willReturn($customerAddress);
-        $this->address->expects($this->once())
-            ->method('getShouldIgnoreValidation')
-            ->willReturn(true);
 
         $this->repository->save($customerAddress);
     }
@@ -222,6 +223,7 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
     {
         $customerId = 34;
         $addressId = 53;
+        $errors[] = __('Please enter the state/province.');
         $customerAddress = $this->getMockForAbstractClass(
             \Magento\Customer\Api\Data\AddressInterface::class,
             [],
@@ -245,7 +247,9 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->address->expects($this->once())
             ->method('updateData')
             ->with($customerAddress);
-        $this->prepareMocksForInvalidAddressValidation();
+        $this->address->expects($this->once())
+            ->method('validate')
+            ->willReturn($errors);
 
         $this->repository->save($customerAddress);
     }
@@ -258,6 +262,7 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
     {
         $customerId = 34;
         $addressId = 53;
+        $errors[] = __('region is a required field.');
         $customerAddress = $this->getMockForAbstractClass(
             \Magento\Customer\Api\Data\AddressInterface::class,
             [],
@@ -281,60 +286,13 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->address->expects($this->once())
             ->method('updateData')
             ->with($customerAddress);
-        $countryModel = $this->getMock(\Magento\Directory\Model\Country::class, [], [], '', false);
-        $regionCollection = $this->getMock(
-            \Magento\Directory\Model\ResourceModel\Region\Collection::class,
-            [],
-            [],
-            '',
-            false
-        );
 
-        $this->address->expects($this->once())
-            ->method('getShouldIgnoreValidation')
-            ->willReturn(false);
-        $this->address->expects($this->atLeastOnce())
-            ->method('getCountryId')
-            ->willReturn(1);
-        $this->address->expects($this->once())
-            ->method('getFirstname')
-            ->willReturn('firstname');
-        $this->address->expects($this->once())
-            ->method('getLastname')
-            ->willReturn('lastname');
-        $this->address->expects($this->once())
-            ->method('getStreetLine')
-            ->with(1)
-            ->willReturn('street line');
-        $this->address->expects($this->once())
-            ->method('getCity')
-            ->willReturn('city');
-        $this->address->expects($this->once())
-            ->method('getTelephone')
-            ->willReturn('23423423423');
         $this->address->expects($this->never())
             ->method('getRegionId')
             ->willReturn(null);
-
-        $this->directoryData->expects($this->once())
-            ->method('getCountriesWithOptionalZip')
-            ->willReturn([1]);
-        $this->address->expects($this->once())
-            ->method('getCountryModel')
-            ->willReturn($countryModel);
-        $countryModel->expects($this->once())
-            ->method('getRegionCollection')
-            ->willReturn($regionCollection);
-        $regionCollection->expects($this->once())
-            ->method('count')
-            ->willReturn(0);
-        $this->directoryData->expects($this->once())
-            ->method('isRegionRequired')
-            ->with(1)
-            ->willReturn(true);
         $this->address->expects($this->once())
-            ->method('getRegion')
-            ->willReturn('');
+            ->method('validate')
+            ->willReturn($errors);
 
         $this->repository->save($customerAddress);
     }
@@ -347,6 +305,7 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
     {
         $customerId = 34;
         $addressId = 53;
+        $errors[] = __('regionId is a required field.');
         $customerAddress = $this->getMockForAbstractClass(
             \Magento\Customer\Api\Data\AddressInterface::class,
             [],
@@ -370,114 +329,14 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->address->expects($this->once())
             ->method('updateData')
             ->with($customerAddress);
-        $countryModel = $this->getMock(\Magento\Directory\Model\Country::class, [], [], '', false);
-        $regionCollection = $this->getMock(
-            \Magento\Directory\Model\ResourceModel\Region\Collection::class,
-            [],
-            [],
-            '',
-            false
-        );
-
-        $this->address->expects($this->once())
-            ->method('getShouldIgnoreValidation')
-            ->willReturn(false);
-        $this->address->expects($this->atLeastOnce())
-            ->method('getCountryId')
-            ->willReturn(1);
-        $this->address->expects($this->once())
-            ->method('getFirstname')
-            ->willReturn('firstname');
-        $this->address->expects($this->once())
-            ->method('getLastname')
-            ->willReturn('lastname');
-        $this->address->expects($this->once())
-            ->method('getStreetLine')
-            ->with(1)
-            ->willReturn('street line');
-        $this->address->expects($this->once())
-            ->method('getCity')
-            ->willReturn('city');
-        $this->address->expects($this->once())
-            ->method('getTelephone')
-            ->willReturn('23423423423');
-        $this->address->expects($this->once())
-            ->method('getRegionId')
-            ->willReturn(2);
-
-        $this->directoryData->expects($this->once())
-            ->method('getCountriesWithOptionalZip')
-            ->willReturn([1]);
-        $this->address->expects($this->once())
-            ->method('getCountryModel')
-            ->willReturn($countryModel);
-        $countryModel->expects($this->once())
-            ->method('getRegionCollection')
-            ->willReturn($regionCollection);
-        $regionCollection->expects($this->atLeastOnce())
-            ->method('count')
-            ->willReturn(2);
-        $regionCollection->expects($this->once())
-            ->method('getData')
-            ->willReturn([5, 6, 7, 8, 9]);
-        $this->directoryData->expects($this->once())
-            ->method('isRegionRequired')
-            ->with(1)
-            ->willReturn(true);
         $this->address->expects($this->never())
             ->method('getRegion')
             ->willReturn('');
-
-        $this->repository->save($customerAddress);
-    }
-
-    protected function prepareMocksForInvalidAddressValidation()
-    {
-        $countryModel = $this->getMock(\Magento\Directory\Model\Country::class, [], [], '', false);
-        $regionCollection = $this->getMock(
-            \Magento\Directory\Model\ResourceModel\Region\Collection::class,
-            [],
-            [],
-            '',
-            false
-        );
-
-        $this->address->expects($this->once())
-            ->method('getShouldIgnoreValidation')
-            ->willReturn(false);
-        $this->address->expects($this->atLeastOnce())
-            ->method('getCountryId');
-        $this->address->expects($this->once())
-            ->method('getFirstname');
-        $this->address->expects($this->once())
-            ->method('getLastname');
-        $this->address->expects($this->once())
-            ->method('getStreetLine')
-            ->with(1);
         $this->address->expects($this->once())
-            ->method('getCity');
-        $this->address->expects($this->once())
-            ->method('getTelephone');
-        $this->address->expects($this->never())
-            ->method('getRegionId')
-            ->willReturn(null);
+            ->method('validate')
+            ->willReturn($errors);
 
-        $this->directoryData->expects($this->once())
-            ->method('getCountriesWithOptionalZip')
-            ->willReturn([]);
-        $this->address->expects($this->once())
-            ->method('getCountryModel')
-            ->willReturn($countryModel);
-        $countryModel->expects($this->once())
-            ->method('getRegionCollection')
-            ->willReturn($regionCollection);
-        $regionCollection->expects($this->once())
-            ->method('count')
-            ->willReturn(0);
-        $this->directoryData->expects($this->once())
-            ->method('isRegionRequired')
-            ->with(null)
-            ->willReturn(true);
+        $this->repository->save($customerAddress);
     }
 
     public function testGetById()
diff --git a/app/code/Magento/Customer/Test/Unit/Ui/Component/Listing/Column/AccountLockTest.php b/app/code/Magento/Customer/Test/Unit/Ui/Component/Listing/Column/AccountLockTest.php
index c72cf9fddd0b7043759b0c1706e3018f51bce174..c6f113d56c38f587ffa10c0d21f3d6fe8a5c2ac2 100644
--- a/app/code/Magento/Customer/Test/Unit/Ui/Component/Listing/Column/AccountLockTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Ui/Component/Listing/Column/AccountLockTest.php
@@ -46,27 +46,9 @@ class AccountLockTest extends \PHPUnit_Framework_TestCase
      */
     public function testPrepareDataSource($lockExpirationDate, $expectedResult)
     {
-        $dataSource = [
-            'data' => [
-                'items' => [
-                    [
-                        'lock_expires' => $lockExpirationDate
-                    ],
-                ]
-            ]
-        ];
-        $expectedDataSource = [
-            'data' => [
-                'items' => [
-                    [
-                        'lock_expires' => $expectedResult,
-                    ],
-                ]
-            ]
-        ];
-        $dataSource = $this->component->prepareDataSource($dataSource);
+        $dataSource = $this->component->prepareDataSource($lockExpirationDate);
 
-        $this->assertEquals($expectedDataSource, $dataSource);
+        $this->assertEquals($expectedResult, $dataSource);
     }
 
     /**
@@ -76,13 +58,77 @@ class AccountLockTest extends \PHPUnit_Framework_TestCase
     {
         return [
             [
-                'lockExpirationDate' => date("F j, Y", strtotime('-1 days')),
-                'expectedResult' => new \Magento\Framework\Phrase('Unlocked')
+                'lockExpirationDate' => [
+                    'data' => [
+                        'items' => [['lock_expires' => null]],
+                    ]
+                ],
+                'expectedResult' => [
+                    'data' => [
+                        'items' => [
+                            [
+                                'lock_expires' => new \Magento\Framework\Phrase('Unlocked')
+                            ],
+                        ]
+                    ]
+                ]
             ],
             [
-                'lockExpirationDate' => date("F j, Y", strtotime('+1 days')),
-                'expectedResult' => new \Magento\Framework\Phrase('Locked')
-            ]
+                'lockExpirationDate' => [
+                    'data' => [
+                        'items' => [[]]//Non exist lock_expires data
+                    ]
+                ],
+                'expectedResult' => [
+                    'data' => [
+                        'items' => [
+                            [
+                                'lock_expires' => new \Magento\Framework\Phrase('Unlocked')
+                            ],
+                        ]
+                    ]
+                ]
+            ],
+            [
+                'lockExpirationDate' => [
+                    'data' => [
+                        'items' => [
+                            [
+                                'lock_expires' => date("F j, Y", strtotime('-1 days'))
+                            ],
+                        ]
+                    ]
+                ],
+                'expectedResult' => [
+                    'data' => [
+                        'items' => [
+                            [
+                                'lock_expires' => new \Magento\Framework\Phrase('Unlocked')
+                            ],
+                        ]
+                    ]
+                ]
+            ],
+            [
+                'lockExpirationDate' => [
+                    'data' => [
+                        'items' => [
+                            [
+                                'lock_expires' => date("F j, Y", strtotime('+1 days'))
+                            ],
+                        ]
+                    ]
+                ],
+                'expectedResult' => [
+                    'data' => [
+                        'items' => [
+                            [
+                                'lock_expires' => new \Magento\Framework\Phrase('Locked')
+                            ],
+                        ]
+                    ]
+                ]
+            ],
         ];
     }
 }
diff --git a/app/code/Magento/Customer/Ui/Component/Listing/Column/AccountLock.php b/app/code/Magento/Customer/Ui/Component/Listing/Column/AccountLock.php
index 5e2e92e1c933e070c04b26713c067c51d14397e5..3622829f53f0cfd74c82820d32f56f6a11bb91ee 100644
--- a/app/code/Magento/Customer/Ui/Component/Listing/Column/AccountLock.php
+++ b/app/code/Magento/Customer/Ui/Component/Listing/Column/AccountLock.php
@@ -41,9 +41,13 @@ class AccountLock extends Column
     {
         if (isset($dataSource['data']['items'])) {
             foreach ($dataSource['data']['items'] as & $item) {
-                $lockExpires = new \DateTime($item['lock_expires']);
-                if ($lockExpires > new \DateTime()) {
-                    $item['lock_expires'] =  __('Locked');
+                if (array_key_exists('lock_expires', $item)) {
+                    $lockExpires = new \DateTime($item['lock_expires']);
+                    if ($lockExpires > new \DateTime()) {
+                        $item['lock_expires'] =  __('Locked');
+                    } else {
+                        $item['lock_expires'] = __('Unlocked');
+                    }
                 } else {
                     $item['lock_expires'] = __('Unlocked');
                 }
diff --git a/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php b/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php
index b4e4fef8fb2f941eaa56cc33b2df65f783fa0413..40b262e3e4f5176f87d306be8babb5cfb2ba1898 100644
--- a/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php
+++ b/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php
@@ -5,7 +5,7 @@
  */
 namespace Magento\Deploy\Console\Command\App;
 
-use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Framework\App\Config\ConfigSourceInterface;
 use Magento\Framework\App\DeploymentConfig\Writer;
 use Magento\Framework\Config\File\ConfigFilePool;
 use Magento\Framework\Console\Cli;
@@ -24,7 +24,7 @@ class ApplicationDumpCommand extends Command
     private $writer;
 
     /**
-     * @var SourceInterface[]
+     * @var ConfigSourceInterface[]
      */
     private $sources;
 
@@ -64,20 +64,29 @@ class ApplicationDumpCommand extends Command
     protected function execute(InputInterface $input, OutputInterface $output)
     {
         $dump = [];
+        $comments = [];
         foreach ($this->sources as $sourceData) {
-            /** @var SourceInterface $source */
+            /** @var ConfigSourceInterface $source */
             $source = $sourceData['source'];
             $namespace = $sourceData['namespace'];
             $dump[$namespace] = $source->get();
+            if (!empty($sourceData['comment'])) {
+                $comments[$namespace] = is_string($sourceData['comment'])
+                    ? $sourceData['comment']
+                    : $sourceData['comment']->get();
+            }
         }
-
         $this->writer
             ->saveConfig(
                 [ConfigFilePool::APP_CONFIG => $dump],
                 true,
-                ConfigFilePool::LOCAL
+                ConfigFilePool::LOCAL,
+                $comments
             );
+        if (!empty($comments)) {
+            $output->writeln($comments);
+        }
         $output->writeln('<info>Done.</info>');
-        return  Cli::RETURN_SUCCESS;
+        return Cli::RETURN_SUCCESS;
     }
 }
diff --git a/app/code/Magento/Developer/etc/di.xml b/app/code/Magento/Developer/etc/di.xml
index 80433242853b85378a31b50133716e8399084c29..2362aaa0780debfcdc0e55b270ed733dc1237e5b 100644
--- a/app/code/Magento/Developer/etc/di.xml
+++ b/app/code/Magento/Developer/etc/di.xml
@@ -252,4 +252,11 @@
             </argument>
         </arguments>
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="dev/restrict/allow_ips" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Dhl/etc/di.xml b/app/code/Magento/Dhl/etc/di.xml
index a215c2e82182535e14e659d20cf1f7db2317e915..cbe795791147cc03de7eb060c84108c6cbeb53fa 100644
--- a/app/code/Magento/Dhl/etc/di.xml
+++ b/app/code/Magento/Dhl/etc/di.xml
@@ -9,4 +9,13 @@
     <type name="Magento\Checkout\Block\Cart\LayoutProcessor">
         <plugin name="checkout_cart_shipping_dhl" type="Magento\Dhl\Model\Plugin\Checkout\Block\Cart\Shipping"/>
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="carriers/dhl/id" xsi:type="string">1</item>
+                <item name="carriers/dhl/password" xsi:type="string">1</item>
+                <item name="carriers/dhl/account" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Directory/Model/ResourceModel/Region/Collection.php b/app/code/Magento/Directory/Model/ResourceModel/Region/Collection.php
index 3fdb20165d4bea912e42c94e14c5c0b3e01cdf8e..7d3f63e257e5e23ecf49c3845d34aad0ced2287f 100644
--- a/app/code/Magento/Directory/Model/ResourceModel/Region/Collection.php
+++ b/app/code/Magento/Directory/Model/ResourceModel/Region/Collection.php
@@ -253,7 +253,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         if (count($options) > 0) {
             array_unshift(
                 $options,
-                ['title' => null, 'value' => null, 'label' => __('Please select a region, state or province.')]
+                ['title' => '', 'value' => '', 'label' => __('Please select a region, state or province.')]
             );
         }
         return $options;
diff --git a/app/code/Magento/Directory/etc/di.xml b/app/code/Magento/Directory/etc/di.xml
index f868197e60593cb59292a060b473f1d87d55820e..b4da40d119fe3e2269d1d33f47c5e2009a3379b1 100644
--- a/app/code/Magento/Directory/etc/di.xml
+++ b/app/code/Magento/Directory/etc/di.xml
@@ -47,4 +47,12 @@
     <preference for="Magento\Directory\Api\CountryInformationAcquirerInterface" type="Magento\Directory\Model\CountryInformationAcquirer" />
     <preference for="Magento\Directory\Api\Data\CountryInformationInterface" type="Magento\Directory\Model\Data\CountryInformation" />
     <preference for="Magento\Directory\Api\Data\RegionInformationInterface" type="Magento\Directory\Model\Data\RegionInformation" />
+
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="currency/import/error_email" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Downloadable/view/adminhtml/web/template/components/file-uploader.html b/app/code/Magento/Downloadable/view/adminhtml/web/template/components/file-uploader.html
index 907c184dfce575c9ed1e9eb8a1be9de3c042f8f0..8cbe03034aa4408d3a84335dce6395e78427faae 100644
--- a/app/code/Magento/Downloadable/view/adminhtml/web/template/components/file-uploader.html
+++ b/app/code/Magento/Downloadable/view/adminhtml/web/template/components/file-uploader.html
@@ -1,3 +1,10 @@
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+
 <div class="admin__field-control">
     <div class="file-uploader" data-role="drop-zone" css="_loading: isLoading">
         <each args="data: value, as: '$file'">
@@ -16,4 +23,4 @@
             <span class="file-uploader-spinner"/>
         </div>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/app/code/Magento/GroupedProduct/Model/Product/Type/Grouped.php b/app/code/Magento/GroupedProduct/Model/Product/Type/Grouped.php
index 02ff894df7c1fb1ed6ec7b6af07f019cece1b8cb..74a7e8112aa0ddb528b46168a16df15310fd227c 100644
--- a/app/code/Magento/GroupedProduct/Model/Product/Type/Grouped.php
+++ b/app/code/Magento/GroupedProduct/Model/Product/Type/Grouped.php
@@ -202,7 +202,7 @@ class Grouped extends \Magento\Catalog\Model\Product\Type\AbstractType
             $collection = $this->getAssociatedProductCollection(
                 $product
             )->addAttributeToSelect(
-                ['name', 'price',  'special_price', 'special_from_date', 'special_to_date']
+                ['name', 'price', 'special_price', 'special_from_date', 'special_to_date', 'tax_class_id']
             )->addFilterByRequiredOptions()->setPositionOrder()->addStoreFilter(
                 $this->getStoreFilter($product)
             )->addAttributeToFilter(
diff --git a/app/code/Magento/NewRelicReporting/etc/di.xml b/app/code/Magento/NewRelicReporting/etc/di.xml
index caabf89be1871b05d55040d34f3b4b0e5b7a9120..6e3a24be91982e9f14b54228144157165094b1a5 100644
--- a/app/code/Magento/NewRelicReporting/etc/di.xml
+++ b/app/code/Magento/NewRelicReporting/etc/di.xml
@@ -12,4 +12,14 @@
             <argument name="fullModuleList" xsi:type="object">Magento\Framework\Module\FullModuleList</argument>
         </arguments>
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="newrelicreporting/general/account_id" xsi:type="string">1</item>
+                <item name="newrelicreporting/general/app_id" xsi:type="string">1</item>
+                <item name="newrelicreporting/general/api" xsi:type="string">1</item>
+                <item name="newrelicreporting/general/insights_insert_key" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Newsletter/Model/ResourceModel/Queue.php b/app/code/Magento/Newsletter/Model/ResourceModel/Queue.php
index 12375a5a6ca07404fbcf813c56dc76f3a404c5d3..b25677846622bf175fb6c80ae632132d2fb43e2d 100644
--- a/app/code/Magento/Newsletter/Model/ResourceModel/Queue.php
+++ b/app/code/Magento/Newsletter/Model/ResourceModel/Queue.php
@@ -80,13 +80,13 @@ class Queue extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
             $subscriberIds
         );
 
-        $usedIds = $connection->fetchCol($select);
+        $usedIds = array_flip($connection->fetchCol($select));
+        $subscriberIds = array_flip($subscriberIds);
+        $newIds = array_diff_key($subscriberIds, $usedIds);
+        
         $connection->beginTransaction();
         try {
-            foreach ($subscriberIds as $subscriberId) {
-                if (in_array($subscriberId, $usedIds)) {
-                    continue;
-                }
+            foreach (array_keys($newIds) as $subscriberId) {
                 $data = [];
                 $data['queue_id'] = $queue->getId();
                 $data['subscriber_id'] = $subscriberId;
diff --git a/app/code/Magento/Paypal/etc/di.xml b/app/code/Magento/Paypal/etc/di.xml
index c5cbdbdc51331c95a269581a97a8ee3a94c25e0f..940876451fd591984937faeae1deef5ac1e4ea60 100644
--- a/app/code/Magento/Paypal/etc/di.xml
+++ b/app/code/Magento/Paypal/etc/di.xml
@@ -182,4 +182,32 @@
             <argument name="paymentTokenFactory" xsi:type="object">Magento\Vault\Model\CreditCardTokenFactory</argument>
         </arguments>
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="paypal/general/business_account" xsi:type="string">1</item>
+                <item name="paypal/wpp/api_password" xsi:type="string">1</item>
+                <item name="paypal/wpp/api_signature" xsi:type="string">1</item>
+                <item name="paypal/wpp/api_username" xsi:type="string">1</item>
+                <item name="paypal/wpp/api_cert" xsi:type="string">1</item>
+                <item name="paypal/wpp/proxy_host" xsi:type="string">1</item>
+                <item name="paypal/wpp/proxy_port" xsi:type="string">1</item>
+                <item name="payment/paypal_express/merchant_id" xsi:type="string">1</item>
+                <item name="payment/paypal_express_bml/publisher_id" xsi:type="string">1</item>
+                <item name="paypal/fetch_reports/ftp_password" xsi:type="string">1</item>
+                <item name="paypal/fetch_reports/ftp_login" xsi:type="string">1</item>
+                <item name="paypal/fetch_reports/ftp_path" xsi:type="string">1</item>
+                <item name="paypal/fetch_reports/ftp_ip" xsi:type="string">1</item>
+                <item name="payment/payflow_advanced/user" xsi:type="string">1</item>
+                <item name="payment/payflow_advanced/pwd" xsi:type="string">1</item>
+                <item name="payment/payflow_link/user" xsi:type="string">1</item>
+                <item name="payment/payflow_link/pwd" xsi:type="string">1</item>
+                <item name="payment/payflowpro/user" xsi:type="string">1</item>
+                <item name="payment/payflowpro/pwd" xsi:type="string">1</item>
+                <item name="payment/payflowpro/partner" xsi:type="string">1</item>
+                <item name="payment/payflowpro/proxy_host" xsi:type="string">1</item>
+                <item name="payment/payflowpro/proxy_port" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Persistent/Model/Observer.php b/app/code/Magento/Persistent/Model/Observer.php
index 283d7bb45a5e832b0f4450a7633f6d27056d85ca..392d88a29a58137c04209a91107a4a4cc2f7001d 100644
--- a/app/code/Magento/Persistent/Model/Observer.php
+++ b/app/code/Magento/Persistent/Model/Observer.php
@@ -121,6 +121,13 @@ class Observer
     public function emulateTopLinks($block)
     {
         $this->_applyAccountLinksPersistentData();
-        $block->removeLinkByUrl($this->_url->getUrl('customer/account/login'));
+        /** @var \Magento\Framework\View\Element\Html\Link[] $links */
+        $links = $block->getLinks();
+        $removeLink = $this->_url->getUrl('customer/account/login');
+        foreach ($links as $link) {
+            if ($link->getHref() == $removeLink) {
+                $this->_layout->unsetChild($block->getNameInLayout(), $link->getNameInLayout());
+            }
+        }
     }
 }
diff --git a/app/code/Magento/ProductAlert/composer.json b/app/code/Magento/ProductAlert/composer.json
index 9c63c6958a465852ea3148cab659102880b07630..4ed6a998b084eb25a93ec939ebe20c70c6a4e5c2 100644
--- a/app/code/Magento/ProductAlert/composer.json
+++ b/app/code/Magento/ProductAlert/composer.json
@@ -9,6 +9,9 @@
         "magento/module-customer": "100.2.*",
         "magento/framework": "100.2.*"
     },
+    "suggest": {
+        "magento/module-config": "100.2.*"
+    },
     "type": "magento2-module",
     "version": "100.2.0-dev",
     "license": [
diff --git a/app/code/Magento/ProductAlert/etc/di.xml b/app/code/Magento/ProductAlert/etc/di.xml
index 734b0f6695778bc38744f185da7b58eb0faf50a1..d5c81adce46f0c66f10d5b60226f0525e3fd4c54 100644
--- a/app/code/Magento/ProductAlert/etc/di.xml
+++ b/app/code/Magento/ProductAlert/etc/di.xml
@@ -13,4 +13,12 @@
             </argument>
         </arguments>
     </type>
+
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="catalog/productalert_cron/error_email" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/ProductVideo/composer.json b/app/code/Magento/ProductVideo/composer.json
index 08d21e4c2abbfb167aed2ca24c0ba012d6b2e8c8..726104c084677dfcb69e3721adfe63f4d71a7ecd 100644
--- a/app/code/Magento/ProductVideo/composer.json
+++ b/app/code/Magento/ProductVideo/composer.json
@@ -12,7 +12,8 @@
         "magento/magento-composer-installer": "*"
     },
     "suggest": {
-        "magento/module-customer": "100.2.*"
+        "magento/module-customer": "100.2.*",
+        "magento/module-config": "100.2.*"
     },
     "type": "magento2-module",
     "version": "100.2.0-dev",
diff --git a/app/code/Magento/ProductVideo/etc/di.xml b/app/code/Magento/ProductVideo/etc/di.xml
index 7242a9d48ce1e3c0da66a3f4d5953cda705132cd..9aad01caaf72b65bc1a49951cb84c2f28a2de5e0 100644
--- a/app/code/Magento/ProductVideo/etc/di.xml
+++ b/app/code/Magento/ProductVideo/etc/di.xml
@@ -46,4 +46,11 @@
     <type name="Magento\Catalog\Model\ResourceModel\Product\Gallery">
         <plugin name="external_video_media_resource_backend" type="Magento\ProductVideo\Model\Plugin\ExternalVideoResourceBackend" />
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="catalog/product_video/youtube_api_key" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Quote/Model/Product/Plugin/RemoveQuoteItems.php b/app/code/Magento/Quote/Model/Product/Plugin/RemoveQuoteItems.php
index 49d9be6bcf8ff748b00f67166856185b23a15f53..76af26e3c89cc651691f05f19a9689bedf823b1f 100644
--- a/app/code/Magento/Quote/Model/Product/Plugin/RemoveQuoteItems.php
+++ b/app/code/Magento/Quote/Model/Product/Plugin/RemoveQuoteItems.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\Quote\Model\Product\Plugin;
 
+use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
+
 class RemoveQuoteItems
 {
     /**
@@ -21,19 +23,17 @@ class RemoveQuoteItems
     }
 
     /**
-     * @param \Magento\Catalog\Model\ResourceModel\Product $subject
-     * @param \Closure $proceed
+     * @param ProductResource $subject
+     * @param ProductResource $result
      * @param \Magento\Catalog\Api\Data\ProductInterface $product
-     * @return mixed
+     * @return ProductResource
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
-     * TODO: reimplement with after plugin
      */
-    public function aroundDelete(
-        \Magento\Catalog\Model\ResourceModel\Product $subject,
-        \Closure $proceed,
+    public function afterDelete(
+        ProductResource $subject,
+        ProductResource $result,
         \Magento\Catalog\Api\Data\ProductInterface $product
     ) {
-        $result = $proceed($product);
         $this->quoteItemsCleaner->execute($product);
         return $result;
     }
diff --git a/app/code/Magento/Quote/Test/Unit/Model/Product/Plugin/RemoveQuoteItemsTest.php b/app/code/Magento/Quote/Test/Unit/Model/Product/Plugin/RemoveQuoteItemsTest.php
index 083722f3a1bb3d9044284f7f65ac1b1239b2d0c5..deb6aab3a980a54baf4c69289833d068a78c8d4d 100644
--- a/app/code/Magento/Quote/Test/Unit/Model/Product/Plugin/RemoveQuoteItemsTest.php
+++ b/app/code/Magento/Quote/Test/Unit/Model/Product/Plugin/RemoveQuoteItemsTest.php
@@ -23,16 +23,13 @@ class RemoveQuoteItemsTest extends \PHPUnit_Framework_TestCase
         $this->model = new \Magento\Quote\Model\Product\Plugin\RemoveQuoteItems($this->quoteItemsCleanerMock);
     }
 
-    public function testAroundDelete()
+    public function testAfterDelete()
     {
         $productResourceMock = $this->getMock(\Magento\Catalog\Model\ResourceModel\Product::class, [], [], '', false);
         $productMock = $this->getMock(\Magento\Catalog\Api\Data\ProductInterface::class);
-        $closure = function () use ($productResourceMock) {
-            return $productResourceMock;
-        };
 
         $this->quoteItemsCleanerMock->expects($this->once())->method('execute')->with($productMock);
-        $result = $this->model->aroundDelete($productResourceMock, $closure, $productMock);
+        $result = $this->model->afterDelete($productResourceMock, $productResourceMock, $productMock);
         $this->assertEquals($result, $productResourceMock);
     }
 }
diff --git a/app/code/Magento/Review/etc/di.xml b/app/code/Magento/Review/etc/di.xml
index d42d3e3330c670bce2c036cf8b100842f10a0a48..13f7d0b84bc505bb1fd66c9e16e36e75367219e2 100644
--- a/app/code/Magento/Review/etc/di.xml
+++ b/app/code/Magento/Review/etc/di.xml
@@ -26,4 +26,9 @@
             <argument name="urlModel" xsi:type="object">Magento\Framework\Url</argument>
         </arguments>
     </type>
+    <type name="Magento\Review\Model\ResourceModel\Rating\Option">
+        <arguments>
+            <argument name="customerSession" xsi:type="object">Magento\Customer\Model\Session\Proxy</argument>
+        </arguments>
+    </type>    
 </config>
diff --git a/app/code/Magento/Review/view/frontend/templates/review.phtml b/app/code/Magento/Review/view/frontend/templates/review.phtml
index c3f64511b151226854c3a569740e939e58d87d44..c332a1b4c874cae00c9e93103073e6a3a2910a2b 100644
--- a/app/code/Magento/Review/view/frontend/templates/review.phtml
+++ b/app/code/Magento/Review/view/frontend/templates/review.phtml
@@ -13,7 +13,8 @@
     {
         "*": {
             "Magento_Review/js/process-reviews": {
-                "productReviewUrl": "<?php echo $block->escapeJs($block->escapeUrl($block->getProductReviewUrl())); ?>"
+                "productReviewUrl": "<?php echo $block->escapeJs($block->escapeUrl($block->getProductReviewUrl())); ?>",
+                "reviewsTabSelector": "#tab-label-reviews"
             }
         }
     }
diff --git a/app/code/Magento/Review/view/frontend/web/js/process-reviews.js b/app/code/Magento/Review/view/frontend/web/js/process-reviews.js
index 124b59becf1cbc569b191f5e61b274fba0e7494f..8ba22caf292319e1c259d198cbea92b989084f3d 100644
--- a/app/code/Magento/Review/view/frontend/web/js/process-reviews.js
+++ b/app/code/Magento/Review/view/frontend/web/js/process-reviews.js
@@ -11,7 +11,9 @@ define([
         $.ajax({
             url: url,
             cache: true,
-            dataType: 'html'
+            dataType: 'html',
+            showLoader: true,
+            loaderContext: $('.product.data.items')
         }).done(function (data) {
             $('#product-review-container').html(data);
             $('[data-role="product-review"] .pages a').each(function (index, element) {
@@ -30,7 +32,17 @@ define([
     }
 
     return function (config, element) {
-        processReviews(config.productReviewUrl);
+        var reviewTab = $(config.reviewsTabSelector);
+        var requiredReviewTabRole = 'tab';
+
+        if (reviewTab.attr('role') === requiredReviewTabRole && reviewTab.hasClass('active')) {
+            processReviews(config.productReviewUrl);
+        } else {
+            reviewTab.one('beforeOpen', function () {
+                processReviews(config.productReviewUrl);
+            });
+        }
+
         $(function () {
             $('.product-info-main .reviews-actions a').click(function (event) {
                 event.preventDefault();
diff --git a/app/code/Magento/Sales/etc/di.xml b/app/code/Magento/Sales/etc/di.xml
index 4e2487d9dcada2eaf224f8cc30f65fc8fa4a4fc8..eb392fc83d8580e0cea6803a43c5f1a44f27fd58 100644
--- a/app/code/Magento/Sales/etc/di.xml
+++ b/app/code/Magento/Sales/etc/di.xml
@@ -956,4 +956,18 @@
     <type name="Magento\Sales\Model\ResourceModel\Order\Handler\Address">
         <plugin name="addressUpdate" type="Magento\Sales\Model\Order\Invoice\Plugin\AddressUpdate"/>
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="sales_email/order/copy_to" xsi:type="string">1</item>
+                <item name="sales_email/order_comment/copy_to" xsi:type="string">1</item>
+                <item name="sales_email/invoice/copy_to" xsi:type="string">1</item>
+                <item name="sales_email/invoice_comment/copy_to" xsi:type="string">1</item>
+                <item name="sales_email/shipment/copy_to" xsi:type="string">1</item>
+                <item name="sales_email/shipment_comment/copy_to" xsi:type="string">1</item>
+                <item name="sales_email/creditmemo/copy_to" xsi:type="string">1</item>
+                <item name="sales_email/creditmemo_comment/copy_to" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Shipping/composer.json b/app/code/Magento/Shipping/composer.json
index 03f51bbd95e0ff5f65b88e565cfbe77102a44760..6f3f5c3925fa5431446d0c40ccf1e4bf902afede 100644
--- a/app/code/Magento/Shipping/composer.json
+++ b/app/code/Magento/Shipping/composer.json
@@ -21,7 +21,8 @@
     },
     "suggest": {
         "magento/module-fedex": "100.2.*",
-        "magento/module-ups": "100.2.*"
+        "magento/module-ups": "100.2.*",
+        "magento/module-config": "100.2.*"
     },
     "type": "magento2-module",
     "version": "100.2.0-dev",
diff --git a/app/code/Magento/Shipping/etc/di.xml b/app/code/Magento/Shipping/etc/di.xml
index 1fe0657bf1337a1712c2aef7b614db6a45ea853f..44e138d6c9ac6f5c102727458edfe4d34fe4a9c5 100644
--- a/app/code/Magento/Shipping/etc/di.xml
+++ b/app/code/Magento/Shipping/etc/di.xml
@@ -9,4 +9,16 @@
     <preference for="Magento\Quote\Model\Quote\Address\RateCollectorInterface" type="Magento\Shipping\Model\Shipping" />
     <preference for="Magento\Shipping\Model\CarrierFactoryInterface" type="Magento\Shipping\Model\CarrierFactory" />
     <preference for="Magento\Shipping\Model\Carrier\Source\GenericInterface" type="\Magento\Shipping\Model\Carrier\Source\GenericDefault" />
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="shipping/origin/country_id" xsi:type="string">1</item>
+                <item name="shipping/origin/region_id" xsi:type="string">1</item>
+                <item name="shipping/origin/postcode" xsi:type="string">1</item>
+                <item name="shipping/origin/city" xsi:type="string">1</item>
+                <item name="shipping/origin/street_line1" xsi:type="string">1</item>
+                <item name="shipping/origin/street_line2" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Sitemap/composer.json b/app/code/Magento/Sitemap/composer.json
index 9f556178fc2cccfd070c272a89164e438f1d33e8..307691a67d2e24617f381803d8a3f96a2c010d1b 100644
--- a/app/code/Magento/Sitemap/composer.json
+++ b/app/code/Magento/Sitemap/composer.json
@@ -12,6 +12,9 @@
         "magento/module-media-storage": "100.2.*",
         "magento/framework": "100.2.*"
     },
+    "suggest": {
+        "magento/module-config": "100.2.*"
+    },
     "type": "magento2-module",
     "version": "100.2.0-dev",
     "license": [
diff --git a/app/code/Magento/Sitemap/etc/di.xml b/app/code/Magento/Sitemap/etc/di.xml
index 7ce1fdee7b5b6a1de7947da82c2a1b93bf470bfc..dfe34a25fb7ba37766ae0247194df1cc85bdee28 100644
--- a/app/code/Magento/Sitemap/etc/di.xml
+++ b/app/code/Magento/Sitemap/etc/di.xml
@@ -11,4 +11,11 @@
             <argument name="resource" xsi:type="object">Magento\Sitemap\Model\ResourceModel\Sitemap</argument>
         </arguments>
     </type>
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="sitemap/generate/error_email" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Store/Model/StoreManager.php b/app/code/Magento/Store/Model/StoreManager.php
index 13840b120636773dd108adcdf4a9f590e629383d..f64f2fe84a8cd9a496c0c85f8135e3274cd75f2f 100644
--- a/app/code/Magento/Store/Model/StoreManager.php
+++ b/app/code/Magento/Store/Model/StoreManager.php
@@ -152,7 +152,7 @@ class StoreManager implements
     public function getStore($storeId = null)
     {
         if (!isset($storeId) || '' === $storeId || $storeId === true) {
-            if (!$this->currentStoreId) {
+            if (null === $this->currentStoreId) {
                 \Magento\Framework\Profiler::start('store.resolve');
                 $this->currentStoreId = $this->storeResolver->getCurrentStoreId();
                 \Magento\Framework\Profiler::stop('store.resolve');
diff --git a/app/code/Magento/Swatches/Helper/Data.php b/app/code/Magento/Swatches/Helper/Data.php
index a973a822c4101671faa0fe57925a0e9b0c5b2f2a..d80aaaf73ccf016bc1d571254cfc90a7f0452c3d 100644
--- a/app/code/Magento/Swatches/Helper/Data.php
+++ b/app/code/Magento/Swatches/Helper/Data.php
@@ -328,12 +328,10 @@ class Data
     private function getAllSizeImages(ModelProduct $product, $imageFile)
     {
         return [
-            'large' => $this->imageHelper->init($product, 'product_page_image_large')
-                ->constrainOnly(true)->keepAspectRatio(true)->keepFrame(false)
+            'large' => $this->imageHelper->init($product, 'product_page_image_large_no_frame')
                 ->setImageFile($imageFile)
                 ->getUrl(),
-            'medium' => $this->imageHelper->init($product, 'product_page_image_medium')
-                ->constrainOnly(true)->keepAspectRatio(true)->keepFrame(false)
+            'medium' => $this->imageHelper->init($product, 'product_page_image_medium_no_frame')
                 ->setImageFile($imageFile)
                 ->getUrl(),
             'small' => $this->imageHelper->init($product, 'product_page_image_small')
diff --git a/app/code/Magento/Swatches/Test/Unit/Helper/DataTest.php b/app/code/Magento/Swatches/Test/Unit/Helper/DataTest.php
index e5f2f887836eff5ad73ca95602d4d7aec411150e..10f26acfc2594499adb80cd6df5bfee1fc277f88 100644
--- a/app/code/Magento/Swatches/Test/Unit/Helper/DataTest.php
+++ b/app/code/Magento/Swatches/Test/Unit/Helper/DataTest.php
@@ -340,8 +340,8 @@ class DataTest extends \PHPUnit_Framework_TestCase
         $this->imageHelperMock->expects($this->any())
             ->method('init')
             ->willReturnMap([
-                [$this->productMock, 'product_page_image_large', [], $this->imageHelperMock],
-                [$this->productMock, 'product_page_image_medium', [], $this->imageHelperMock],
+                [$this->productMock, 'product_page_image_large_no_frame', [], $this->imageHelperMock],
+                [$this->productMock, 'product_page_image_medium_no_frame', [], $this->imageHelperMock],
                 [$this->productMock, 'product_page_image_small', [], $this->imageHelperMock],
             ]);
 
@@ -349,15 +349,6 @@ class DataTest extends \PHPUnit_Framework_TestCase
             ->method('setImageFile')
             ->with($image)
             ->willReturnSelf();
-        $this->imageHelperMock->expects($this->any())
-            ->method('constrainOnly')
-            ->willReturnSelf();
-        $this->imageHelperMock->expects($this->any())
-            ->method('keepAspectRatio')
-            ->willReturnSelf();
-        $this->imageHelperMock->expects($this->any())
-            ->method('keepFrame')
-            ->willReturnSelf();
         $this->imageHelperMock->expects($this->any())
             ->method('getUrl')
             ->willReturn('http://full_path_to_image/magento1.png');
diff --git a/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js b/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js
index c1d2fd3f910518ddcf15ae50122db3e5f30cd098..cd9794dc1757d4cfa5f092209ad8515557e42a4a 100644
--- a/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js
+++ b/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js
@@ -259,6 +259,9 @@ define([
             // whether swatches are rendered in product list or on product page
             inProductList: false,
 
+            // sly-old-price block selector
+            slyOldPriceSelector: '.sly-old-price',
+
             // tier prise selectors start
             tierPriceTemplateSelector: '#tier-prices-template',
             tierPriceBlockSelector: '[data-role="tier-price-block"]',
@@ -837,6 +840,12 @@ define([
                 }
             );
 
+            if (result.oldPrice.amount !== result.finalPrice.amount) {
+                $(this.options.slyOldPriceSelector).show();
+            } else {
+                $(this.options.slyOldPriceSelector).hide();
+            }
+
             if (result.tierPrices.length) {
                 if (this.options.tierPriceTemplate) {
                     tierPriceHtml = mageTemplate(
diff --git a/app/code/Magento/Theme/Model/Design/Backend/File.php b/app/code/Magento/Theme/Model/Design/Backend/File.php
index e788c6892f4c89e20f89b454f7a6061f30d08b0b..0d93352f041ac6af29abb16e4ffcb7d837ad5634 100644
--- a/app/code/Magento/Theme/Model/Design/Backend/File.php
+++ b/app/code/Magento/Theme/Model/Design/Backend/File.php
@@ -9,8 +9,10 @@ use Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface;
 use Magento\Config\Model\Config\Backend\File as BackendFile;
 use Magento\Framework\App\Cache\TypeListInterface;
 use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Data\Collection\AbstractDb;
 use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\File\Mime;
 use Magento\Framework\Filesystem;
 use Magento\Framework\Model\Context;
 use Magento\Framework\Model\ResourceModel\AbstractResource;
@@ -29,6 +31,11 @@ class File extends BackendFile
      */
     protected $urlBuilder;
 
+    /**
+     * @var Mime
+     */
+    private $mime;
+
     /**
      * @param Context $context
      * @param Registry $registry
@@ -125,7 +132,9 @@ class File extends BackendFile
                         'url' => $url,
                         'file' => $value,
                         'size' => is_array($stat) ? $stat['size'] : 0,
-                        'exists' => true
+                        'name' => basename($value),
+                        'type' => $this->getMimeType($fileName),
+                        'exists' => true,
                     ]
                 ];
             }
@@ -192,4 +201,33 @@ class File extends BackendFile
     {
         return 'tmp/' . FileProcessor::FILE_DIR . '/' . $filename;
     }
+
+    /**
+     * Retrieve MIME type of requested file
+     *
+     * @param string $fileName
+     * @return string
+     */
+    private function getMimeType($fileName)
+    {
+        $absoluteFilePath = $this->_mediaDirectory->getAbsolutePath($fileName);
+
+        $result = $this->getMime()->getMimeType($absoluteFilePath);
+        return $result;
+    }
+
+    /**
+     * Get Mime instance
+     *
+     * @return Mime
+     *
+     * @deprecated
+     */
+    private function getMime()
+    {
+        if ($this->mime === null) {
+            $this->mime = ObjectManager::getInstance()->get(Mime::class);
+        }
+        return $this->mime;
+    }
 }
diff --git a/app/code/Magento/Theme/Model/Design/Config/DataProvider.php b/app/code/Magento/Theme/Model/Design/Config/DataProvider.php
index c433b02fab240d736637bf41b571c2eb75d193bc..977295c1f80c466899284f0e8e18c373a6007445 100644
--- a/app/code/Magento/Theme/Model/Design/Config/DataProvider.php
+++ b/app/code/Magento/Theme/Model/Design/Config/DataProvider.php
@@ -5,9 +5,13 @@
  */
 namespace Magento\Theme\Model\Design\Config;
 
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\Framework\App\ObjectManager;
 use Magento\Theme\Model\ResourceModel\Design\Config\Collection;
 use Magento\Theme\Model\ResourceModel\Design\Config\CollectionFactory;
 use Magento\Ui\DataProvider\AbstractDataProvider;
+use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
+use Magento\Framework\App\RequestInterface;
 
 class DataProvider extends AbstractDataProvider
 {
@@ -31,6 +35,21 @@ class DataProvider extends AbstractDataProvider
      */
     private $metadataLoader;
 
+    /**
+     * @var SettingChecker
+     */
+    private $settingChecker;
+
+    /**
+     * @var RequestInterface
+     */
+    private $request;
+
+    /**
+     * @var ScopeCodeResolver
+     */
+    private $scopeCodeResolver;
+
     /**
      * @param string $name
      * @param string $primaryFieldName
@@ -78,4 +97,84 @@ class DataProvider extends AbstractDataProvider
         $this->loadedData = $this->dataLoader->getData();
         return $this->loadedData;
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMeta()
+    {
+        $meta = parent::getMeta();
+        if (!isset($meta['other_settings']['children'])) {
+            return $meta;
+        }
+
+        $request = $this->getRequest()->getParams();
+        if (!isset($request['scope'])) {
+            return $meta;
+        }
+
+        $scope = $request['scope'];
+        $scopeCode = $this->getScopeCodeResolver()->resolve(
+            $scope,
+            isset($request['scope_id']) ? $request['scope_id'] : null
+        );
+
+        foreach ($meta['other_settings']['children'] as $settingGroupName => &$settingGroup) {
+            foreach ($settingGroup['children'] as $fieldName => &$field) {
+                $path = sprintf(
+                    'design/%s/%s',
+                    $settingGroupName,
+                    preg_replace('/^' . $settingGroupName . '_/', '', $fieldName)
+                );
+                $isReadOnly = $this->getSettingChecker()->isReadOnly(
+                    $path,
+                    $scope,
+                    $scopeCode
+                );
+
+                if ($isReadOnly) {
+                    $field['arguments']['data']['config']['disabled'] = true;
+                    $field['arguments']['data']['config']['is_disable_inheritance'] = true;
+                }
+            }
+        }
+
+        return $meta;
+    }
+
+    /**
+     * @deprecated
+     * @return ScopeCodeResolver
+     */
+    private function getScopeCodeResolver()
+    {
+        if ($this->scopeCodeResolver === null) {
+            $this->scopeCodeResolver = ObjectManager::getInstance()->get(ScopeCodeResolver::class);
+        }
+        return $this->scopeCodeResolver;
+    }
+
+    /**
+     * @deprecated
+     * @return SettingChecker
+     */
+    private function getSettingChecker()
+    {
+        if ($this->settingChecker === null) {
+            $this->settingChecker = ObjectManager::getInstance()->get(SettingChecker::class);
+        }
+        return $this->settingChecker;
+    }
+
+    /**
+     * @deprecated
+     * @return RequestInterface
+     */
+    private function getRequest()
+    {
+        if ($this->request === null) {
+            $this->request = ObjectManager::getInstance()->get(RequestInterface::class);
+        }
+        return $this->request;
+    }
 }
diff --git a/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php b/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php
index 5a132b0250079123694a23addaea3935d53cb685..786a1820aa5b3f53bbb55aa5f3e0693be2b1776f 100644
--- a/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php
+++ b/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php
@@ -135,7 +135,6 @@ class FileProcessor
      */
     protected function save($fileId, $destination)
     {
-        $result = ['file' => '', 'size' => ''];
         /** @var File $backendModel */
         $backendModel = $this->getBackendModel($fileId);
         $uploader = $this->uploaderFactory->create(['fileId' => $fileId]);
@@ -143,7 +142,9 @@ class FileProcessor
         $uploader->setFilesDispersion(false);
         $uploader->setAllowedExtensions($backendModel->getAllowedExtensions());
         $uploader->addValidateCallback('size', $backendModel, 'validateMaxSize');
-        return array_intersect_key($uploader->save($destination), $result);
+
+        $result = $uploader->save($destination);
+        return $result;
     }
 
     /**
diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/FileTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/FileTest.php
index 7dd8b636210fc6ca6ab86398e2ceb12bd590529f..7038edebac0204ee945e67bbd6e0db2d7b5bbac0 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/FileTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/FileTest.php
@@ -23,6 +23,11 @@ class FileTest extends \PHPUnit_Framework_TestCase
     /** @var File */
     protected $fileBackend;
 
+    /**
+     * @var \Magento\Framework\File\Mime|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $mime;
+
     public function setUp()
     {
         $context = $this->getMockObject(\Magento\Framework\Model\Context::class);
@@ -46,6 +51,10 @@ class FileTest extends \PHPUnit_Framework_TestCase
         $this->urlBuilder = $this->getMockBuilder(\Magento\Framework\UrlInterface::class)
             ->getMockForAbstractClass();
 
+        $this->mime = $this->getMockBuilder(\Magento\Framework\File\Mime::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
         $this->fileBackend = new File(
             $context,
             $registry,
@@ -56,6 +65,13 @@ class FileTest extends \PHPUnit_Framework_TestCase
             $filesystem,
             $this->urlBuilder
         );
+
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $objectManager->setBackwardCompatibleProperty(
+            $this->fileBackend,
+            'mime',
+            $this->mime
+        );
     }
 
     public function tearDown()
@@ -91,6 +107,10 @@ class FileTest extends \PHPUnit_Framework_TestCase
     public function testAfterLoad()
     {
         $value = 'filename.jpg';
+        $mime = 'image/jpg';
+
+        $absoluteFilePath = '/absolute_path/' . $value;
+
         $this->fileBackend->setValue($value);
         $this->fileBackend->setFieldConfig(
             [
@@ -109,6 +129,11 @@ class FileTest extends \PHPUnit_Framework_TestCase
             ->method('isExist')
             ->with('value/' . $value)
             ->willReturn(true);
+        $this->mediaDirectory->expects($this->once())
+            ->method('getAbsolutePath')
+            ->with('value/' . $value)
+            ->willReturn($absoluteFilePath);
+
         $this->urlBuilder->expects($this->once())
             ->method('getBaseUrl')
             ->with(['_type' => UrlInterface::URL_TYPE_MEDIA])
@@ -122,6 +147,11 @@ class FileTest extends \PHPUnit_Framework_TestCase
             ->with('value/' . $value)
             ->willReturn(['size' => 234234]);
 
+        $this->mime->expects($this->once())
+            ->method('getMimeType')
+            ->with($absoluteFilePath)
+            ->willReturn($mime);
+
         $this->fileBackend->afterLoad();
         $this->assertEquals(
             [
@@ -130,6 +160,8 @@ class FileTest extends \PHPUnit_Framework_TestCase
                     'file' => $value,
                     'size' => 234234,
                     'exists' => true,
+                    'name' => $value,
+                    'type' => $mime,
                 ]
             ],
             $this->fileBackend->getValue()
diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php
index 3ba61da79b5ca00073a14e11e7ab14c46b7af031..a5db6156efea32c56009620d9a8f2110f070bfe1 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/DataProviderTest.php
@@ -5,11 +5,18 @@
  */
 namespace Magento\Theme\Test\Unit\Model\Design\Config;
 
+use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\Framework\App\RequestInterface;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 use Magento\Theme\Model\Design\Config\DataLoader;
 use Magento\Theme\Model\Design\Config\DataProvider;
 use Magento\Theme\Model\Design\Config\MetadataLoader;
 use Magento\Theme\Model\ResourceModel\Design\Config\Collection;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class DataProviderTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -32,8 +39,29 @@ class DataProviderTest extends \PHPUnit_Framework_TestCase
      */
     protected $collection;
 
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var RequestInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $requestMock;
+
+    /**
+     * @var ScopeCodeResolver|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scopeCodeResolverMock;
+
+    /**
+     * @var SettingChecker|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $settingCheckerMock;
+
     protected function setUp()
     {
+        $this->objectManager = new ObjectManager($this);
         $this->dataLoader = $this->getMockBuilder(\Magento\Theme\Model\Design\Config\DataProvider\DataLoader::class)
             ->disableOriginalConstructor()
             ->getMock();
@@ -56,6 +84,16 @@ class DataProviderTest extends \PHPUnit_Framework_TestCase
             ->method('create')
             ->willReturn($this->collection);
 
+        $this->requestMock = $this->getMockBuilder(RequestInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->scopeCodeResolverMock = $this->getMockBuilder(ScopeCodeResolver::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->settingCheckerMock = $this->getMockBuilder(SettingChecker::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
         $this->model = new DataProvider(
             'scope',
             'scope',
@@ -64,6 +102,21 @@ class DataProviderTest extends \PHPUnit_Framework_TestCase
             $this->metadataLoader,
             $collectionFactory
         );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->model,
+            'request',
+            $this->requestMock
+        );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->model,
+            'scopeCodeResolver',
+            $this->scopeCodeResolverMock
+        );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->model,
+            'settingChecker',
+            $this->settingCheckerMock
+        );
     }
 
     public function testGetData()
@@ -78,4 +131,119 @@ class DataProviderTest extends \PHPUnit_Framework_TestCase
 
         $this->assertEquals($data, $this->model->getData());
     }
+
+    /**
+     * @param array $inputMeta
+     * @param array $expectedMeta
+     * @param array $request
+     * @dataProvider getMetaDataProvider
+     */
+    public function testGetMeta(array $inputMeta, array $expectedMeta, array $request)
+    {
+        $this->requestMock->expects($this->any())
+            ->method('getParams')
+            ->willReturn($request);
+        $this->scopeCodeResolverMock->expects($this->any())
+            ->method('resolve')
+            ->with('stores', 1)
+            ->willReturn('default');
+        $this->settingCheckerMock->expects($this->any())
+            ->method('isReadOnly')
+            ->withConsecutive(
+                ['design/head/welcome', 'stores', 'default'],
+                ['design/head/logo', 'stores', 'default'],
+                ['design/head/head', 'stores', 'default']
+            )
+            ->willReturnOnConsecutiveCalls(
+                true,
+                false,
+                true
+            );
+
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->model,
+            'meta',
+            $inputMeta
+        );
+
+        $this->assertSame($expectedMeta, $this->model->getMeta());
+    }
+
+    /**
+     * @return array
+     */
+    public function getMetaDataProvider()
+    {
+        return [
+            [
+                [
+                    'option1'
+                ],
+                [
+                    'option1'
+                ],
+                [
+                    'scope' => 'default'
+                ]
+            ],
+            [
+                [
+                    'other_settings' => [
+                        'children' => [
+                            'head' => [
+                                'children' => [
+                                    'head_welcome' => [
+
+                                    ],
+                                    'head_logo' => [
+
+                                    ],
+                                    'head_head' => [
+
+                                    ]
+                                ]
+                            ]
+                        ]
+                    ]
+                ],
+                [
+                    'other_settings' => [
+                        'children' => [
+                            'head' => [
+                                'children' => [
+                                    'head_welcome' => [
+                                        'arguments' => [
+                                            'data' => [
+                                                'config' => [
+                                                    'disabled' => true,
+                                                    'is_disable_inheritance' => true,
+                                                ]
+                                            ]
+                                        ]
+                                    ],
+                                    'head_logo' => [
+
+                                    ],
+                                    'head_head' => [
+                                        'arguments' => [
+                                            'data' => [
+                                                'config' => [
+                                                    'disabled' => true,
+                                                    'is_disable_inheritance' => true,
+                                                ]
+                                            ]
+                                        ]
+                                    ]
+                                ]
+                            ]
+                        ]
+                    ]
+                ],
+                [
+                    'scope' => 'stores',
+                    'scope_id' => 1
+                ]
+            ]
+        ];
+    }
 }
diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/FileProcessorTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/FileProcessorTest.php
index 1cd1072ce69f12110936e4a518990dd854713fd7..61e510ec25cea949a28042c69331d02861891d7b 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/FileProcessorTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/FileProcessorTest.php
@@ -135,11 +135,18 @@ class FileProcessorTest extends \PHPUnit_Framework_TestCase
         $this->uploader->expects($this->once())
             ->method('save')
             ->with('absolute/path/to/tmp/media')
-            ->willReturn(['file' => 'file.jpg', 'size' => '234234']);
+            ->willReturn([
+                'file' => 'file.jpg',
+                'size' => '234234',
+                'type' => 'image/jpg',
+                'name' => 'file.jpg',
+            ]);
         $this->assertEquals(
             [
                 'file' => 'file.jpg',
+                'name' => 'file.jpg',
                 'size' => '234234',
+                'type' => 'image/jpg',
                 'url' => 'http://magento2.com/pub/media/tmp/' . FileProcessor::FILE_DIR . '/file.jpg'
             ],
             $this->fileProcessor->saveToTmp($fieldCode)
diff --git a/app/code/Magento/Ui/Component/Form/Element/DataType/Date.php b/app/code/Magento/Ui/Component/Form/Element/DataType/Date.php
index e9c0c8d7685166001b524af995d62bf6b3c84011..fd319e97b6ab7e87c88f4c899b0c1b49e41f86ab 100644
--- a/app/code/Magento/Ui/Component/Form/Element/DataType/Date.php
+++ b/app/code/Magento/Ui/Component/Form/Element/DataType/Date.php
@@ -60,6 +60,7 @@ class Date extends AbstractDataType
     public function prepare()
     {
         $config = $this->getData('config');
+
         if (!isset($config['storeTimeZone'])) {
             $storeTimeZone = $this->localeDate->getConfigTimezone();
             $config['storeTimeZone'] = $storeTimeZone;
@@ -67,7 +68,7 @@ class Date extends AbstractDataType
         // Set date format pattern by current locale
         $localeDateFormat = $this->localeDate->getDateFormat();
         $config['options']['dateFormat'] = $localeDateFormat;
-        $config['outputDateFormat'] = $localeDateFormat;
+        $config['options']['storeLocale'] = $this->locale;
         $this->setData('config', $config);
         parent::prepare();
     }
diff --git a/app/code/Magento/Ui/Test/Unit/Component/Form/Element/DataType/DateTest.php b/app/code/Magento/Ui/Test/Unit/Component/Form/Element/DataType/DateTest.php
index 7a9df1a7df0a42cf40e98b2c7b0f115d78d5301a..e922b1460b3e0727a841ee034cdf62d570dbc628 100644
--- a/app/code/Magento/Ui/Test/Unit/Component/Form/Element/DataType/DateTest.php
+++ b/app/code/Magento/Ui/Test/Unit/Component/Form/Element/DataType/DateTest.php
@@ -70,9 +70,6 @@ class DateTest extends \PHPUnit_Framework_TestCase
         $this->assertArrayHasKey('options', $config);
         $this->assertArrayHasKey('dateFormat', $config['options']);
         $this->assertEquals($localeDateFormat, $config['options']['dateFormat']);
-
-        $this->assertArrayHasKey('outputDateFormat', $config);
-        $this->assertEquals($localeDateFormat, $config['outputDateFormat']);
     }
 
     public function testPrepareWithoutTimeOffset()
@@ -112,8 +109,6 @@ class DateTest extends \PHPUnit_Framework_TestCase
         $this->assertArrayHasKey('dateFormat', $config['options']);
         $this->assertEquals($localeDateFormat, $config['options']['dateFormat']);
 
-        $this->assertArrayHasKey('outputDateFormat', $config);
-        $this->assertEquals($localeDateFormat, $config['outputDateFormat']);
     }
 
     /**
@@ -121,6 +116,7 @@ class DateTest extends \PHPUnit_Framework_TestCase
      */
     public function testPrepare()
     {
+        $this->localeResolverMock->expects($this->any())->method('getLocale')->willReturn('de-DE');
         $this->date = $this->objectManagerHelper->getObject(
             Date::class,
             [
@@ -133,5 +129,6 @@ class DateTest extends \PHPUnit_Framework_TestCase
         $this->date->prepare();
         $configArray = $this->date->getData('config');
         $this->assertEquals('America/Chicago', $configArray['storeTimeZone']);
+        $this->assertEquals('de-DE', $configArray['options']['storeLocale']);
     }
 }
diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/country.js b/app/code/Magento/Ui/view/base/web/js/form/element/country.js
index c72d02c595bb8d8d4185f8bc9969cfa3a3bc5940..cd611a04a1569d45f7edb0668f0fee75833e396d 100644
--- a/app/code/Magento/Ui/view/base/web/js/form/element/country.js
+++ b/app/code/Magento/Ui/view/base/web/js/form/element/country.js
@@ -42,6 +42,7 @@ define([
             });
 
             this.setOptions(result);
+            this.reset();
         }
     });
 });
diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/date.js b/app/code/Magento/Ui/view/base/web/js/form/element/date.js
index fde7faa72ed7c9307e0b2781b7301d421efe2fc0..202cfe93069b02bad6ff888a51b9661a54109e54 100644
--- a/app/code/Magento/Ui/view/base/web/js/form/element/date.js
+++ b/app/code/Magento/Ui/view/base/web/js/form/element/date.js
@@ -1,5 +1,5 @@
 /**
- * Copyright © 2015 Magento. All rights reserved.
+ * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 define([
@@ -53,6 +53,12 @@ define([
             pickerDefaultDateFormat: 'MM/dd/y', // ICU Date Format
             pickerDefaultTimeFormat: 'h:mm a', // ICU Time Format
 
+            /**
+             * Moment compatible format used for moment conversion
+             * of date from datePicker
+             */
+            momentFormat: 'MM/DD/YYYY',
+
             elementTmpl: 'ui/form/element/date',
 
             listens: {
@@ -142,7 +148,7 @@ define([
                     formattedValue = moment(shiftedValue).format('YYYY-MM-DD HH:mm');
                     value = moment.tz(formattedValue, this.storeTimeZone).tz('UTC').toISOString();
                 } else {
-                    value = moment(shiftedValue, this.pickerDateTimeFormat);
+                    value = moment(shiftedValue, this.momentFormat);
                     value = value.format(this.outputDateFormat);
                 }
             } else {
@@ -160,19 +166,21 @@ define([
          */
         prepareDateTimeFormats: function () {
             this.pickerDateTimeFormat = this.options.dateFormat;
+            this.momentFormat = this.options.dateFormat ?
+                    utils.convertToMomentFormat(this.options.dateFormat) : this.momentFormat;
 
             if (this.options.showsTime) {
                 this.pickerDateTimeFormat += ' ' + this.options.timeFormat;
             }
 
-            this.pickerDateTimeFormat = utils.normalizeDate(this.pickerDateTimeFormat);
+            this.pickerDateTimeFormat = utils.convertToMomentFormat(this.pickerDateTimeFormat);
 
             if (this.dateFormat) {
                 this.inputDateFormat = this.dateFormat;
             }
 
-            this.inputDateFormat = utils.normalizeDate(this.inputDateFormat);
-            this.outputDateFormat = utils.normalizeDate(this.outputDateFormat);
+            this.inputDateFormat = utils.convertToMomentFormat(this.inputDateFormat);
+            this.outputDateFormat = utils.convertToMomentFormat(this.outputDateFormat);
 
             this.validationParams.dateFormat = this.outputDateFormat;
         }
diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js b/app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js
index 32ebd40f75346afb4d2d06cd6f9c4db16950fd4a..a695102bfdfa69e68bf664847c3cb31f4d563cb5 100644
--- a/app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js
+++ b/app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js
@@ -18,6 +18,7 @@ define([
             value: [],
             maxFileSize: false,
             isMultipleFiles: false,
+            placeholderType: 'document', // 'image', 'video'
             allowedExtensions: false,
             previewTmpl: 'ui/form/element/uploader/preview',
             dropZone: '[data-role=drop-zone]',
@@ -158,6 +159,8 @@ define([
          * @returns {Object} Modified file object.
          */
         processFile: function (file) {
+            file.previewType = this.getFilePreviewType(file);
+
             this.observe.call(file, true, [
                 'previewWidth',
                 'previewHeight'
@@ -235,6 +238,24 @@ define([
             return validator('validate-file-type', file.name, this.allowedExtensions);
         },
 
+        /**
+         * Get simplified file type.
+         *
+         * @param {Object} file - File to be checked.
+         * @returns {String}
+         */
+        getFilePreviewType: function (file) {
+            var type;
+
+            if (!file.type) {
+                return 'document';
+            }
+
+            type = file.type.split('/')[0];
+
+            return type !== 'image' && type !== 'video' ? 'document' : type;
+        },
+
         /**
          * Checks if size of provided file exceeds
          * defined in configuration size limits.
diff --git a/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/datepicker.js b/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/datepicker.js
index 77d3a069ccef76bbcacad28459820b3359b025e7..4f52aa431632c11115864b22bdc819b9385b20a3 100644
--- a/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/datepicker.js
+++ b/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/datepicker.js
@@ -53,7 +53,7 @@ define([
                 'setDate',
                 moment(
                     observable(),
-                    utils.normalizeDate(
+                    utils.convertToMomentFormat(
                         options.dateFormat + (options.showsTime ? ' ' + options.timeFormat : '')
                     )
                 ).toDate()
diff --git a/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/preview.html b/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/preview.html
index 91c2eb1bcd0dce2c7aba7e195a2364015f2470c9..45493b83d8f58222dd39a683a6db0effaa7d2464 100644
--- a/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/preview.html
+++ b/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/preview.html
@@ -6,9 +6,11 @@
 -->
 <div class="file-uploader-summary">
     <div class="file-uploader-preview">
-        <a attr="href: $parent.getFilePreview($file)" target="_blank">
+        <a class="preview-link"
+           css="'preview-' + $file.previewType"
+           attr="href: $parent.getFilePreview($file), title: $file.name" target="_blank">
             <img
-                class="preview-image"
+                if="$file.previewType === 'image'"
                 tabindex="0"
                 event="load: $parent.onPreviewLoad.bind($parent)"
                 attr="
@@ -29,8 +31,11 @@
     </div>
 
     <div class="file-uploader-filename" text="$file.name"/>
+
     <div class="file-uploader-meta">
-        <text args="$file.previewWidth"/>x<text args="$file.previewHeight"/>, 
+        <span if="$file.previewType === 'image'">
+            <text args="$file.previewWidth"/>x<text args="$file.previewHeight"/>,
+        </span>
         <text args="$parent.formatSize($file.size)"/>
     </div>
 </div>
diff --git a/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/uploader.html b/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/uploader.html
index ab309026c9ffeb3a8e56816c19994b33d34d4116..f0f80efdb16d61745aa3624519c371634eba6130 100644
--- a/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/uploader.html
+++ b/app/code/Magento/Ui/view/base/web/templates/form/element/uploader/uploader.html
@@ -4,6 +4,7 @@
  * See COPYING.txt for license details.
  */
 -->
+
 <div class="admin__field" visible="visible" css="$data.additionalClasses">
     <label class="admin__field-label" if="$data.label" attr="for: uid">
         <span translate="label" attr="'data-config-scope': $data.scopeLabel"/>
@@ -28,6 +29,15 @@
             <label class="admin__field-error" if="error" attr="for: uid" text="error"/>
 
             <each args="data: value, as: '$file'" render="$parent.getPreviewTmpl($file)"/>
+
+            <div if="isMultipleFiles" class="file-uploader-summary">
+                <label attr="for: uid"
+                       class="file-uploader-placeholder"
+                       css="'placeholder-' + placeholderType">
+                    <span class="file-uploader-placeholder-text"
+                          translate="'Click here or drag and drop to add files.'"/>
+                </label>
+            </div>
         </div>
         <render args="$data.service.template" if="$data.hasService()"/>
     </div>
diff --git a/app/code/Magento/Ups/composer.json b/app/code/Magento/Ups/composer.json
index c20dd28ba88876a70c04ea49038b94f82d3d9b06..e3cf2bce1813a0d6625f0b5dce2ac4cf0d8b5640 100644
--- a/app/code/Magento/Ups/composer.json
+++ b/app/code/Magento/Ups/composer.json
@@ -12,6 +12,9 @@
         "magento/module-quote": "100.2.*",
         "magento/framework": "100.2.*"
     },
+    "suggest": {
+        "magento/module-config": "100.2.*"
+    },
     "type": "magento2-module",
     "version": "100.2.0-dev",
     "license": [
diff --git a/app/code/Magento/Ups/etc/di.xml b/app/code/Magento/Ups/etc/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..324349a82994fdadec4d4db33cdb66f28029b137
--- /dev/null
+++ b/app/code/Magento/Ups/etc/di.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="carriers/ups/username" xsi:type="string">1</item>
+                <item name="carriers/ups/password" xsi:type="string">1</item>
+                <item name="carriers/ups/access_license_number" xsi:type="string">1</item>
+                <item name="carriers/ups/tracking_xml_url" xsi:type="string">1</item>
+                <item name="carriers/ups/gateway_xml_url" xsi:type="string">1</item>
+                <item name="carriers/ups/shipper_number" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
+</config>
diff --git a/app/code/Magento/Usps/etc/di.xml b/app/code/Magento/Usps/etc/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..450a24ad8b9f734ec85d1640ea1df8bf75e12225
--- /dev/null
+++ b/app/code/Magento/Usps/etc/di.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+    <type name="Magento\Config\Model\Config\Export\ExcludeList">
+        <arguments>
+            <argument name="configs" xsi:type="array">
+                <item name="carriers/usps/userid" xsi:type="string">1</item>
+                <item name="carriers/usps/password" xsi:type="string">1</item>
+                <item name="carriers/usps/gateway_url" xsi:type="string">1</item>
+                <item name="carriers/usps/gateway_secure_url" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
+</config>
diff --git a/app/design/adminhtml/Magento/backend/Magento_Catalog/web/css/source/_module.less b/app/design/adminhtml/Magento/backend/Magento_Catalog/web/css/source/_module.less
index 304f895a85b969dfe95acd4e3dddb0607940432f..77a769d8f5a36cc4788031b5efa4d57c85481106 100644
--- a/app/design/adminhtml/Magento/backend/Magento_Catalog/web/css/source/_module.less
+++ b/app/design/adminhtml/Magento/backend/Magento_Catalog/web/css/source/_module.less
@@ -78,3 +78,19 @@
         margin-top: -@indent__base;
     }
 }
+
+//
+//  Advanced Price panel
+//  ---------------------------------------------
+
+.admin__control-fields {
+    .control-grouped {
+        .lib-vendor-prefix-display(inline-flex);
+        .lib-vendor-prefix-flex-direction(row);
+
+        .admin__field + .admin__field {
+            margin-left: @indent__s;
+            margin-top: 0;
+        }
+    }
+}
diff --git a/app/design/adminhtml/Magento/backend/web/css/source/components/_file-uploader.less b/app/design/adminhtml/Magento/backend/web/css/source/components/_file-uploader.less
index 7637e64d830d1ea3f7b8a36404bf8c14b661d656..e0639704f4583f1fb7dee0cd1bc0af73687ecaa1 100644
--- a/app/design/adminhtml/Magento/backend/web/css/source/components/_file-uploader.less
+++ b/app/design/adminhtml/Magento/backend/web/css/source/components/_file-uploader.less
@@ -15,6 +15,17 @@
 @file-uploader-preview__background-color: @color-white;
 @file-uploader-preview-focus__color: @color-blue2;
 
+@file-uploader-document-icon__color: @color-gray80;
+@file-uploader-document-icon__size: 7rem;
+@file-uploader-document-icon__z-index: @data-grid-file-uploader-image__z-index + 1;
+
+@file-uploader-video-icon__color: @color-gray80;
+@file-uploader-video-icon__size: 4rem;
+@file-uploader-video-icon__z-index: @data-grid-file-uploader-image__z-index + 1;
+
+@file-uploader-placeholder-icon__color: @color-gray80;
+@file-uploader-placeholder-icon__z-index: @data-grid-file-uploader-image__z-index + 1;
+
 @file-uploader-delete-icon__color: @color-brownie;
 @file-uploader-delete-icon__hover__color: @color-brownie-vanilla;
 @file-uploader-delete-icon__font-size: 2rem;
@@ -48,7 +59,6 @@
 //  ---------------------------------------------
 
 .file-uploader-area {
-    margin-bottom: @indent__xs;
     position: relative;
 
     input[type='file'] {
@@ -66,6 +76,11 @@
     }
 }
 
+.file-uploader-summary {
+    display: inline-block;
+    vertical-align: top;
+}
+
 .file-uploader-button {
     cursor: pointer;
     display: inline-block;
@@ -89,17 +104,6 @@
 }
 
 .file-uploader-preview {
-    background: @file-uploader-preview__background-color;
-    border: 1px solid @file-uploader-preview__border-color;
-    box-sizing: border-box;
-    cursor: pointer;
-    height: @file-uploader-preview__height;
-    line-height: 1;
-    margin-bottom: @indent__s;
-    overflow: hidden;
-    position: relative;
-    width: @file-uploader-preview__width;
-
     .action-remove {
         &:extend(.abs-action-reset all);
         .lib-icon-font (
@@ -123,12 +127,18 @@
     }
 
     &:hover {
-        .preview-image {
+        .preview-image img,
+        .preview-link:before {
             opacity: @file-uploader-preview__opacity;
         }
     }
 
-    .preview-image {
+    .preview-link {
+        display: block;
+        height: 100%;
+    }
+
+    .preview-image img {
         bottom: 0;
         left: 0;
         margin: auto;
@@ -139,6 +149,59 @@
         top: 0;
         z-index: 1;
     }
+
+    .preview-video {
+        .lib-icon-font(
+            @icon-video__content,
+            @_icon-font: @icons-admin__font-name,
+            @_icon-font-size: @file-uploader-video-icon__size,
+            @_icon-font-color: @file-uploader-video-icon__color,
+            @_icon-font-color-hover: @file-uploader-video-icon__color
+        );
+
+        &:before {
+            left: 0;
+            margin-top: -@file-uploader-video-icon__size / 2;
+            position: absolute;
+            right: 0;
+            top: 50%;
+            z-index: @file-uploader-video-icon__z-index;
+        }
+    }
+
+    .preview-document {
+        .lib-icon-font(
+            @icon-document__content,
+            @_icon-font: @icons-admin__font-name,
+            @_icon-font-size: @file-uploader-document-icon__size,
+            @_icon-font-color: @file-uploader-document-icon__color,
+            @_icon-font-color-hover: @file-uploader-document-icon__color
+        );
+
+        &:before {
+            left: 0;
+            margin-top: -@file-uploader-document-icon__size / 2;
+            position: absolute;
+            right: 0;
+            top: 50%;
+            z-index: @file-uploader-document-icon__z-index;
+        }
+    }
+}
+
+.file-uploader-preview,
+.file-uploader-placeholder {
+    background: @file-uploader-preview__background-color;
+    border: 1px solid @file-uploader-preview__border-color;
+    box-sizing: border-box;
+    cursor: pointer;
+    display: block;
+    height: @file-uploader-preview__height;
+    line-height: 1;
+    margin: @indent__s @indent__m @indent__s 0;
+    overflow: hidden;
+    position: relative;
+    width: @file-uploader-preview__width;
 }
 
 .file-uploader {
@@ -154,6 +217,8 @@
     }
 
     .file-uploader-filename {
+        .lib-text-overflow();
+        max-width: @file-uploader-preview__width;
         word-break: break-all;
 
         &:first-child {
@@ -176,6 +241,76 @@
     }
 }
 
+// Placeholder for multiple uploader
+.file-uploader-placeholder {
+    &.placeholder-document {
+        .lib-icon-font(
+            @icon-document__content,
+            @_icon-font: @icons-admin__font-name,
+            @_icon-font-size: 5rem,
+            @_icon-font-color: @file-uploader-placeholder-icon__color,
+            @_icon-font-color-hover: @file-uploader-placeholder-icon__color
+        );
+
+        &:before {
+            left: 0;
+            position: absolute;
+            right: 0;
+            top: 20px;
+            z-index: @file-uploader-placeholder-icon__z-index;
+        }
+    }
+
+    &.placeholder-image {
+        .lib-icon-font(
+            @icon-camera__content,
+            @_icon-font: @icons-admin__font-name,
+            @_icon-font-size: 5rem,
+            @_icon-font-color: @file-uploader-placeholder-icon__color,
+            @_icon-font-color-hover: @file-uploader-placeholder-icon__color
+        );
+
+        &:before {
+            left: 0;
+            position: absolute;
+            right: 0;
+            top: 20px;
+            z-index: @file-uploader-placeholder-icon__z-index;
+        }
+    }
+
+    &.placeholder-video {
+        .lib-icon-font(
+            @icon-video__content,
+            @_icon-font: @icons-admin__font-name,
+            @_icon-font-size: 3rem,
+            @_icon-font-color: @file-uploader-placeholder-icon__color,
+            @_icon-font-color-hover: @file-uploader-placeholder-icon__color
+        );
+
+        &:before {
+            left: 0;
+            position: absolute;
+            right: 0;
+            top: 30px;
+            z-index: @file-uploader-placeholder-icon__z-index;
+        }
+    }
+}
+
+.file-uploader-placeholder-text {
+    bottom: 0;
+    color: @color-blue-dodger;
+    font-size: 1.1rem;
+    left: 0;
+    line-height: @line-height__base;
+    margin-bottom: 15%;
+    padding: 0 @indent__base;
+    position: absolute;
+    right: 0;
+    text-align: center;
+}
+
 //
 //  Grid image uploader
 //  ---------------------------------------------
diff --git a/app/design/adminhtml/Magento/backend/web/css/source/variables/_icons.less b/app/design/adminhtml/Magento/backend/web/css/source/variables/_icons.less
index 53433d3c75703f626e9ef86e721988b92e3836a4..ec1d4709213f3e1ea59ed53eda33fbc4f3741998 100644
--- a/app/design/adminhtml/Magento/backend/web/css/source/variables/_icons.less
+++ b/app/design/adminhtml/Magento/backend/web/css/source/variables/_icons.less
@@ -80,3 +80,4 @@
 @icon-clip__content: '\e643';
 @icon-module__content: '\e647';
 @icon-alert-round__content: '\e648';
+@icon-document__content: '\e649';
diff --git a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.eot b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.eot
index 5bc0bee548c35b205925ca3b46c99706d05c8d66..9587f3997440e0dd93da7e02e72423d2655e3533 100755
Binary files a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.eot and b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.eot differ
diff --git a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.svg b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.svg
index 4478010abc66d68dbfbae79368128878031350d4..2904f02b748e481e18d92eb7c347c17e18bb37ba 100755
--- a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.svg
+++ b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.svg
@@ -1 +1 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" ><svg xmlns="http://www.w3.org/2000/svg"><defs><font id="icomoon" horiz-adv-x="1024"><font-face units-per-em="1024" ascent="960" descent="-64" /><missing-glyph horiz-adv-x="1024" /><glyph unicode="&#x20;" horiz-adv-x="512" d="" /><glyph unicode="&#xe600;" glyph-name="account" horiz-adv-x="1090" d="M709.921 801.306c8.139-32.295 8.927-34.974 8.192-68.162-0.263-12.813-7.772-71.943-5.724-90.112 1.628-14.966 5.461-16.174 11.448-28.514 10.398-21.425 6.984-51.095 2.941-72.678-2.206-11.868-6.827-28.725-13.916-38.387-7.667-10.66-23.211-10.713-30.142-23.158-9.872-17.854-4.306-43.008-10.503-62.385-7.142-21.898-25.101-23.421-26.466-52.145 8.822-1.155 17.592-2.468 26.466-3.623 8.822-18.59 25.049-55.874 41.59-67.059 13.863-3.728 27.727-7.457 41.59-11.185 48.627-19.64 102.558-43.061 151.237-63.33 44.373-18.432 97.411-24.996 113.48-70.84 0-31.035 2.941-104.501 2.153-145.25h-965.553c-0.893 40.697 2.153 114.215 2.153 145.25 15.964 45.844 69.002 52.408 113.375 70.84 48.679 20.27 102.61 43.691 151.237 63.33 13.811 3.728 27.674 7.457 41.59 11.185 16.489 11.185 32.715 48.522 41.538 67.059l19.692 4.621c-4.464 24.576-19.85 26.466-26.256 43.743-2.521 26.099-5.041 52.145-7.509 78.192 0.053-1.155-18.117 3.361-20.48 4.779-25.731 15.806-26.204 80.24-28.725 107.021-1.103 12.183 16.174 22.265 11.343 44.636-28.094 131.44 12.183 192.88 75.881 213.307 44.216 17.749 126.871 50.465 203.855 3.728l19.167-17.487 30.93-5.251c15.491-8.77 25.416-38.124 25.416-38.124z" /><glyph unicode="&#xe601;" glyph-name="arrowdown" horiz-adv-x="1085" d="M529.203 73.86l-468.465 628.209h936.931l-468.465-628.209z" /><glyph unicode="&#xe602;" glyph-name="cms" horiz-adv-x="1034" d="M976.793-22.006h-910.388v910.388h910.388v-910.388zM912.622 824.211h-782.046v-782.088h782.046v782.088zM221.432 137.2h152.876v372.033h-152.876v-372.033zM466.323 139.766h350.932v366.53h-350.932v-366.53zM221.432 599.511h595.865v147.125h-595.865v-147.125z" /><glyph unicode="&#xe603;" glyph-name="customers" horiz-adv-x="489" d="M264.319 651.169c75.685 0 136.98 61.259 136.98 136.944 0 75.649-61.295 136.98-136.98 136.98s-137.017-61.331-137.017-136.98c0-75.649 61.331-136.944 137.017-136.944zM448.929 589.149c-28.962 28.926-63.325 46.252-187.655 46.252s-157.859-18.776-185.335-46.252c-27.44-27.44-18.196-320.43-18.196-320.43l60.824 144.411 38.241-430.334 110.23 220.278 102.907-220.278 36.393 430.334 60.824-144.411c-0.036 0 10.693 291.468-18.233 320.43z" /><glyph unicode="&#xe604;" glyph-name="dashboard" horiz-adv-x="1376" d="M680.975 886.272c-337.523 0-610.976-273.515-611.038-610.976 0.122-37.72 1.039-251.812 1.039-251.812h1219.997c0 0 0.978 239.219 1.039 251.812-0.183 337.523-273.637 610.976-611.038 610.976zM737.708 762.169c31.117-3.607 61.379-10.271 90.418-19.624l-19.93-61.685c-25.004 8.070-51.169 13.939-78.191 16.995l7.703 64.313zM270.091 286.85h-64.864c0 31.423 3.118 62.235 8.803 92.007l63.702-12.349c-5.135-25.799-7.642-52.392-7.642-79.658zM305.855 455.581l-59.178 26.288c12.655 28.489 28 55.449 45.79 80.636l52.942-37.475c-15.284-21.825-28.611-45.056-39.554-69.449zM407.46 594.845l-43.405 48.113c22.925 20.541 47.807 39.187 74.462 54.96l33.318-55.571c-22.987-13.755-44.567-29.65-64.374-47.501zM536.943 742.545c29.039 9.292 59.178 16.017 90.418 19.624l7.581-64.313c-26.838-3.057-53.003-8.926-78.13-16.995l-19.869 61.685zM761.673 158.468l-152.897-27.205-38.881 150.452 395.172 404.22-203.394-527.467zM1019.476 525.029l52.942 37.414c17.79-25.187 33.257-52.148 45.851-80.636l-59.178-26.288c-10.943 24.454-24.209 47.685-39.615 69.51zM1094.916 286.85c0 27.266-2.69 53.859-7.703 79.658l63.702 12.349c5.808-29.834 8.803-60.645 8.803-92.007h-64.802zM646.006 189.341c26.777-17.056 62.174-9.415 79.291 17.24 17.118 26.593 9.292 62.051-17.301 79.108-26.655 17.24-62.051 9.354-79.23-17.362-17.118-26.349-9.476-61.99 17.24-78.986z" /><glyph unicode="&#xe605;" glyph-name="filter" d="M24.097 846.535h972.827v-111.922l-410.504-412.792v-238.366l-171.447-87.505v325.871l-390.875 415.877v108.837z" /><glyph unicode="&#xe606;" glyph-name="logo" horiz-adv-x="903" d="M454.495 911.101l-402.697-240.513v-457.026l104.632-60.727v457.049l298.157 178.728 299.698-179.142-0.138-455.922 103.528 60.013v457.026l-403.18 240.513zM507.766 629.72v-534.344l-53.271-32.124-53.34 32.262v533.792l-138.090-83.853v-456.934l191.453-115.516 193.087 116.322v456.451l-139.839 83.945z" /><glyph unicode="&#xe607;" glyph-name="notification-02" horiz-adv-x="989" d="M870.821 228.163c-64.195 65.89-78.231 188.772-91.738 283.159-20.074 139.937-24.259 297.089-226.008 317.693v25.318c0 25.424-39.195 46.028-64.937 46.028s-62.024-20.551-62.024-46.028v-25.371c-200.054-20.816-206.993-177.914-226.855-317.693-13.453-94.439-27.331-217.268-91.049-283.264-12.818-13.348-16.473-32.998-9.11-49.947 7.362-16.843 24.153-27.913 42.797-27.913h695.343c18.75 0 35.593 11.070 42.903 28.019s3.655 36.653-9.322 50zM489.569-3.883c51.060 0 92.373 40.837 92.373 91.367h-184.694c-0.053-50.53 41.314-91.367 92.32-91.367z" /><glyph unicode="&#xe608;" glyph-name="product" horiz-adv-x="954" d="M252.137 806.772l-160.070-92.393 378.042-218.205 160.023 92.393-377.996 218.205zM845.638 712.937l-377.996 218.252-145.222-83.828 377.996-218.205 145.222 83.782zM502.784 433.85v-433.664l376.832 217.507v433.711l-376.832-217.553zM55.668 217.74l376.785-217.507v436.503l-376.785 217.46v-436.457z" /><glyph unicode="&#xe609;" glyph-name="promotions" horiz-adv-x="1170" d="M59.153 425.818l164.053-38.141v303.902l-164.053-38.141v-227.621zM1122.198 900.847l-837.712-194.959v-335.978l140.328-376.832 151.712 57.45-104.049 279.113 649.668-151.18v722.385z" /><glyph unicode="&#xe60a;" glyph-name="reports" horiz-adv-x="991" d="M736.707-21.234h207.134v322.703h-207.134v-322.703zM399.646-21.234h207.134v946.793h-207.134v-946.793zM62.673-21.19h207.134v634.704h-207.134v-634.704z" /><glyph unicode="&#xe60b;" glyph-name="sales" horiz-adv-x="659" d="M426.502 347.483c-15.866 13.512-42.796 25.753-80.79 36.723v-198.774c11.535 1.459 23.729 4.331 36.299 8.851 12.618 4.426 23.87 10.829 33.804 19.068 9.981 8.427 18.173 18.55 24.529 30.649 6.638 12.006 9.651 26.365 9.651 42.89 0.047 26.836-7.721 47.222-23.493 60.593zM576.736 223.144c-7.109-23.117-19.774-45.762-38.135-67.749-18.503-22.175-43.079-41.855-74.010-58.992-30.885-17.373-70.432-27.683-118.878-31.12v-88.088h-57.014v88.088c-72.080 5.603-128.483 29.237-169.113 71.374-40.536 42.090-63.935 104.095-70.432 185.544h136.251c-0.753-39.359 8.992-70.479 28.86-93.266 20.15-22.74 44.774-37.335 74.434-43.455v216.523c-3.060 1.318-7.486 2.919-12.994 4.567-5.508 1.789-11.393 3.343-17.938 4.708-23.776 6.827-47.175 15.019-70.291 24.294-23.493 9.369-44.114 21.704-62.523 37.335-18.456 15.584-33.098 34.84-43.879 57.956-11.111 23.211-16.478 51.977-16.478 86.487 0 35.31 6.168 66.336 18.785 93.313 12.665 26.836 29.143 49.529 49.858 67.702 20.621 18.314 44.303 32.58 71.468 42.419 27.071 10.122 55.037 16.149 83.992 18.314v79.66h57.014v-79.66c29.143-3.531 56.308-10.169 81.638-20.292 25.423-10.028 47.787-23.729 67.137-41.478 19.585-17.514 35.357-39.453 47.457-65.771 12.288-26.13 19.35-57.109 21.28-93.172h-137.287c-0.518 27.636-8.616 51.082-23.917 70.432-15.725 19.303-34.275 29.002-56.308 29.002v-183.331c7.862-2.072 15.631-4.143 23.729-6.12 8.098-2.072 16.525-4.567 25.565-7.297 47.645-13.983 84.415-31.12 110.168-51.318 25.8-20.292 44.726-41.666 56.92-63.653 12.335-22.175 19.633-44.256 21.704-66.336 2.448-22.081 3.531-41.713 3.531-59.039 0.047-15.207-3.531-34.416-10.593-57.579zM228.905 696.585c-8.38-7.156-15.113-16.196-19.962-26.883-4.802-10.781-7.062-23.352-7.062-37.759 0-22.834 6.733-40.536 20.103-52.824 13.653-12.618 35.734-22.552 66.713-30.131v168.831c-10.829 0-21.516-1.695-31.826-5.226-10.216-3.437-19.633-8.851-27.966-16.007z" /><glyph unicode="&#xe60c;" glyph-name="search" horiz-adv-x="1109" d="M555.139 938.358c-218.775 71.601-457.062-40.29-532.231-250.028-75.227-209.681 41.211-437.665 259.928-509.208 218.717-71.601 457.004 40.348 532.231 250.028s-41.211 437.665-259.928 509.208zM320.076 282.955c-158.915 52.089-243.467 217.681-188.903 369.978 54.679 152.296 227.754 233.625 386.669 181.593s243.409-217.624 188.788-369.92c-54.622-152.296-227.696-233.567-386.554-181.65zM638.482 274.206l358.927-349.602 24.807 69.241 24.865 69.241-310.348 302.29z" /><glyph unicode="&#xe60d;" glyph-name="stores" horiz-adv-x="1280" d="M1098.281 874.55c19.777 3.723 34.901 21.232 34.901 42.347-0.058 23.791-19.196 43.103-42.812 43.103h-900.508c-23.675 0-42.754-19.312-42.754-43.103 0-21.057 15.007-38.566 34.843-42.347l-181.951-354.421v-68.988c0-30.946 32.516-56.016 72.594-56.016 13.437 0 26.001 2.908 36.821 7.795v-466.919h1061.286v466.919c10.878-4.944 23.326-7.795 36.879-7.795 40.078 0 72.594 25.071 72.594 56.016v68.988l-181.893 354.421zM214.758 395.125c-38.217 0-69.221 25.071-69.221 56.016v6.457h-0.349v62.531l137.162 353.665h109.648l-107.961-353.665v-68.988c0 0 0 0 0 0 0-30.946-31.004-56.016-69.279-56.016zM498.447 395.125c-38.217 0-69.221 25.071-69.221 56.016v68.988l57.354 353.665h109.241l-28.095-353.665v-68.93c-0.058-31.004-31.004-56.075-69.279-56.075zM782.077 395.125c-38.217 0-69.162 25.071-69.162 56.016v68.988l-28.154 353.665h108.892l57.296-353.665v-68.988c0-0.931 0.175-1.92 0.233-2.792-1.803-29.666-32.051-53.224-69.104-53.224zM1134.637 451.141c0-30.946-31.004-56.016-69.221-56.016s-69.162 25.071-69.162 56.016v68.988l-108.019 353.665h109.59l137.22-353.665v-62.473h-0.349v-6.515h-0.058z" /><glyph unicode="&#xe60f;" glyph-name="views" horiz-adv-x="1890" d="M944.97 630.958c-97.861 0-177.522-79.581-177.522-177.443 0-97.94 79.66-177.679 177.522-177.679 98.019 0 177.679 79.739 177.679 177.679 0 97.861-79.66 177.443-177.679 177.443zM944.97 960c-470.712 0-944.97-512-944.97-512s474.258-512 944.97-512c470.949 0 945.128 512 945.128 512s-474.179 512-945.128 512zM944.97 91.144c-200.057 0-362.292 162.078-362.292 362.45 0 200.057 162.236 362.292 362.292 362.292 200.214 0 362.45-162.236 362.45-362.292 0-200.451-162.236-362.45-362.45-362.45z" /><glyph unicode="&#xe610;" glyph-name="system-config" d="M1020.032 394.445v116.045l-16.41 5.376-124.237 40.525-33.152 80.102 63.718 134.784-82.048 82.125-15.411-7.808-116.531-59.213-80.077 33.178-50.278 140.442h-116.096l-45.875-140.698-80-33.126-134.963 63.744-82.022-82.074 7.834-15.334 59.162-116.608-33.126-80.026-140.518-50.253v-116.147l16.435-5.325 124.288-40.576 33.075-80-63.693-134.886 82.048-82.099 131.942 66.97 80.026-33.152 50.304-140.39h116.096l5.35 16.41 40.55 124.237 80.077 33.178 134.886-63.718 82.074 82.074-7.834 15.386-59.213 116.582 33.203 80.026 140.416 50.253zM510.003 287.411c-89.754 0-162.509 72.832-162.509 162.611 0 89.754 72.755 162.483 162.509 162.483 89.83 0 162.509-72.73 162.509-162.483 0.026-89.805-72.653-162.611-162.509-162.611z" /><glyph unicode="&#xe611;" glyph-name="home" d="M509.978 905.574l-509.978-509.926 95.949-95.949 414.106 413.978 413.875-413.978 95.949 95.898-509.901 509.978zM146.253 271.437v-335.437h259.917v304.819h207.514v-304.819h259.917v335.488l-363.622 363.597-363.725-363.648z" /><glyph unicode="&#xe612;" glyph-name="lego" d="M0 223.59l498.278-287.59v421.402l-498.278 287.667v-421.478zM894.464 735.514v-44.262c0-32.819-62.797-59.418-140.365-59.418-77.466 0-140.262 26.598-140.262 59.418v73.216h0.435c4.71-30.925 65.408-55.475 139.853-55.475 77.568 0 140.365 26.624 140.365 59.29 0 32.845-62.797 59.366-140.365 59.366-6.195 0-12.262-0.205-18.202-0.563l-90.317 52.147v-55.706c0-32.819-62.72-59.392-140.262-59.392-48.691 0-91.597 10.496-116.813 26.47-3.584 3.712-7.987 7.245-13.312 10.598-6.579 6.861-10.24 14.387-10.24 22.323v53.939l-87.322-50.381c-6.272 0.307-12.646 0.614-19.123 0.614-77.491 0-140.314-26.522-140.314-59.366 0-32.691 62.822-59.29 140.314-59.29 74.445 0 135.219 24.525 139.93 55.475h0.384v-73.216c0-32.819-62.746-59.418-140.314-59.418-77.491 0-140.314 26.598-140.314 59.418v43.622l-108.083-62.31 499.994-288.563 496.691 286.694-112.358 64.768zM646.784 551.987c0-32.794-62.874-59.315-140.365-59.315s-140.339 26.522-140.339 59.315v73.267h0.41c4.762-30.95 65.459-55.475 139.93-55.475s135.142 24.525 139.904 55.475h0.486v-73.267zM525.645 353.766v-417.766l498.355 287.718v417.766l-498.355-287.718zM505.318 841.344c77.542 0 140.262 26.547 140.262 59.315s-62.72 59.315-140.262 59.315c-77.491 0-140.339-26.573-140.339-59.315-0.026-32.768 62.822-59.315 140.339-59.315z" /><glyph unicode="&#xe613;" glyph-name="tool" d="M287.002 478.336c0.205-0.23 0.461-0.486 0.691-0.717l103.347-103.373 36.045 36.045-56.55 56.499 90.266 90.189 11.904-1.28c3.046-0.307 6.093-0.538 9.19-0.538 6.246 0 12.314 0.768 18.253 2.125l-66.381 66.381c-1.357 1.382-2.765 2.611-4.173 3.814 20.454 73.6 1.766 155.725-56.038 213.555-57.421 57.421-138.803 76.237-211.968 56.525l123.955-123.981-32.563-121.446-121.395-32.589-124.032 124.006c-19.712-73.19-0.896-154.573 56.525-212.019 60.262-60.288 147.021-77.952 222.925-53.197zM653.235 404.198c-1.997-8.909-2.509-18.202-1.459-27.546l1.306-11.93-90.189-90.189-56.55 56.55-36.070-36.122 327.219-327.194c20.198-20.173 46.618-30.259 73.062-30.259s52.915 10.086 73.037 30.259c40.346 40.32 40.346 105.728 0 146.074l-290.355 290.355zM905.907 1.638l-51.866-13.875-42.112 42.112 13.901 51.891 51.866 13.926 42.112-42.138-13.901-51.917zM506.701 365.901l56.576-56.576 64.128 64.154c-3.482 31.334 6.707 63.821 30.669 87.808 24.013 23.962 56.474 34.176 87.808 30.72l280.397 280.346-157.056 157.056-280.448-280.397c3.482-31.258-6.682-63.821-30.669-87.782-24.013-23.987-56.525-34.176-87.808-30.643l-64.102-64.205 56.499-56.422-277.043-277.12-10.138 10.138-53.248-42.829-89.421-141.312 22.835-22.835 141.312 89.421 42.803 53.222-10.138 10.138 277.043 277.12z" /><glyph unicode="&#xe614;" glyph-name="upgrade" d="M1023.932 454.895c-3.717 282.692-236.1 508.826-518.793 505.003-282.658-3.775-508.826-236.066-505.071-518.827 3.772-282.556 236.1-508.826 518.793-505.003 282.658 3.768 508.826 236.066 505.071 518.827zM623.991 478.696v-298.633h-223.983v298.633h-186.621l298.633 298.633 298.667-298.633h-186.679z" /><glyph unicode="&#xe615;" glyph-name="expand-close" d="M512.794 960c-283.187 0-512.794-229.581-512.794-512.794 0-283.187 229.606-512.794 512.794-512.794s512.794 229.632 512.794 512.794c0 283.213-229.581 512.794-512.794 512.794zM512.794-11.213c-253.158 0-458.394 205.261-458.394 458.368 0 253.158 205.261 458.394 458.394 458.394 253.184 0 458.394-205.235 458.394-458.394 0.026-253.107-205.21-458.368-458.394-458.368zM760.013 334.387l30.387 38.4-265.6 206.413-20.787 1.613-259.226-208.026 28.826-39.987 236.8 177.613z" /><glyph unicode="&#xe616;" glyph-name="expand-open" d="M512.794 960c-283.187 0-512.794-229.581-512.794-512.794 0-283.187 229.606-512.794 512.794-512.794s512.794 229.606 512.794 512.794c0 283.213-229.581 512.794-512.794 512.794zM512.794-11.213c-253.158 0-458.394 205.261-458.394 458.394 0 253.158 205.261 458.394 458.394 458.394 253.184 0 458.394-205.235 458.394-458.394 0.026-253.133-205.21-458.394-458.394-458.394zM265.6 505.6l-30.387-38.4 265.574-206.387 20.813-1.613 259.2 208-28.8 39.987-236.8-177.587z" /><glyph unicode="&#xe617;" glyph-name="gripper" d="M259.2 960h214.323v-214.323h-214.323v214.323zM259.2 690.125h214.323v-214.349h-214.323v214.349zM259.2 420.224h214.323v-214.349h-214.323v214.349zM259.2 150.349h214.323v-214.349h-214.323v214.349zM549.325 960h214.323v-214.323h-214.323v214.323zM549.325 690.125h214.323v-214.349h-214.323v214.349zM549.325 420.224h214.323v-214.349h-214.323v214.349zM549.325 150.349h214.323v-214.349h-214.323v214.349z" /><glyph unicode="&#xe618;" glyph-name="forward" d="M860.058 774.938v-272l-430.029 269.158-1.894-253.491-424.371 249.754-3.763-647.834 426.24 241.28-5.606-239.437 439.424 252.16v-259.635h163.942v660.045z" /><glyph unicode="&#xe619;" glyph-name="backward" d="M163.942 114.893v271.974l430.029-269.133 1.894 253.491 424.397-249.754 3.738 647.834-426.24-241.28 5.606 239.437-439.424-252.16v259.635h-163.942v-660.045z" /><glyph unicode="&#xe61a;" glyph-name="info" d="M505.704 919.002c-260.096-3.489-468.158-217.202-464.706-477.336 3.489-259.982 217.202-468.12 477.298-464.631s468.158 217.202 464.706 477.336c-3.413 260.058-217.202 468.12-477.298 464.631zM557.928 762.027c47.863 0 62.009-27.762 62.009-59.544 0-39.671-31.782-76.383-86.016-76.383-45.359 0-66.901 22.831-65.65 60.53 0 31.782 26.624 75.435 89.657 75.435zM435.162 153.619c-32.73 0-56.661 19.873-33.792 107.217l37.547 154.814c6.485 24.841 7.585 34.778 0 34.778-9.785 0-52.262-17.143-77.407-34.057l-16.346 26.776c79.607 66.446 171.16 105.472 210.375 105.472 32.73 0 38.153-38.722 21.807-98.266l-43.008-162.816c-7.585-28.786-4.286-38.722 3.262-38.722 9.785 0 41.984 11.871 73.614 36.75l18.47-24.841c-77.369-77.369-161.792-107.179-194.56-107.179z" /><glyph unicode="&#xe61b;" glyph-name="lock" d="M591.986 511.981h-16.005v192.019c0 105.851-86.13 192.019-192.019 192.019h-128c-105.851 0-192.019-86.13-192.019-192.019v-192.019h-16.005c-26.396 0-48.014-21.618-48.014-48.014v-479.991c0-26.396 21.618-48.014 48.014-48.014h544.009c26.396 0 48.014 21.618 48.014 48.014v479.991c0 26.396-21.618 48.014-48.014 48.014zM384 64h-128l27.838 139.188c-16.801 11.529-27.838 30.872-27.838 52.793 0 35.347 28.672 64.019 64.019 64.019s64.019-28.672 64.019-64.019c0-21.921-11.036-41.263-27.838-52.793l27.838-139.188zM448.019 511.981h-256v192.019c0 35.271 28.71 64.019 64.019 64.019h128c35.271 0 64.019-28.71 64.019-64.019v-192.019z" /><glyph unicode="&#xe61c;" glyph-name="loop" d="M870.4 642.56h-194.56v-143.36h153.6v-215.040h-634.88v215.040h215.040v-112.64l204.8 184.32-204.8 184.32v-112.64h-256c-56.51 0-102.4-45.815-102.4-102.4v-296.96c0-56.51 45.89-102.4 102.4-102.4h716.8c56.585 0 102.4 45.89 102.4 102.4v296.96c0 56.585-45.815 102.4-102.4 102.4z" /><glyph unicode="&#xe61d;" glyph-name="plus" d="M991.991 576h-351.991v351.991c0 17.673-14.336 32.009-32.009 32.009h-192.019c-17.673 0-32.009-14.336-32.009-32.009v-351.991h-351.991c-17.673 0-32.009-14.336-32.009-32.009v-192.019c0-17.673 14.336-32.009 32.009-32.009h351.991v-351.991c0-17.673 14.336-32.009 32.009-32.009h192.019c17.673 0 32.009 14.336 32.009 32.009v351.991h351.991c17.673 0 32.009 14.336 32.009 32.009v192.019c0 17.673-14.336 32.009-32.009 32.009z" /><glyph unicode="&#xe61e;" glyph-name="recover" d="M505.704 919.002c-260.096-3.489-468.158-217.126-464.706-477.298 3.489-260.21 217.202-468.158 477.298-464.744 260.134 3.489 468.233 217.202 464.706 477.298-3.489 260.21-217.202 468.233-477.298 464.744zM506.577 857.6c70.163 0.986 136.382-15.853 194.56-46.118l-63.374-105.662c-38.002 18.47-80.631 28.937-125.762 28.937-45.056 0-87.723-10.43-125.687-28.975l-63.336 105.624c54.993 28.672 117.343 45.321 183.599 46.232zM254.255 322.313l-105.586-63.298c-28.672 54.955-45.321 117.305-46.194 183.486-0.986 70.201 15.853 136.457 46.118 194.56l105.624-63.45c-18.546-37.926-28.975-80.555-28.975-125.649 0-45.056 10.43-87.723 28.975-125.687zM517.461 38.438c-70.163-0.986-136.457 15.853-194.56 46.118l63.374 105.662c38.002-18.546 80.631-28.975 125.687-28.975 45.094 0 87.761 10.392 125.687 28.937l63.336-105.586c-54.993-28.634-117.305-45.246-183.561-46.194zM512 222.758c-124.397 0-225.242 100.883-225.242 225.242 0 124.397 100.883 225.28 225.242 225.28 124.473 0 225.28-100.883 225.28-225.28s-100.807-225.242-225.28-225.242zM769.745 322.313c18.546 38.002 28.975 80.631 28.975 125.687 0 45.094-10.43 87.723-28.975 125.687l105.586 63.374c28.672-54.993 45.359-117.305 46.232-183.561 0.91-70.201-15.929-136.457-46.194-194.56l-105.624 63.336z" /><glyph unicode="&#xe61f;" glyph-name="refresh" horiz-adv-x="1176" d="M906.126 824.187v0c-91.174 75.89-202.487 113.171-312.548 113.057-127.014 0.038-253.611-49.683-348.16-145.636l-95.004 79.265-1.593-305.342 300.184 56.282-99.442 82.944c67.546 64.247 155.269 97.204 244.015 97.28 79.948-0.038 159.782-26.7 226.114-81.806 84.347-70.125 127.659-170.629 127.772-272.46-0.038-14.715-0.948-29.431-2.769-44.070l137.519 26.283c0.19 5.954 0.303 11.871 0.303 17.787 0.152 140.098-60.151 279.78-176.431 376.415zM839.035 193.024c-67.736-65.498-156.255-99.025-245.912-99.1-79.986 0.038-159.82 26.738-226.114 81.806-84.347 70.125-127.697 170.629-127.772 272.498 0 16.839 1.252 33.716 3.679 50.366l-138.164-25.941c-0.379-8.116-0.683-16.346-0.683-24.462-0.114-140.174 60.226-279.817 176.545-376.491 91.136-75.852 202.411-113.057 312.51-112.981h0.341c127.924 0 255.241 50.441 349.943 147.759l90.795-75.207 0.569 305.38-299.956-57.344 104.183-86.281z" /><glyph unicode="&#xe620;" glyph-name="remove-small" horiz-adv-x="1176" d="M593.351 938.268c-270.753 0-490.268-219.477-490.268-490.231s219.515-490.268 490.268-490.268 490.231 219.515 490.231 490.268c0 270.753-219.477 490.231-490.231 490.231zM828.947 276.347l-72.363-72.363-162.095 162.133-164.902-164.902-73.121 73.121 164.902 164.902-161.678 161.678 72.363 72.325 161.602-161.678 165.774 165.736 73.121-73.083-165.774-165.736 162.171-162.133z" /><glyph unicode="&#xe621;" glyph-name="retweet" d="M254.976 284.16v267.264h103.424l-179.2 203.776-179.2-203.776h103.424v-308.224c0-56.51 45.815-102.4 102.4-102.4h459.776l-131.186 143.36h-279.438zM920.538 344.576v308.224c0 56.51-45.89 102.4-102.4 102.4h-459.738l131.11-143.36h279.514v-267.264h-103.424l179.2-203.776 179.2 203.776h-103.462z" /><glyph unicode="&#xe622;" glyph-name="unlocked" d="M768 895.981h-128c-105.851 0-192.019-86.13-192.019-192.019v-192.019h-400.005c-26.396 0-48.014-21.618-48.014-48.014v-479.991c0-26.396 21.618-48.014 48.014-48.014h544.009c26.396 0 48.014 21.618 48.014 48.014v479.991c0 26.396-21.618 48.014-48.014 48.014h-16.005v192.019c0 35.271 28.71 64.019 64.019 64.019h128c35.271 0 64.019-28.71 64.019-64.019v-192.019h128v192.019c0 105.851-86.13 192.019-192.019 192.019zM384 64h-128l27.838 139.188c-16.801 11.529-27.838 30.872-27.838 52.793 0 35.347 28.672 64.019 64.019 64.019s64.019-28.672 64.019-64.019c0-21.921-11.036-41.263-27.838-52.793l27.838-139.188z" /><glyph unicode="&#xe623;" glyph-name="warning" horiz-adv-x="1176" d="M593.351 960l-593.351-1023.962h1186.74l-593.351 1023.962zM653.236 60.549h-125.421v121.211h125.421v-121.211zM622.175 231.671h-62.502l-34.816 288.313v156.748h131.3v-156.748l-33.982-288.313z" /><glyph unicode="&#xe624;" glyph-name="arrow-left" d="M0 448l512-512v320.019h512v384h-512v320.019z" /><glyph unicode="&#xe625;" glyph-name="arrow-right" d="M1024 448l-512 512v-320.019h-512v-384h512v-320.019z" /><glyph unicode="&#xe626;" glyph-name="back-arrow" d="M402.735 813.265l-320.019-320.019c-24.993-24.993-24.993-65.498 0-90.491l320.019-320.019c24.993-24.993 65.498-24.993 90.491 0s24.993 65.498 0 90.491l-210.754 210.754h613.49c35.347 0 64.019 28.634 64.019 64.019s-28.672 64.019-64.019 64.019h-613.49l210.754 210.754c12.478 12.478 18.735 28.862 18.735 45.246s-6.258 32.768-18.735 45.246c-24.993 24.993-65.498 24.993-90.491 0z" /><glyph unicode="&#xe627;" glyph-name="calendar" horiz-adv-x="1176" d="M507.259 381.478h-102.059v-101.717h102.059v101.717zM650.885 245.286h-101.945v-101.717h101.945v101.717zM507.259 245.286h-102.059v-101.717h102.059v101.717zM507.259 517.67h-102.059v-101.679h102.059v101.679zM843.131 715.909c23.4 0 42.287 18.887 42.287 42.174v145.408c0 23.324-18.887 42.174-42.287 42.174s-42.325-18.849-42.325-42.174v-145.408c0.038-23.324 18.925-42.174 42.325-42.174zM343.419 715.909c23.362 0 42.249 18.887 42.249 42.174v145.408c0 23.324-18.887 42.174-42.249 42.174-23.4 0-42.325-18.849-42.325-42.174v-145.408c0-23.324 18.925-42.174 42.325-42.174zM363.444 381.478h-102.059v-101.717h102.059v101.717zM363.444 245.286h-102.059v-101.717h102.059v101.717zM650.885 381.478h-101.945v-101.717h101.945v101.717zM938.325 381.478h-102.059v-101.717h102.059v101.717zM938.325 517.67h-102.059v-101.679h102.059v101.679zM899.337 875.615v-46.914c17.598-15.474 28.71-38.153 28.71-63.412 0-46.801-37.964-84.764-84.916-84.764s-84.954 37.964-84.954 84.764c0 25.259 11.15 47.938 28.71 63.412v46.914h-387.262v-46.914c17.56-15.474 28.71-38.153 28.71-63.412 0-46.801-38.002-84.764-84.916-84.764s-84.954 37.964-84.954 84.764c0 25.259 11.15 47.938 28.71 63.412v46.914h-192.322v-925.279h997.035v925.279h-192.512zM999.234 44.696h-809.832v589.938h809.832v-589.938zM650.885 517.67h-101.945v-101.679h101.945v101.679zM794.624 517.67h-101.983v-101.679h101.983v101.679zM794.624 245.286h-101.983v-101.717h101.983v101.717zM794.624 381.478h-101.983v-101.717h101.983v101.717z" /><glyph unicode="&#xe628;" glyph-name="caret-down" d="M132.21 673.242c-13.881 13.729-36.295 13.729-50.138 0-13.805-13.653-13.805-35.878 0-49.607l404.897-400.877c13.881-13.729 36.257-13.729 50.138 0l404.897 400.877c13.805 13.729 13.881 35.878 0 49.607s-36.371 13.729-50.138 0.038l-379.866-365.606-379.79 365.568z" /><glyph unicode="&#xe629;" glyph-name="caret-left" d="M737.242 68.21c13.729-13.881 13.729-36.257 0-50.138s-35.878-13.881-49.607 0l-400.877 404.821c-13.729 13.881-13.729 36.295 0 50.138l400.877 404.897c13.729 13.881 35.878 13.881 49.607 0s13.729-36.257 0-50.138l-365.568-379.79 365.568-379.79z" /><glyph unicode="&#xe62a;" glyph-name="caret-right" d="M286.72 68.21c-13.729-13.881-13.729-36.257 0-50.138s35.878-13.881 49.607 0l400.877 404.821c13.729 13.881 13.729 36.295 0 50.138l-400.915 404.897c-13.729 13.881-35.878 13.881-49.607 0s-13.729-36.257 0-50.138l365.568-379.79-365.568-379.79z" /><glyph unicode="&#xe62b;" glyph-name="caret-up" d="M891.79 222.758c13.881-13.729 36.295-13.729 50.138 0 13.881 13.729 13.881 35.878 0 49.607l-404.897 400.877c-13.805 13.729-36.257 13.729-50.062 0l-404.897-400.877c-13.805-13.729-13.881-35.878 0-49.607s36.257-13.729 50.138 0l379.79 365.606 379.79-365.606z" /><glyph unicode="&#xe62c;" glyph-name="ccw" d="M574.767 867.84c-227.593 0-412.672-182.386-418.247-409.335h-125.8l188.378-209.92 188.302 209.92h-146.242c5.537 168.998 143.777 304.393 313.609 304.393 173.397 0 313.913-140.971 313.913-314.899s-140.478-314.861-313.913-314.861c-69.48 0-133.689 22.718-185.685 61.099l-71.983-76.99c70.997-55.751 160.465-89.050 257.707-89.050 231.159 0 418.551 187.961 418.551 419.84-0.038 231.879-187.43 419.84-418.551 419.84z" /><glyph unicode="&#xe62d;" glyph-name="check-mage" horiz-adv-x="1176" d="M996.617 833.214l-513.555-513.555-256.796 256.834-128.379-128.417 385.214-385.252 641.896 642.010z" /><glyph unicode="&#xe62e;" glyph-name="clock" d="M512 919.040c-260.134 0-471.040-210.944-471.040-471.040 0-260.134 210.906-471.040 471.040-471.040s471.040 210.906 471.040 471.040c0 260.134-210.906 471.040-471.040 471.040zM512 79.36c-203.624 0-368.64 165.054-368.64 368.64s165.016 368.64 368.64 368.64 368.64-165.054 368.64-368.64-165.016-368.64-368.64-368.64zM547.84 714.24h-71.68v-281.069l174.345-174.345 50.669 50.707-153.335 153.335z" /><glyph unicode="&#xe62f;" glyph-name="close-mage" horiz-adv-x="1176" d="M1094.391 882.29l-77.71 77.71-423.329-423.347-423.33 423.347-77.71-77.672 423.35-423.368-423.312-423.329 77.672-77.71 423.338 423.338 423.283-423.3 77.671 77.71-423.263 423.281z" /><glyph unicode="&#xe630;" glyph-name="delete" horiz-adv-x="1176" d="M337.541-61.004h513.024l64.512 645.916h-639.128l61.592-645.916zM737.394 805.831v116.508c0 19.191-15.398 34.702-34.361 34.702h-217.847c-19.001 0-34.361-15.55-34.361-34.702v-114.574c-73.576-8.382-150.149-24.614-226.494-52.338v-106.989h738.001v109.833c0 0-90.074 31.403-224.977 47.559zM668.937 812.241c-47.749 3.224-99.252 4.096-153.297 0.986v61.44c0 9.519 7.623 17.332 17.143 17.332h118.936c9.519 0 17.218-7.813 17.218-17.332v-62.426z" /><glyph unicode="&#xe631;" glyph-name="edit" horiz-adv-x="1176" d="M928.503 933.111l-111.502-112.109 156.065-156.9 111.502 112.071-156.065 156.937zM215.002 215.59l156.065-156.9 535.211 538.093-156.065 156.9-535.211-538.093zM103.917-47.161l188.985 49.873-139.302 140.098-49.683-190.009z" /><glyph unicode="&#xe632;" glyph-name="error" d="M1014.67 137.349c0 0 0 0 0 0l-310.651 310.651 310.651 310.651c0 0 0 0 0 0 3.337 3.337 5.765 7.244 7.32 11.416 4.248 11.378 1.82 24.69-7.32 33.83l-146.735 146.735c-9.14 9.14-22.452 11.567-33.83 7.32-4.172-1.555-8.078-3.982-11.416-7.32 0 0 0 0 0 0l-310.651-310.651-310.651 310.651c0 0 0 0 0 0-3.337 3.337-7.244 5.765-11.416 7.32-11.378 4.248-24.69 1.82-33.83-7.32l-146.735-146.735c-9.14-9.14-11.567-22.452-7.32-33.83 1.555-4.172 3.982-8.078 7.32-11.416 0 0 0 0 0 0l310.651-310.651-310.651-310.651c0 0 0 0 0 0-3.337-3.337-5.765-7.244-7.32-11.416-4.248-11.378-1.82-24.69 7.32-33.83l146.735-146.735c9.14-9.14 22.452-11.567 33.83-7.32 4.172 1.555 8.078 3.982 11.416 7.32 0 0 0 0 0 0l310.651 310.651 310.651-310.651c0 0 0 0 0 0 3.337-3.337 7.244-5.765 11.416-7.32 11.378-4.248 24.69-1.82 33.83 7.32l146.735 146.735c9.14 9.14 11.567 22.452 7.32 33.83-1.555 4.172-3.982 8.078-7.32 11.416z" /><glyph unicode="&#xe633;" glyph-name="help" horiz-adv-x="1176" d="M593.351 937.434c-270.336 0-489.434-219.098-489.434-489.358s219.098-489.434 489.434-489.434 489.434 219.136 489.434 489.434-219.136 489.358-489.434 489.358zM635.752 133.404c-11.985-11.719-26.396-17.636-43.16-17.636-8.154 0-15.967 1.517-23.4 4.589-7.358 3.034-13.843 7.168-19.456 12.174-5.613 5.158-10.126 11.226-13.388 18.356-3.337 7.13-4.968 14.753-4.968 22.945 0 16.308 5.992 30.303 17.977 42.060 11.947 11.681 26.396 17.598 43.198 17.598 16.308 0 30.606-5.689 42.78-16.801 12.25-11.188 18.318-24.993 18.318-41.339-0.038-16.384-5.992-30.303-17.939-41.984zM778.923 577.327c-3.982-13.767-9.747-26.396-17.18-37.774-7.471-11.454-16.498-22.49-27.079-33.071s-22.49-21.618-35.65-33.033c-11.454-9.785-20.783-18.318-27.913-25.79-7.168-7.396-12.895-14.867-17.218-22.338-4.286-7.433-7.282-15.398-9.026-24.007-1.707-8.609-2.617-49.721-2.617-62.35v-22.338h-101.376v32.616c0 13.729 0.986 56.661 3.034 67.584s5.158 21.125 9.481 30.872 10.012 19.228 17.18 28.369c7.168 9.14 16.232 18.887 27.079 29.203l38.647 36.902c10.847 9.747 20.177 20.632 27.951 32.616 7.737 12.060 11.529 26.7 11.529 43.88 0 22.3-6.978 41.036-21.011 56.206-14.071 15.17-33.944 22.793-59.695 22.793-13.16 0-25.069-2.389-35.65-7.282-10.619-4.817-19.797-11.454-27.496-19.759-7.737-8.344-13.577-17.901-17.598-28.786-3.982-10.847-6.334-21.997-6.865-33.527l-105.624 9.444c3.413 27.496 10.733 51.959 21.921 73.463 11.112 21.466 25.562 39.595 43.311 54.575 17.711 14.829 38.078 26.169 61.023 33.944 22.869 7.699 47.521 11.605 73.842 11.605 24.614 0 47.976-3.603 70.049-10.771 21.959-7.168 41.491-17.711 58.406-31.782 16.839-14.033 30.227-31.365 39.936-51.959 9.709-20.632 14.564-44.411 14.564-71.263 0-18.356-2.010-34.475-5.992-48.166z" /><glyph unicode="&#xe634;" glyph-name="history" d="M574.805 867.84c-227.631 0-412.71-182.386-418.247-409.335h-125.838l188.378-209.958 188.302 209.958h-146.242c5.537 168.998 143.777 304.393 313.647 304.393 173.359 0 313.875-140.971 313.875-314.899s-140.478-314.861-313.875-314.861c-69.518 0-133.727 22.718-185.761 61.099l-71.983-76.99c71.073-55.751 160.503-89.050 257.745-89.050 231.121 0 418.513 187.961 418.513 419.84-0.038 231.879-187.43 419.84-418.513 419.84zM537.6 673.28v-240.109l153.865-153.865 50.669 50.669-132.855 132.855v210.413h-71.68z" /><glyph unicode="&#xe635;" glyph-name="export" d="M383.462 382.49h255.693v213.043h127.795l-255.642 255.667-255.642-255.667h127.795zM852.173 382.49v-170.394h-681.754v170.394h-170.419v-340.89h1022.618v340.89z" /><glyph unicode="&#xe636;" glyph-name="import" d="M639.155 851.2h-255.693v-213.043h-127.795l255.667-255.667 255.616 255.667h-127.795zM852.173 382.49v-170.394h-681.754v170.394h-170.419v-340.89h1022.618v340.89z" /><glyph unicode="&#xe637;" glyph-name="dot" d="M505.139 959.915c-282.658-3.775-508.826-236.066-505.071-518.827 3.772-282.556 236.1-508.826 518.793-505.003 282.658 3.768 508.826 236.066 505.071 518.827-3.717 282.658-236.1 508.826-518.793 505.003z" /><glyph unicode="&#xe638;" glyph-name="not-installed" d="M510.413 960c-281.907 0-510.413-228.582-510.413-510.413 0-281.933 228.506-510.464 510.413-510.464s510.387 228.557 510.387 510.464c0 281.83-228.48 510.413-510.387 510.413zM865.843 449.587c0-69.99-20.506-135.27-55.578-190.285l-490.163 490.163c55.091 35.021 120.32 55.475 190.31 55.475 195.942 0 355.43-159.411 355.43-355.354zM154.957 449.587c0 69.939 20.506 135.245 55.578 190.31l490.189-490.189c-55.066-35.072-120.371-55.501-190.31-55.501-195.942-0.026-355.456 159.437-355.456 355.379z" /><glyph unicode="&#xe639;" glyph-name="disabled" d="M511.77 960c-282.778 0-512.102-229.222-512.102-512.179 0-282.829 229.325-512.102 512.102-512.102 282.931-0.026 512.23 229.248 512.23 512.102 0 282.957-229.299 512.179-512.23 512.179zM143.718 540.032h736.205v-184.269h-736.205v184.269z" /><glyph unicode="&#xe63a;" glyph-name="menu-item" horiz-adv-x="903" d="M857.675 670.587l-403.18 240.514-402.726-240.514v-457.026l403.18-240.515 402.726 240.514v457.027zM454.857 95.535l-298.427 178.383v335.966l298.157 178.729 298.428-178.383v-335.966l-298.158-178.729z" /><glyph unicode="&#xe63b;" glyph-name="tag" d="M904.192 959.973l-307.234-0.116-596.89-596.958 426.906-426.906 596.958 596.958-0.113 305.596-119.603 121.426zM858.679 646.663c-39.997-40.001-104.854-40.001-144.794 0-40.001 40.001-40.001 104.796 0 144.794 39.939 40.001 104.796 40.001 144.794 0 39.997-39.997 39.997-104.793 0-144.794z" /><glyph unicode="&#xe63c;" glyph-name="camera" d="M982.767 728.098h-250.095l-59.255 121.364c0 0-11.827 25.201-42.11 25.201-23.375 0-169.366 0-235.25 0-32.969 0-44.001-25.027-44.001-25.027l-57.484-121.539h-253.406c-22.74 0-41.131-18.459-41.131-41.267v-624.333c0-22.743 18.401-41.199 41.131-41.199h941.636c22.74 0 41.199 18.459 41.199 41.199v624.299c0 22.798-18.456 41.267-41.199 41.267zM512 136.090c-138.793 0-251.597 113.015-251.597 251.931 0 138.912 112.845 251.87 251.597 251.87 138.68 0 251.597-112.981 251.597-251.87 0-138.909-112.913-251.931-251.597-251.931zM512 539.068c-83.255 0-150.972-67.714-150.972-150.972 0-83.197 67.71-150.903 150.972-150.903 83.258 0 150.903 67.714 150.903 150.903 0 83.255-67.652 150.972-150.903 150.972z" /><glyph unicode="&#xe63d;" glyph-name="grid" d="M0.010 959.628h279.074v-279.074h-279.074zM372.77 959.628h279.074v-279.074h-279.074zM744.892 959.628h279.074v-279.074h-279.074zM0.010 587.503h279.074v-279.074h-279.074zM372.77 587.503h279.074v-279.074h-279.074zM744.892 587.503h279.074v-279.074h-279.074zM0.010 215.415h279.074v-279.074h-279.074zM372.77 215.415h279.074v-279.074h-279.074zM744.892 215.415h279.074v-279.074h-279.074z" /><glyph unicode="&#xe63e;" glyph-name="list-menu" d="M0.010 771.516h1023.966v-136.509h-1023.966zM0.010 517.53h1023.966v-136.506h-1023.966zM0.010 260.983h1023.966v-136.513h-1023.966z" /><glyph unicode="&#xe63f;" glyph-name="cart" d="M771.001 183.263c-55.445 0-100.448-44.754-100.448-100.2s44.879-100.324 100.448-100.324 100.448 44.879 100.448 100.324-45.003 100.2-100.448 100.2zM771.001 41.293c-23.123 0-41.77 18.648-41.77 41.771s18.647 41.77 41.77 41.77c23.247 0 41.895-18.648 41.895-41.77s-18.648-41.771-41.895-41.771zM469.532 183.263c-55.445 0-100.449-44.754-100.449-100.2s45.003-100.324 100.449-100.324c55.445 0 100.448 44.879 100.448 100.324s-45.003 100.2-100.448 100.2zM469.532 41.293c-23.123 0-41.771 18.648-41.771 41.771s18.648 41.77 41.771 41.77 41.77-18.648 41.77-41.77-18.648-41.771-41.77-41.771zM823.587 465.588c-130.036 0-238.441 91.622-264.547 213.825h-207.237l-136.749 198.162v1.865h-207.237v-83.541h169.942l78.693-117.729 83.417-412.857h581.183l49.23 243.786c-42.268-27.474-92.616-43.511-146.694-43.511zM1023.862 710.244v45.376l-55.073 18.026-12.929 31.204 24.863 52.71-31.95 32.074-5.967-2.984-45.5-23.123-31.328 12.929-19.642 54.948h-45.376l-2.114-6.464-15.912-48.608-31.203-12.929-52.835 24.863-32.074-31.95 3.108-5.967 23.247-45.624-13.053-31.328-54.948-19.766v-45.376l6.34-2.113 48.732-15.788 12.929-31.204-24.863-52.71 32.074-32.074 6.092 3.108 45.376 22.999 31.328-12.929 19.642-54.824h45.376l2.113 6.464 15.913 48.359 31.203 12.929 52.71-24.988 32.198 32.074-3.108 6.092-23.247 45.624 12.929 31.203 54.948 19.766zM824.582 668.473c-35.057 0-63.65 28.469-63.65 63.526 0 35.182 28.469 63.526 63.65 63.526s63.526-28.469 63.526-63.526c-0.124-35.182-28.469-63.526-63.526-63.526z" /><glyph unicode="&#xe640;" glyph-name="screen" horiz-adv-x="1159" d="M723.661 70.399c-2.404 10.843-4.034 21.47-5.282 31.583h-277.528c-2.458-20.233-6.917-43.087-14.646-64.305-7.79-21.277-18.796-40.54-33.824-54.15-15.028-13.552-33.689-22.104-59.788-22.158v-25.369h494.020v25.369c-26.142 0.058-44.737 8.61-59.838 22.158-22.44 20.307-35.961 53.91-43.114 86.873zM1126.214 960h-1093.209c-18.22 0-33.005-15.024-33.005-33.596v-731.259c0-18.576 14.785-33.623 33.005-33.623h1093.209c18.224 0 33.067 15.051 33.067 33.623v731.259c0 18.572-14.843 33.596-33.067 33.596zM1079.193 243.078h-999.234v635.394h999.234v-635.394z" /><glyph unicode="&#xe641;" glyph-name="video" horiz-adv-x="2041" d="M2041.366 958.898v-1021.449h-175.926l-411.263 409.297v204.59l411.263 407.568h175.926zM1305.997-29.076c0-19.377-15.608-34.924-34.856-34.924h-1236.279c-19.255 0-34.863 15.547-34.863 34.924v954.275c0 19.248 15.608 34.801 34.863 34.801h1236.279c19.248 0 34.856-15.553 34.856-34.801v-954.275z" /><glyph unicode="&#xe642;" glyph-name="revert" horiz-adv-x="1404" d="M1042.226 660.151h-598.393v299.849l-443.833-384.316 443.833-384.403v299.859h598.393c106.478 0 192.801-86.318 192.801-192.801s-86.318-192.796-192.801-192.796v-0.483l-452.707-0.005c-46.695-0.005-84.53-37.845-84.53-84.535 0-46.68 37.84-84.525 84.535-84.525 0.377 0 0.744 0.053 1.121 0.058h451.581c199.964 0 362.044 162.085 362.044 362.039 0 199.964-162.080 362.059-362.044 362.059z" /><glyph unicode="&#xe643;" glyph-name="clip" d="M939.616 811.616c112.512-112.448 112.512-294.816 0-407.264l-350.944-350.976c-12.512-12.544-32.736-12.544-45.248 0-12.576 12.512-12.576 32.704 0 45.248l346.432 346.464c87.488 87.488 87.488 229.248-0.064 316.768-87.36 87.488-229.248 87.488-316.736 0l-462.304-456.864c-62.496-62.464-62.496-163.776 0-226.24 62.496-62.496 163.744-62.496 226.24 0l466.88 461.344c37.44 37.44 37.44 98.336 0 135.776-37.44 37.408-98.304 37.408-135.744 0l-351.008-351.008c-12.512-12.512-32.736-12.512-45.248 0-12.512 12.544-12.512 32.736 0 45.28l350.976 350.976c62.432 62.464 163.744 62.464 226.24 0 62.496-62.496 62.496-163.776 0-226.272l-466.88-461.376c-87.296-87.328-229.408-87.328-316.736 0s-87.328 229.472 0 316.8l466.88 461.344c112.448 112.512 294.816 112.512 407.264 0z" /><glyph unicode="&#xe647;" glyph-name="module" horiz-adv-x="883" d="M793.271 737.4l-192.695 83.055v-80.482c-2.517-31.926-83.182-57.618-182.582-57.618-99.309 0-180.126 25.692-182.398 57.618h-0.318l-0.465 80.482-197.709-83.055 381.218-167.697 374.95 167.697zM265.959 841.886l-1.104-0.428c32.596-16.331 89.086-27.124 153.551-27.124 64.726 0 121.621 10.94 153.996 27.355l-1.168 0.512c18.811 9.3 29.664 20.34 29.664 32.264 0 32.713-81.606 59.114-182.492 59.114-100.759 0-182.806-26.401-182.806-59.114-0.003-12.007 11.295-23.218 30.36-32.579zM418.418 497.564l-418.418 191.009v-563.335l418.321-189.238 418.321 189.238v563.733l-418.224-191.407z" /><glyph unicode="&#xe648;" glyph-name="alert-round" d="M1023.959 454.912c-3.717 282.665-236.121 508.842-518.817 505.040-282.689-3.772-508.866-236.091-505.094-518.868 3.772-282.58 236.121-508.842 518.813-505.040 282.689 3.772 508.866 236.067 505.098 518.868zM580.086 55.641h-136.149v136.163h136.149v-136.163zM597.168 666.258l-44.103-388.928h-83.113l-43.099 388.928v171.575h170.318v-171.575z" /></font></defs></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg"><metadata>Generated by IcoMoon</metadata><defs><font id="icomoon" horiz-adv-x="1024"><font-face units-per-em="1024" ascent="960" descent="-64"/><missing-glyph horiz-adv-x="1024"/><glyph unicode=" " horiz-adv-x="512" d=""/><glyph unicode="&#58880;" glyph-name="account" horiz-adv-x="1090" d="M709.921 801.306c8.139-32.295 8.927-34.974 8.192-68.162-0.263-12.813-7.772-71.943-5.724-90.112 1.628-14.966 5.461-16.174 11.448-28.514 10.398-21.425 6.984-51.095 2.941-72.678-2.206-11.868-6.827-28.725-13.916-38.387-7.667-10.66-23.211-10.713-30.142-23.158-9.872-17.854-4.306-43.008-10.503-62.385-7.142-21.898-25.101-23.421-26.466-52.145 8.822-1.155 17.592-2.468 26.466-3.623 8.822-18.59 25.049-55.874 41.59-67.059 13.863-3.728 27.727-7.457 41.59-11.185 48.627-19.64 102.558-43.061 151.237-63.33 44.373-18.432 97.411-24.996 113.48-70.84 0-31.035 2.941-104.501 2.153-145.25h-965.553c-0.893 40.697 2.153 114.215 2.153 145.25 15.964 45.844 69.002 52.408 113.375 70.84 48.679 20.27 102.61 43.691 151.237 63.33 13.811 3.728 27.674 7.457 41.59 11.185 16.489 11.185 32.715 48.522 41.538 67.059l19.692 4.621c-4.464 24.576-19.85 26.466-26.256 43.743-2.521 26.099-5.041 52.145-7.509 78.192 0.053-1.155-18.117 3.361-20.48 4.779-25.731 15.806-26.204 80.24-28.725 107.021-1.103 12.183 16.174 22.265 11.343 44.636-28.094 131.44 12.183 192.88 75.881 213.307 44.216 17.749 126.871 50.465 203.855 3.728l19.167-17.487 30.93-5.251c15.491-8.77 25.416-38.124 25.416-38.124z"/><glyph unicode="&#58881;" glyph-name="arrowdown" horiz-adv-x="1085" d="M529.203 73.86l-468.465 628.209h936.931l-468.465-628.209z"/><glyph unicode="&#58882;" glyph-name="cms" horiz-adv-x="1034" d="M976.793-22.006h-910.388v910.388h910.388v-910.388zM912.622 824.211h-782.046v-782.088h782.046v782.088zM221.432 137.2h152.876v372.033h-152.876v-372.033zM466.323 139.766h350.932v366.53h-350.932v-366.53zM221.432 599.511h595.865v147.125h-595.865v-147.125z"/><glyph unicode="&#58883;" glyph-name="customers" horiz-adv-x="489" d="M264.319 651.169c75.685 0 136.98 61.259 136.98 136.944 0 75.649-61.295 136.98-136.98 136.98s-137.017-61.331-137.017-136.98c0-75.649 61.331-136.944 137.017-136.944zM448.929 589.149c-28.962 28.926-63.325 46.252-187.655 46.252s-157.859-18.776-185.335-46.252c-27.44-27.44-18.196-320.43-18.196-320.43l60.824 144.411 38.241-430.334 110.23 220.278 102.907-220.278 36.393 430.334 60.824-144.411c-0.036 0 10.693 291.468-18.233 320.43z"/><glyph unicode="&#58884;" glyph-name="dashboard" horiz-adv-x="1376" d="M680.975 886.272c-337.523 0-610.976-273.515-611.038-610.976 0.122-37.72 1.039-251.812 1.039-251.812h1219.997c0 0 0.978 239.219 1.039 251.812-0.183 337.523-273.637 610.976-611.038 610.976zM737.708 762.169c31.117-3.607 61.379-10.271 90.418-19.624l-19.93-61.685c-25.004 8.070-51.169 13.939-78.191 16.995l7.703 64.313zM270.091 286.85h-64.864c0 31.423 3.118 62.235 8.803 92.007l63.702-12.349c-5.135-25.799-7.642-52.392-7.642-79.658zM305.855 455.581l-59.178 26.288c12.655 28.489 28 55.449 45.79 80.636l52.942-37.475c-15.284-21.825-28.611-45.056-39.554-69.449zM407.46 594.845l-43.405 48.113c22.925 20.541 47.807 39.187 74.462 54.96l33.318-55.571c-22.987-13.755-44.567-29.65-64.374-47.501zM536.943 742.545c29.039 9.292 59.178 16.017 90.418 19.624l7.581-64.313c-26.838-3.057-53.003-8.926-78.13-16.995l-19.869 61.685zM761.673 158.468l-152.897-27.205-38.881 150.452 395.172 404.22-203.394-527.467zM1019.476 525.029l52.942 37.414c17.79-25.187 33.257-52.148 45.851-80.636l-59.178-26.288c-10.943 24.454-24.209 47.685-39.615 69.51zM1094.916 286.85c0 27.266-2.69 53.859-7.703 79.658l63.702 12.349c5.808-29.834 8.803-60.645 8.803-92.007h-64.802zM646.006 189.341c26.777-17.056 62.174-9.415 79.291 17.24 17.118 26.593 9.292 62.051-17.301 79.108-26.655 17.24-62.051 9.354-79.23-17.362-17.118-26.349-9.476-61.99 17.24-78.986z"/><glyph unicode="&#58885;" glyph-name="filter" d="M24.097 846.535h972.827v-111.922l-410.504-412.792v-238.366l-171.447-87.505v325.871l-390.875 415.877v108.837z"/><glyph unicode="&#58886;" glyph-name="logo" horiz-adv-x="903" d="M454.495 911.101l-402.697-240.513v-457.026l104.632-60.727v457.049l298.157 178.728 299.698-179.142-0.138-455.922 103.528 60.013v457.026l-403.18 240.513zM507.766 629.72v-534.344l-53.271-32.124-53.34 32.262v533.792l-138.090-83.853v-456.934l191.453-115.516 193.087 116.322v456.451l-139.839 83.945z"/><glyph unicode="&#58887;" glyph-name="notification-02" horiz-adv-x="989" d="M870.821 228.163c-64.195 65.89-78.231 188.772-91.738 283.159-20.074 139.937-24.259 297.089-226.008 317.693v25.318c0 25.424-39.195 46.028-64.937 46.028s-62.024-20.551-62.024-46.028v-25.371c-200.054-20.816-206.993-177.914-226.855-317.693-13.453-94.439-27.331-217.268-91.049-283.264-12.818-13.348-16.473-32.998-9.11-49.947 7.362-16.843 24.153-27.913 42.797-27.913h695.343c18.75 0 35.593 11.070 42.903 28.019s3.655 36.653-9.322 50zM489.569-3.883c51.060 0 92.373 40.837 92.373 91.367h-184.694c-0.053-50.53 41.314-91.367 92.32-91.367z"/><glyph unicode="&#58888;" glyph-name="product" horiz-adv-x="954" d="M252.137 806.772l-160.070-92.393 378.042-218.205 160.023 92.393-377.996 218.205zM845.638 712.937l-377.996 218.252-145.222-83.828 377.996-218.205 145.222 83.782zM502.784 433.85v-433.664l376.832 217.507v433.711l-376.832-217.553zM55.668 217.74l376.785-217.507v436.503l-376.785 217.46v-436.457z"/><glyph unicode="&#58889;" glyph-name="promotions" horiz-adv-x="1170" d="M59.153 425.818l164.053-38.141v303.902l-164.053-38.141v-227.621zM1122.198 900.847l-837.712-194.959v-335.978l140.328-376.832 151.712 57.45-104.049 279.113 649.668-151.18v722.385z"/><glyph unicode="&#58890;" glyph-name="reports" horiz-adv-x="991" d="M736.707-21.234h207.134v322.703h-207.134v-322.703zM399.646-21.234h207.134v946.793h-207.134v-946.793zM62.673-21.19h207.134v634.704h-207.134v-634.704z"/><glyph unicode="&#58891;" glyph-name="sales" horiz-adv-x="659" d="M426.502 347.483c-15.866 13.512-42.796 25.753-80.79 36.723v-198.774c11.535 1.459 23.729 4.331 36.299 8.851 12.618 4.426 23.87 10.829 33.804 19.068 9.981 8.427 18.173 18.55 24.529 30.649 6.638 12.006 9.651 26.365 9.651 42.89 0.047 26.836-7.721 47.222-23.493 60.593zM576.736 223.144c-7.109-23.117-19.774-45.762-38.135-67.749-18.503-22.175-43.079-41.855-74.010-58.992-30.885-17.373-70.432-27.683-118.878-31.12v-88.088h-57.014v88.088c-72.080 5.603-128.483 29.237-169.113 71.374-40.536 42.090-63.935 104.095-70.432 185.544h136.251c-0.753-39.359 8.992-70.479 28.86-93.266 20.15-22.74 44.774-37.335 74.434-43.455v216.523c-3.060 1.318-7.486 2.919-12.994 4.567-5.508 1.789-11.393 3.343-17.938 4.708-23.776 6.827-47.175 15.019-70.291 24.294-23.493 9.369-44.114 21.704-62.523 37.335-18.456 15.584-33.098 34.84-43.879 57.956-11.111 23.211-16.478 51.977-16.478 86.487 0 35.31 6.168 66.336 18.785 93.313 12.665 26.836 29.143 49.529 49.858 67.702 20.621 18.314 44.303 32.58 71.468 42.419 27.071 10.122 55.037 16.149 83.992 18.314v79.66h57.014v-79.66c29.143-3.531 56.308-10.169 81.638-20.292 25.423-10.028 47.787-23.729 67.137-41.478 19.585-17.514 35.357-39.453 47.457-65.771 12.288-26.13 19.35-57.109 21.28-93.172h-137.287c-0.518 27.636-8.616 51.082-23.917 70.432-15.725 19.303-34.275 29.002-56.308 29.002v-183.331c7.862-2.072 15.631-4.143 23.729-6.12 8.098-2.072 16.525-4.567 25.565-7.297 47.645-13.983 84.415-31.12 110.168-51.318 25.8-20.292 44.726-41.666 56.92-63.653 12.335-22.175 19.633-44.256 21.704-66.336 2.448-22.081 3.531-41.713 3.531-59.039 0.047-15.207-3.531-34.416-10.593-57.579zM228.905 696.585c-8.38-7.156-15.113-16.196-19.962-26.883-4.802-10.781-7.062-23.352-7.062-37.759 0-22.834 6.733-40.536 20.103-52.824 13.653-12.618 35.734-22.552 66.713-30.131v168.831c-10.829 0-21.516-1.695-31.826-5.226-10.216-3.437-19.633-8.851-27.966-16.007z"/><glyph unicode="&#58892;" glyph-name="search" horiz-adv-x="1109" d="M555.139 938.358c-218.775 71.601-457.062-40.29-532.231-250.028-75.227-209.681 41.211-437.665 259.928-509.208 218.717-71.601 457.004 40.348 532.231 250.028s-41.211 437.665-259.928 509.208zM320.076 282.955c-158.915 52.089-243.467 217.681-188.903 369.978 54.679 152.296 227.754 233.625 386.669 181.593s243.409-217.624 188.788-369.92c-54.622-152.296-227.696-233.567-386.554-181.65zM638.482 274.206l358.927-349.602 24.807 69.241 24.865 69.241-310.348 302.29z"/><glyph unicode="&#58893;" glyph-name="stores" horiz-adv-x="1280" d="M1098.281 874.55c19.777 3.723 34.901 21.232 34.901 42.347-0.058 23.791-19.196 43.103-42.812 43.103h-900.508c-23.675 0-42.754-19.312-42.754-43.103 0-21.057 15.007-38.566 34.843-42.347l-181.951-354.421v-68.988c0-30.946 32.516-56.016 72.594-56.016 13.437 0 26.001 2.908 36.821 7.795v-466.919h1061.286v466.919c10.878-4.944 23.326-7.795 36.879-7.795 40.078 0 72.594 25.071 72.594 56.016v68.988l-181.893 354.421zM214.758 395.125c-38.217 0-69.221 25.071-69.221 56.016v6.457h-0.349v62.531l137.162 353.665h109.648l-107.961-353.665v-68.988c0 0 0 0 0 0 0-30.946-31.004-56.016-69.279-56.016zM498.447 395.125c-38.217 0-69.221 25.071-69.221 56.016v68.988l57.354 353.665h109.241l-28.095-353.665v-68.93c-0.058-31.004-31.004-56.075-69.279-56.075zM782.077 395.125c-38.217 0-69.162 25.071-69.162 56.016v68.988l-28.154 353.665h108.892l57.296-353.665v-68.988c0-0.931 0.175-1.92 0.233-2.792-1.803-29.666-32.051-53.224-69.104-53.224zM1134.637 451.141c0-30.946-31.004-56.016-69.221-56.016s-69.162 25.071-69.162 56.016v68.988l-108.019 353.665h109.59l137.22-353.665v-62.473h-0.349v-6.515h-0.058z"/><glyph unicode="&#58895;" glyph-name="views" horiz-adv-x="1890" d="M944.97 630.958c-97.861 0-177.522-79.581-177.522-177.443 0-97.94 79.66-177.679 177.522-177.679 98.019 0 177.679 79.739 177.679 177.679 0 97.861-79.66 177.443-177.679 177.443zM944.97 960c-470.712 0-944.97-512-944.97-512s474.258-512 944.97-512c470.949 0 945.128 512 945.128 512s-474.179 512-945.128 512zM944.97 91.144c-200.057 0-362.292 162.078-362.292 362.45 0 200.057 162.236 362.292 362.292 362.292 200.214 0 362.45-162.236 362.45-362.292 0-200.451-162.236-362.45-362.45-362.45z"/><glyph unicode="&#58896;" glyph-name="system-config" d="M1020.032 394.445v116.045l-16.41 5.376-124.237 40.525-33.152 80.102 63.718 134.784-82.048 82.125-15.411-7.808-116.531-59.213-80.077 33.178-50.278 140.442h-116.096l-45.875-140.698-80-33.126-134.963 63.744-82.022-82.074 7.834-15.334 59.162-116.608-33.126-80.026-140.518-50.253v-116.147l16.435-5.325 124.288-40.576 33.075-80-63.693-134.886 82.048-82.099 131.942 66.97 80.026-33.152 50.304-140.39h116.096l5.35 16.41 40.55 124.237 80.077 33.178 134.886-63.718 82.074 82.074-7.834 15.386-59.213 116.582 33.203 80.026 140.416 50.253zM510.003 287.411c-89.754 0-162.509 72.832-162.509 162.611 0 89.754 72.755 162.483 162.509 162.483 89.83 0 162.509-72.73 162.509-162.483 0.026-89.805-72.653-162.611-162.509-162.611z"/><glyph unicode="&#58897;" glyph-name="home" d="M509.978 905.574l-509.978-509.926 95.949-95.949 414.106 413.978 413.875-413.978 95.949 95.898-509.901 509.978zM146.253 271.437v-335.437h259.917v304.819h207.514v-304.819h259.917v335.488l-363.622 363.597-363.725-363.648z"/><glyph unicode="&#58898;" glyph-name="lego" d="M0 223.59l498.278-287.59v421.402l-498.278 287.667v-421.478zM894.464 735.514v-44.262c0-32.819-62.797-59.418-140.365-59.418-77.466 0-140.262 26.598-140.262 59.418v73.216h0.435c4.71-30.925 65.408-55.475 139.853-55.475 77.568 0 140.365 26.624 140.365 59.29 0 32.845-62.797 59.366-140.365 59.366-6.195 0-12.262-0.205-18.202-0.563l-90.317 52.147v-55.706c0-32.819-62.72-59.392-140.262-59.392-48.691 0-91.597 10.496-116.813 26.47-3.584 3.712-7.987 7.245-13.312 10.598-6.579 6.861-10.24 14.387-10.24 22.323v53.939l-87.322-50.381c-6.272 0.307-12.646 0.614-19.123 0.614-77.491 0-140.314-26.522-140.314-59.366 0-32.691 62.822-59.29 140.314-59.29 74.445 0 135.219 24.525 139.93 55.475h0.384v-73.216c0-32.819-62.746-59.418-140.314-59.418-77.491 0-140.314 26.598-140.314 59.418v43.622l-108.083-62.31 499.994-288.563 496.691 286.694-112.358 64.768zM646.784 551.987c0-32.794-62.874-59.315-140.365-59.315s-140.339 26.522-140.339 59.315v73.267h0.41c4.762-30.95 65.459-55.475 139.93-55.475s135.142 24.525 139.904 55.475h0.486v-73.267zM525.645 353.766v-417.766l498.355 287.718v417.766l-498.355-287.718zM505.318 841.344c77.542 0 140.262 26.547 140.262 59.315s-62.72 59.315-140.262 59.315c-77.491 0-140.339-26.573-140.339-59.315-0.026-32.768 62.822-59.315 140.339-59.315z"/><glyph unicode="&#58899;" glyph-name="tool" d="M287.002 478.336c0.205-0.23 0.461-0.486 0.691-0.717l103.347-103.373 36.045 36.045-56.55 56.499 90.266 90.189 11.904-1.28c3.046-0.307 6.093-0.538 9.19-0.538 6.246 0 12.314 0.768 18.253 2.125l-66.381 66.381c-1.357 1.382-2.765 2.611-4.173 3.814 20.454 73.6 1.766 155.725-56.038 213.555-57.421 57.421-138.803 76.237-211.968 56.525l123.955-123.981-32.563-121.446-121.395-32.589-124.032 124.006c-19.712-73.19-0.896-154.573 56.525-212.019 60.262-60.288 147.021-77.952 222.925-53.197zM653.235 404.198c-1.997-8.909-2.509-18.202-1.459-27.546l1.306-11.93-90.189-90.189-56.55 56.55-36.070-36.122 327.219-327.194c20.198-20.173 46.618-30.259 73.062-30.259s52.915 10.086 73.037 30.259c40.346 40.32 40.346 105.728 0 146.074l-290.355 290.355zM905.907 1.638l-51.866-13.875-42.112 42.112 13.901 51.891 51.866 13.926 42.112-42.138-13.901-51.917zM506.701 365.901l56.576-56.576 64.128 64.154c-3.482 31.334 6.707 63.821 30.669 87.808 24.013 23.962 56.474 34.176 87.808 30.72l280.397 280.346-157.056 157.056-280.448-280.397c3.482-31.258-6.682-63.821-30.669-87.782-24.013-23.987-56.525-34.176-87.808-30.643l-64.102-64.205 56.499-56.422-277.043-277.12-10.138 10.138-53.248-42.829-89.421-141.312 22.835-22.835 141.312 89.421 42.803 53.222-10.138 10.138 277.043 277.12z"/><glyph unicode="&#58900;" glyph-name="upgrade" d="M1023.932 454.895c-3.717 282.692-236.1 508.826-518.793 505.003-282.658-3.775-508.826-236.066-505.071-518.827 3.772-282.556 236.1-508.826 518.793-505.003 282.658 3.768 508.826 236.066 505.071 518.827zM623.991 478.696v-298.633h-223.983v298.633h-186.621l298.633 298.633 298.667-298.633h-186.679z"/><glyph unicode="&#58901;" glyph-name="expand-close" d="M512.794 960c-283.187 0-512.794-229.581-512.794-512.794 0-283.187 229.606-512.794 512.794-512.794s512.794 229.632 512.794 512.794c0 283.213-229.581 512.794-512.794 512.794zM512.794-11.213c-253.158 0-458.394 205.261-458.394 458.368 0 253.158 205.261 458.394 458.394 458.394 253.184 0 458.394-205.235 458.394-458.394 0.026-253.107-205.21-458.368-458.394-458.368zM760.013 334.387l30.387 38.4-265.6 206.413-20.787 1.613-259.226-208.026 28.826-39.987 236.8 177.613z"/><glyph unicode="&#58902;" glyph-name="expand-open" d="M512.794 960c-283.187 0-512.794-229.581-512.794-512.794 0-283.187 229.606-512.794 512.794-512.794s512.794 229.606 512.794 512.794c0 283.213-229.581 512.794-512.794 512.794zM512.794-11.213c-253.158 0-458.394 205.261-458.394 458.394 0 253.158 205.261 458.394 458.394 458.394 253.184 0 458.394-205.235 458.394-458.394 0.026-253.133-205.21-458.394-458.394-458.394zM265.6 505.6l-30.387-38.4 265.574-206.387 20.813-1.613 259.2 208-28.8 39.987-236.8-177.587z"/><glyph unicode="&#58903;" glyph-name="gripper" d="M259.2 960h214.323v-214.323h-214.323v214.323zM259.2 690.125h214.323v-214.349h-214.323v214.349zM259.2 420.224h214.323v-214.349h-214.323v214.349zM259.2 150.349h214.323v-214.349h-214.323v214.349zM549.325 960h214.323v-214.323h-214.323v214.323zM549.325 690.125h214.323v-214.349h-214.323v214.349zM549.325 420.224h214.323v-214.349h-214.323v214.349zM549.325 150.349h214.323v-214.349h-214.323v214.349z"/><glyph unicode="&#58904;" glyph-name="forward" d="M860.058 774.938v-272l-430.029 269.158-1.894-253.491-424.371 249.754-3.763-647.834 426.24 241.28-5.606-239.437 439.424 252.16v-259.635h163.942v660.045z"/><glyph unicode="&#58905;" glyph-name="backward" d="M163.942 114.893v271.974l430.029-269.133 1.894 253.491 424.397-249.754 3.738 647.834-426.24-241.28 5.606 239.437-439.424-252.16v259.635h-163.942v-660.045z"/><glyph unicode="&#58906;" glyph-name="info" d="M505.704 919.002c-260.096-3.489-468.158-217.202-464.706-477.336 3.489-259.982 217.202-468.12 477.298-464.631s468.158 217.202 464.706 477.336c-3.413 260.058-217.202 468.12-477.298 464.631zM557.928 762.027c47.863 0 62.009-27.762 62.009-59.544 0-39.671-31.782-76.383-86.016-76.383-45.359 0-66.901 22.831-65.65 60.53 0 31.782 26.624 75.435 89.657 75.435zM435.162 153.619c-32.73 0-56.661 19.873-33.792 107.217l37.547 154.814c6.485 24.841 7.585 34.778 0 34.778-9.785 0-52.262-17.143-77.407-34.057l-16.346 26.776c79.607 66.446 171.16 105.472 210.375 105.472 32.73 0 38.153-38.722 21.807-98.266l-43.008-162.816c-7.585-28.786-4.286-38.722 3.262-38.722 9.785 0 41.984 11.871 73.614 36.75l18.47-24.841c-77.369-77.369-161.792-107.179-194.56-107.179z"/><glyph unicode="&#58907;" glyph-name="lock" d="M591.986 511.981h-16.005v192.019c0 105.851-86.13 192.019-192.019 192.019h-128c-105.851 0-192.019-86.13-192.019-192.019v-192.019h-16.005c-26.396 0-48.014-21.618-48.014-48.014v-479.991c0-26.396 21.618-48.014 48.014-48.014h544.009c26.396 0 48.014 21.618 48.014 48.014v479.991c0 26.396-21.618 48.014-48.014 48.014zM384 64h-128l27.838 139.188c-16.801 11.529-27.838 30.872-27.838 52.793 0 35.347 28.672 64.019 64.019 64.019s64.019-28.672 64.019-64.019c0-21.921-11.036-41.263-27.838-52.793l27.838-139.188zM448.019 511.981h-256v192.019c0 35.271 28.71 64.019 64.019 64.019h128c35.271 0 64.019-28.71 64.019-64.019v-192.019z"/><glyph unicode="&#58908;" glyph-name="loop" d="M870.4 642.56h-194.56v-143.36h153.6v-215.040h-634.88v215.040h215.040v-112.64l204.8 184.32-204.8 184.32v-112.64h-256c-56.51 0-102.4-45.815-102.4-102.4v-296.96c0-56.51 45.89-102.4 102.4-102.4h716.8c56.585 0 102.4 45.89 102.4 102.4v296.96c0 56.585-45.815 102.4-102.4 102.4z"/><glyph unicode="&#58909;" glyph-name="plus" d="M991.991 576h-351.991v351.991c0 17.673-14.336 32.009-32.009 32.009h-192.019c-17.673 0-32.009-14.336-32.009-32.009v-351.991h-351.991c-17.673 0-32.009-14.336-32.009-32.009v-192.019c0-17.673 14.336-32.009 32.009-32.009h351.991v-351.991c0-17.673 14.336-32.009 32.009-32.009h192.019c17.673 0 32.009 14.336 32.009 32.009v351.991h351.991c17.673 0 32.009 14.336 32.009 32.009v192.019c0 17.673-14.336 32.009-32.009 32.009z"/><glyph unicode="&#58910;" glyph-name="recover" d="M505.704 919.002c-260.096-3.489-468.158-217.126-464.706-477.298 3.489-260.21 217.202-468.158 477.298-464.744 260.134 3.489 468.233 217.202 464.706 477.298-3.489 260.21-217.202 468.233-477.298 464.744zM506.577 857.6c70.163 0.986 136.382-15.853 194.56-46.118l-63.374-105.662c-38.002 18.47-80.631 28.937-125.762 28.937-45.056 0-87.723-10.43-125.687-28.975l-63.336 105.624c54.993 28.672 117.343 45.321 183.599 46.232zM254.255 322.313l-105.586-63.298c-28.672 54.955-45.321 117.305-46.194 183.486-0.986 70.201 15.853 136.457 46.118 194.56l105.624-63.45c-18.546-37.926-28.975-80.555-28.975-125.649 0-45.056 10.43-87.723 28.975-125.687zM517.461 38.438c-70.163-0.986-136.457 15.853-194.56 46.118l63.374 105.662c38.002-18.546 80.631-28.975 125.687-28.975 45.094 0 87.761 10.392 125.687 28.937l63.336-105.586c-54.993-28.634-117.305-45.246-183.561-46.194zM512 222.758c-124.397 0-225.242 100.883-225.242 225.242 0 124.397 100.883 225.28 225.242 225.28 124.473 0 225.28-100.883 225.28-225.28s-100.807-225.242-225.28-225.242zM769.745 322.313c18.546 38.002 28.975 80.631 28.975 125.687 0 45.094-10.43 87.723-28.975 125.687l105.586 63.374c28.672-54.993 45.359-117.305 46.232-183.561 0.91-70.201-15.929-136.457-46.194-194.56l-105.624 63.336z"/><glyph unicode="&#58911;" glyph-name="refresh" horiz-adv-x="1176" d="M906.126 824.187v0c-91.174 75.89-202.487 113.171-312.548 113.057-127.014 0.038-253.611-49.683-348.16-145.636l-95.004 79.265-1.593-305.342 300.184 56.282-99.442 82.944c67.546 64.247 155.269 97.204 244.015 97.28 79.948-0.038 159.782-26.7 226.114-81.806 84.347-70.125 127.659-170.629 127.772-272.46-0.038-14.715-0.948-29.431-2.769-44.070l137.519 26.283c0.19 5.954 0.303 11.871 0.303 17.787 0.152 140.098-60.151 279.78-176.431 376.415zM839.035 193.024c-67.736-65.498-156.255-99.025-245.912-99.1-79.986 0.038-159.82 26.738-226.114 81.806-84.347 70.125-127.697 170.629-127.772 272.498 0 16.839 1.252 33.716 3.679 50.366l-138.164-25.941c-0.379-8.116-0.683-16.346-0.683-24.462-0.114-140.174 60.226-279.817 176.545-376.491 91.136-75.852 202.411-113.057 312.51-112.981h0.341c127.924 0 255.241 50.441 349.943 147.759l90.795-75.207 0.569 305.38-299.956-57.344 104.183-86.281z"/><glyph unicode="&#58912;" glyph-name="remove-small" horiz-adv-x="1176" d="M593.351 938.268c-270.753 0-490.268-219.477-490.268-490.231s219.515-490.268 490.268-490.268 490.231 219.515 490.231 490.268c0 270.753-219.477 490.231-490.231 490.231zM828.947 276.347l-72.363-72.363-162.095 162.133-164.902-164.902-73.121 73.121 164.902 164.902-161.678 161.678 72.363 72.325 161.602-161.678 165.774 165.736 73.121-73.083-165.774-165.736 162.171-162.133z"/><glyph unicode="&#58913;" glyph-name="retweet" d="M254.976 284.16v267.264h103.424l-179.2 203.776-179.2-203.776h103.424v-308.224c0-56.51 45.815-102.4 102.4-102.4h459.776l-131.186 143.36h-279.438zM920.538 344.576v308.224c0 56.51-45.89 102.4-102.4 102.4h-459.738l131.11-143.36h279.514v-267.264h-103.424l179.2-203.776 179.2 203.776h-103.462z"/><glyph unicode="&#58914;" glyph-name="unlocked" d="M768 895.981h-128c-105.851 0-192.019-86.13-192.019-192.019v-192.019h-400.005c-26.396 0-48.014-21.618-48.014-48.014v-479.991c0-26.396 21.618-48.014 48.014-48.014h544.009c26.396 0 48.014 21.618 48.014 48.014v479.991c0 26.396-21.618 48.014-48.014 48.014h-16.005v192.019c0 35.271 28.71 64.019 64.019 64.019h128c35.271 0 64.019-28.71 64.019-64.019v-192.019h128v192.019c0 105.851-86.13 192.019-192.019 192.019zM384 64h-128l27.838 139.188c-16.801 11.529-27.838 30.872-27.838 52.793 0 35.347 28.672 64.019 64.019 64.019s64.019-28.672 64.019-64.019c0-21.921-11.036-41.263-27.838-52.793l27.838-139.188z"/><glyph unicode="&#58915;" glyph-name="warning" horiz-adv-x="1176" d="M593.351 960l-593.351-1023.962h1186.74l-593.351 1023.962zM653.236 60.549h-125.421v121.211h125.421v-121.211zM622.175 231.671h-62.502l-34.816 288.313v156.748h131.3v-156.748l-33.982-288.313z"/><glyph unicode="&#58916;" glyph-name="arrow-left" d="M0 448l512-512v320.019h512v384h-512v320.019z"/><glyph unicode="&#58917;" glyph-name="arrow-right" d="M1024 448l-512 512v-320.019h-512v-384h512v-320.019z"/><glyph unicode="&#58918;" glyph-name="back-arrow" d="M402.735 813.265l-320.019-320.019c-24.993-24.993-24.993-65.498 0-90.491l320.019-320.019c24.993-24.993 65.498-24.993 90.491 0s24.993 65.498 0 90.491l-210.754 210.754h613.49c35.347 0 64.019 28.634 64.019 64.019s-28.672 64.019-64.019 64.019h-613.49l210.754 210.754c12.478 12.478 18.735 28.862 18.735 45.246s-6.258 32.768-18.735 45.246c-24.993 24.993-65.498 24.993-90.491 0z"/><glyph unicode="&#58919;" glyph-name="calendar" horiz-adv-x="1176" d="M507.259 381.478h-102.059v-101.717h102.059v101.717zM650.885 245.286h-101.945v-101.717h101.945v101.717zM507.259 245.286h-102.059v-101.717h102.059v101.717zM507.259 517.67h-102.059v-101.679h102.059v101.679zM843.131 715.909c23.4 0 42.287 18.887 42.287 42.174v145.408c0 23.324-18.887 42.174-42.287 42.174s-42.325-18.849-42.325-42.174v-145.408c0.038-23.324 18.925-42.174 42.325-42.174zM343.419 715.909c23.362 0 42.249 18.887 42.249 42.174v145.408c0 23.324-18.887 42.174-42.249 42.174-23.4 0-42.325-18.849-42.325-42.174v-145.408c0-23.324 18.925-42.174 42.325-42.174zM363.444 381.478h-102.059v-101.717h102.059v101.717zM363.444 245.286h-102.059v-101.717h102.059v101.717zM650.885 381.478h-101.945v-101.717h101.945v101.717zM938.325 381.478h-102.059v-101.717h102.059v101.717zM938.325 517.67h-102.059v-101.679h102.059v101.679zM899.337 875.615v-46.914c17.598-15.474 28.71-38.153 28.71-63.412 0-46.801-37.964-84.764-84.916-84.764s-84.954 37.964-84.954 84.764c0 25.259 11.15 47.938 28.71 63.412v46.914h-387.262v-46.914c17.56-15.474 28.71-38.153 28.71-63.412 0-46.801-38.002-84.764-84.916-84.764s-84.954 37.964-84.954 84.764c0 25.259 11.15 47.938 28.71 63.412v46.914h-192.322v-925.279h997.035v925.279h-192.512zM999.234 44.696h-809.832v589.938h809.832v-589.938zM650.885 517.67h-101.945v-101.679h101.945v101.679zM794.624 517.67h-101.983v-101.679h101.983v101.679zM794.624 245.286h-101.983v-101.717h101.983v101.717zM794.624 381.478h-101.983v-101.717h101.983v101.717z"/><glyph unicode="&#58920;" glyph-name="caret-down" d="M132.21 673.242c-13.881 13.729-36.295 13.729-50.138 0-13.805-13.653-13.805-35.878 0-49.607l404.897-400.877c13.881-13.729 36.257-13.729 50.138 0l404.897 400.877c13.805 13.729 13.881 35.878 0 49.607s-36.371 13.729-50.138 0.038l-379.866-365.606-379.79 365.568z"/><glyph unicode="&#58921;" glyph-name="caret-left" d="M737.242 68.21c13.729-13.881 13.729-36.257 0-50.138s-35.878-13.881-49.607 0l-400.877 404.821c-13.729 13.881-13.729 36.295 0 50.138l400.877 404.897c13.729 13.881 35.878 13.881 49.607 0s13.729-36.257 0-50.138l-365.568-379.79 365.568-379.79z"/><glyph unicode="&#58922;" glyph-name="caret-right" d="M286.72 68.21c-13.729-13.881-13.729-36.257 0-50.138s35.878-13.881 49.607 0l400.877 404.821c13.729 13.881 13.729 36.295 0 50.138l-400.915 404.897c-13.729 13.881-35.878 13.881-49.607 0s-13.729-36.257 0-50.138l365.568-379.79-365.568-379.79z"/><glyph unicode="&#58923;" glyph-name="caret-up" d="M891.79 222.758c13.881-13.729 36.295-13.729 50.138 0 13.881 13.729 13.881 35.878 0 49.607l-404.897 400.877c-13.805 13.729-36.257 13.729-50.062 0l-404.897-400.877c-13.805-13.729-13.881-35.878 0-49.607s36.257-13.729 50.138 0l379.79 365.606 379.79-365.606z"/><glyph unicode="&#58924;" glyph-name="ccw" d="M574.767 867.84c-227.593 0-412.672-182.386-418.247-409.335h-125.8l188.378-209.92 188.302 209.92h-146.242c5.537 168.998 143.777 304.393 313.609 304.393 173.397 0 313.913-140.971 313.913-314.899s-140.478-314.861-313.913-314.861c-69.48 0-133.689 22.718-185.685 61.099l-71.983-76.99c70.997-55.751 160.465-89.050 257.707-89.050 231.159 0 418.551 187.961 418.551 419.84-0.038 231.879-187.43 419.84-418.551 419.84z"/><glyph unicode="&#58925;" glyph-name="check-mage" horiz-adv-x="1176" d="M996.617 833.214l-513.555-513.555-256.796 256.834-128.379-128.417 385.214-385.252 641.896 642.010z"/><glyph unicode="&#58926;" glyph-name="clock" d="M512 919.040c-260.134 0-471.040-210.944-471.040-471.040 0-260.134 210.906-471.040 471.040-471.040s471.040 210.906 471.040 471.040c0 260.134-210.906 471.040-471.040 471.040zM512 79.36c-203.624 0-368.64 165.054-368.64 368.64s165.016 368.64 368.64 368.64 368.64-165.054 368.64-368.64-165.016-368.64-368.64-368.64zM547.84 714.24h-71.68v-281.069l174.345-174.345 50.669 50.707-153.335 153.335z"/><glyph unicode="&#58927;" glyph-name="close-mage" horiz-adv-x="1176" d="M1094.391 882.29l-77.71 77.71-423.329-423.347-423.33 423.347-77.71-77.672 423.35-423.368-423.312-423.329 77.672-77.71 423.338 423.338 423.283-423.3 77.671 77.71-423.263 423.281z"/><glyph unicode="&#58928;" glyph-name="delete" horiz-adv-x="1176" d="M337.541-61.004h513.024l64.512 645.916h-639.128l61.592-645.916zM737.394 805.831v116.508c0 19.191-15.398 34.702-34.361 34.702h-217.847c-19.001 0-34.361-15.55-34.361-34.702v-114.574c-73.576-8.382-150.149-24.614-226.494-52.338v-106.989h738.001v109.833c0 0-90.074 31.403-224.977 47.559zM668.937 812.241c-47.749 3.224-99.252 4.096-153.297 0.986v61.44c0 9.519 7.623 17.332 17.143 17.332h118.936c9.519 0 17.218-7.813 17.218-17.332v-62.426z"/><glyph unicode="&#58929;" glyph-name="edit" horiz-adv-x="1176" d="M928.503 933.111l-111.502-112.109 156.065-156.9 111.502 112.071-156.065 156.937zM215.002 215.59l156.065-156.9 535.211 538.093-156.065 156.9-535.211-538.093zM103.917-47.161l188.985 49.873-139.302 140.098-49.683-190.009z"/><glyph unicode="&#58930;" glyph-name="error" d="M1014.67 137.349c0 0 0 0 0 0l-310.651 310.651 310.651 310.651c0 0 0 0 0 0 3.337 3.337 5.765 7.244 7.32 11.416 4.248 11.378 1.82 24.69-7.32 33.83l-146.735 146.735c-9.14 9.14-22.452 11.567-33.83 7.32-4.172-1.555-8.078-3.982-11.416-7.32 0 0 0 0 0 0l-310.651-310.651-310.651 310.651c0 0 0 0 0 0-3.337 3.337-7.244 5.765-11.416 7.32-11.378 4.248-24.69 1.82-33.83-7.32l-146.735-146.735c-9.14-9.14-11.567-22.452-7.32-33.83 1.555-4.172 3.982-8.078 7.32-11.416 0 0 0 0 0 0l310.651-310.651-310.651-310.651c0 0 0 0 0 0-3.337-3.337-5.765-7.244-7.32-11.416-4.248-11.378-1.82-24.69 7.32-33.83l146.735-146.735c9.14-9.14 22.452-11.567 33.83-7.32 4.172 1.555 8.078 3.982 11.416 7.32 0 0 0 0 0 0l310.651 310.651 310.651-310.651c0 0 0 0 0 0 3.337-3.337 7.244-5.765 11.416-7.32 11.378-4.248 24.69-1.82 33.83 7.32l146.735 146.735c9.14 9.14 11.567 22.452 7.32 33.83-1.555 4.172-3.982 8.078-7.32 11.416z"/><glyph unicode="&#58931;" glyph-name="help" horiz-adv-x="1176" d="M593.351 937.434c-270.336 0-489.434-219.098-489.434-489.358s219.098-489.434 489.434-489.434 489.434 219.136 489.434 489.434-219.136 489.358-489.434 489.358zM635.752 133.404c-11.985-11.719-26.396-17.636-43.16-17.636-8.154 0-15.967 1.517-23.4 4.589-7.358 3.034-13.843 7.168-19.456 12.174-5.613 5.158-10.126 11.226-13.388 18.356-3.337 7.13-4.968 14.753-4.968 22.945 0 16.308 5.992 30.303 17.977 42.060 11.947 11.681 26.396 17.598 43.198 17.598 16.308 0 30.606-5.689 42.78-16.801 12.25-11.188 18.318-24.993 18.318-41.339-0.038-16.384-5.992-30.303-17.939-41.984zM778.923 577.327c-3.982-13.767-9.747-26.396-17.18-37.774-7.471-11.454-16.498-22.49-27.079-33.071s-22.49-21.618-35.65-33.033c-11.454-9.785-20.783-18.318-27.913-25.79-7.168-7.396-12.895-14.867-17.218-22.338-4.286-7.433-7.282-15.398-9.026-24.007-1.707-8.609-2.617-49.721-2.617-62.35v-22.338h-101.376v32.616c0 13.729 0.986 56.661 3.034 67.584s5.158 21.125 9.481 30.872 10.012 19.228 17.18 28.369c7.168 9.14 16.232 18.887 27.079 29.203l38.647 36.902c10.847 9.747 20.177 20.632 27.951 32.616 7.737 12.060 11.529 26.7 11.529 43.88 0 22.3-6.978 41.036-21.011 56.206-14.071 15.17-33.944 22.793-59.695 22.793-13.16 0-25.069-2.389-35.65-7.282-10.619-4.817-19.797-11.454-27.496-19.759-7.737-8.344-13.577-17.901-17.598-28.786-3.982-10.847-6.334-21.997-6.865-33.527l-105.624 9.444c3.413 27.496 10.733 51.959 21.921 73.463 11.112 21.466 25.562 39.595 43.311 54.575 17.711 14.829 38.078 26.169 61.023 33.944 22.869 7.699 47.521 11.605 73.842 11.605 24.614 0 47.976-3.603 70.049-10.771 21.959-7.168 41.491-17.711 58.406-31.782 16.839-14.033 30.227-31.365 39.936-51.959 9.709-20.632 14.564-44.411 14.564-71.263 0-18.356-2.010-34.475-5.992-48.166z"/><glyph unicode="&#58932;" glyph-name="history" d="M574.805 867.84c-227.631 0-412.71-182.386-418.247-409.335h-125.838l188.378-209.958 188.302 209.958h-146.242c5.537 168.998 143.777 304.393 313.647 304.393 173.359 0 313.875-140.971 313.875-314.899s-140.478-314.861-313.875-314.861c-69.518 0-133.727 22.718-185.761 61.099l-71.983-76.99c71.073-55.751 160.503-89.050 257.745-89.050 231.121 0 418.513 187.961 418.513 419.84-0.038 231.879-187.43 419.84-418.513 419.84zM537.6 673.28v-240.109l153.865-153.865 50.669 50.669-132.855 132.855v210.413h-71.68z"/><glyph unicode="&#58933;" glyph-name="export" d="M383.462 382.49h255.693v213.043h127.795l-255.642 255.667-255.642-255.667h127.795zM852.173 382.49v-170.394h-681.754v170.394h-170.419v-340.89h1022.618v340.89z"/><glyph unicode="&#58934;" glyph-name="import" d="M639.155 851.2h-255.693v-213.043h-127.795l255.667-255.667 255.616 255.667h-127.795zM852.173 382.49v-170.394h-681.754v170.394h-170.419v-340.89h1022.618v340.89z"/><glyph unicode="&#58935;" glyph-name="dot" d="M505.139 959.915c-282.658-3.775-508.826-236.066-505.071-518.827 3.772-282.556 236.1-508.826 518.793-505.003 282.658 3.768 508.826 236.066 505.071 518.827-3.717 282.658-236.1 508.826-518.793 505.003z"/><glyph unicode="&#58936;" glyph-name="not-installed" d="M510.413 960c-281.907 0-510.413-228.582-510.413-510.413 0-281.933 228.506-510.464 510.413-510.464s510.387 228.557 510.387 510.464c0 281.83-228.48 510.413-510.387 510.413zM865.843 449.587c0-69.99-20.506-135.27-55.578-190.285l-490.163 490.163c55.091 35.021 120.32 55.475 190.31 55.475 195.942 0 355.43-159.411 355.43-355.354zM154.957 449.587c0 69.939 20.506 135.245 55.578 190.31l490.189-490.189c-55.066-35.072-120.371-55.501-190.31-55.501-195.942-0.026-355.456 159.437-355.456 355.379z"/><glyph unicode="&#58937;" glyph-name="disabled" d="M511.77 960c-282.778 0-512.102-229.222-512.102-512.179 0-282.829 229.325-512.102 512.102-512.102 282.931-0.026 512.23 229.248 512.23 512.102 0 282.957-229.299 512.179-512.23 512.179zM143.718 540.032h736.205v-184.269h-736.205v184.269z"/><glyph unicode="&#58938;" glyph-name="menu-item" horiz-adv-x="903" d="M857.675 670.587l-403.18 240.514-402.726-240.514v-457.026l403.18-240.515 402.726 240.514v457.027zM454.857 95.535l-298.427 178.383v335.966l298.157 178.729 298.428-178.383v-335.966l-298.158-178.729z"/><glyph unicode="&#58939;" glyph-name="tag" d="M904.192 959.973l-307.234-0.116-596.89-596.958 426.906-426.906 596.958 596.958-0.113 305.596-119.603 121.426zM858.679 646.663c-39.997-40.001-104.854-40.001-144.794 0-40.001 40.001-40.001 104.796 0 144.794 39.939 40.001 104.796 40.001 144.794 0 39.997-39.997 39.997-104.793 0-144.794z"/><glyph unicode="&#58940;" glyph-name="camera" d="M982.767 728.098h-250.095l-59.255 121.364c0 0-11.827 25.201-42.11 25.201-23.375 0-169.366 0-235.25 0-32.969 0-44.001-25.027-44.001-25.027l-57.484-121.539h-253.406c-22.74 0-41.131-18.459-41.131-41.267v-624.333c0-22.743 18.401-41.199 41.131-41.199h941.636c22.74 0 41.199 18.459 41.199 41.199v624.299c0 22.798-18.456 41.267-41.199 41.267zM512 136.090c-138.793 0-251.597 113.015-251.597 251.931 0 138.912 112.845 251.87 251.597 251.87 138.68 0 251.597-112.981 251.597-251.87 0-138.909-112.913-251.931-251.597-251.931zM512 539.068c-83.255 0-150.972-67.714-150.972-150.972 0-83.197 67.71-150.903 150.972-150.903 83.258 0 150.903 67.714 150.903 150.903 0 83.255-67.652 150.972-150.903 150.972z"/><glyph unicode="&#58941;" glyph-name="grid" d="M0.010 959.628h279.074v-279.074h-279.074zM372.77 959.628h279.074v-279.074h-279.074zM744.892 959.628h279.074v-279.074h-279.074zM0.010 587.503h279.074v-279.074h-279.074zM372.77 587.503h279.074v-279.074h-279.074zM744.892 587.503h279.074v-279.074h-279.074zM0.010 215.415h279.074v-279.074h-279.074zM372.77 215.415h279.074v-279.074h-279.074zM744.892 215.415h279.074v-279.074h-279.074z"/><glyph unicode="&#58942;" glyph-name="list-menu" d="M0.010 771.516h1023.966v-136.509h-1023.966zM0.010 517.53h1023.966v-136.506h-1023.966zM0.010 260.983h1023.966v-136.513h-1023.966z"/><glyph unicode="&#58943;" glyph-name="cart" d="M771.001 183.263c-55.445 0-100.448-44.754-100.448-100.2s44.879-100.324 100.448-100.324 100.448 44.879 100.448 100.324-45.003 100.2-100.448 100.2zM771.001 41.293c-23.123 0-41.77 18.648-41.77 41.771s18.647 41.77 41.77 41.77c23.247 0 41.895-18.648 41.895-41.77s-18.648-41.771-41.895-41.771zM469.532 183.263c-55.445 0-100.449-44.754-100.449-100.2s45.003-100.324 100.449-100.324c55.445 0 100.448 44.879 100.448 100.324s-45.003 100.2-100.448 100.2zM469.532 41.293c-23.123 0-41.771 18.648-41.771 41.771s18.648 41.77 41.771 41.77 41.77-18.648 41.77-41.77-18.648-41.771-41.77-41.771zM823.587 465.588c-130.036 0-238.441 91.622-264.547 213.825h-207.237l-136.749 198.162v1.865h-207.237v-83.541h169.942l78.693-117.729 83.417-412.857h581.183l49.23 243.786c-42.268-27.474-92.616-43.511-146.694-43.511zM1023.862 710.244v45.376l-55.073 18.026-12.929 31.204 24.863 52.71-31.95 32.074-5.967-2.984-45.5-23.123-31.328 12.929-19.642 54.948h-45.376l-2.114-6.464-15.912-48.608-31.203-12.929-52.835 24.863-32.074-31.95 3.108-5.967 23.247-45.624-13.053-31.328-54.948-19.766v-45.376l6.34-2.113 48.732-15.788 12.929-31.204-24.863-52.71 32.074-32.074 6.092 3.108 45.376 22.999 31.328-12.929 19.642-54.824h45.376l2.113 6.464 15.913 48.359 31.203 12.929 52.71-24.988 32.198 32.074-3.108 6.092-23.247 45.624 12.929 31.203 54.948 19.766zM824.582 668.473c-35.057 0-63.65 28.469-63.65 63.526 0 35.182 28.469 63.526 63.65 63.526s63.526-28.469 63.526-63.526c-0.124-35.182-28.469-63.526-63.526-63.526z"/><glyph unicode="&#58944;" glyph-name="screen" horiz-adv-x="1159" d="M723.661 70.399c-2.404 10.843-4.034 21.47-5.282 31.583h-277.528c-2.458-20.233-6.917-43.087-14.646-64.305-7.79-21.277-18.796-40.54-33.824-54.15-15.028-13.552-33.689-22.104-59.788-22.158v-25.369h494.020v25.369c-26.142 0.058-44.737 8.61-59.838 22.158-22.44 20.307-35.961 53.91-43.114 86.873zM1126.214 960h-1093.209c-18.22 0-33.005-15.024-33.005-33.596v-731.259c0-18.576 14.785-33.623 33.005-33.623h1093.209c18.224 0 33.067 15.051 33.067 33.623v731.259c0 18.572-14.843 33.596-33.067 33.596zM1079.193 243.078h-999.234v635.394h999.234v-635.394z"/><glyph unicode="&#58945;" glyph-name="video" horiz-adv-x="2041" d="M2041.366 958.898v-1021.449h-175.926l-411.263 409.297v204.59l411.263 407.568h175.926zM1305.997-29.076c0-19.377-15.608-34.924-34.856-34.924h-1236.279c-19.255 0-34.863 15.547-34.863 34.924v954.275c0 19.248 15.608 34.801 34.863 34.801h1236.279c19.248 0 34.856-15.553 34.856-34.801v-954.275z"/><glyph unicode="&#58946;" glyph-name="revert" horiz-adv-x="1404" d="M1042.226 660.151h-598.393v299.849l-443.833-384.316 443.833-384.403v299.859h598.393c106.478 0 192.801-86.318 192.801-192.801s-86.318-192.796-192.801-192.796v-0.483l-452.707-0.005c-46.695-0.005-84.53-37.845-84.53-84.535 0-46.68 37.84-84.525 84.535-84.525 0.377 0 0.744 0.053 1.121 0.058h451.581c199.964 0 362.044 162.085 362.044 362.039 0 199.964-162.080 362.059-362.044 362.059z"/><glyph unicode="&#58947;" glyph-name="clip" d="M939.616 811.616c112.512-112.448 112.512-294.816 0-407.264l-350.944-350.976c-12.512-12.544-32.736-12.544-45.248 0-12.576 12.512-12.576 32.704 0 45.248l346.432 346.464c87.488 87.488 87.488 229.248-0.064 316.768-87.36 87.488-229.248 87.488-316.736 0l-462.304-456.864c-62.496-62.464-62.496-163.776 0-226.24 62.496-62.496 163.744-62.496 226.24 0l466.88 461.344c37.44 37.44 37.44 98.336 0 135.776-37.44 37.408-98.304 37.408-135.744 0l-351.008-351.008c-12.512-12.512-32.736-12.512-45.248 0-12.512 12.544-12.512 32.736 0 45.28l350.976 350.976c62.432 62.464 163.744 62.464 226.24 0 62.496-62.496 62.496-163.776 0-226.272l-466.88-461.376c-87.296-87.328-229.408-87.328-316.736 0s-87.328 229.472 0 316.8l466.88 461.344c112.448 112.512 294.816 112.512 407.264 0z"/><glyph unicode="&#58951;" glyph-name="module" horiz-adv-x="883" d="M793.271 737.4l-192.695 83.055v-80.482c-2.517-31.926-83.182-57.618-182.582-57.618-99.309 0-180.126 25.692-182.398 57.618h-0.318l-0.465 80.482-197.709-83.055 381.218-167.697 374.95 167.697zM265.959 841.886l-1.104-0.428c32.596-16.331 89.086-27.124 153.551-27.124 64.726 0 121.621 10.94 153.996 27.355l-1.168 0.512c18.811 9.3 29.664 20.34 29.664 32.264 0 32.713-81.606 59.114-182.492 59.114-100.759 0-182.806-26.401-182.806-59.114-0.003-12.007 11.295-23.218 30.36-32.579zM418.418 497.564l-418.418 191.009v-563.335l418.321-189.238 418.321 189.238v563.733l-418.224-191.407z"/><glyph unicode="&#58952;" glyph-name="alert-round" d="M1023.959 454.912c-3.717 282.665-236.121 508.842-518.817 505.040-282.689-3.772-508.866-236.091-505.094-518.868 3.772-282.58 236.121-508.842 518.813-505.040 282.689 3.772 508.866 236.067 505.098 518.868zM580.086 55.641h-136.149v136.163h136.149v-136.163zM597.168 666.258l-44.103-388.928h-83.113l-43.099 388.928v171.575h170.318v-171.575z"/><glyph unicode="&#58953;" glyph-name="document" horiz-adv-x="793" d="M0 448v-512h793.43v771.052l-42.045 36.62c-23.735 19.666-46.114 39.332-50.183 43.401-4.069 3.391-16.275 14.241-27.126 23.735s-53.574 46.792-94.94 83.412l-75.952 65.78h-503.184v-512zM465.886 746.384c0.678-56.286 1.356-105.791 2.034-109.86 0-6.781 25.77-8.816 107.147-8.816h107.147v-287.534c-0.678-252.27-1.356-288.212-10.85-290.246-5.425-1.356-133.595-2.034-284.821-2.034l-274.649 0.678-1.356 392.646c-0.678 216.328-0.678 396.715 0.678 400.106 1.356 4.069 67.136 6.781 177.674 6.781h175.64l1.356-101.722z"/></font></defs></svg>
\ No newline at end of file
diff --git a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.ttf b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.ttf
index bc3eddf307438029d440be39f85fe2bfe398afc8..2d896e8b3dba067a0b772b262be35c066160a7d8 100755
Binary files a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.ttf and b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.ttf differ
diff --git a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.woff b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.woff
index bd9560bf583279cb79ec485a741272b9a73e89bd..7cd73320aed862466a210b9d8455f19bca9b0cd9 100755
Binary files a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.woff and b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.woff differ
diff --git a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.woff2 b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.woff2
index 25c1c88c0bff8958c62084729d9b618f97646fde..a26908a3b1e6992cf5a27638e38871b2eac07b13 100755
Binary files a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.woff2 and b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/admin-icons.woff2 differ
diff --git a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/selection.json b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/selection.json
index c1733d650bcd283ce794e7989a555bc0cb87f438..f639e5bb413f1976b46a371e28bb6a7ceec528cb 100755
--- a/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/selection.json
+++ b/app/design/adminhtml/Magento/backend/web/fonts/admin-icons/selection.json
@@ -1,2326 +1,2356 @@
 {
-    "IcoMoonType": "selection",
-    "icons": [
-        {
-            "icon": {
-                "paths": [
-                    "M2041.366 1.102v1021.449h-175.926l-411.263-409.297v-204.59l411.263-407.568h175.926z",
-                    "M1305.997 989.076c0 19.377-15.608 34.924-34.856 34.924h-1236.279c-19.255 0-34.863-15.547-34.863-34.924v-954.275c0-19.248 15.608-34.801 34.863-34.801h1236.279c19.248 0 34.856 15.553 34.856 34.801v954.275z"
-                ],
-                "width": 2041,
-                "attrs": [],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "video"
-                ],
-                "grid": 0
-            },
-            "attrs": [],
-            "properties": {
-                "order": 127,
-                "id": 0,
-                "prevSize": 32,
-                "code": 58945,
-                "name": "video"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 0
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M723.661 889.601c-2.404-10.843-4.034-21.47-5.282-31.583h-277.528c-2.458 20.233-6.917 43.087-14.646 64.305-7.79 21.277-18.796 40.54-33.824 54.15-15.028 13.552-33.689 22.104-59.788 22.158v25.369h494.020v-25.369c-26.142-0.058-44.737-8.61-59.838-22.158-22.44-20.307-35.961-53.91-43.114-86.873zM1126.214 0h-1093.209c-18.22 0-33.005 15.024-33.005 33.596v731.259c0 18.576 14.785 33.623 33.005 33.623h1093.209c18.224 0 33.067-15.051 33.067-33.623v-731.259c0-18.572-14.843-33.596-33.067-33.596zM1079.193 716.922h-999.234v-635.394h999.234v635.394z"
-                ],
-                "width": 1159,
-                "attrs": [],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "screen"
-                ],
-                "grid": 0
-            },
-            "attrs": [],
-            "properties": {
-                "order": 72,
-                "id": 1,
-                "prevSize": 32,
-                "code": 58944,
-                "name": "screen"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 1
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M771.001 776.737c-55.445 0-100.448 44.754-100.448 100.2s44.879 100.324 100.448 100.324 100.448-44.879 100.448-100.324-45.003-100.2-100.448-100.2zM771.001 918.707c-23.123 0-41.77-18.648-41.77-41.771s18.647-41.77 41.77-41.77c23.247 0 41.895 18.648 41.895 41.77s-18.648 41.771-41.895 41.771z",
-                    "M469.532 776.737c-55.445 0-100.449 44.754-100.449 100.2s45.003 100.324 100.449 100.324c55.445 0 100.448-44.879 100.448-100.324s-45.003-100.2-100.448-100.2zM469.532 918.707c-23.123 0-41.771-18.648-41.771-41.771s18.648-41.77 41.771-41.77 41.77 18.648 41.77 41.77-18.648 41.771-41.77 41.771z",
-                    "M823.587 494.412c-130.036 0-238.441-91.622-264.547-213.825h-207.237l-136.749-198.162v-1.865h-207.237v83.541h169.942l78.693 117.729 83.417 412.857h581.183l49.23-243.786c-42.268 27.474-92.616 43.511-146.694 43.511z",
-                    "M1023.862 249.756v-45.376l-55.073-18.026-12.929-31.204 24.863-52.71-31.95-32.074-5.967 2.984-45.5 23.123-31.328-12.929-19.642-54.948h-45.376l-2.114 6.464-15.912 48.608-31.203 12.929-52.835-24.863-32.074 31.95 3.108 5.967 23.247 45.624-13.053 31.328-54.948 19.766v45.376l6.34 2.113 48.732 15.788 12.929 31.204-24.863 52.71 32.074 32.074 6.092-3.108 45.376-22.999 31.328 12.929 19.642 54.824h45.376l2.113-6.464 15.913-48.359 31.203-12.929 52.71 24.988 32.198-32.074-3.108-6.092-23.247-45.624 12.929-31.203 54.948-19.766zM824.582 291.527c-35.057 0-63.65-28.469-63.65-63.526 0-35.182 28.469-63.526 63.65-63.526s63.526 28.469 63.526 63.526c-0.124 35.182-28.469 63.526-63.526 63.526z"
-                ],
-                "attrs": [],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "cart"
-                ],
-                "grid": 0
-            },
-            "attrs": [],
-            "properties": {
-                "order": 71,
-                "id": 2,
-                "prevSize": 32,
-                "code": 58943,
-                "name": "cart"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 2
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M0.010 188.484h1023.966v136.509h-1023.966z",
-                    "M0.010 442.47h1023.966v136.506h-1023.966z",
-                    "M0.010 699.017h1023.966v136.513h-1023.966z"
-                ],
-                "attrs": [
-                    {},
-                    {},
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "list-menu"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {},
-                {},
-                {}
-            ],
-            "properties": {
-                "order": 61,
-                "id": 3,
-                "prevSize": 32,
-                "code": 58942,
-                "name": "list-menu"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 3
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M0.010 0.372h279.074v279.074h-279.074z",
-                    "M372.77 0.372h279.074v279.074h-279.074z",
-                    "M744.892 0.372h279.074v279.074h-279.074z",
-                    "M0.010 372.497h279.074v279.074h-279.074z",
-                    "M372.77 372.497h279.074v279.074h-279.074z",
-                    "M744.892 372.497h279.074v279.074h-279.074z",
-                    "M0.010 744.585h279.074v279.074h-279.074z",
-                    "M372.77 744.585h279.074v279.074h-279.074z",
-                    "M744.892 744.585h279.074v279.074h-279.074z"
-                ],
-                "attrs": [
-                    {},
-                    {},
-                    {},
-                    {},
-                    {},
-                    {},
-                    {},
-                    {},
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "grid"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {},
-                {},
-                {},
-                {},
-                {},
-                {},
-                {},
-                {},
-                {}
-            ],
-            "properties": {
-                "order": 112,
-                "id": 4,
-                "prevSize": 32,
-                "code": 58941,
-                "name": "grid"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 4
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M982.767 231.902h-250.095l-59.255-121.364c0 0-11.827-25.201-42.11-25.201-23.375 0-169.366 0-235.25 0-32.969 0-44.001 25.027-44.001 25.027l-57.484 121.539h-253.406c-22.74 0-41.131 18.459-41.131 41.267v624.333c0 22.743 18.401 41.199 41.131 41.199h941.636c22.74 0 41.199-18.459 41.199-41.199v-624.299c0-22.798-18.456-41.267-41.199-41.267zM512 823.91c-138.793 0-251.597-113.015-251.597-251.931 0-138.912 112.845-251.87 251.597-251.87 138.68 0 251.597 112.981 251.597 251.87 0 138.909-112.913 251.931-251.597 251.931z",
-                    "M512 420.932c-83.255 0-150.972 67.714-150.972 150.972 0 83.197 67.71 150.903 150.972 150.903 83.258 0 150.903-67.714 150.903-150.903 0-83.255-67.652-150.972-150.903-150.972z"
-                ],
-                "attrs": [
-                    {},
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "camera"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {},
-                {}
-            ],
-            "properties": {
-                "order": 121,
-                "id": 5,
-                "prevSize": 32,
-                "code": 58940,
-                "name": "camera"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 5
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M904.192 0.027l-307.234 0.116-596.89 596.958 426.906 426.906 596.958-596.958-0.113-305.596-119.603-121.426zM858.679 313.337c-39.997 40.001-104.854 40.001-144.794 0-40.001-40.001-40.001-104.796 0-144.794 39.939-40.001 104.796-40.001 144.794 0 39.997 39.997 39.997 104.793 0 144.794z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "tag"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 111,
-                "id": 6,
-                "prevSize": 32,
-                "code": 58939,
-                "name": "tag"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 6
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M1094.391 77.71l-77.71-77.71-423.329 423.347-423.33-423.347-77.71 77.672 423.35 423.368-423.312 423.329 77.672 77.71 423.338-423.338 423.283 423.3 77.671-77.71-423.263-423.281z"
-                ],
-                "width": 1176,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "colorPermutations": {
-                    "6868681": [
-                        {
-                            "f": 0
-                        }
-                    ]
-                },
-                "tags": [
-                    "close-mage"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 110,
-                "id": 7,
-                "prevSize": 32,
-                "code": 58927,
-                "name": "close-mage"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 7
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M857.675 289.413l-403.18-240.514-402.726 240.514v457.026l403.18 240.515 402.726-240.514v-457.027zM454.857 864.465l-298.427-178.383v-335.966l298.157-178.729 298.428 178.383v335.966l-298.158 178.729z"
-                ],
-                "width": 903,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "colorPermutations": {
-                    "6868681": [
-                        {
-                            "f": 0
-                        }
-                    ]
-                },
-                "tags": [
-                    "menu-item"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 109,
-                "id": 8,
-                "prevSize": 32,
-                "code": 58938,
-                "name": "menu-item"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 8
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M505.704 40.998c-260.096 3.489-468.158 217.202-464.706 477.336 3.489 259.982 217.202 468.12 477.298 464.631s468.158-217.202 464.706-477.336c-3.413-260.058-217.202-468.12-477.298-464.631zM557.928 197.973c47.863 0 62.009 27.762 62.009 59.544 0 39.671-31.782 76.383-86.016 76.383-45.359 0-66.901-22.831-65.65-60.53 0-31.782 26.624-75.435 89.657-75.435zM435.162 806.381c-32.73 0-56.661-19.873-33.792-107.217l37.547-154.814c6.485-24.841 7.585-34.778 0-34.778-9.785 0-52.262 17.143-77.407 34.057l-16.346-26.776c79.607-66.446 171.16-105.472 210.375-105.472 32.73 0 38.153 38.722 21.807 98.266l-43.008 162.816c-7.585 28.786-4.286 38.722 3.262 38.722 9.785 0 41.984-11.871 73.614-36.75l18.47 24.841c-77.369 77.369-161.792 107.179-194.56 107.179z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "info"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 108,
-                "id": 9,
-                "prevSize": 32,
-                "code": 58906,
-                "name": "info"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 9
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M591.986 448.019h-16.005v-192.019c0-105.851-86.13-192.019-192.019-192.019h-128c-105.851 0-192.019 86.13-192.019 192.019v192.019h-16.005c-26.396 0-48.014 21.618-48.014 48.014v479.991c0 26.396 21.618 48.014 48.014 48.014h544.009c26.396 0 48.014-21.618 48.014-48.014v-479.991c0-26.396-21.618-48.014-48.014-48.014zM384 896h-128l27.838-139.188c-16.801-11.529-27.838-30.872-27.838-52.793 0-35.347 28.672-64.019 64.019-64.019s64.019 28.672 64.019 64.019c0 21.921-11.036 41.263-27.838 52.793l27.838 139.188zM448.019 448.019h-256v-192.019c0-35.271 28.71-64.019 64.019-64.019h128c35.271 0 64.019 28.71 64.019 64.019v192.019z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "lock"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 107,
-                "id": 10,
-                "prevSize": 32,
-                "code": 58907,
-                "name": "lock"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 10
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M870.4 317.44h-194.56v143.36h153.6v215.040h-634.88v-215.040h215.040v112.64l204.8-184.32-204.8-184.32v112.64h-256c-56.51 0-102.4 45.815-102.4 102.4v296.96c0 56.51 45.89 102.4 102.4 102.4h716.8c56.585 0 102.4-45.89 102.4-102.4v-296.96c0-56.585-45.815-102.4-102.4-102.4z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "loop"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 106,
-                "id": 11,
-                "prevSize": 32,
-                "code": 58908,
-                "name": "loop"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 11
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M991.991 384h-351.991v-351.991c0-17.673-14.336-32.009-32.009-32.009h-192.019c-17.673 0-32.009 14.336-32.009 32.009v351.991h-351.991c-17.673 0-32.009 14.336-32.009 32.009v192.019c0 17.673 14.336 32.009 32.009 32.009h351.991v351.991c0 17.673 14.336 32.009 32.009 32.009h192.019c17.673 0 32.009-14.336 32.009-32.009v-351.991h351.991c17.673 0 32.009-14.336 32.009-32.009v-192.019c0-17.673-14.336-32.009-32.009-32.009z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "plus"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 105,
-                "id": 12,
-                "prevSize": 32,
-                "code": 58909,
-                "name": "plus"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 12
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M505.704 40.998c-260.096 3.489-468.158 217.126-464.706 477.298 3.489 260.21 217.202 468.158 477.298 464.744 260.134-3.489 468.233-217.202 464.706-477.298-3.489-260.21-217.202-468.233-477.298-464.744zM506.577 102.4c70.163-0.986 136.382 15.853 194.56 46.118l-63.374 105.662c-38.002-18.47-80.631-28.937-125.762-28.937-45.056 0-87.723 10.43-125.687 28.975l-63.336-105.624c54.993-28.672 117.343-45.321 183.599-46.232zM254.255 637.687l-105.586 63.298c-28.672-54.955-45.321-117.305-46.194-183.486-0.986-70.201 15.853-136.457 46.118-194.56l105.624 63.45c-18.546 37.926-28.975 80.555-28.975 125.649 0 45.056 10.43 87.723 28.975 125.687zM517.461 921.562c-70.163 0.986-136.457-15.853-194.56-46.118l63.374-105.662c38.002 18.546 80.631 28.975 125.687 28.975 45.094 0 87.761-10.392 125.687-28.937l63.336 105.586c-54.993 28.634-117.305 45.246-183.561 46.194zM512 737.242c-124.397 0-225.242-100.883-225.242-225.242 0-124.397 100.883-225.28 225.242-225.28 124.473 0 225.28 100.883 225.28 225.28s-100.807 225.242-225.28 225.242zM769.745 637.687c18.546-38.002 28.975-80.631 28.975-125.687 0-45.094-10.43-87.723-28.975-125.687l105.586-63.374c28.672 54.993 45.359 117.305 46.232 183.561 0.91 70.201-15.929 136.457-46.194 194.56l-105.624-63.336z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "recover"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 104,
-                "id": 13,
-                "prevSize": 32,
-                "code": 58910,
-                "name": "recover"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 13
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M906.126 135.813v0c-91.174-75.89-202.487-113.171-312.548-113.057-127.014-0.038-253.611 49.683-348.16 145.636l-95.004-79.265-1.593 305.342 300.184-56.282-99.442-82.944c67.546-64.247 155.269-97.204 244.015-97.28 79.948 0.038 159.782 26.7 226.114 81.806 84.347 70.125 127.659 170.629 127.772 272.46-0.038 14.715-0.948 29.431-2.769 44.070l137.519-26.283c0.19-5.954 0.303-11.871 0.303-17.787 0.152-140.098-60.151-279.78-176.431-376.415zM839.035 766.976c-67.736 65.498-156.255 99.025-245.912 99.1-79.986-0.038-159.82-26.738-226.114-81.806-84.347-70.125-127.697-170.629-127.772-272.498 0-16.839 1.252-33.716 3.679-50.366l-138.164 25.941c-0.379 8.116-0.683 16.346-0.683 24.462-0.114 140.174 60.226 279.817 176.545 376.491 91.136 75.852 202.411 113.057 312.51 112.981h0.341c127.924 0 255.241-50.441 349.943-147.759l90.795 75.207 0.569-305.38-299.956 57.344 104.183 86.281z"
-                ],
-                "width": 1176,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "refresh"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 113,
-                "id": 14,
-                "prevSize": 32,
-                "code": 58911,
-                "name": "refresh"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 14
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M593.351 21.732c-270.753 0-490.268 219.477-490.268 490.231s219.515 490.268 490.268 490.268 490.231-219.515 490.231-490.268c0-270.753-219.477-490.231-490.231-490.231zM828.947 683.653l-72.363 72.363-162.095-162.133-164.902 164.902-73.121-73.121 164.902-164.902-161.678-161.678 72.363-72.325 161.602 161.678 165.774-165.736 73.121 73.083-165.774 165.736 162.171 162.133z"
-                ],
-                "width": 1176,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "remove-small"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 114,
-                "id": 15,
-                "prevSize": 32,
-                "code": 58912,
-                "name": "remove-small"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 15
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M254.976 675.84v-267.264h103.424l-179.2-203.776-179.2 203.776h103.424v308.224c0 56.51 45.815 102.4 102.4 102.4h459.776l-131.186-143.36h-279.438zM920.538 615.424v-308.224c0-56.51-45.89-102.4-102.4-102.4h-459.738l131.11 143.36h279.514v267.264h-103.424l179.2 203.776 179.2-203.776h-103.462z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "retweet"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 117,
-                "id": 16,
-                "prevSize": 32,
-                "code": 58913,
-                "name": "retweet"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 16
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M768 64.019h-128c-105.851 0-192.019 86.13-192.019 192.019v192.019h-400.005c-26.396 0-48.014 21.618-48.014 48.014v479.991c0 26.396 21.618 48.014 48.014 48.014h544.009c26.396 0 48.014-21.618 48.014-48.014v-479.991c0-26.396-21.618-48.014-48.014-48.014h-16.005v-192.019c0-35.271 28.71-64.019 64.019-64.019h128c35.271 0 64.019 28.71 64.019 64.019v192.019h128v-192.019c0-105.851-86.13-192.019-192.019-192.019zM384 896h-128l27.838-139.188c-16.801-11.529-27.838-30.872-27.838-52.793 0-35.347 28.672-64.019 64.019-64.019s64.019 28.672 64.019 64.019c0 21.921-11.036 41.263-27.838 52.793l27.838 139.188z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "unlocked"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 36,
-                "id": 17,
-                "prevSize": 32,
-                "code": 58914,
-                "name": "unlocked"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 17
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M593.351 0l-593.351 1023.962h1186.74l-593.351-1023.962zM653.236 899.451h-125.421v-121.211h125.421v121.211zM622.175 728.329h-62.502l-34.816-288.313v-156.748h131.3v156.748l-33.982 288.313z"
-                ],
-                "width": 1176,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "warning"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 37,
-                "id": 18,
-                "prevSize": 32,
-                "code": 58915,
-                "name": "warning"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 18
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M0 512l512 512v-320.019h512v-384h-512v-320.019z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "arrow-left"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 38,
-                "id": 19,
-                "prevSize": 32,
-                "code": 58916,
-                "name": "arrow-left"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 19
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M1024 512l-512-512v320.019h-512v384h512v320.019z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "arrow-right"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 39,
-                "id": 20,
-                "prevSize": 32,
-                "code": 58917,
-                "name": "arrow-right"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 20
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M402.735 146.735l-320.019 320.019c-24.993 24.993-24.993 65.498 0 90.491l320.019 320.019c24.993 24.993 65.498 24.993 90.491 0s24.993-65.498 0-90.491l-210.754-210.754h613.49c35.347 0 64.019-28.634 64.019-64.019s-28.672-64.019-64.019-64.019h-613.49l210.754-210.754c12.478-12.478 18.735-28.862 18.735-45.246s-6.258-32.768-18.735-45.246c-24.993-24.993-65.498-24.993-90.491 0z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "back-arrow"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 103,
-                "id": 21,
-                "prevSize": 32,
-                "code": 58918,
-                "name": "back-arrow"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 21
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M507.259 578.522h-102.059v101.717h102.059v-101.717zM650.885 714.714h-101.945v101.717h101.945v-101.717zM507.259 714.714h-102.059v101.717h102.059v-101.717zM507.259 442.33h-102.059v101.679h102.059v-101.679zM843.131 244.091c23.4 0 42.287-18.887 42.287-42.174v-145.408c0-23.324-18.887-42.174-42.287-42.174s-42.325 18.849-42.325 42.174v145.408c0.038 23.324 18.925 42.174 42.325 42.174zM343.419 244.091c23.362 0 42.249-18.887 42.249-42.174v-145.408c0-23.324-18.887-42.174-42.249-42.174-23.4 0-42.325 18.849-42.325 42.174v145.408c0 23.324 18.925 42.174 42.325 42.174zM363.444 578.522h-102.059v101.717h102.059v-101.717zM363.444 714.714h-102.059v101.717h102.059v-101.717zM650.885 578.522h-101.945v101.717h101.945v-101.717zM938.325 578.522h-102.059v101.717h102.059v-101.717zM938.325 442.33h-102.059v101.679h102.059v-101.679zM899.337 84.385v46.914c17.598 15.474 28.71 38.153 28.71 63.412 0 46.801-37.964 84.764-84.916 84.764s-84.954-37.964-84.954-84.764c0-25.259 11.15-47.938 28.71-63.412v-46.914h-387.262v46.914c17.56 15.474 28.71 38.153 28.71 63.412 0 46.801-38.002 84.764-84.916 84.764s-84.954-37.964-84.954-84.764c0-25.259 11.15-47.938 28.71-63.412v-46.914h-192.322v925.279h997.035v-925.279h-192.512zM999.234 915.304h-809.832v-589.938h809.832v589.938zM650.885 442.33h-101.945v101.679h101.945v-101.679zM794.624 442.33h-101.983v101.679h101.983v-101.679zM794.624 714.714h-101.983v101.717h101.983v-101.717zM794.624 578.522h-101.983v101.717h101.983v-101.717z"
-                ],
-                "width": 1176,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "calendar"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 102,
-                "id": 22,
-                "prevSize": 32,
-                "code": 58919,
-                "name": "calendar"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 22
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M132.21 286.758c-13.881-13.729-36.295-13.729-50.138 0-13.805 13.653-13.805 35.878 0 49.607l404.897 400.877c13.881 13.729 36.257 13.729 50.138 0l404.897-400.877c13.805-13.729 13.881-35.878 0-49.607s-36.371-13.729-50.138-0.038l-379.866 365.606-379.79-365.568z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "caret-down"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 101,
-                "id": 23,
-                "prevSize": 32,
-                "code": 58920,
-                "name": "caret-down"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 23
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M737.242 891.79c13.729 13.881 13.729 36.257 0 50.138s-35.878 13.881-49.607 0l-400.877-404.821c-13.729-13.881-13.729-36.295 0-50.138l400.877-404.897c13.729-13.881 35.878-13.881 49.607 0s13.729 36.257 0 50.138l-365.568 379.79 365.568 379.79z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "caret-left"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 100,
-                "id": 24,
-                "prevSize": 32,
-                "code": 58921,
-                "name": "caret-left"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 24
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M286.72 891.79c-13.729 13.881-13.729 36.257 0 50.138s35.878 13.881 49.607 0l400.877-404.821c13.729-13.881 13.729-36.295 0-50.138l-400.915-404.897c-13.729-13.881-35.878-13.881-49.607 0s-13.729 36.257 0 50.138l365.568 379.79-365.568 379.79z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "caret-right"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 99,
-                "id": 25,
-                "prevSize": 32,
-                "code": 58922,
-                "name": "caret-right"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 25
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M891.79 737.242c13.881 13.729 36.295 13.729 50.138 0 13.881-13.729 13.881-35.878 0-49.607l-404.897-400.877c-13.805-13.729-36.257-13.729-50.062 0l-404.897 400.877c-13.805 13.729-13.881 35.878 0 49.607s36.257 13.729 50.138 0l379.79-365.606 379.79 365.606z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "caret-up"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 98,
-                "id": 26,
-                "prevSize": 32,
-                "code": 58923,
-                "name": "caret-up"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 26
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M574.767 92.16c-227.593 0-412.672 182.386-418.247 409.335h-125.8l188.378 209.92 188.302-209.92h-146.242c5.537-168.998 143.777-304.393 313.609-304.393 173.397 0 313.913 140.971 313.913 314.899s-140.478 314.861-313.913 314.861c-69.48 0-133.689-22.718-185.685-61.099l-71.983 76.99c70.997 55.751 160.465 89.050 257.707 89.050 231.159 0 418.551-187.961 418.551-419.84-0.038-231.879-187.43-419.84-418.551-419.84z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "ccw"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 97,
-                "id": 27,
-                "prevSize": 32,
-                "code": 58924,
-                "name": "ccw"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 27
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M996.617 126.786l-513.555 513.555-256.796-256.834-128.379 128.417 385.214 385.252 641.896-642.010z"
-                ],
-                "width": 1176,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "check-mage"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 96,
-                "id": 28,
-                "prevSize": 32,
-                "code": 58925,
-                "name": "check-mage"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 28
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M512 40.96c-260.134 0-471.040 210.944-471.040 471.040 0 260.134 210.906 471.040 471.040 471.040s471.040-210.906 471.040-471.040c0-260.134-210.906-471.040-471.040-471.040zM512 880.64c-203.624 0-368.64-165.054-368.64-368.64s165.016-368.64 368.64-368.64 368.64 165.054 368.64 368.64-165.016 368.64-368.64 368.64zM547.84 245.76h-71.68v281.069l174.345 174.345 50.669-50.707-153.335-153.335z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "clock"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 95,
-                "id": 29,
-                "prevSize": 32,
-                "code": 58926,
-                "name": "clock"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 29
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M337.541 1021.004h513.024l64.512-645.916h-639.128l61.592 645.916zM737.394 154.169v-116.508c0-19.191-15.398-34.702-34.361-34.702h-217.847c-19.001 0-34.361 15.55-34.361 34.702v114.574c-73.576 8.382-150.149 24.614-226.494 52.338v106.989h738.001v-109.833c0 0-90.074-31.403-224.977-47.559zM668.937 147.759c-47.749-3.224-99.252-4.096-153.297-0.986v-61.44c0-9.519 7.623-17.332 17.143-17.332h118.936c9.519 0 17.218 7.813 17.218 17.332v62.426z"
-                ],
-                "width": 1176,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "delete"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 94,
-                "id": 30,
-                "prevSize": 32,
-                "code": 58928,
-                "name": "delete"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 30
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M928.503 26.889l-111.502 112.109 156.065 156.9 111.502-112.071-156.065-156.937zM215.002 744.41l156.065 156.9 535.211-538.093-156.065-156.9-535.211 538.093zM103.917 1007.161l188.985-49.873-139.302-140.098-49.683 190.009z"
-                ],
-                "width": 1176,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "edit"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 115,
-                "id": 31,
-                "prevSize": 32,
-                "code": 58929,
-                "name": "edit"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 31
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M1014.67 822.651c0 0 0 0 0 0l-310.651-310.651 310.651-310.651c0 0 0 0 0 0 3.337-3.337 5.765-7.244 7.32-11.416 4.248-11.378 1.82-24.69-7.32-33.83l-146.735-146.735c-9.14-9.14-22.452-11.567-33.83-7.32-4.172 1.555-8.078 3.982-11.416 7.32 0 0 0 0 0 0l-310.651 310.651-310.651-310.651c0 0 0 0 0 0-3.337-3.337-7.244-5.765-11.416-7.32-11.378-4.248-24.69-1.82-33.83 7.32l-146.735 146.735c-9.14 9.14-11.567 22.452-7.32 33.83 1.555 4.172 3.982 8.078 7.32 11.416 0 0 0 0 0 0l310.651 310.651-310.651 310.651c0 0 0 0 0 0-3.337 3.337-5.765 7.244-7.32 11.416-4.248 11.378-1.82 24.69 7.32 33.83l146.735 146.735c9.14 9.14 22.452 11.567 33.83 7.32 4.172-1.555 8.078-3.982 11.416-7.32 0 0 0 0 0 0l310.651-310.651 310.651 310.651c0 0 0 0 0 0 3.337 3.337 7.244 5.765 11.416 7.32 11.378 4.248 24.69 1.82 33.83-7.32l146.735-146.735c9.14-9.14 11.567-22.452 7.32-33.83-1.555-4.172-3.982-8.078-7.32-11.416z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "error"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 122,
-                "id": 32,
-                "prevSize": 32,
-                "code": 58930,
-                "name": "error"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 32
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M593.351 22.566c-270.336 0-489.434 219.098-489.434 489.358s219.098 489.434 489.434 489.434 489.434-219.136 489.434-489.434-219.136-489.358-489.434-489.358zM635.752 826.596c-11.985 11.719-26.396 17.636-43.16 17.636-8.154 0-15.967-1.517-23.4-4.589-7.358-3.034-13.843-7.168-19.456-12.174-5.613-5.158-10.126-11.226-13.388-18.356-3.337-7.13-4.968-14.753-4.968-22.945 0-16.308 5.992-30.303 17.977-42.060 11.947-11.681 26.396-17.598 43.198-17.598 16.308 0 30.606 5.689 42.78 16.801 12.25 11.188 18.318 24.993 18.318 41.339-0.038 16.384-5.992 30.303-17.939 41.984zM778.923 382.673c-3.982 13.767-9.747 26.396-17.18 37.774-7.471 11.454-16.498 22.49-27.079 33.071s-22.49 21.618-35.65 33.033c-11.454 9.785-20.783 18.318-27.913 25.79-7.168 7.396-12.895 14.867-17.218 22.338-4.286 7.433-7.282 15.398-9.026 24.007-1.707 8.609-2.617 49.721-2.617 62.35v22.338h-101.376v-32.616c0-13.729 0.986-56.661 3.034-67.584s5.158-21.125 9.481-30.872 10.012-19.228 17.18-28.369c7.168-9.14 16.232-18.887 27.079-29.203l38.647-36.902c10.847-9.747 20.177-20.632 27.951-32.616 7.737-12.060 11.529-26.7 11.529-43.88 0-22.3-6.978-41.036-21.011-56.206-14.071-15.17-33.944-22.793-59.695-22.793-13.16 0-25.069 2.389-35.65 7.282-10.619 4.817-19.797 11.454-27.496 19.759-7.737 8.344-13.577 17.901-17.598 28.786-3.982 10.847-6.334 21.997-6.865 33.527l-105.624-9.444c3.413-27.496 10.733-51.959 21.921-73.463 11.112-21.466 25.562-39.595 43.311-54.575 17.711-14.829 38.078-26.169 61.023-33.944 22.869-7.699 47.521-11.605 73.842-11.605 24.614 0 47.976 3.603 70.049 10.771 21.959 7.168 41.491 17.711 58.406 31.782 16.839 14.033 30.227 31.365 39.936 51.959 9.709 20.632 14.564 44.411 14.564 71.263 0 18.356-2.010 34.475-5.992 48.166z"
-                ],
-                "width": 1176,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "help"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 124,
-                "id": 33,
-                "prevSize": 32,
-                "code": 58931,
-                "name": "help"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 33
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M574.805 92.16c-227.631 0-412.71 182.386-418.247 409.335h-125.838l188.378 209.958 188.302-209.958h-146.242c5.537-168.998 143.777-304.393 313.647-304.393 173.359 0 313.875 140.971 313.875 314.899s-140.478 314.861-313.875 314.861c-69.518 0-133.727-22.718-185.761-61.099l-71.983 76.99c71.073 55.751 160.503 89.050 257.745 89.050 231.121 0 418.513-187.961 418.513-419.84-0.038-231.879-187.43-419.84-418.513-419.84zM537.6 286.72v240.109l153.865 153.865 50.669-50.669-132.855-132.855v-210.413h-71.68z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "history"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 45,
-                "id": 34,
-                "prevSize": 32,
-                "code": 58932,
-                "name": "history"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 34
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M510.413 0c-281.907 0-510.413 228.582-510.413 510.413 0 281.933 228.506 510.464 510.413 510.464s510.387-228.557 510.387-510.464c0-281.83-228.48-510.413-510.387-510.413zM865.843 510.413c0 69.99-20.506 135.27-55.578 190.285l-490.163-490.163c55.091-35.021 120.32-55.475 190.31-55.475 195.942 0 355.43 159.411 355.43 355.354zM154.957 510.413c0-69.939 20.506-135.245 55.578-190.31l490.189 490.189c-55.066 35.072-120.371 55.501-190.31 55.501-195.942 0.026-355.456-159.437-355.456-355.379z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "not-installed"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 58,
-                "id": 35,
-                "prevSize": 32,
-                "code": 58936,
-                "name": "not-installed"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 35
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M511.77 0c-282.778 0-512.102 229.222-512.102 512.179 0 282.829 229.325 512.102 512.102 512.102 282.931 0.026 512.23-229.248 512.23-512.102 0-282.957-229.299-512.179-512.23-512.179zM143.718 419.968h736.205v184.269h-736.205v-184.269z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "disabled"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 57,
-                "id": 36,
-                "prevSize": 32,
-                "code": 58937,
-                "name": "disabled"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 36
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M505.139 0.085c-282.658 3.775-508.826 236.066-505.071 518.827 3.772 282.556 236.1 508.826 518.793 505.003 282.658-3.768 508.826-236.066 505.071-518.827-3.717-282.658-236.1-508.826-518.793-505.003z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "dot"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 56,
-                "id": 37,
-                "prevSize": 32,
-                "code": 58935,
-                "name": "dot"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 37
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M383.462 577.51h255.693v-213.043h127.795l-255.642-255.667-255.642 255.667h127.795z",
-                    "M852.173 577.51v170.394h-681.754v-170.394h-170.419v340.89h1022.618v-340.89z"
-                ],
-                "attrs": [
-                    {},
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "export"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {},
-                {}
-            ],
-            "properties": {
-                "order": 93,
-                "id": 38,
-                "prevSize": 32,
-                "code": 58933,
-                "name": "export"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 38
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M639.155 108.8h-255.693v213.043h-127.795l255.667 255.667 255.616-255.667h-127.795z",
-                    "M852.173 577.51v170.394h-681.754v-170.394h-170.419v340.89h1022.618v-340.89z"
-                ],
-                "attrs": [
-                    {},
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "import"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {},
-                {}
-            ],
-            "properties": {
-                "order": 92,
-                "id": 39,
-                "prevSize": 32,
-                "code": 58934,
-                "name": "import"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 39
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M259.2 0h214.323v214.323h-214.323v-214.323z",
-                    "M259.2 269.875h214.323v214.349h-214.323v-214.349z",
-                    "M259.2 539.776h214.323v214.349h-214.323v-214.349z",
-                    "M259.2 809.651h214.323v214.349h-214.323v-214.349z",
-                    "M549.325 0h214.323v214.323h-214.323v-214.323z",
-                    "M549.325 269.875h214.323v214.349h-214.323v-214.349z",
-                    "M549.325 539.776h214.323v214.349h-214.323v-214.349z",
-                    "M549.325 809.651h214.323v214.349h-214.323v-214.349z"
-                ],
-                "attrs": [
-                    {},
-                    {},
-                    {},
-                    {},
-                    {},
-                    {},
-                    {},
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "gripper"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {},
-                {},
-                {},
-                {},
-                {},
-                {},
-                {},
-                {}
-            ],
-            "properties": {
-                "order": 91,
-                "id": 40,
-                "prevSize": 32,
-                "code": 58903,
-                "name": "gripper"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 40
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M860.058 185.062v272l-430.029-269.158-1.894 253.491-424.371-249.754-3.763 647.834 426.24-241.28-5.606 239.437 439.424-252.16v259.635h163.942v-660.045z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "forward"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 90,
-                "id": 41,
-                "prevSize": 32,
-                "code": 58904,
-                "name": "forward"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 41
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M163.942 845.107v-271.974l430.029 269.133 1.894-253.491 424.397 249.754 3.738-647.834-426.24 241.28 5.606-239.437-439.424 252.16v-259.635h-163.942v660.045z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "backward"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 89,
-                "id": 42,
-                "prevSize": 32,
-                "code": 58905,
-                "name": "backward",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 42
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M512.794 0c-283.187 0-512.794 229.581-512.794 512.794 0 283.187 229.606 512.794 512.794 512.794s512.794-229.632 512.794-512.794c0-283.213-229.581-512.794-512.794-512.794zM512.794 971.213c-253.158 0-458.394-205.261-458.394-458.368 0-253.158 205.261-458.394 458.394-458.394 253.184 0 458.394 205.235 458.394 458.394 0.026 253.107-205.21 458.368-458.394 458.368z",
-                    "M760.013 625.613l30.387-38.4-265.6-206.413-20.787-1.613-259.226 208.026 28.826 39.987 236.8-177.613z"
-                ],
-                "attrs": [
-                    {},
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "expand-close"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {},
-                {}
-            ],
-            "properties": {
-                "order": 88,
-                "id": 43,
-                "prevSize": 32,
-                "code": 58901,
-                "name": "expand-close"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 43
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M512.794 0c-283.187 0-512.794 229.581-512.794 512.794 0 283.187 229.606 512.794 512.794 512.794s512.794-229.606 512.794-512.794c0-283.213-229.581-512.794-512.794-512.794zM512.794 971.213c-253.158 0-458.394-205.261-458.394-458.394 0-253.158 205.261-458.394 458.394-458.394 253.184 0 458.394 205.235 458.394 458.394 0.026 253.133-205.21 458.394-458.394 458.394z",
-                    "M265.6 454.4l-30.387 38.4 265.574 206.387 20.813 1.613 259.2-208-28.8-39.987-236.8 177.587z"
-                ],
-                "attrs": [
-                    {},
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "expand-open"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {},
-                {}
-            ],
-            "properties": {
-                "order": 87,
-                "id": 44,
-                "prevSize": 32,
-                "code": 58902,
-                "name": "expand-open"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 44
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M1020.032 565.555v-116.045l-16.41-5.376-124.237-40.525-33.152-80.102 63.718-134.784-82.048-82.125-15.411 7.808-116.531 59.213-80.077-33.178-50.278-140.442h-116.096l-45.875 140.698-80 33.126-134.963-63.744-82.022 82.074 7.834 15.334 59.162 116.608-33.126 80.026-140.518 50.253v116.147l16.435 5.325 124.288 40.576 33.075 80-63.693 134.886 82.048 82.099 131.942-66.97 80.026 33.152 50.304 140.39h116.096l5.35-16.41 40.55-124.237 80.077-33.178 134.886 63.718 82.074-82.074-7.834-15.386-59.213-116.582 33.203-80.026 140.416-50.253zM510.003 672.589c-89.754 0-162.509-72.832-162.509-162.611 0-89.754 72.755-162.483 162.509-162.483 89.83 0 162.509 72.73 162.509 162.483 0.026 89.805-72.653 162.611-162.509 162.611z"
-                ],
-                "attrs": [
-                    {
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "system-config"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 86,
-                "id": 45,
-                "prevSize": 32,
-                "code": 58896,
-                "name": "system-config"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 45
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M509.978 54.426l-509.978 509.926 95.949 95.949 414.106-413.978 413.875 413.978 95.949-95.898-509.901-509.978zM146.253 688.563v335.437h259.917v-304.819h207.514v304.819h259.917v-335.488l-363.622-363.597-363.725 363.648z"
-                ],
-                "attrs": [
-                    {
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "home"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 85,
-                "id": 46,
-                "prevSize": 32,
-                "code": 58897,
-                "name": "home"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 46
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M0 736.41l498.278 287.59v-421.402l-498.278-287.667v421.478zM894.464 224.486v44.262c0 32.819-62.797 59.418-140.365 59.418-77.466 0-140.262-26.598-140.262-59.418v-73.216h0.435c4.71 30.925 65.408 55.475 139.853 55.475 77.568 0 140.365-26.624 140.365-59.29 0-32.845-62.797-59.366-140.365-59.366-6.195 0-12.262 0.205-18.202 0.563l-90.317-52.147v55.706c0 32.819-62.72 59.392-140.262 59.392-48.691 0-91.597-10.496-116.813-26.47-3.584-3.712-7.987-7.245-13.312-10.598-6.579-6.861-10.24-14.387-10.24-22.323v-53.939l-87.322 50.381c-6.272-0.307-12.646-0.614-19.123-0.614-77.491 0-140.314 26.522-140.314 59.366 0 32.691 62.822 59.29 140.314 59.29 74.445 0 135.219-24.525 139.93-55.475h0.384v73.216c0 32.819-62.746 59.418-140.314 59.418-77.491 0-140.314-26.598-140.314-59.418v-43.622l-108.083 62.31 499.994 288.563 496.691-286.694-112.358-64.768zM646.784 408.013c0 32.794-62.874 59.315-140.365 59.315s-140.339-26.522-140.339-59.315v-73.267h0.41c4.762 30.95 65.459 55.475 139.93 55.475s135.142-24.525 139.904-55.475h0.486v73.267zM525.645 606.234v417.766l498.355-287.718v-417.766l-498.355 287.718zM505.318 118.656c77.542 0 140.262-26.547 140.262-59.315s-62.72-59.315-140.262-59.315c-77.491 0-140.339 26.573-140.339 59.315-0.026 32.768 62.822 59.315 140.339 59.315z"
-                ],
-                "attrs": [
-                    {
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "lego"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 84,
-                "id": 47,
-                "prevSize": 32,
-                "code": 58898,
-                "name": "lego"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 47
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M287.002 481.664c0.205 0.23 0.461 0.486 0.691 0.717l103.347 103.373 36.045-36.045-56.55-56.499 90.266-90.189 11.904 1.28c3.046 0.307 6.093 0.538 9.19 0.538 6.246 0 12.314-0.768 18.253-2.125l-66.381-66.381c-1.357-1.382-2.765-2.611-4.173-3.814 20.454-73.6 1.766-155.725-56.038-213.555-57.421-57.421-138.803-76.237-211.968-56.525l123.955 123.981-32.563 121.446-121.395 32.589-124.032-124.006c-19.712 73.19-0.896 154.573 56.525 212.019 60.262 60.288 147.021 77.952 222.925 53.197zM653.235 555.802c-1.997 8.909-2.509 18.202-1.459 27.546l1.306 11.93-90.189 90.189-56.55-56.55-36.070 36.122 327.219 327.194c20.198 20.173 46.618 30.259 73.062 30.259s52.915-10.086 73.037-30.259c40.346-40.32 40.346-105.728 0-146.074l-290.355-290.355zM905.907 958.362l-51.866 13.875-42.112-42.112 13.901-51.891 51.866-13.926 42.112 42.138-13.901 51.917zM506.701 594.099l56.576 56.576 64.128-64.154c-3.482-31.334 6.707-63.821 30.669-87.808 24.013-23.962 56.474-34.176 87.808-30.72l280.397-280.346-157.056-157.056-280.448 280.397c3.482 31.258-6.682 63.821-30.669 87.782-24.013 23.987-56.525 34.176-87.808 30.643l-64.102 64.205 56.499 56.422-277.043 277.12-10.138-10.138-53.248 42.829-89.421 141.312 22.835 22.835 141.312-89.421 42.803-53.222-10.138-10.138 277.043-277.12z"
-                ],
-                "attrs": [
-                    {
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "tool"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 120,
-                "id": 48,
-                "prevSize": 32,
-                "code": 58899,
-                "name": "tool"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 48
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M1023.932 505.105c-3.717-282.692-236.1-508.826-518.793-505.003-282.658 3.775-508.826 236.066-505.071 518.827 3.772 282.556 236.1 508.826 518.793 505.003 282.658-3.768 508.826-236.066 505.071-518.827zM623.991 481.304v298.633h-223.983v-298.633h-186.621l298.633-298.633 298.667 298.633h-186.679z"
-                ],
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "upgrade"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 125,
-                "id": 49,
-                "prevSize": 32,
-                "code": 58900,
-                "name": "upgrade"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 49
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M870.821 731.837c-64.195-65.89-78.231-188.772-91.738-283.159-20.074-139.937-24.259-297.089-226.008-317.693v-25.318c0-25.424-39.195-46.028-64.937-46.028s-62.024 20.551-62.024 46.028v25.371c-200.054 20.816-206.993 177.914-226.855 317.693-13.453 94.439-27.331 217.268-91.049 283.264-12.818 13.348-16.473 32.998-9.11 49.947 7.362 16.843 24.153 27.913 42.797 27.913h695.343c18.75 0 35.593-11.070 42.903-28.019s3.655-36.653-9.322-50z",
-                    "M489.569 963.883c51.060 0 92.373-40.837 92.373-91.367h-184.694c-0.053 50.53 41.314 91.367 92.32 91.367z"
-                ],
-                "width": 989,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    },
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "notification-02"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                },
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 123,
-                "id": 50,
-                "prevSize": 32,
-                "code": 58887,
-                "name": "notification-02"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 50
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M252.137 153.228l-160.070 92.393 378.042 218.205 160.023-92.393-377.996-218.205zM845.638 247.063l-377.996-218.252-145.222 83.828 377.996 218.205 145.222-83.782zM502.784 526.15v433.664l376.832-217.507v-433.711l-376.832 217.553zM55.668 742.26l376.785 217.507v-436.503l-376.785-217.46v436.457z"
-                ],
-                "width": 954,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "product"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 7,
-                "id": 51,
-                "prevSize": 32,
-                "code": 58888,
-                "name": "product",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 51
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M454.495 48.899l-402.697 240.513v457.026l104.632 60.727v-457.049l298.157-178.728 299.698 179.142-0.138 455.922 103.528-60.013v-457.026l-403.18-240.513zM507.766 330.28v534.344l-53.271 32.124-53.34-32.262v-533.792l-138.090 83.853v456.934l191.453 115.516 193.087-116.322v-456.451l-139.839-83.945z"
-                ],
-                "width": 903,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    },
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    },
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "logo"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                },
-                {
-                    "opacity": 1,
-                    "visibility": false
-                },
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 17,
-                "id": 52,
-                "prevSize": 32,
-                "code": 58886,
-                "name": "logo",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 52
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M709.921 158.694c8.139 32.295 8.927 34.974 8.192 68.162-0.263 12.813-7.772 71.943-5.724 90.112 1.628 14.966 5.461 16.174 11.448 28.514 10.398 21.425 6.984 51.095 2.941 72.678-2.206 11.868-6.827 28.725-13.916 38.387-7.667 10.66-23.211 10.713-30.142 23.158-9.872 17.854-4.306 43.008-10.503 62.385-7.142 21.898-25.101 23.421-26.466 52.145 8.822 1.155 17.592 2.468 26.466 3.623 8.822 18.59 25.049 55.874 41.59 67.059 13.863 3.728 27.727 7.457 41.59 11.185 48.627 19.64 102.558 43.061 151.237 63.33 44.373 18.432 97.411 24.996 113.48 70.84 0 31.035 2.941 104.501 2.153 145.25h-965.553c-0.893-40.697 2.153-114.215 2.153-145.25 15.964-45.844 69.002-52.408 113.375-70.84 48.679-20.27 102.61-43.691 151.237-63.33 13.811-3.728 27.674-7.457 41.59-11.185 16.489-11.185 32.715-48.522 41.538-67.059l19.692-4.621c-4.464-24.576-19.85-26.466-26.256-43.743-2.521-26.099-5.041-52.145-7.509-78.192 0.053 1.155-18.117-3.361-20.48-4.779-25.731-15.806-26.204-80.24-28.725-107.021-1.103-12.183 16.174-22.265 11.343-44.636-28.094-131.44 12.183-192.88 75.881-213.307 44.216-17.749 126.871-50.465 203.855-3.728l19.167 17.487 30.93 5.251c15.491 8.77 25.416 38.124 25.416 38.124z"
-                ],
-                "width": 1090,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "account"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 9,
-                "id": 53,
-                "prevSize": 32,
-                "code": 58880,
-                "name": "account",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 53
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M529.203 886.14l-468.465-628.209h936.931l-468.465 628.209z"
-                ],
-                "width": 1085,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "arrowdown"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 10,
-                "id": 54,
-                "prevSize": 32,
-                "code": 58881,
-                "name": "arrowdown",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 54
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M976.793 982.006h-910.388v-910.388h910.388v910.388zM912.622 135.789h-782.046v782.088h782.046v-782.088z",
-                    "M221.432 822.8h152.876v-372.033h-152.876v372.033z",
-                    "M466.323 820.234h350.932v-366.53h-350.932v366.53z",
-                    "M221.432 360.489h595.865v-147.125h-595.865v147.125z"
-                ],
-                "width": 1034,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    },
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    },
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    },
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "cms"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                },
-                {
-                    "opacity": 1,
-                    "visibility": false
-                },
-                {
-                    "opacity": 1,
-                    "visibility": false
-                },
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 83,
-                "id": 55,
-                "prevSize": 32,
-                "code": 58882,
-                "name": "cms",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 55
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M264.319 308.831c75.685 0 136.98-61.259 136.98-136.944 0-75.649-61.295-136.98-136.98-136.98s-137.017 61.331-137.017 136.98c0 75.649 61.331 136.944 137.017 136.944zM448.929 370.851c-28.962-28.926-63.325-46.252-187.655-46.252s-157.859 18.776-185.335 46.252c-27.44 27.44-18.196 320.43-18.196 320.43l60.824-144.411 38.241 430.334 110.23-220.278 102.907 220.278 36.393-430.334 60.824 144.411c-0.036 0 10.693-291.468-18.233-320.43z"
-                ],
-                "width": 489,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "customers"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 82,
-                "id": 56,
-                "prevSize": 32,
-                "code": 58883,
-                "name": "customers",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 56
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M680.975 73.728c-337.523 0-610.976 273.515-611.038 610.976 0.122 37.72 1.039 251.812 1.039 251.812h1219.997c0 0 0.978-239.219 1.039-251.812-0.183-337.523-273.637-610.976-611.038-610.976zM737.708 197.831c31.117 3.607 61.379 10.271 90.418 19.624l-19.93 61.685c-25.004-8.070-51.169-13.939-78.191-16.995l7.703-64.313zM270.091 673.15h-64.864c0-31.423 3.118-62.235 8.803-92.007l63.702 12.349c-5.135 25.799-7.642 52.392-7.642 79.658zM305.855 504.419l-59.178-26.288c12.655-28.489 28-55.449 45.79-80.636l52.942 37.475c-15.284 21.825-28.611 45.056-39.554 69.449zM407.46 365.155l-43.405-48.113c22.925-20.541 47.807-39.187 74.462-54.96l33.318 55.571c-22.987 13.755-44.567 29.65-64.374 47.501zM536.943 217.455c29.039-9.292 59.178-16.017 90.418-19.624l7.581 64.313c-26.838 3.057-53.003 8.926-78.13 16.995l-19.869-61.685zM761.673 801.532l-152.897 27.205-38.881-150.452 395.172-404.22-203.394 527.467zM1019.476 434.971l52.942-37.414c17.79 25.187 33.257 52.148 45.851 80.636l-59.178 26.288c-10.943-24.454-24.209-47.685-39.615-69.51zM1094.916 673.15c0-27.266-2.69-53.859-7.703-79.658l63.702-12.349c5.808 29.834 8.803 60.645 8.803 92.007h-64.802zM646.006 770.659c26.777 17.056 62.174 9.415 79.291-17.24 17.118-26.593 9.292-62.051-17.301-79.108-26.655-17.24-62.051-9.354-79.23 17.362-17.118 26.349-9.476 61.99 17.24 78.986z"
-                ],
-                "width": 1376,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "dashboard"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 81,
-                "id": 57,
-                "prevSize": 32,
-                "code": 58884,
-                "name": "dashboard",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 57
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M24.097 113.465h972.827v111.922l-410.504 412.792v238.366l-171.447 87.505v-325.871l-390.875-415.877v-108.837z"
-                ],
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "filter"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 80,
-                "id": 58,
-                "prevSize": 32,
-                "code": 58885,
-                "name": "filter",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 58
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M59.153 534.182l164.053 38.141v-303.902l-164.053 38.141v227.621zM1122.198 59.153l-837.712 194.959v335.978l140.328 376.832 151.712-57.45-104.049-279.113 649.668 151.18v-722.385z"
-                ],
-                "width": 1170,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "promotions"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 79,
-                "id": 59,
-                "prevSize": 32,
-                "code": 58889,
-                "name": "promotions",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 59
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M736.707 981.234h207.134v-322.703h-207.134v322.703zM399.646 981.234h207.134v-946.793h-207.134v946.793zM62.673 981.19h207.134v-634.704h-207.134v634.704z"
-                ],
-                "width": 991,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "reports"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 78,
-                "id": 60,
-                "prevSize": 32,
-                "code": 58890,
-                "name": "reports",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 60
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M426.502 612.517c-15.866-13.512-42.796-25.753-80.79-36.723v198.774c11.535-1.459 23.729-4.331 36.299-8.851 12.618-4.426 23.87-10.829 33.804-19.068 9.981-8.427 18.173-18.55 24.529-30.649 6.638-12.006 9.651-26.365 9.651-42.89 0.047-26.836-7.721-47.222-23.493-60.593zM576.736 736.856c-7.109 23.117-19.774 45.762-38.135 67.749-18.503 22.175-43.079 41.855-74.010 58.992-30.885 17.373-70.432 27.683-118.878 31.12v88.088h-57.014v-88.088c-72.080-5.603-128.483-29.237-169.113-71.374-40.536-42.090-63.935-104.095-70.432-185.544h136.251c-0.753 39.359 8.992 70.479 28.86 93.266 20.15 22.74 44.774 37.335 74.434 43.455v-216.523c-3.060-1.318-7.486-2.919-12.994-4.567-5.508-1.789-11.393-3.343-17.938-4.708-23.776-6.827-47.175-15.019-70.291-24.294-23.493-9.369-44.114-21.704-62.523-37.335-18.456-15.584-33.098-34.84-43.879-57.956-11.111-23.211-16.478-51.977-16.478-86.487 0-35.31 6.168-66.336 18.785-93.313 12.665-26.836 29.143-49.529 49.858-67.702 20.621-18.314 44.303-32.58 71.468-42.419 27.071-10.122 55.037-16.149 83.992-18.314v-79.66h57.014v79.66c29.143 3.531 56.308 10.169 81.638 20.292 25.423 10.028 47.787 23.729 67.137 41.478 19.585 17.514 35.357 39.453 47.457 65.771 12.288 26.13 19.35 57.109 21.28 93.172h-137.287c-0.518-27.636-8.616-51.082-23.917-70.432-15.725-19.303-34.275-29.002-56.308-29.002v183.331c7.862 2.072 15.631 4.143 23.729 6.12 8.098 2.072 16.525 4.567 25.565 7.297 47.645 13.983 84.415 31.12 110.168 51.318 25.8 20.292 44.726 41.666 56.92 63.653 12.335 22.175 19.633 44.256 21.704 66.336 2.448 22.081 3.531 41.713 3.531 59.039 0.047 15.207-3.531 34.416-10.593 57.579zM228.905 263.415c-8.38 7.156-15.113 16.196-19.962 26.883-4.802 10.781-7.062 23.352-7.062 37.759 0 22.834 6.733 40.536 20.103 52.824 13.653 12.618 35.734 22.552 66.713 30.131v-168.831c-10.829 0-21.516 1.695-31.826 5.226-10.216 3.437-19.633 8.851-27.966 16.007z"
-                ],
-                "width": 659,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "sales"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 77,
-                "id": 61,
-                "prevSize": 32,
-                "code": 58891,
-                "name": "sales",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 61
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M555.139 21.642c-218.775-71.601-457.062 40.29-532.231 250.028-75.227 209.681 41.211 437.665 259.928 509.208 218.717 71.601 457.004-40.348 532.231-250.028s-41.211-437.665-259.928-509.208zM320.076 677.045c-158.915-52.089-243.467-217.681-188.903-369.978 54.679-152.296 227.754-233.625 386.669-181.593s243.409 217.624 188.788 369.92c-54.622 152.296-227.696 233.567-386.554 181.65z",
-                    "M638.482 685.794l358.927 349.602 24.807-69.241 24.865-69.241-310.348-302.29z"
-                ],
-                "width": 1109,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    },
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "search"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                },
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 76,
-                "id": 62,
-                "prevSize": 32,
-                "code": 58892,
-                "name": "search",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 62
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M1098.281 85.45c19.777-3.723 34.901-21.232 34.901-42.347-0.058-23.791-19.196-43.103-42.812-43.103h-900.508c-23.675 0-42.754 19.312-42.754 43.103 0 21.057 15.007 38.566 34.843 42.347l-181.951 354.421v68.988c0 30.946 32.516 56.016 72.594 56.016 13.437 0 26.001-2.908 36.821-7.795v466.919h1061.286v-466.919c10.878 4.944 23.326 7.795 36.879 7.795 40.078 0 72.594-25.071 72.594-56.016v-68.988l-181.893-354.421zM214.758 564.875c-38.217 0-69.221-25.071-69.221-56.016v-6.457h-0.349v-62.531l137.162-353.665h109.648l-107.961 353.665v68.988c0 0 0 0 0 0 0 30.946-31.004 56.016-69.279 56.016zM498.447 564.875c-38.217 0-69.221-25.071-69.221-56.016v-68.988l57.354-353.665h109.241l-28.095 353.665v68.93c-0.058 31.004-31.004 56.075-69.279 56.075zM782.077 564.875c-38.217 0-69.162-25.071-69.162-56.016v-68.988l-28.154-353.665h108.892l57.296 353.665v68.988c0 0.931 0.175 1.92 0.233 2.792-1.803 29.666-32.051 53.224-69.104 53.224zM1134.637 508.859c0 30.946-31.004 56.016-69.221 56.016s-69.162-25.071-69.162-56.016v-68.988l-108.019-353.665h109.59l137.22 353.665v62.473h-0.349v6.515h-0.058z"
-                ],
-                "width": 1280,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "stores"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 75,
-                "id": 63,
-                "prevSize": 32,
-                "code": 58893,
-                "name": "stores",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 63
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M944.97 329.042c-97.861 0-177.522 79.581-177.522 177.443 0 97.94 79.66 177.679 177.522 177.679 98.019 0 177.679-79.739 177.679-177.679 0-97.861-79.66-177.443-177.679-177.443zM944.97-0c-470.712 0-944.97 512-944.97 512s474.258 512 944.97 512c470.949 0 945.128-512 945.128-512s-474.179-512-945.128-512zM944.97 868.856c-200.057 0-362.292-162.078-362.292-362.45 0-200.057 162.236-362.292 362.292-362.292 200.214 0 362.45 162.236 362.45 362.292 0 200.451-162.236 362.45-362.45 362.45z"
-                ],
-                "width": 1890,
-                "attrs": [
-                    {
-                        "opacity": 1,
-                        "visibility": false
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "views"
-                ],
-                "grid": 0
-            },
-            "attrs": [
-                {
-                    "opacity": 1,
-                    "visibility": false
-                }
-            ],
-            "properties": {
-                "order": 73,
-                "id": 64,
-                "prevSize": 32,
-                "code": 58895,
-                "name": "views",
-                "ligatures": ""
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 64
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M1042.226 299.849h-598.393v-299.849l-443.833 384.316 443.833 384.403v-299.859h598.393c106.478 0 192.801 86.318 192.801 192.801s-86.318 192.796-192.801 192.796v0.483l-452.707 0.005c-46.695 0.005-84.53 37.845-84.53 84.535 0 46.68 37.84 84.525 84.535 84.525 0.377 0 0.744-0.053 1.121-0.058h451.581c199.964 0 362.044-162.085 362.044-362.039 0-199.964-162.080-362.059-362.044-362.059z"
-                ],
-                "width": 1404,
-                "attrs": [],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "revert"
-                ],
-                "grid": 0
-            },
-            "attrs": [],
-            "properties": {
-                "order": 129,
-                "id": 65,
-                "prevSize": 32,
-                "code": 58946,
-                "name": "revert"
-            },
-            "setIdx": 0,
-            "setId": 7,
-            "iconIdx": 65
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M1023.959 505.088c-3.717-282.665-236.121-508.842-518.817-505.040-282.689 3.772-508.866 236.091-505.094 518.868 3.772 282.58 236.121 508.842 518.813 505.040 282.689-3.772 508.866-236.067 505.098-518.868zM580.086 904.359h-136.149v-136.163h136.149v136.163zM597.168 293.742l-44.103 388.928h-83.113l-43.099-388.928v-171.575h170.318v171.575z"
-                ],
-                "attrs": [
-                    {
-                        "fill": "rgb(100, 97, 96)"
-                    }
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "alert-round"
-                ],
-                "grid": 32
-            },
-            "attrs": [
-                {
-                    "fill": "rgb(100, 97, 96)"
-                }
-            ],
-            "properties": {
-                "order": 132,
-                "id": 0,
-                "name": "alert-round",
-                "prevSize": 32,
-                "code": 58952
-            },
-            "setIdx": 1,
-            "setId": 6,
-            "iconIdx": 0
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M793.271 222.6l-192.695-83.055v80.482c-2.517 31.926-83.182 57.618-182.582 57.618-99.309 0-180.126-25.692-182.398-57.618h-0.318l-0.465-80.482-197.709 83.055 381.218 167.697 374.95-167.697zM265.959 118.114l-1.104 0.428c32.596 16.331 89.086 27.124 153.551 27.124 64.726 0 121.621-10.94 153.996-27.355l-1.168-0.512c18.811-9.3 29.664-20.34 29.664-32.264 0-32.713-81.606-59.114-182.492-59.114-100.759 0-182.806 26.401-182.806 59.114-0.003 12.007 11.295 23.218 30.36 32.579zM418.418 462.436l-418.418-191.009v563.335l418.321 189.238 418.321-189.238v-563.733l-418.224 191.407z"
-                ],
-                "width": 883,
-                "attrs": [
-                    {}
-                ],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "module"
-                ],
-                "grid": 32
-            },
-            "attrs": [
-                {}
-            ],
-            "properties": {
-                "order": 131,
-                "id": 1,
-                "name": "module",
-                "prevSize": 32,
-                "code": 58951
-            },
-            "setIdx": 1,
-            "setId": 6,
-            "iconIdx": 1
-        },
-        {
-            "icon": {
-                "paths": [
-                    "M939.616 148.384c112.512 112.448 112.512 294.816 0 407.264l-350.944 350.976c-12.512 12.544-32.736 12.544-45.248 0-12.576-12.512-12.576-32.704 0-45.248l346.432-346.464c87.488-87.488 87.488-229.248-0.064-316.768-87.36-87.488-229.248-87.488-316.736 0l-462.304 456.864c-62.496 62.464-62.496 163.776 0 226.24 62.496 62.496 163.744 62.496 226.24 0l466.88-461.344c37.44-37.44 37.44-98.336 0-135.776-37.44-37.408-98.304-37.408-135.744 0l-351.008 351.008c-12.512 12.512-32.736 12.512-45.248 0-12.512-12.544-12.512-32.736 0-45.28l350.976-350.976c62.432-62.464 163.744-62.464 226.24 0 62.496 62.496 62.496 163.776 0 226.272l-466.88 461.376c-87.296 87.328-229.408 87.328-316.736 0-87.328-87.328-87.328-229.472 0-316.8l466.88-461.344c112.448-112.512 294.816-112.512 407.264 0z"
-                ],
-                "attrs": [],
-                "isMulticolor": false,
-                "isMulticolor2": false,
-                "tags": [
-                    "clip",
-                    "paperclip",
-                    "attachment"
-                ],
-                "grid": 32
-            },
-            "attrs": [],
-            "properties": {
-                "id": 2,
-                "order": 130,
-                "prevSize": 32,
-                "code": 58947,
-                "name": "clip"
-            },
-            "setIdx": 1,
-            "setId": 6,
-            "iconIdx": 2
+  "IcoMoonType": "selection",
+  "icons": [
+    {
+      "icon": {
+        "paths": [
+          "M0 512v512h793.43v-771.052l-42.045-36.62c-23.735-19.666-46.114-39.332-50.183-43.401-4.069-3.391-16.275-14.241-27.126-23.735s-53.574-46.792-94.94-83.412l-75.952-65.78h-503.184v512zM465.886 213.616c0.678 56.286 1.356 105.791 2.034 109.86 0 6.781 25.77 8.816 107.147 8.816h107.147v287.534c-0.678 252.27-1.356 288.212-10.85 290.246-5.425 1.356-133.595 2.034-284.821 2.034l-274.649-0.678-1.356-392.646c-0.678-216.328-0.678-396.715 0.678-400.106 1.356-4.069 67.136-6.781 177.674-6.781h175.64l1.356 101.722z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "width": 793,
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "grid": 32,
+        "tags": [
+          "document"
+        ]
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 133,
+        "id": 0,
+        "name": "document",
+        "prevSize": 32,
+        "code": 58953
+      },
+      "setIdx": 0,
+      "setId": 2,
+      "iconIdx": 0
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1023.959 505.088c-3.717-282.665-236.121-508.842-518.817-505.040-282.689 3.772-508.866 236.091-505.094 518.868 3.772 282.58 236.121 508.842 518.813 505.040 282.689-3.772 508.866-236.067 505.098-518.868zM580.086 904.359h-136.149v-136.163h136.149v136.163zM597.168 293.742l-44.103 388.928h-83.113l-43.099-388.928v-171.575h170.318v171.575z"
+        ],
+        "attrs": [
+          {
+            "fill": "rgb(100, 97, 96)"
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "alert-round"
+        ],
+        "grid": 32
+      },
+      "attrs": [
+        {
+          "fill": "rgb(100, 97, 96)"
         }
-    ],
-    "height": 1024,
-    "metadata": {
-        "name": "icomoon"
-    },
-    "preferences": {
-        "showGlyphs": true,
-        "showQuickUse": true,
-        "showQuickUse2": true,
-        "showSVGs": true,
-        "fontPref": {
-            "prefix": "icon-",
-            "metadata": {
-                "fontFamily": "icomoon",
-                "majorVersion": 1,
-                "minorVersion": 0
-            },
-            "metrics": {
-                "emSize": 1024,
-                "baseline": 6.25,
-                "whitespace": 50
-            },
-            "resetPoint": 58880,
-            "showVersion": true,
-            "showSelector": false,
-            "showMetrics": false,
-            "showMetadata": false,
-            "embed": false
-        },
-        "imagePref": {
-            "prefix": "icon-",
-            "png": true,
-            "useClassSelector": true,
-            "classSelector": ".icon"
-        },
-        "historySize": 100,
-        "showCodes": true,
-        "search": "",
-        "gridSize": 16,
-        "showLiga": false
+      ],
+      "properties": {
+        "order": 132,
+        "id": 0,
+        "name": "alert-round",
+        "prevSize": 32,
+        "code": 58952
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 66
+    },
+    {
+      "icon": {
+        "paths": [
+          "M793.271 222.6l-192.695-83.055v80.482c-2.517 31.926-83.182 57.618-182.582 57.618-99.309 0-180.126-25.692-182.398-57.618h-0.318l-0.465-80.482-197.709 83.055 381.218 167.697 374.95-167.697zM265.959 118.114l-1.104 0.428c32.596 16.331 89.086 27.124 153.551 27.124 64.726 0 121.621-10.94 153.996-27.355l-1.168-0.512c18.811-9.3 29.664-20.34 29.664-32.264 0-32.713-81.606-59.114-182.492-59.114-100.759 0-182.806 26.401-182.806 59.114-0.003 12.007 11.295 23.218 30.36 32.579zM418.418 462.436l-418.418-191.009v563.335l418.321 189.238 418.321-189.238v-563.733l-418.224 191.407z"
+        ],
+        "width": 883,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "module"
+        ],
+        "grid": 32
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 131,
+        "id": 1,
+        "name": "module",
+        "prevSize": 32,
+        "code": 58951
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 67
+    },
+    {
+      "icon": {
+        "paths": [
+          "M939.616 148.384c112.512 112.448 112.512 294.816 0 407.264l-350.944 350.976c-12.512 12.544-32.736 12.544-45.248 0-12.576-12.512-12.576-32.704 0-45.248l346.432-346.464c87.488-87.488 87.488-229.248-0.064-316.768-87.36-87.488-229.248-87.488-316.736 0l-462.304 456.864c-62.496 62.464-62.496 163.776 0 226.24 62.496 62.496 163.744 62.496 226.24 0l466.88-461.344c37.44-37.44 37.44-98.336 0-135.776-37.44-37.408-98.304-37.408-135.744 0l-351.008 351.008c-12.512 12.512-32.736 12.512-45.248 0-12.512-12.544-12.512-32.736 0-45.28l350.976-350.976c62.432-62.464 163.744-62.464 226.24 0 62.496 62.496 62.496 163.776 0 226.272l-466.88 461.376c-87.296 87.328-229.408 87.328-316.736 0-87.328-87.328-87.328-229.472 0-316.8l466.88-461.344c112.448-112.512 294.816-112.512 407.264 0z"
+        ],
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "clip",
+          "paperclip",
+          "attachment"
+        ],
+        "grid": 32
+      },
+      "attrs": [],
+      "properties": {
+        "id": 2,
+        "order": 130,
+        "prevSize": 32,
+        "code": 58947,
+        "name": "clip"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 68
+    },
+    {
+      "icon": {
+        "paths": [
+          "M2041.366 1.102v1021.449h-175.926l-411.263-409.297v-204.59l411.263-407.568h175.926z",
+          "M1305.997 989.076c0 19.377-15.608 34.924-34.856 34.924h-1236.279c-19.255 0-34.863-15.547-34.863-34.924v-954.275c0-19.248 15.608-34.801 34.863-34.801h1236.279c19.248 0 34.856 15.553 34.856 34.801v954.275z"
+        ],
+        "width": 2041,
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "video"
+        ],
+        "grid": 0
+      },
+      "attrs": [],
+      "properties": {
+        "order": 127,
+        "id": 0,
+        "prevSize": 32,
+        "code": 58945,
+        "name": "video"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 0
+    },
+    {
+      "icon": {
+        "paths": [
+          "M723.661 889.601c-2.404-10.843-4.034-21.47-5.282-31.583h-277.528c-2.458 20.233-6.917 43.087-14.646 64.305-7.79 21.277-18.796 40.54-33.824 54.15-15.028 13.552-33.689 22.104-59.788 22.158v25.369h494.020v-25.369c-26.142-0.058-44.737-8.61-59.838-22.158-22.44-20.307-35.961-53.91-43.114-86.873zM1126.214 0h-1093.209c-18.22 0-33.005 15.024-33.005 33.596v731.259c0 18.576 14.785 33.623 33.005 33.623h1093.209c18.224 0 33.067-15.051 33.067-33.623v-731.259c0-18.572-14.843-33.596-33.067-33.596zM1079.193 716.922h-999.234v-635.394h999.234v635.394z"
+        ],
+        "width": 1159,
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "screen"
+        ],
+        "grid": 0
+      },
+      "attrs": [],
+      "properties": {
+        "order": 72,
+        "id": 1,
+        "prevSize": 32,
+        "code": 58944,
+        "name": "screen"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 1
+    },
+    {
+      "icon": {
+        "paths": [
+          "M771.001 776.737c-55.445 0-100.448 44.754-100.448 100.2s44.879 100.324 100.448 100.324 100.448-44.879 100.448-100.324-45.003-100.2-100.448-100.2zM771.001 918.707c-23.123 0-41.77-18.648-41.77-41.771s18.647-41.77 41.77-41.77c23.247 0 41.895 18.648 41.895 41.77s-18.648 41.771-41.895 41.771z",
+          "M469.532 776.737c-55.445 0-100.449 44.754-100.449 100.2s45.003 100.324 100.449 100.324c55.445 0 100.448-44.879 100.448-100.324s-45.003-100.2-100.448-100.2zM469.532 918.707c-23.123 0-41.771-18.648-41.771-41.771s18.648-41.77 41.771-41.77 41.77 18.648 41.77 41.77-18.648 41.771-41.77 41.771z",
+          "M823.587 494.412c-130.036 0-238.441-91.622-264.547-213.825h-207.237l-136.749-198.162v-1.865h-207.237v83.541h169.942l78.693 117.729 83.417 412.857h581.183l49.23-243.786c-42.268 27.474-92.616 43.511-146.694 43.511z",
+          "M1023.862 249.756v-45.376l-55.073-18.026-12.929-31.204 24.863-52.71-31.95-32.074-5.967 2.984-45.5 23.123-31.328-12.929-19.642-54.948h-45.376l-2.114 6.464-15.912 48.608-31.203 12.929-52.835-24.863-32.074 31.95 3.108 5.967 23.247 45.624-13.053 31.328-54.948 19.766v45.376l6.34 2.113 48.732 15.788 12.929 31.204-24.863 52.71 32.074 32.074 6.092-3.108 45.376-22.999 31.328 12.929 19.642 54.824h45.376l2.113-6.464 15.913-48.359 31.203-12.929 52.71 24.988 32.198-32.074-3.108-6.092-23.247-45.624 12.929-31.203 54.948-19.766zM824.582 291.527c-35.057 0-63.65-28.469-63.65-63.526 0-35.182 28.469-63.526 63.65-63.526s63.526 28.469 63.526 63.526c-0.124 35.182-28.469 63.526-63.526 63.526z"
+        ],
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "cart"
+        ],
+        "grid": 0
+      },
+      "attrs": [],
+      "properties": {
+        "order": 71,
+        "id": 2,
+        "prevSize": 32,
+        "code": 58943,
+        "name": "cart"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 2
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0.010 188.484h1023.966v136.509h-1023.966z",
+          "M0.010 442.47h1023.966v136.506h-1023.966z",
+          "M0.010 699.017h1023.966v136.513h-1023.966z"
+        ],
+        "attrs": [
+          {},
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "list-menu"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {},
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 61,
+        "id": 3,
+        "prevSize": 32,
+        "code": 58942,
+        "name": "list-menu"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 3
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0.010 0.372h279.074v279.074h-279.074z",
+          "M372.77 0.372h279.074v279.074h-279.074z",
+          "M744.892 0.372h279.074v279.074h-279.074z",
+          "M0.010 372.497h279.074v279.074h-279.074z",
+          "M372.77 372.497h279.074v279.074h-279.074z",
+          "M744.892 372.497h279.074v279.074h-279.074z",
+          "M0.010 744.585h279.074v279.074h-279.074z",
+          "M372.77 744.585h279.074v279.074h-279.074z",
+          "M744.892 744.585h279.074v279.074h-279.074z"
+        ],
+        "attrs": [
+          {},
+          {},
+          {},
+          {},
+          {},
+          {},
+          {},
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "grid"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {},
+        {},
+        {},
+        {},
+        {},
+        {},
+        {},
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 112,
+        "id": 4,
+        "prevSize": 32,
+        "code": 58941,
+        "name": "grid"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 4
+    },
+    {
+      "icon": {
+        "paths": [
+          "M982.767 231.902h-250.095l-59.255-121.364c0 0-11.827-25.201-42.11-25.201-23.375 0-169.366 0-235.25 0-32.969 0-44.001 25.027-44.001 25.027l-57.484 121.539h-253.406c-22.74 0-41.131 18.459-41.131 41.267v624.333c0 22.743 18.401 41.199 41.131 41.199h941.636c22.74 0 41.199-18.459 41.199-41.199v-624.299c0-22.798-18.456-41.267-41.199-41.267zM512 823.91c-138.793 0-251.597-113.015-251.597-251.931 0-138.912 112.845-251.87 251.597-251.87 138.68 0 251.597 112.981 251.597 251.87 0 138.909-112.913 251.931-251.597 251.931z",
+          "M512 420.932c-83.255 0-150.972 67.714-150.972 150.972 0 83.197 67.71 150.903 150.972 150.903 83.258 0 150.903-67.714 150.903-150.903 0-83.255-67.652-150.972-150.903-150.972z"
+        ],
+        "attrs": [
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "camera"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 121,
+        "id": 5,
+        "prevSize": 32,
+        "code": 58940,
+        "name": "camera"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 5
+    },
+    {
+      "icon": {
+        "paths": [
+          "M904.192 0.027l-307.234 0.116-596.89 596.958 426.906 426.906 596.958-596.958-0.113-305.596-119.603-121.426zM858.679 313.337c-39.997 40.001-104.854 40.001-144.794 0-40.001-40.001-40.001-104.796 0-144.794 39.939-40.001 104.796-40.001 144.794 0 39.997 39.997 39.997 104.793 0 144.794z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "tag"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 111,
+        "id": 6,
+        "prevSize": 32,
+        "code": 58939,
+        "name": "tag"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 6
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1094.391 77.71l-77.71-77.71-423.329 423.347-423.33-423.347-77.71 77.672 423.35 423.368-423.312 423.329 77.672 77.71 423.338-423.338 423.283 423.3 77.671-77.71-423.263-423.281z"
+        ],
+        "width": 1176,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "colorPermutations": {
+          "6868681": [
+            {
+              "f": 0
+            }
+          ]
+        },
+        "tags": [
+          "close-mage"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 110,
+        "id": 7,
+        "prevSize": 32,
+        "code": 58927,
+        "name": "close-mage"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 7
+    },
+    {
+      "icon": {
+        "paths": [
+          "M857.675 289.413l-403.18-240.514-402.726 240.514v457.026l403.18 240.515 402.726-240.514v-457.027zM454.857 864.465l-298.427-178.383v-335.966l298.157-178.729 298.428 178.383v335.966l-298.158 178.729z"
+        ],
+        "width": 903,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "colorPermutations": {
+          "6868681": [
+            {
+              "f": 0
+            }
+          ]
+        },
+        "tags": [
+          "menu-item"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 109,
+        "id": 8,
+        "prevSize": 32,
+        "code": 58938,
+        "name": "menu-item"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 8
+    },
+    {
+      "icon": {
+        "paths": [
+          "M505.704 40.998c-260.096 3.489-468.158 217.202-464.706 477.336 3.489 259.982 217.202 468.12 477.298 464.631s468.158-217.202 464.706-477.336c-3.413-260.058-217.202-468.12-477.298-464.631zM557.928 197.973c47.863 0 62.009 27.762 62.009 59.544 0 39.671-31.782 76.383-86.016 76.383-45.359 0-66.901-22.831-65.65-60.53 0-31.782 26.624-75.435 89.657-75.435zM435.162 806.381c-32.73 0-56.661-19.873-33.792-107.217l37.547-154.814c6.485-24.841 7.585-34.778 0-34.778-9.785 0-52.262 17.143-77.407 34.057l-16.346-26.776c79.607-66.446 171.16-105.472 210.375-105.472 32.73 0 38.153 38.722 21.807 98.266l-43.008 162.816c-7.585 28.786-4.286 38.722 3.262 38.722 9.785 0 41.984-11.871 73.614-36.75l18.47 24.841c-77.369 77.369-161.792 107.179-194.56 107.179z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "info"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 108,
+        "id": 9,
+        "prevSize": 32,
+        "code": 58906,
+        "name": "info"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 9
+    },
+    {
+      "icon": {
+        "paths": [
+          "M591.986 448.019h-16.005v-192.019c0-105.851-86.13-192.019-192.019-192.019h-128c-105.851 0-192.019 86.13-192.019 192.019v192.019h-16.005c-26.396 0-48.014 21.618-48.014 48.014v479.991c0 26.396 21.618 48.014 48.014 48.014h544.009c26.396 0 48.014-21.618 48.014-48.014v-479.991c0-26.396-21.618-48.014-48.014-48.014zM384 896h-128l27.838-139.188c-16.801-11.529-27.838-30.872-27.838-52.793 0-35.347 28.672-64.019 64.019-64.019s64.019 28.672 64.019 64.019c0 21.921-11.036 41.263-27.838 52.793l27.838 139.188zM448.019 448.019h-256v-192.019c0-35.271 28.71-64.019 64.019-64.019h128c35.271 0 64.019 28.71 64.019 64.019v192.019z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "lock"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 107,
+        "id": 10,
+        "prevSize": 32,
+        "code": 58907,
+        "name": "lock"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 10
+    },
+    {
+      "icon": {
+        "paths": [
+          "M870.4 317.44h-194.56v143.36h153.6v215.040h-634.88v-215.040h215.040v112.64l204.8-184.32-204.8-184.32v112.64h-256c-56.51 0-102.4 45.815-102.4 102.4v296.96c0 56.51 45.89 102.4 102.4 102.4h716.8c56.585 0 102.4-45.89 102.4-102.4v-296.96c0-56.585-45.815-102.4-102.4-102.4z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "loop"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 106,
+        "id": 11,
+        "prevSize": 32,
+        "code": 58908,
+        "name": "loop"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 11
+    },
+    {
+      "icon": {
+        "paths": [
+          "M991.991 384h-351.991v-351.991c0-17.673-14.336-32.009-32.009-32.009h-192.019c-17.673 0-32.009 14.336-32.009 32.009v351.991h-351.991c-17.673 0-32.009 14.336-32.009 32.009v192.019c0 17.673 14.336 32.009 32.009 32.009h351.991v351.991c0 17.673 14.336 32.009 32.009 32.009h192.019c17.673 0 32.009-14.336 32.009-32.009v-351.991h351.991c17.673 0 32.009-14.336 32.009-32.009v-192.019c0-17.673-14.336-32.009-32.009-32.009z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "plus"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 105,
+        "id": 12,
+        "prevSize": 32,
+        "code": 58909,
+        "name": "plus"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 12
+    },
+    {
+      "icon": {
+        "paths": [
+          "M505.704 40.998c-260.096 3.489-468.158 217.126-464.706 477.298 3.489 260.21 217.202 468.158 477.298 464.744 260.134-3.489 468.233-217.202 464.706-477.298-3.489-260.21-217.202-468.233-477.298-464.744zM506.577 102.4c70.163-0.986 136.382 15.853 194.56 46.118l-63.374 105.662c-38.002-18.47-80.631-28.937-125.762-28.937-45.056 0-87.723 10.43-125.687 28.975l-63.336-105.624c54.993-28.672 117.343-45.321 183.599-46.232zM254.255 637.687l-105.586 63.298c-28.672-54.955-45.321-117.305-46.194-183.486-0.986-70.201 15.853-136.457 46.118-194.56l105.624 63.45c-18.546 37.926-28.975 80.555-28.975 125.649 0 45.056 10.43 87.723 28.975 125.687zM517.461 921.562c-70.163 0.986-136.457-15.853-194.56-46.118l63.374-105.662c38.002 18.546 80.631 28.975 125.687 28.975 45.094 0 87.761-10.392 125.687-28.937l63.336 105.586c-54.993 28.634-117.305 45.246-183.561 46.194zM512 737.242c-124.397 0-225.242-100.883-225.242-225.242 0-124.397 100.883-225.28 225.242-225.28 124.473 0 225.28 100.883 225.28 225.28s-100.807 225.242-225.28 225.242zM769.745 637.687c18.546-38.002 28.975-80.631 28.975-125.687 0-45.094-10.43-87.723-28.975-125.687l105.586-63.374c28.672 54.993 45.359 117.305 46.232 183.561 0.91 70.201-15.929 136.457-46.194 194.56l-105.624-63.336z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "recover"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 104,
+        "id": 13,
+        "prevSize": 32,
+        "code": 58910,
+        "name": "recover"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 13
+    },
+    {
+      "icon": {
+        "paths": [
+          "M906.126 135.813v0c-91.174-75.89-202.487-113.171-312.548-113.057-127.014-0.038-253.611 49.683-348.16 145.636l-95.004-79.265-1.593 305.342 300.184-56.282-99.442-82.944c67.546-64.247 155.269-97.204 244.015-97.28 79.948 0.038 159.782 26.7 226.114 81.806 84.347 70.125 127.659 170.629 127.772 272.46-0.038 14.715-0.948 29.431-2.769 44.070l137.519-26.283c0.19-5.954 0.303-11.871 0.303-17.787 0.152-140.098-60.151-279.78-176.431-376.415zM839.035 766.976c-67.736 65.498-156.255 99.025-245.912 99.1-79.986-0.038-159.82-26.738-226.114-81.806-84.347-70.125-127.697-170.629-127.772-272.498 0-16.839 1.252-33.716 3.679-50.366l-138.164 25.941c-0.379 8.116-0.683 16.346-0.683 24.462-0.114 140.174 60.226 279.817 176.545 376.491 91.136 75.852 202.411 113.057 312.51 112.981h0.341c127.924 0 255.241-50.441 349.943-147.759l90.795 75.207 0.569-305.38-299.956 57.344 104.183 86.281z"
+        ],
+        "width": 1176,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "refresh"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 113,
+        "id": 14,
+        "prevSize": 32,
+        "code": 58911,
+        "name": "refresh"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 14
+    },
+    {
+      "icon": {
+        "paths": [
+          "M593.351 21.732c-270.753 0-490.268 219.477-490.268 490.231s219.515 490.268 490.268 490.268 490.231-219.515 490.231-490.268c0-270.753-219.477-490.231-490.231-490.231zM828.947 683.653l-72.363 72.363-162.095-162.133-164.902 164.902-73.121-73.121 164.902-164.902-161.678-161.678 72.363-72.325 161.602 161.678 165.774-165.736 73.121 73.083-165.774 165.736 162.171 162.133z"
+        ],
+        "width": 1176,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "remove-small"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 114,
+        "id": 15,
+        "prevSize": 32,
+        "code": 58912,
+        "name": "remove-small"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 15
+    },
+    {
+      "icon": {
+        "paths": [
+          "M254.976 675.84v-267.264h103.424l-179.2-203.776-179.2 203.776h103.424v308.224c0 56.51 45.815 102.4 102.4 102.4h459.776l-131.186-143.36h-279.438zM920.538 615.424v-308.224c0-56.51-45.89-102.4-102.4-102.4h-459.738l131.11 143.36h279.514v267.264h-103.424l179.2 203.776 179.2-203.776h-103.462z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "retweet"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 117,
+        "id": 16,
+        "prevSize": 32,
+        "code": 58913,
+        "name": "retweet"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 16
+    },
+    {
+      "icon": {
+        "paths": [
+          "M768 64.019h-128c-105.851 0-192.019 86.13-192.019 192.019v192.019h-400.005c-26.396 0-48.014 21.618-48.014 48.014v479.991c0 26.396 21.618 48.014 48.014 48.014h544.009c26.396 0 48.014-21.618 48.014-48.014v-479.991c0-26.396-21.618-48.014-48.014-48.014h-16.005v-192.019c0-35.271 28.71-64.019 64.019-64.019h128c35.271 0 64.019 28.71 64.019 64.019v192.019h128v-192.019c0-105.851-86.13-192.019-192.019-192.019zM384 896h-128l27.838-139.188c-16.801-11.529-27.838-30.872-27.838-52.793 0-35.347 28.672-64.019 64.019-64.019s64.019 28.672 64.019 64.019c0 21.921-11.036 41.263-27.838 52.793l27.838 139.188z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "unlocked"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 36,
+        "id": 17,
+        "prevSize": 32,
+        "code": 58914,
+        "name": "unlocked"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 17
+    },
+    {
+      "icon": {
+        "paths": [
+          "M593.351 0l-593.351 1023.962h1186.74l-593.351-1023.962zM653.236 899.451h-125.421v-121.211h125.421v121.211zM622.175 728.329h-62.502l-34.816-288.313v-156.748h131.3v156.748l-33.982 288.313z"
+        ],
+        "width": 1176,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "warning"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 37,
+        "id": 18,
+        "prevSize": 32,
+        "code": 58915,
+        "name": "warning"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 18
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 512l512 512v-320.019h512v-384h-512v-320.019z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "arrow-left"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 38,
+        "id": 19,
+        "prevSize": 32,
+        "code": 58916,
+        "name": "arrow-left"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 19
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1024 512l-512-512v320.019h-512v384h512v320.019z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "arrow-right"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 39,
+        "id": 20,
+        "prevSize": 32,
+        "code": 58917,
+        "name": "arrow-right"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 20
+    },
+    {
+      "icon": {
+        "paths": [
+          "M402.735 146.735l-320.019 320.019c-24.993 24.993-24.993 65.498 0 90.491l320.019 320.019c24.993 24.993 65.498 24.993 90.491 0s24.993-65.498 0-90.491l-210.754-210.754h613.49c35.347 0 64.019-28.634 64.019-64.019s-28.672-64.019-64.019-64.019h-613.49l210.754-210.754c12.478-12.478 18.735-28.862 18.735-45.246s-6.258-32.768-18.735-45.246c-24.993-24.993-65.498-24.993-90.491 0z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "back-arrow"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 103,
+        "id": 21,
+        "prevSize": 32,
+        "code": 58918,
+        "name": "back-arrow"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 21
+    },
+    {
+      "icon": {
+        "paths": [
+          "M507.259 578.522h-102.059v101.717h102.059v-101.717zM650.885 714.714h-101.945v101.717h101.945v-101.717zM507.259 714.714h-102.059v101.717h102.059v-101.717zM507.259 442.33h-102.059v101.679h102.059v-101.679zM843.131 244.091c23.4 0 42.287-18.887 42.287-42.174v-145.408c0-23.324-18.887-42.174-42.287-42.174s-42.325 18.849-42.325 42.174v145.408c0.038 23.324 18.925 42.174 42.325 42.174zM343.419 244.091c23.362 0 42.249-18.887 42.249-42.174v-145.408c0-23.324-18.887-42.174-42.249-42.174-23.4 0-42.325 18.849-42.325 42.174v145.408c0 23.324 18.925 42.174 42.325 42.174zM363.444 578.522h-102.059v101.717h102.059v-101.717zM363.444 714.714h-102.059v101.717h102.059v-101.717zM650.885 578.522h-101.945v101.717h101.945v-101.717zM938.325 578.522h-102.059v101.717h102.059v-101.717zM938.325 442.33h-102.059v101.679h102.059v-101.679zM899.337 84.385v46.914c17.598 15.474 28.71 38.153 28.71 63.412 0 46.801-37.964 84.764-84.916 84.764s-84.954-37.964-84.954-84.764c0-25.259 11.15-47.938 28.71-63.412v-46.914h-387.262v46.914c17.56 15.474 28.71 38.153 28.71 63.412 0 46.801-38.002 84.764-84.916 84.764s-84.954-37.964-84.954-84.764c0-25.259 11.15-47.938 28.71-63.412v-46.914h-192.322v925.279h997.035v-925.279h-192.512zM999.234 915.304h-809.832v-589.938h809.832v589.938zM650.885 442.33h-101.945v101.679h101.945v-101.679zM794.624 442.33h-101.983v101.679h101.983v-101.679zM794.624 714.714h-101.983v101.717h101.983v-101.717zM794.624 578.522h-101.983v101.717h101.983v-101.717z"
+        ],
+        "width": 1176,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "calendar"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 102,
+        "id": 22,
+        "prevSize": 32,
+        "code": 58919,
+        "name": "calendar"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 22
+    },
+    {
+      "icon": {
+        "paths": [
+          "M132.21 286.758c-13.881-13.729-36.295-13.729-50.138 0-13.805 13.653-13.805 35.878 0 49.607l404.897 400.877c13.881 13.729 36.257 13.729 50.138 0l404.897-400.877c13.805-13.729 13.881-35.878 0-49.607s-36.371-13.729-50.138-0.038l-379.866 365.606-379.79-365.568z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "caret-down"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 101,
+        "id": 23,
+        "prevSize": 32,
+        "code": 58920,
+        "name": "caret-down"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 23
+    },
+    {
+      "icon": {
+        "paths": [
+          "M737.242 891.79c13.729 13.881 13.729 36.257 0 50.138s-35.878 13.881-49.607 0l-400.877-404.821c-13.729-13.881-13.729-36.295 0-50.138l400.877-404.897c13.729-13.881 35.878-13.881 49.607 0s13.729 36.257 0 50.138l-365.568 379.79 365.568 379.79z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "caret-left"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 100,
+        "id": 24,
+        "prevSize": 32,
+        "code": 58921,
+        "name": "caret-left"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 24
+    },
+    {
+      "icon": {
+        "paths": [
+          "M286.72 891.79c-13.729 13.881-13.729 36.257 0 50.138s35.878 13.881 49.607 0l400.877-404.821c13.729-13.881 13.729-36.295 0-50.138l-400.915-404.897c-13.729-13.881-35.878-13.881-49.607 0s-13.729 36.257 0 50.138l365.568 379.79-365.568 379.79z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "caret-right"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 99,
+        "id": 25,
+        "prevSize": 32,
+        "code": 58922,
+        "name": "caret-right"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 25
+    },
+    {
+      "icon": {
+        "paths": [
+          "M891.79 737.242c13.881 13.729 36.295 13.729 50.138 0 13.881-13.729 13.881-35.878 0-49.607l-404.897-400.877c-13.805-13.729-36.257-13.729-50.062 0l-404.897 400.877c-13.805 13.729-13.881 35.878 0 49.607s36.257 13.729 50.138 0l379.79-365.606 379.79 365.606z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "caret-up"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 98,
+        "id": 26,
+        "prevSize": 32,
+        "code": 58923,
+        "name": "caret-up"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 26
+    },
+    {
+      "icon": {
+        "paths": [
+          "M574.767 92.16c-227.593 0-412.672 182.386-418.247 409.335h-125.8l188.378 209.92 188.302-209.92h-146.242c5.537-168.998 143.777-304.393 313.609-304.393 173.397 0 313.913 140.971 313.913 314.899s-140.478 314.861-313.913 314.861c-69.48 0-133.689-22.718-185.685-61.099l-71.983 76.99c70.997 55.751 160.465 89.050 257.707 89.050 231.159 0 418.551-187.961 418.551-419.84-0.038-231.879-187.43-419.84-418.551-419.84z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "ccw"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 97,
+        "id": 27,
+        "prevSize": 32,
+        "code": 58924,
+        "name": "ccw"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 27
+    },
+    {
+      "icon": {
+        "paths": [
+          "M996.617 126.786l-513.555 513.555-256.796-256.834-128.379 128.417 385.214 385.252 641.896-642.010z"
+        ],
+        "width": 1176,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "check-mage"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 96,
+        "id": 28,
+        "prevSize": 32,
+        "code": 58925,
+        "name": "check-mage"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 28
+    },
+    {
+      "icon": {
+        "paths": [
+          "M512 40.96c-260.134 0-471.040 210.944-471.040 471.040 0 260.134 210.906 471.040 471.040 471.040s471.040-210.906 471.040-471.040c0-260.134-210.906-471.040-471.040-471.040zM512 880.64c-203.624 0-368.64-165.054-368.64-368.64s165.016-368.64 368.64-368.64 368.64 165.054 368.64 368.64-165.016 368.64-368.64 368.64zM547.84 245.76h-71.68v281.069l174.345 174.345 50.669-50.707-153.335-153.335z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "clock"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 95,
+        "id": 29,
+        "prevSize": 32,
+        "code": 58926,
+        "name": "clock"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 29
+    },
+    {
+      "icon": {
+        "paths": [
+          "M337.541 1021.004h513.024l64.512-645.916h-639.128l61.592 645.916zM737.394 154.169v-116.508c0-19.191-15.398-34.702-34.361-34.702h-217.847c-19.001 0-34.361 15.55-34.361 34.702v114.574c-73.576 8.382-150.149 24.614-226.494 52.338v106.989h738.001v-109.833c0 0-90.074-31.403-224.977-47.559zM668.937 147.759c-47.749-3.224-99.252-4.096-153.297-0.986v-61.44c0-9.519 7.623-17.332 17.143-17.332h118.936c9.519 0 17.218 7.813 17.218 17.332v62.426z"
+        ],
+        "width": 1176,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "delete"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 94,
+        "id": 30,
+        "prevSize": 32,
+        "code": 58928,
+        "name": "delete"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 30
+    },
+    {
+      "icon": {
+        "paths": [
+          "M928.503 26.889l-111.502 112.109 156.065 156.9 111.502-112.071-156.065-156.937zM215.002 744.41l156.065 156.9 535.211-538.093-156.065-156.9-535.211 538.093zM103.917 1007.161l188.985-49.873-139.302-140.098-49.683 190.009z"
+        ],
+        "width": 1176,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "edit"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 115,
+        "id": 31,
+        "prevSize": 32,
+        "code": 58929,
+        "name": "edit"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 31
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1014.67 822.651c0 0 0 0 0 0l-310.651-310.651 310.651-310.651c0 0 0 0 0 0 3.337-3.337 5.765-7.244 7.32-11.416 4.248-11.378 1.82-24.69-7.32-33.83l-146.735-146.735c-9.14-9.14-22.452-11.567-33.83-7.32-4.172 1.555-8.078 3.982-11.416 7.32 0 0 0 0 0 0l-310.651 310.651-310.651-310.651c0 0 0 0 0 0-3.337-3.337-7.244-5.765-11.416-7.32-11.378-4.248-24.69-1.82-33.83 7.32l-146.735 146.735c-9.14 9.14-11.567 22.452-7.32 33.83 1.555 4.172 3.982 8.078 7.32 11.416 0 0 0 0 0 0l310.651 310.651-310.651 310.651c0 0 0 0 0 0-3.337 3.337-5.765 7.244-7.32 11.416-4.248 11.378-1.82 24.69 7.32 33.83l146.735 146.735c9.14 9.14 22.452 11.567 33.83 7.32 4.172-1.555 8.078-3.982 11.416-7.32 0 0 0 0 0 0l310.651-310.651 310.651 310.651c0 0 0 0 0 0 3.337 3.337 7.244 5.765 11.416 7.32 11.378 4.248 24.69 1.82 33.83-7.32l146.735-146.735c9.14-9.14 11.567-22.452 7.32-33.83-1.555-4.172-3.982-8.078-7.32-11.416z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "error"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 122,
+        "id": 32,
+        "prevSize": 32,
+        "code": 58930,
+        "name": "error"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 32
+    },
+    {
+      "icon": {
+        "paths": [
+          "M593.351 22.566c-270.336 0-489.434 219.098-489.434 489.358s219.098 489.434 489.434 489.434 489.434-219.136 489.434-489.434-219.136-489.358-489.434-489.358zM635.752 826.596c-11.985 11.719-26.396 17.636-43.16 17.636-8.154 0-15.967-1.517-23.4-4.589-7.358-3.034-13.843-7.168-19.456-12.174-5.613-5.158-10.126-11.226-13.388-18.356-3.337-7.13-4.968-14.753-4.968-22.945 0-16.308 5.992-30.303 17.977-42.060 11.947-11.681 26.396-17.598 43.198-17.598 16.308 0 30.606 5.689 42.78 16.801 12.25 11.188 18.318 24.993 18.318 41.339-0.038 16.384-5.992 30.303-17.939 41.984zM778.923 382.673c-3.982 13.767-9.747 26.396-17.18 37.774-7.471 11.454-16.498 22.49-27.079 33.071s-22.49 21.618-35.65 33.033c-11.454 9.785-20.783 18.318-27.913 25.79-7.168 7.396-12.895 14.867-17.218 22.338-4.286 7.433-7.282 15.398-9.026 24.007-1.707 8.609-2.617 49.721-2.617 62.35v22.338h-101.376v-32.616c0-13.729 0.986-56.661 3.034-67.584s5.158-21.125 9.481-30.872 10.012-19.228 17.18-28.369c7.168-9.14 16.232-18.887 27.079-29.203l38.647-36.902c10.847-9.747 20.177-20.632 27.951-32.616 7.737-12.060 11.529-26.7 11.529-43.88 0-22.3-6.978-41.036-21.011-56.206-14.071-15.17-33.944-22.793-59.695-22.793-13.16 0-25.069 2.389-35.65 7.282-10.619 4.817-19.797 11.454-27.496 19.759-7.737 8.344-13.577 17.901-17.598 28.786-3.982 10.847-6.334 21.997-6.865 33.527l-105.624-9.444c3.413-27.496 10.733-51.959 21.921-73.463 11.112-21.466 25.562-39.595 43.311-54.575 17.711-14.829 38.078-26.169 61.023-33.944 22.869-7.699 47.521-11.605 73.842-11.605 24.614 0 47.976 3.603 70.049 10.771 21.959 7.168 41.491 17.711 58.406 31.782 16.839 14.033 30.227 31.365 39.936 51.959 9.709 20.632 14.564 44.411 14.564 71.263 0 18.356-2.010 34.475-5.992 48.166z"
+        ],
+        "width": 1176,
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "help"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 124,
+        "id": 33,
+        "prevSize": 32,
+        "code": 58931,
+        "name": "help"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 33
+    },
+    {
+      "icon": {
+        "paths": [
+          "M574.805 92.16c-227.631 0-412.71 182.386-418.247 409.335h-125.838l188.378 209.958 188.302-209.958h-146.242c5.537-168.998 143.777-304.393 313.647-304.393 173.359 0 313.875 140.971 313.875 314.899s-140.478 314.861-313.875 314.861c-69.518 0-133.727-22.718-185.761-61.099l-71.983 76.99c71.073 55.751 160.503 89.050 257.745 89.050 231.121 0 418.513-187.961 418.513-419.84-0.038-231.879-187.43-419.84-418.513-419.84zM537.6 286.72v240.109l153.865 153.865 50.669-50.669-132.855-132.855v-210.413h-71.68z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "history"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 45,
+        "id": 34,
+        "prevSize": 32,
+        "code": 58932,
+        "name": "history"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 34
+    },
+    {
+      "icon": {
+        "paths": [
+          "M510.413 0c-281.907 0-510.413 228.582-510.413 510.413 0 281.933 228.506 510.464 510.413 510.464s510.387-228.557 510.387-510.464c0-281.83-228.48-510.413-510.387-510.413zM865.843 510.413c0 69.99-20.506 135.27-55.578 190.285l-490.163-490.163c55.091-35.021 120.32-55.475 190.31-55.475 195.942 0 355.43 159.411 355.43 355.354zM154.957 510.413c0-69.939 20.506-135.245 55.578-190.31l490.189 490.189c-55.066 35.072-120.371 55.501-190.31 55.501-195.942 0.026-355.456-159.437-355.456-355.379z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "not-installed"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 58,
+        "id": 35,
+        "prevSize": 32,
+        "code": 58936,
+        "name": "not-installed"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 35
+    },
+    {
+      "icon": {
+        "paths": [
+          "M511.77 0c-282.778 0-512.102 229.222-512.102 512.179 0 282.829 229.325 512.102 512.102 512.102 282.931 0.026 512.23-229.248 512.23-512.102 0-282.957-229.299-512.179-512.23-512.179zM143.718 419.968h736.205v184.269h-736.205v-184.269z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "disabled"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 57,
+        "id": 36,
+        "prevSize": 32,
+        "code": 58937,
+        "name": "disabled"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 36
+    },
+    {
+      "icon": {
+        "paths": [
+          "M505.139 0.085c-282.658 3.775-508.826 236.066-505.071 518.827 3.772 282.556 236.1 508.826 518.793 505.003 282.658-3.768 508.826-236.066 505.071-518.827-3.717-282.658-236.1-508.826-518.793-505.003z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "dot"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 56,
+        "id": 37,
+        "prevSize": 32,
+        "code": 58935,
+        "name": "dot"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 37
+    },
+    {
+      "icon": {
+        "paths": [
+          "M383.462 577.51h255.693v-213.043h127.795l-255.642-255.667-255.642 255.667h127.795z",
+          "M852.173 577.51v170.394h-681.754v-170.394h-170.419v340.89h1022.618v-340.89z"
+        ],
+        "attrs": [
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "export"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 93,
+        "id": 38,
+        "prevSize": 32,
+        "code": 58933,
+        "name": "export"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 38
+    },
+    {
+      "icon": {
+        "paths": [
+          "M639.155 108.8h-255.693v213.043h-127.795l255.667 255.667 255.616-255.667h-127.795z",
+          "M852.173 577.51v170.394h-681.754v-170.394h-170.419v340.89h1022.618v-340.89z"
+        ],
+        "attrs": [
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "import"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 92,
+        "id": 39,
+        "prevSize": 32,
+        "code": 58934,
+        "name": "import"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 39
+    },
+    {
+      "icon": {
+        "paths": [
+          "M259.2 0h214.323v214.323h-214.323v-214.323z",
+          "M259.2 269.875h214.323v214.349h-214.323v-214.349z",
+          "M259.2 539.776h214.323v214.349h-214.323v-214.349z",
+          "M259.2 809.651h214.323v214.349h-214.323v-214.349z",
+          "M549.325 0h214.323v214.323h-214.323v-214.323z",
+          "M549.325 269.875h214.323v214.349h-214.323v-214.349z",
+          "M549.325 539.776h214.323v214.349h-214.323v-214.349z",
+          "M549.325 809.651h214.323v214.349h-214.323v-214.349z"
+        ],
+        "attrs": [
+          {},
+          {},
+          {},
+          {},
+          {},
+          {},
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "gripper"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {},
+        {},
+        {},
+        {},
+        {},
+        {},
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 91,
+        "id": 40,
+        "prevSize": 32,
+        "code": 58903,
+        "name": "gripper"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 40
+    },
+    {
+      "icon": {
+        "paths": [
+          "M860.058 185.062v272l-430.029-269.158-1.894 253.491-424.371-249.754-3.763 647.834 426.24-241.28-5.606 239.437 439.424-252.16v259.635h163.942v-660.045z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "forward"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 90,
+        "id": 41,
+        "prevSize": 32,
+        "code": 58904,
+        "name": "forward"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 41
+    },
+    {
+      "icon": {
+        "paths": [
+          "M163.942 845.107v-271.974l430.029 269.133 1.894-253.491 424.397 249.754 3.738-647.834-426.24 241.28 5.606-239.437-439.424 252.16v-259.635h-163.942v660.045z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "backward"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 89,
+        "id": 42,
+        "prevSize": 32,
+        "code": 58905,
+        "name": "backward",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 42
+    },
+    {
+      "icon": {
+        "paths": [
+          "M512.794 0c-283.187 0-512.794 229.581-512.794 512.794 0 283.187 229.606 512.794 512.794 512.794s512.794-229.632 512.794-512.794c0-283.213-229.581-512.794-512.794-512.794zM512.794 971.213c-253.158 0-458.394-205.261-458.394-458.368 0-253.158 205.261-458.394 458.394-458.394 253.184 0 458.394 205.235 458.394 458.394 0.026 253.107-205.21 458.368-458.394 458.368z",
+          "M760.013 625.613l30.387-38.4-265.6-206.413-20.787-1.613-259.226 208.026 28.826 39.987 236.8-177.613z"
+        ],
+        "attrs": [
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "expand-close"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 88,
+        "id": 43,
+        "prevSize": 32,
+        "code": 58901,
+        "name": "expand-close"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 43
+    },
+    {
+      "icon": {
+        "paths": [
+          "M512.794 0c-283.187 0-512.794 229.581-512.794 512.794 0 283.187 229.606 512.794 512.794 512.794s512.794-229.606 512.794-512.794c0-283.213-229.581-512.794-512.794-512.794zM512.794 971.213c-253.158 0-458.394-205.261-458.394-458.394 0-253.158 205.261-458.394 458.394-458.394 253.184 0 458.394 205.235 458.394 458.394 0.026 253.133-205.21 458.394-458.394 458.394z",
+          "M265.6 454.4l-30.387 38.4 265.574 206.387 20.813 1.613 259.2-208-28.8-39.987-236.8 177.587z"
+        ],
+        "attrs": [
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "expand-open"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 87,
+        "id": 44,
+        "prevSize": 32,
+        "code": 58902,
+        "name": "expand-open"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 44
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1020.032 565.555v-116.045l-16.41-5.376-124.237-40.525-33.152-80.102 63.718-134.784-82.048-82.125-15.411 7.808-116.531 59.213-80.077-33.178-50.278-140.442h-116.096l-45.875 140.698-80 33.126-134.963-63.744-82.022 82.074 7.834 15.334 59.162 116.608-33.126 80.026-140.518 50.253v116.147l16.435 5.325 124.288 40.576 33.075 80-63.693 134.886 82.048 82.099 131.942-66.97 80.026 33.152 50.304 140.39h116.096l5.35-16.41 40.55-124.237 80.077-33.178 134.886 63.718 82.074-82.074-7.834-15.386-59.213-116.582 33.203-80.026 140.416-50.253zM510.003 672.589c-89.754 0-162.509-72.832-162.509-162.611 0-89.754 72.755-162.483 162.509-162.483 89.83 0 162.509 72.73 162.509 162.483 0.026 89.805-72.653 162.611-162.509 162.611z"
+        ],
+        "attrs": [
+          {
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "system-config"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 86,
+        "id": 45,
+        "prevSize": 32,
+        "code": 58896,
+        "name": "system-config"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 45
+    },
+    {
+      "icon": {
+        "paths": [
+          "M509.978 54.426l-509.978 509.926 95.949 95.949 414.106-413.978 413.875 413.978 95.949-95.898-509.901-509.978zM146.253 688.563v335.437h259.917v-304.819h207.514v304.819h259.917v-335.488l-363.622-363.597-363.725 363.648z"
+        ],
+        "attrs": [
+          {
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "home"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 85,
+        "id": 46,
+        "prevSize": 32,
+        "code": 58897,
+        "name": "home"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 46
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 736.41l498.278 287.59v-421.402l-498.278-287.667v421.478zM894.464 224.486v44.262c0 32.819-62.797 59.418-140.365 59.418-77.466 0-140.262-26.598-140.262-59.418v-73.216h0.435c4.71 30.925 65.408 55.475 139.853 55.475 77.568 0 140.365-26.624 140.365-59.29 0-32.845-62.797-59.366-140.365-59.366-6.195 0-12.262 0.205-18.202 0.563l-90.317-52.147v55.706c0 32.819-62.72 59.392-140.262 59.392-48.691 0-91.597-10.496-116.813-26.47-3.584-3.712-7.987-7.245-13.312-10.598-6.579-6.861-10.24-14.387-10.24-22.323v-53.939l-87.322 50.381c-6.272-0.307-12.646-0.614-19.123-0.614-77.491 0-140.314 26.522-140.314 59.366 0 32.691 62.822 59.29 140.314 59.29 74.445 0 135.219-24.525 139.93-55.475h0.384v73.216c0 32.819-62.746 59.418-140.314 59.418-77.491 0-140.314-26.598-140.314-59.418v-43.622l-108.083 62.31 499.994 288.563 496.691-286.694-112.358-64.768zM646.784 408.013c0 32.794-62.874 59.315-140.365 59.315s-140.339-26.522-140.339-59.315v-73.267h0.41c4.762 30.95 65.459 55.475 139.93 55.475s135.142-24.525 139.904-55.475h0.486v73.267zM525.645 606.234v417.766l498.355-287.718v-417.766l-498.355 287.718zM505.318 118.656c77.542 0 140.262-26.547 140.262-59.315s-62.72-59.315-140.262-59.315c-77.491 0-140.339 26.573-140.339 59.315-0.026 32.768 62.822 59.315 140.339 59.315z"
+        ],
+        "attrs": [
+          {
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "lego"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 84,
+        "id": 47,
+        "prevSize": 32,
+        "code": 58898,
+        "name": "lego"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 47
+    },
+    {
+      "icon": {
+        "paths": [
+          "M287.002 481.664c0.205 0.23 0.461 0.486 0.691 0.717l103.347 103.373 36.045-36.045-56.55-56.499 90.266-90.189 11.904 1.28c3.046 0.307 6.093 0.538 9.19 0.538 6.246 0 12.314-0.768 18.253-2.125l-66.381-66.381c-1.357-1.382-2.765-2.611-4.173-3.814 20.454-73.6 1.766-155.725-56.038-213.555-57.421-57.421-138.803-76.237-211.968-56.525l123.955 123.981-32.563 121.446-121.395 32.589-124.032-124.006c-19.712 73.19-0.896 154.573 56.525 212.019 60.262 60.288 147.021 77.952 222.925 53.197zM653.235 555.802c-1.997 8.909-2.509 18.202-1.459 27.546l1.306 11.93-90.189 90.189-56.55-56.55-36.070 36.122 327.219 327.194c20.198 20.173 46.618 30.259 73.062 30.259s52.915-10.086 73.037-30.259c40.346-40.32 40.346-105.728 0-146.074l-290.355-290.355zM905.907 958.362l-51.866 13.875-42.112-42.112 13.901-51.891 51.866-13.926 42.112 42.138-13.901 51.917zM506.701 594.099l56.576 56.576 64.128-64.154c-3.482-31.334 6.707-63.821 30.669-87.808 24.013-23.962 56.474-34.176 87.808-30.72l280.397-280.346-157.056-157.056-280.448 280.397c3.482 31.258-6.682 63.821-30.669 87.782-24.013 23.987-56.525 34.176-87.808 30.643l-64.102 64.205 56.499 56.422-277.043 277.12-10.138-10.138-53.248 42.829-89.421 141.312 22.835 22.835 141.312-89.421 42.803-53.222-10.138-10.138 277.043-277.12z"
+        ],
+        "attrs": [
+          {
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "tool"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 120,
+        "id": 48,
+        "prevSize": 32,
+        "code": 58899,
+        "name": "tool"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 48
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1023.932 505.105c-3.717-282.692-236.1-508.826-518.793-505.003-282.658 3.775-508.826 236.066-505.071 518.827 3.772 282.556 236.1 508.826 518.793 505.003 282.658-3.768 508.826-236.066 505.071-518.827zM623.991 481.304v298.633h-223.983v-298.633h-186.621l298.633-298.633 298.667 298.633h-186.679z"
+        ],
+        "attrs": [
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "upgrade"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {}
+      ],
+      "properties": {
+        "order": 125,
+        "id": 49,
+        "prevSize": 32,
+        "code": 58900,
+        "name": "upgrade"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 49
+    },
+    {
+      "icon": {
+        "paths": [
+          "M870.821 731.837c-64.195-65.89-78.231-188.772-91.738-283.159-20.074-139.937-24.259-297.089-226.008-317.693v-25.318c0-25.424-39.195-46.028-64.937-46.028s-62.024 20.551-62.024 46.028v25.371c-200.054 20.816-206.993 177.914-226.855 317.693-13.453 94.439-27.331 217.268-91.049 283.264-12.818 13.348-16.473 32.998-9.11 49.947 7.362 16.843 24.153 27.913 42.797 27.913h695.343c18.75 0 35.593-11.070 42.903-28.019s3.655-36.653-9.322-50z",
+          "M489.569 963.883c51.060 0 92.373-40.837 92.373-91.367h-184.694c-0.053 50.53 41.314 91.367 92.32 91.367z"
+        ],
+        "width": 989,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          },
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "notification-02"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        },
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 123,
+        "id": 50,
+        "prevSize": 32,
+        "code": 58887,
+        "name": "notification-02"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 50
+    },
+    {
+      "icon": {
+        "paths": [
+          "M252.137 153.228l-160.070 92.393 378.042 218.205 160.023-92.393-377.996-218.205zM845.638 247.063l-377.996-218.252-145.222 83.828 377.996 218.205 145.222-83.782zM502.784 526.15v433.664l376.832-217.507v-433.711l-376.832 217.553zM55.668 742.26l376.785 217.507v-436.503l-376.785-217.46v436.457z"
+        ],
+        "width": 954,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "product"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 7,
+        "id": 51,
+        "prevSize": 32,
+        "code": 58888,
+        "name": "product",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 51
+    },
+    {
+      "icon": {
+        "paths": [
+          "M454.495 48.899l-402.697 240.513v457.026l104.632 60.727v-457.049l298.157-178.728 299.698 179.142-0.138 455.922 103.528-60.013v-457.026l-403.18-240.513zM507.766 330.28v534.344l-53.271 32.124-53.34-32.262v-533.792l-138.090 83.853v456.934l191.453 115.516 193.087-116.322v-456.451l-139.839-83.945z"
+        ],
+        "width": 903,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          },
+          {
+            "opacity": 1,
+            "visibility": false
+          },
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "logo"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        },
+        {
+          "opacity": 1,
+          "visibility": false
+        },
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 17,
+        "id": 52,
+        "prevSize": 32,
+        "code": 58886,
+        "name": "logo",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 52
+    },
+    {
+      "icon": {
+        "paths": [
+          "M709.921 158.694c8.139 32.295 8.927 34.974 8.192 68.162-0.263 12.813-7.772 71.943-5.724 90.112 1.628 14.966 5.461 16.174 11.448 28.514 10.398 21.425 6.984 51.095 2.941 72.678-2.206 11.868-6.827 28.725-13.916 38.387-7.667 10.66-23.211 10.713-30.142 23.158-9.872 17.854-4.306 43.008-10.503 62.385-7.142 21.898-25.101 23.421-26.466 52.145 8.822 1.155 17.592 2.468 26.466 3.623 8.822 18.59 25.049 55.874 41.59 67.059 13.863 3.728 27.727 7.457 41.59 11.185 48.627 19.64 102.558 43.061 151.237 63.33 44.373 18.432 97.411 24.996 113.48 70.84 0 31.035 2.941 104.501 2.153 145.25h-965.553c-0.893-40.697 2.153-114.215 2.153-145.25 15.964-45.844 69.002-52.408 113.375-70.84 48.679-20.27 102.61-43.691 151.237-63.33 13.811-3.728 27.674-7.457 41.59-11.185 16.489-11.185 32.715-48.522 41.538-67.059l19.692-4.621c-4.464-24.576-19.85-26.466-26.256-43.743-2.521-26.099-5.041-52.145-7.509-78.192 0.053 1.155-18.117-3.361-20.48-4.779-25.731-15.806-26.204-80.24-28.725-107.021-1.103-12.183 16.174-22.265 11.343-44.636-28.094-131.44 12.183-192.88 75.881-213.307 44.216-17.749 126.871-50.465 203.855-3.728l19.167 17.487 30.93 5.251c15.491 8.77 25.416 38.124 25.416 38.124z"
+        ],
+        "width": 1090,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "account"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 9,
+        "id": 53,
+        "prevSize": 32,
+        "code": 58880,
+        "name": "account",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 53
+    },
+    {
+      "icon": {
+        "paths": [
+          "M529.203 886.14l-468.465-628.209h936.931l-468.465 628.209z"
+        ],
+        "width": 1085,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "arrowdown"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 10,
+        "id": 54,
+        "prevSize": 32,
+        "code": 58881,
+        "name": "arrowdown",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 54
+    },
+    {
+      "icon": {
+        "paths": [
+          "M976.793 982.006h-910.388v-910.388h910.388v910.388zM912.622 135.789h-782.046v782.088h782.046v-782.088z",
+          "M221.432 822.8h152.876v-372.033h-152.876v372.033z",
+          "M466.323 820.234h350.932v-366.53h-350.932v366.53z",
+          "M221.432 360.489h595.865v-147.125h-595.865v147.125z"
+        ],
+        "width": 1034,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          },
+          {
+            "opacity": 1,
+            "visibility": false
+          },
+          {
+            "opacity": 1,
+            "visibility": false
+          },
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "cms"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        },
+        {
+          "opacity": 1,
+          "visibility": false
+        },
+        {
+          "opacity": 1,
+          "visibility": false
+        },
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 83,
+        "id": 55,
+        "prevSize": 32,
+        "code": 58882,
+        "name": "cms",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 55
+    },
+    {
+      "icon": {
+        "paths": [
+          "M264.319 308.831c75.685 0 136.98-61.259 136.98-136.944 0-75.649-61.295-136.98-136.98-136.98s-137.017 61.331-137.017 136.98c0 75.649 61.331 136.944 137.017 136.944zM448.929 370.851c-28.962-28.926-63.325-46.252-187.655-46.252s-157.859 18.776-185.335 46.252c-27.44 27.44-18.196 320.43-18.196 320.43l60.824-144.411 38.241 430.334 110.23-220.278 102.907 220.278 36.393-430.334 60.824 144.411c-0.036 0 10.693-291.468-18.233-320.43z"
+        ],
+        "width": 489,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "customers"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 82,
+        "id": 56,
+        "prevSize": 32,
+        "code": 58883,
+        "name": "customers",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 56
+    },
+    {
+      "icon": {
+        "paths": [
+          "M680.975 73.728c-337.523 0-610.976 273.515-611.038 610.976 0.122 37.72 1.039 251.812 1.039 251.812h1219.997c0 0 0.978-239.219 1.039-251.812-0.183-337.523-273.637-610.976-611.038-610.976zM737.708 197.831c31.117 3.607 61.379 10.271 90.418 19.624l-19.93 61.685c-25.004-8.070-51.169-13.939-78.191-16.995l7.703-64.313zM270.091 673.15h-64.864c0-31.423 3.118-62.235 8.803-92.007l63.702 12.349c-5.135 25.799-7.642 52.392-7.642 79.658zM305.855 504.419l-59.178-26.288c12.655-28.489 28-55.449 45.79-80.636l52.942 37.475c-15.284 21.825-28.611 45.056-39.554 69.449zM407.46 365.155l-43.405-48.113c22.925-20.541 47.807-39.187 74.462-54.96l33.318 55.571c-22.987 13.755-44.567 29.65-64.374 47.501zM536.943 217.455c29.039-9.292 59.178-16.017 90.418-19.624l7.581 64.313c-26.838 3.057-53.003 8.926-78.13 16.995l-19.869-61.685zM761.673 801.532l-152.897 27.205-38.881-150.452 395.172-404.22-203.394 527.467zM1019.476 434.971l52.942-37.414c17.79 25.187 33.257 52.148 45.851 80.636l-59.178 26.288c-10.943-24.454-24.209-47.685-39.615-69.51zM1094.916 673.15c0-27.266-2.69-53.859-7.703-79.658l63.702-12.349c5.808 29.834 8.803 60.645 8.803 92.007h-64.802zM646.006 770.659c26.777 17.056 62.174 9.415 79.291-17.24 17.118-26.593 9.292-62.051-17.301-79.108-26.655-17.24-62.051-9.354-79.23 17.362-17.118 26.349-9.476 61.99 17.24 78.986z"
+        ],
+        "width": 1376,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "dashboard"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 81,
+        "id": 57,
+        "prevSize": 32,
+        "code": 58884,
+        "name": "dashboard",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 57
+    },
+    {
+      "icon": {
+        "paths": [
+          "M24.097 113.465h972.827v111.922l-410.504 412.792v238.366l-171.447 87.505v-325.871l-390.875-415.877v-108.837z"
+        ],
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "filter"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 80,
+        "id": 58,
+        "prevSize": 32,
+        "code": 58885,
+        "name": "filter",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 58
+    },
+    {
+      "icon": {
+        "paths": [
+          "M59.153 534.182l164.053 38.141v-303.902l-164.053 38.141v227.621zM1122.198 59.153l-837.712 194.959v335.978l140.328 376.832 151.712-57.45-104.049-279.113 649.668 151.18v-722.385z"
+        ],
+        "width": 1170,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "promotions"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 79,
+        "id": 59,
+        "prevSize": 32,
+        "code": 58889,
+        "name": "promotions",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 59
+    },
+    {
+      "icon": {
+        "paths": [
+          "M736.707 981.234h207.134v-322.703h-207.134v322.703zM399.646 981.234h207.134v-946.793h-207.134v946.793zM62.673 981.19h207.134v-634.704h-207.134v634.704z"
+        ],
+        "width": 991,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "reports"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 78,
+        "id": 60,
+        "prevSize": 32,
+        "code": 58890,
+        "name": "reports",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 60
+    },
+    {
+      "icon": {
+        "paths": [
+          "M426.502 612.517c-15.866-13.512-42.796-25.753-80.79-36.723v198.774c11.535-1.459 23.729-4.331 36.299-8.851 12.618-4.426 23.87-10.829 33.804-19.068 9.981-8.427 18.173-18.55 24.529-30.649 6.638-12.006 9.651-26.365 9.651-42.89 0.047-26.836-7.721-47.222-23.493-60.593zM576.736 736.856c-7.109 23.117-19.774 45.762-38.135 67.749-18.503 22.175-43.079 41.855-74.010 58.992-30.885 17.373-70.432 27.683-118.878 31.12v88.088h-57.014v-88.088c-72.080-5.603-128.483-29.237-169.113-71.374-40.536-42.090-63.935-104.095-70.432-185.544h136.251c-0.753 39.359 8.992 70.479 28.86 93.266 20.15 22.74 44.774 37.335 74.434 43.455v-216.523c-3.060-1.318-7.486-2.919-12.994-4.567-5.508-1.789-11.393-3.343-17.938-4.708-23.776-6.827-47.175-15.019-70.291-24.294-23.493-9.369-44.114-21.704-62.523-37.335-18.456-15.584-33.098-34.84-43.879-57.956-11.111-23.211-16.478-51.977-16.478-86.487 0-35.31 6.168-66.336 18.785-93.313 12.665-26.836 29.143-49.529 49.858-67.702 20.621-18.314 44.303-32.58 71.468-42.419 27.071-10.122 55.037-16.149 83.992-18.314v-79.66h57.014v79.66c29.143 3.531 56.308 10.169 81.638 20.292 25.423 10.028 47.787 23.729 67.137 41.478 19.585 17.514 35.357 39.453 47.457 65.771 12.288 26.13 19.35 57.109 21.28 93.172h-137.287c-0.518-27.636-8.616-51.082-23.917-70.432-15.725-19.303-34.275-29.002-56.308-29.002v183.331c7.862 2.072 15.631 4.143 23.729 6.12 8.098 2.072 16.525 4.567 25.565 7.297 47.645 13.983 84.415 31.12 110.168 51.318 25.8 20.292 44.726 41.666 56.92 63.653 12.335 22.175 19.633 44.256 21.704 66.336 2.448 22.081 3.531 41.713 3.531 59.039 0.047 15.207-3.531 34.416-10.593 57.579zM228.905 263.415c-8.38 7.156-15.113 16.196-19.962 26.883-4.802 10.781-7.062 23.352-7.062 37.759 0 22.834 6.733 40.536 20.103 52.824 13.653 12.618 35.734 22.552 66.713 30.131v-168.831c-10.829 0-21.516 1.695-31.826 5.226-10.216 3.437-19.633 8.851-27.966 16.007z"
+        ],
+        "width": 659,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "sales"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 77,
+        "id": 61,
+        "prevSize": 32,
+        "code": 58891,
+        "name": "sales",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 61
+    },
+    {
+      "icon": {
+        "paths": [
+          "M555.139 21.642c-218.775-71.601-457.062 40.29-532.231 250.028-75.227 209.681 41.211 437.665 259.928 509.208 218.717 71.601 457.004-40.348 532.231-250.028s-41.211-437.665-259.928-509.208zM320.076 677.045c-158.915-52.089-243.467-217.681-188.903-369.978 54.679-152.296 227.754-233.625 386.669-181.593s243.409 217.624 188.788 369.92c-54.622 152.296-227.696 233.567-386.554 181.65z",
+          "M638.482 685.794l358.927 349.602 24.807-69.241 24.865-69.241-310.348-302.29z"
+        ],
+        "width": 1109,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          },
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "search"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        },
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 76,
+        "id": 62,
+        "prevSize": 32,
+        "code": 58892,
+        "name": "search",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 62
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1098.281 85.45c19.777-3.723 34.901-21.232 34.901-42.347-0.058-23.791-19.196-43.103-42.812-43.103h-900.508c-23.675 0-42.754 19.312-42.754 43.103 0 21.057 15.007 38.566 34.843 42.347l-181.951 354.421v68.988c0 30.946 32.516 56.016 72.594 56.016 13.437 0 26.001-2.908 36.821-7.795v466.919h1061.286v-466.919c10.878 4.944 23.326 7.795 36.879 7.795 40.078 0 72.594-25.071 72.594-56.016v-68.988l-181.893-354.421zM214.758 564.875c-38.217 0-69.221-25.071-69.221-56.016v-6.457h-0.349v-62.531l137.162-353.665h109.648l-107.961 353.665v68.988c0 0 0 0 0 0 0 30.946-31.004 56.016-69.279 56.016zM498.447 564.875c-38.217 0-69.221-25.071-69.221-56.016v-68.988l57.354-353.665h109.241l-28.095 353.665v68.93c-0.058 31.004-31.004 56.075-69.279 56.075zM782.077 564.875c-38.217 0-69.162-25.071-69.162-56.016v-68.988l-28.154-353.665h108.892l57.296 353.665v68.988c0 0.931 0.175 1.92 0.233 2.792-1.803 29.666-32.051 53.224-69.104 53.224zM1134.637 508.859c0 30.946-31.004 56.016-69.221 56.016s-69.162-25.071-69.162-56.016v-68.988l-108.019-353.665h109.59l137.22 353.665v62.473h-0.349v6.515h-0.058z"
+        ],
+        "width": 1280,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "stores"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 75,
+        "id": 63,
+        "prevSize": 32,
+        "code": 58893,
+        "name": "stores",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 63
+    },
+    {
+      "icon": {
+        "paths": [
+          "M944.97 329.042c-97.861 0-177.522 79.581-177.522 177.443 0 97.94 79.66 177.679 177.522 177.679 98.019 0 177.679-79.739 177.679-177.679 0-97.861-79.66-177.443-177.679-177.443zM944.97-0c-470.712 0-944.97 512-944.97 512s474.258 512 944.97 512c470.949 0 945.128-512 945.128-512s-474.179-512-945.128-512zM944.97 868.856c-200.057 0-362.292-162.078-362.292-362.45 0-200.057 162.236-362.292 362.292-362.292 200.214 0 362.45 162.236 362.45 362.292 0 200.451-162.236 362.45-362.45 362.45z"
+        ],
+        "width": 1890,
+        "attrs": [
+          {
+            "opacity": 1,
+            "visibility": false
+          }
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "views"
+        ],
+        "grid": 0
+      },
+      "attrs": [
+        {
+          "opacity": 1,
+          "visibility": false
+        }
+      ],
+      "properties": {
+        "order": 73,
+        "id": 64,
+        "prevSize": 32,
+        "code": 58895,
+        "name": "views",
+        "ligatures": ""
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 64
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1042.226 299.849h-598.393v-299.849l-443.833 384.316 443.833 384.403v-299.859h598.393c106.478 0 192.801 86.318 192.801 192.801s-86.318 192.796-192.801 192.796v0.483l-452.707 0.005c-46.695 0.005-84.53 37.845-84.53 84.535 0 46.68 37.84 84.525 84.535 84.525 0.377 0 0.744-0.053 1.121-0.058h451.581c199.964 0 362.044-162.085 362.044-362.039 0-199.964-162.080-362.059-362.044-362.059z"
+        ],
+        "width": 1404,
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "revert"
+        ],
+        "grid": 0
+      },
+      "attrs": [],
+      "properties": {
+        "order": 129,
+        "id": 65,
+        "prevSize": 32,
+        "code": 58946,
+        "name": "revert"
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 65
     }
+  ],
+  "height": 1024,
+  "metadata": {
+    "name": "icomoon"
+  },
+  "preferences": {
+    "showGlyphs": true,
+    "showQuickUse": true,
+    "showQuickUse2": true,
+    "showSVGs": true,
+    "fontPref": {
+      "prefix": "icon-",
+      "metadata": {
+        "fontFamily": "icomoon",
+        "majorVersion": 1,
+        "minorVersion": 0
+      },
+      "metrics": {
+        "emSize": 1024,
+        "baseline": 6.25,
+        "whitespace": 50
+      },
+      "resetPoint": 58880,
+      "showVersion": true,
+      "showSelector": false,
+      "showMetrics": false,
+      "showMetadata": false,
+      "embed": false
+    },
+    "imagePref": {
+      "prefix": "icon-",
+      "png": true,
+      "useClassSelector": true,
+      "classSelector": ".icon"
+    },
+    "historySize": 100,
+    "showCodes": true,
+    "search": "",
+    "gridSize": 16,
+    "showLiga": false
+  }
 }
\ No newline at end of file
diff --git a/app/design/frontend/Magento/blank/etc/view.xml b/app/design/frontend/Magento/blank/etc/view.xml
index 6c53a8613f09ca1f91c9e024b8e2cec723f0b309..3bf5fc6fc77af5a67becb60920343c6f6ce48db8 100644
--- a/app/design/frontend/Magento/blank/etc/view.xml
+++ b/app/design/frontend/Magento/blank/etc/view.xml
@@ -73,10 +73,18 @@
                 <height>140</height>
             </image>
             <image id="product_page_image_large" type="image"/>
+            <image id="product_page_image_large_no_frame" type="image">
+                <frame>false</frame>
+            </image>
             <image id="product_page_image_medium" type="image">
                 <width>700</width>
                 <height>700</height>
             </image>
+            <image id="product_page_image_medium_no_frame" type="image">
+                <width>700</width>
+                <height>700</height>
+                <frame>false</frame>
+            </image>
             <image id="product_page_image_small" type="thumbnail">
                 <width>90</width>
                 <height>90</height>
diff --git a/app/design/frontend/Magento/luma/etc/view.xml b/app/design/frontend/Magento/luma/etc/view.xml
index 12a51ee065edba43c9afde39ce31c2aace3d00a8..33fc64af977c557f17fd7e9db0779a881fa77e08 100644
--- a/app/design/frontend/Magento/luma/etc/view.xml
+++ b/app/design/frontend/Magento/luma/etc/view.xml
@@ -77,10 +77,18 @@
                 <height>140</height>
             </image>
             <image id="product_page_image_large" type="image"/>
+            <image id="product_page_image_large_no_frame" type="image">
+                <frame>false</frame>
+            </image>
             <image id="product_page_image_medium" type="image">
                 <width>700</width>
                 <height>560</height>
             </image>
+            <image id="product_page_image_medium_no_frame" type="image">
+                <width>700</width>
+                <height>700</height>
+                <frame>false</frame>
+            </image>
             <image id="product_page_image_small" type="thumbnail">
                 <width>88</width>
                 <height>110</height>
diff --git a/app/etc/di.xml b/app/etc/di.xml
index e9767eccb28114ffa66bc8bc84829d92b1620e99..1b347574f4b2a2d3f010cb9a712da6cd6c7dbec2 100755
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -433,7 +433,7 @@
     </virtualType>
     <virtualType name="layoutObjectArgumentInterpreter" type="Magento\Framework\View\Layout\Argument\Interpreter\DataObject">
         <arguments>
-            <argument name="expectedClass" xsi:type="string">Magento\Framework\Data\CollectionDataSourceInterface</argument>
+            <argument name="expectedClass" xsi:type="string">Magento\Framework\View\Element\Block\ArgumentInterface</argument>
         </arguments>
     </virtualType>
     <type name="Magento\Framework\View\Layout\Argument\Interpreter\NamedParams">
diff --git a/dev/tests/functional/composer.json b/dev/tests/functional/composer.json
index e4a9bd10fa65832e7fdc4ae01f10578056b55a47..f170114a4ea8348714531af55ca805bb5e3442fe 100644
--- a/dev/tests/functional/composer.json
+++ b/dev/tests/functional/composer.json
@@ -1,6 +1,6 @@
 {
     "require": {
-        "magento/mtf": "1.0.0-rc49",
+        "magento/mtf": "1.0.0-rc50",
         "php": "~5.6.5|7.0.2|~7.0.6",
         "phpunit/phpunit": "~4.8.0|~5.5.0",
         "phpunit/phpunit-selenium": ">=1.2"
diff --git a/dev/tests/functional/credentials.xml.dist b/dev/tests/functional/credentials.xml.dist
index 78186091a568ddba7368126c4b9217714e35d127..1061ca183f7f9e6ef4d4c1f740159423729e7c75 100644
--- a/dev/tests/functional/credentials.xml.dist
+++ b/dev/tests/functional/credentials.xml.dist
@@ -48,20 +48,32 @@
     <field path="payment/paypal_group_all_in_one/wpp_usuk/wpp_required_settings/wpp_and_express_checkout/api_signature" value="" />
     <field path="payment/paypal_express/merchant_id" value="" />
 
-    <field path="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/business_account" value="" />
-    <field path="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/partner" value="" />
-    <field path="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/user" value="" />
-    <field path="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/pwd" value="" />
-    <field path="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/vendor" value="" />
+    <field replace="payflow_pro_fraud_protection_enabled_business_account" value="" />
+    <field replace="payflow_pro_fraud_protection_enabled_partner" value="" />
+    <field replace="payflow_pro_fraud_protection_enabled_user" value="" />
+    <field replace="payflow_pro_fraud_protection_enabled_pwd" value="" />
+    <field replace="payflow_pro_fraud_protection_enabled_vendor" value="" />
+
+    <field replace="payflow_pro_business_account" value="" />
+    <field replace="payflow_pro_partner" value="" />
+    <field replace="payflow_pro_user" value="" />
+    <field replace="payflow_pro_pwd" value="" />
+    <field replace="payflow_pro_vendor" value="" />
+
+    <field replace="payflow_link_business_account_email" value="" />
+    <field replace="payflow_link_partner" value="" />
+    <field replace="payflow_link_user" value="" />
+    <field replace="payflow_link_password" value="" />
+    <field replace="payflow_link_vendor" value="" />
+
+    <field path="payment/paypal_group_all_in_one/payments_pro_hosted_solution_with_express_checkout/pphs_required_settings/pphs_required_settings_pphs/business_account" value="" />
+    <field path="payment/paypal_group_all_in_one/payments_pro_hosted_solution_with_express_checkout/pphs_required_settings/pphs_required_settings_pphs/api_username" value="" />
+    <field path="payment/paypal_group_all_in_one/payments_pro_hosted_solution_with_express_checkout/pphs_required_settings/pphs_required_settings_pphs/api_password" value="" />
+    <field path="payment/paypal_group_all_in_one/payments_pro_hosted_solution_with_express_checkout/pphs_required_settings/pphs_required_settings_pphs/api_signature" value="" />
 
     <field path="payment/paypal_alternative_payment_methods/express_checkout_us/express_checkout_required/express_checkout_required_express_checkout/business_account" value="" />
     <field path="payment/paypal_alternative_payment_methods/express_checkout_us/express_checkout_required/express_checkout_required_express_checkout/api_username" value="" />
     <field path="payment/paypal_alternative_payment_methods/express_checkout_us/express_checkout_required/express_checkout_required_express_checkout/api_password" value="" />
     <field path="payment/paypal_alternative_payment_methods/express_checkout_us/express_checkout_required/express_checkout_required_express_checkout/api_signature" value="" />
 
-    <field path="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/business_account" value="" />
-    <field path="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/partner" value="" />
-    <field path="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/user" value="" />
-    <field path="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/pwd" value="" />
-    <field path="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/vendor" value="" />
 </replace>
diff --git a/dev/tests/functional/lib/Magento/Mtf/Client/Element/DatepickerElement.php b/dev/tests/functional/lib/Magento/Mtf/Client/Element/DatepickerElement.php
index e09ca5647cf590831e10b47ce8f86e20ef670ef3..07ac39363119094f9da91ab2b3d4dda8aa5129c3 100644
--- a/dev/tests/functional/lib/Magento/Mtf/Client/Element/DatepickerElement.php
+++ b/dev/tests/functional/lib/Magento/Mtf/Client/Element/DatepickerElement.php
@@ -67,8 +67,8 @@ class DatepickerElement extends SimpleElement
         $date[1] = ltrim($date[1], '0');
         $this->find($this->datePickerButton, Locator::SELECTOR_XPATH)->click();
         $datapicker = $this->find($this->datePickerBlock, Locator::SELECTOR_XPATH);
-        $datapicker->find($this->datePickerMonth, Locator::SELECTOR_XPATH, 'select')->setValue($date[0]);
         $datapicker->find($this->datePickerYear, Locator::SELECTOR_XPATH, 'select')->setValue($date[2]);
+        $datapicker->find($this->datePickerMonth, Locator::SELECTOR_XPATH, 'select')->setValue($date[0]);
         $datapicker->find(sprintf($this->datePickerCalendar, $date[1]), Locator::SELECTOR_XPATH)->click();
         if ($datapicker->isVisible()) {
             $datapicker->find($this->datePickerButtonClose, Locator::SELECTOR_XPATH)->click();
diff --git a/dev/tests/functional/lib/Magento/Mtf/Constraint/AbstractAssertForm.php b/dev/tests/functional/lib/Magento/Mtf/Constraint/AbstractAssertForm.php
index ba1eca68a2436d1be756d82542ec412c95858e42..7114ec405ea28f4afd48537523ee9725e6058639 100644
--- a/dev/tests/functional/lib/Magento/Mtf/Constraint/AbstractAssertForm.php
+++ b/dev/tests/functional/lib/Magento/Mtf/Constraint/AbstractAssertForm.php
@@ -118,8 +118,8 @@ abstract class AbstractAssertForm extends AbstractConstraint
 
     /**
      * Sort multidimensional array by paths.
-     * Pattern path: key/subKey::sorkKey.
-     * Exapmle:
+     * Pattern path: key/subKey::sortKey.
+     * Example:
      * $data = [
      *     'custom_options' => [
      *         'options' => [
diff --git a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Block/Form/Cc.php b/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Block/Form/Cc.php
deleted file mode 100644
index 7918859e53715c5215f772d988d91ac475a6150d..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Block/Form/Cc.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Authorizenet\Test\Block\Form;
-
-use Magento\Payment\Test\Block\Form\Cc as CreditCard;
-
-/**
- * Class Cc
- * Form for filling credit card data for Authorize.Net payment method
- */
-class Cc extends CreditCard
-{
-    //
-}
diff --git a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Block/Form/Cc.xml b/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Block/Form/Cc.xml
deleted file mode 100755
index a7d2ae40b89c527f1d6bd5bcc1b55a9c0a8a4f03..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Block/Form/Cc.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" ?>
-<!--
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<mapping strict="0">
-    <wrapper>payment</wrapper>
-    <fields>
-        <cc_number />
-        <cc_exp_month>
-            <input>select</input>
-        </cc_exp_month>
-        <cc_exp_year>
-            <input>select</input>
-        </cc_exp_year>
-        <cc_cid />
-    </fields>
-</mapping>
diff --git a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Fixture/CreditCardAuthorizenet.xml b/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Fixture/CreditCardAuthorizenet.xml
deleted file mode 100644
index 2777d09b4f16336c3b49a68fc6bdb1e47fe1d186..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Fixture/CreditCardAuthorizenet.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd">
-    <fixture name="credit_card_authorizenet"
-             module="Magento_Authorizenet"
-             type="virtual"
-             entity_type="credit_card_authorizenet"
-             repository_class="Magento\Authorizenet\Test\Repository\CreditCard"
-             class="Magento\Authorizenet\Test\Fixture\CreditCardAuthorizenet">
-        <field name="cc_number" />
-        <field name="cc_exp_month" />
-        <field name="cc_exp_year" />
-        <field name="cc_cid" />
-    </fixture>
-</config>
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 d629bcba9e174251a1bc1e4c8fff6cc664911598..d25149f645f056d7f6e47e10706de3a0bc27e831 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
@@ -17,9 +17,8 @@
             <data name="prices" xsi:type="array">
                 <item name="grandTotal" xsi:type="string">15.00</item>
             </data>
-            <data name="creditCardClass" xsi:type="string">credit_card_authorizenet</data>
             <data name="payment/method" xsi:type="string">authorizenet_directpost</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_authorizenet</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
             <data name="configData" xsi:type="string">authorizenet</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S0</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/Cc.php b/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/BraintreeCc.php
similarity index 65%
rename from dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/Cc.php
rename to dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/BraintreeCc.php
index 2179efc0d5bf16c1299fba2439ddf415b3f575f7..60354b0f9ca28ae680039ecef9ce9cd47fd309e1 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/Cc.php
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/BraintreeCc.php
@@ -9,26 +9,33 @@ namespace Magento\Braintree\Test\Block\Form;
 use Magento\Mtf\Client\Locator;
 use Magento\Mtf\Client\Element\SimpleElement;
 use Magento\Mtf\Fixture\FixtureInterface;
-use Magento\Payment\Test\Block\Form\Cc as CreditCard;
+use Magento\Mtf\ObjectManager;
+use Magento\Payment\Test\Block\Form\PaymentCc;
 
 /**
- * Class Cc
- * Form for filling credit card data for Braintree payment method
+ * Form for filling credit card data for Braintree payment method.
  */
-class Cc extends CreditCard
+class BraintreeCc extends PaymentCc
 {
     /**
-     * Braintree iFrame locator
+     * Braintree iFrame locator.
      *
      * @var array
      */
     protected $braintreeForm = [
-        "credit_card_number" => "#braintree-hosted-field-number",
-        "credit_card_exp_month" => "#braintree-hosted-field-expirationMonth",
-        "credit_card_exp_year" => "#braintree-hosted-field-expirationYear",
-        "cvv" => "#braintree-hosted-field-cvv",
+        "cc_number" => "#braintree-hosted-field-number",
+        "cc_exp_month" => "#braintree-hosted-field-expirationMonth",
+        "cc_exp_year" => "#braintree-hosted-field-expirationYear",
+        "cc_cid" => "#braintree-hosted-field-cvv",
     ];
 
+    /**
+     * Fill Braintree credit card form.
+     *
+     * @param FixtureInterface $fixture
+     * @param SimpleElement|null $element
+     * @return void
+     */
     public function fill(FixtureInterface $fixture, SimpleElement $element = null)
     {
         $mapping = $this->dataMapping($fixture->getData());
@@ -40,7 +47,8 @@ class Cc extends CreditCard
                     return $fieldElement->isVisible() ? true : null;
                 }
             );
-            $this->browser->switchToFrame(new Locator($iframe));
+            $iframeLocator = ObjectManager::getInstance()->create(Locator::class, ['value' => $iframe]);
+            $this->browser->switchToFrame($iframeLocator);
             $element = $this->browser->find('body');
             $this->browser->waitUntil(
                 function () use ($element) {
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/Cc.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/BraintreeCc.xml
similarity index 63%
rename from dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/Cc.xml
rename to dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/BraintreeCc.xml
index 6ea1ba9ee6e15ffe8d86aea81f8dc46aa5abc79d..d1d09ec7b1dd70bfa6413afe00bfff4ae95d735e 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/Cc.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Form/BraintreeCc.xml
@@ -7,17 +7,17 @@
 -->
 <mapping strict="0">
     <fields>
-        <credit_card_number>
+        <cc_number>
             <selector>#credit-card-number</selector>
-        </credit_card_number>
-        <credit_card_exp_month>
+        </cc_number>
+        <cc_exp_month>
             <selector>#expiration-month</selector>
-        </credit_card_exp_month>
-        <credit_card_exp_year>
+        </cc_exp_month>
+        <cc_exp_year>
             <selector>#expiration-year</selector>
-        </credit_card_exp_year>
-        <cvv>
+        </cc_exp_year>
+        <cc_cid>
             <selector>#cvv</selector>
-        </cvv>
+        </cc_cid>
     </fields>
 </mapping>
\ No newline at end of file
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Info.php b/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Info.php
deleted file mode 100644
index 32dfb8f40fe87695cbe251048757385dc8310116..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/Block/Info.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Braintree\Test\Block;
-
-use Magento\Mtf\Block\Block;
-use Magento\Mtf\Client\Locator;
-
-/**
- * Payment information block.
- */
-class Info extends Block
-{
-    /**
-     * Braintree Payment information block locator.
-     */
-    private $info = './/tr';
-
-    /**
-     * Get Braintree payment information block data.
-     *
-     * @return array
-     */
-    public function getPaymentInfo()
-    {
-        $result = [];
-        $elements = $this->_rootElement->getElements($this->info, Locator::SELECTOR_XPATH);
-        foreach ($elements as $row) {
-            $key = rtrim($row->find('./th', Locator::SELECTOR_XPATH)->getText(), ':');
-            $value = $row->find('./td', Locator::SELECTOR_XPATH)->getText();
-            $result[$key] = $value;
-        }
-        return $result;
-    }
-}
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/Constraint/Assert3dSecureInfoIsPresent.php b/dev/tests/functional/tests/app/Magento/Braintree/Test/Constraint/Assert3dSecureInfoIsPresent.php
index bb1e0670231574d4e6c53eaf483e419e0ecab0ae..29af7632f7fd748a82e359164c80098c0fd59941 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/Constraint/Assert3dSecureInfoIsPresent.php
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/Constraint/Assert3dSecureInfoIsPresent.php
@@ -6,13 +6,16 @@
 
 namespace Magento\Braintree\Test\Constraint;
 
-use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
 use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
 
+/**
+ * Assert that 3D Secure information is present on order page in Admin.
+ */
 class Assert3dSecureInfoIsPresent extends AbstractConstraint
 {
     /**
-     * Assert that 3D Secure information is  present on order page in Admin.
+     * Assert that 3D Secure information is present on order page in Admin.
      *
      * @param SalesOrderView $salesOrderView
      * @param array $paymentInformation
@@ -20,7 +23,9 @@ class Assert3dSecureInfoIsPresent extends AbstractConstraint
      */
     public function processAssert(SalesOrderView $salesOrderView, array $paymentInformation)
     {
-        $actualPaymentInformation = $salesOrderView->getBraintreeInfoBlock()->getPaymentInfo();
+        /** @var \Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info $infoTab */
+        $infoTab = $salesOrderView->getOrderForm()->openTab('info')->getTab('info');
+        $actualPaymentInformation = $infoTab->getPaymentInfoBlock()->getData();
         foreach ($paymentInformation as $key => $value) {
             \PHPUnit_Framework_Assert::assertArrayHasKey(
                 $key,
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/Fixture/CreditCardBraintree.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/Fixture/CreditCardBraintree.xml
deleted file mode 100644
index e9baa301509ce6212e0374dd26c8442157cb6cbf..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/Fixture/CreditCardBraintree.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd">
-    <fixture name="credit_card_braintree"
-             module="Magento_Braintree"
-             type="virtual"
-             entity_type="credit_card_braintree"
-             repository_class="Magento\Braintree\Test\Repository\CreditCard"
-             class="Magento\Braintree\Test\Fixture\CreditCardBraintree">
-        <field name="credit_card_number" />
-        <field name="credit_card_exp_month" />
-        <field name="credit_card_exp_year" />
-        <field name="cvv" />
-    </fixture>
-</config>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/Page/Adminhtml/SalesOrderView.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/Page/Adminhtml/SalesOrderView.xml
deleted file mode 100644
index be96e88c35f81a40cc384d4fb137effe58261e53..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/Page/Adminhtml/SalesOrderView.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright © 2016 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="SalesOrderView" area="Adminhtml" mca="sales/order/view" module="Magento_Sales">
-        <block name="BraintreeInfoBlock" class="Magento\Braintree\Test\Block\Info" locator="//div[contains(@class, 'admin__page-section-item order-payment-method')]" strategy="xpath"/>
-    </page>
-</config>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/CreditCard.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/CreditCard.xml
index 6aa9383ff2bd1051364b1498d799ebb681714aca..e780ece1ab971ef3edeb89fed253db6b1cd93a8c 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/CreditCard.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/CreditCard.xml
@@ -6,33 +6,29 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/Magento/Mtf/Repository/etc/repository.xsd">
-    <repository class="Magento\Braintree\Test\Repository\CreditCard">
-        <dataset name="visa_braintree">
-            <field name="credit_card_number" xsi:type="string">4111111111111111</field>
-            <field name="credit_card_exp_month" xsi:type="string">01</field>
-            <field name="credit_card_exp_year" xsi:type="string">2020</field>
-            <field name="cvv" xsi:type="string">123</field>
-        </dataset>
-
+    <repository class="Magento\Payment\Test\Repository\CreditCard">
         <dataset name="visa_braintree_3dsecure">
-            <field name="credit_card_number" xsi:type="string">4000000000000002</field>
-            <field name="credit_card_exp_month" xsi:type="string">01</field>
-            <field name="credit_card_exp_year" xsi:type="string">20</field>
-            <field name="cvv" xsi:type="string">123</field>
+            <field name="payment_code" xsi:type="string">braintree</field>
+            <field name="cc_number" xsi:type="string">4000000000000002</field>
+            <field name="cc_exp_month" xsi:type="string">01</field>
+            <field name="cc_exp_year" xsi:type="string">20</field>
+            <field name="cc_cid" xsi:type="string">123</field>
         </dataset>
 
         <dataset name="visa_braintree_3dsecure_failed">
-            <field name="credit_card_number" xsi:type="string">4000000000000028</field>
-            <field name="credit_card_exp_month" xsi:type="string">01</field>
-            <field name="credit_card_exp_year" xsi:type="string">2020</field>
-            <field name="cvv" xsi:type="string">123</field>
+            <field name="payment_code" xsi:type="string">braintree</field>
+            <field name="cc_number" xsi:type="string">4000000000000028</field>
+            <field name="cc_exp_month" xsi:type="string">01</field>
+            <field name="cc_exp_year" xsi:type="string">2020</field>
+            <field name="cc_cid" xsi:type="string">123</field>
         </dataset>
 
         <dataset name="visa_braintree_fraud_rejected">
-            <field name="credit_card_number" xsi:type="string">4000111111111511</field>
-            <field name="credit_card_exp_month" xsi:type="string">01</field>
-            <field name="credit_card_exp_year" xsi:type="string">2020</field>
-            <field name="cvv" xsi:type="string">123</field>
+            <field name="payment_code" xsi:type="string">braintree</field>
+            <field name="cc_number" xsi:type="string">4000111111111511</field>
+            <field name="cc_exp_month" xsi:type="string">01</field>
+            <field name="cc_exp_year" xsi:type="string">2020</field>
+            <field name="cc_cid" xsi:type="string">123</field>
         </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/BraintreeSettlementReportTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/BraintreeSettlementReportTest.xml
index e80f6071ae5d1d33b37bb7c26c7389ed08aa8962..dba818e57659d86757a11c213c70e314ead2b0c7 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/BraintreeSettlementReportTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/BraintreeSettlementReportTest.xml
@@ -18,8 +18,8 @@
                 <item name="grandTotal" xsi:type="string">15.00</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="configData" xsi:type="string">braintree</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="tag" xsi:type="string">test_type:extended_acceptance_test, test_type:3rd_party_test, severity:S1</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOnlineCreditMemoBraintreePaypalTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOnlineCreditMemoBraintreePaypalTest.xml
index 53847e55fd9f91e29fbeeb6c71a0402a1fb6a6f6..2f14871eda96e102a51ed4ceefd4578af49967b8 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOnlineCreditMemoBraintreePaypalTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOnlineCreditMemoBraintreePaypalTest.xml
@@ -14,7 +14,7 @@
             <data name="checkoutMethod" xsi:type="string">login</data>
             <data name="taxRule" xsi:type="string">us_ca_ny_rule</data>
             <data name="refundedPrices" xsi:type="array">
-                <item name="0" xsi:type="string">139.9</item>
+                <item name="0" xsi:type="string">139.90</item>
             </data>
             <data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
             <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
@@ -34,7 +34,7 @@
             <data name="checkoutMethod" xsi:type="string">login</data>
             <data name="taxRule" xsi:type="string">us_ca_ny_rule</data>
             <data name="refundedPrices" xsi:type="array">
-                <item name="0" xsi:type="string">621.2</item>
+                <item name="0" xsi:type="string">621.20</item>
             </data>
             <data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
             <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOnlineInvoiceEntityTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOnlineInvoiceEntityTest.xml
index d9f382e4b650e5ce48955e264c67b36c893dbb84..da73da001338ade7fdd655609ff4b04d0f8602db 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOnlineInvoiceEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOnlineInvoiceEntityTest.xml
@@ -18,11 +18,11 @@
             <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="capturedPrices" xsi:type="array">
-                <item name="0" xsi:type="string">139.9</item>
+                <item name="0" xsi:type="string">139.90</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="configData" xsi:type="string">braintree</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="orderButtonsAvailable" xsi:type="string">Back, Send Email, Credit Memo, Hold, Ship, Reorder</data>
@@ -50,8 +50,8 @@
                 <item name="1" xsi:type="string">118.25</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="configData" xsi:type="string">braintree</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="orderButtonsAvailable" xsi:type="string">Back, Send Email, Credit Memo, Hold, Ship, Reorder</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml
index 083bd33feca7b133903b9f83eb12c4d5b3f1fcfa..7e010fc4d1f0d31a9e735386ab36a47a5828d6da 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml
@@ -22,8 +22,8 @@
                 <item name="grandTotal" xsi:type="string">145.98</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="configData" xsi:type="string">braintree</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="orderButtonsAvailable" xsi:type="string">Back, Cancel, Send Email, Hold, Invoice, Ship, Reorder, Edit</data>
@@ -52,8 +52,8 @@
                 <item name="0" xsi:type="string">145.98</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="configData" xsi:type="string">braintree, braintree_sale</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="orderButtonsAvailable" xsi:type="string">Back, Send Email, Hold, Ship, Reorder</data>
@@ -79,7 +79,6 @@
                 <item name="grandTotal" xsi:type="string">145.98</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree_fraud_rejected</data>
             <data name="configData" xsi:type="string">braintree</data>
             <data name="status" xsi:type="string">Processing</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateVaultOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateVaultOrderBackendTest.xml
index c9b26df050cfc9cf9ef4913a4f538459cee1923f..123a453a921d648fa3a5e2d579904d3373c5e1db 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateVaultOrderBackendTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateVaultOrderBackendTest.xml
@@ -20,8 +20,8 @@
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
             <data name="vault/method" xsi:type="string">braintree_cc_vault</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="creditCardSave" xsi:type="string">Yes</data>
             <data name="configData" xsi:type="string">braintree, braintree_use_vault</data>
             <data name="status" xsi:type="string">Processing</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/InvoicePaypalBraintreeTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/InvoicePaypalBraintreeTest.xml
index 352e0ed684919a43df66b429d5b8250d90cae351..23985d208e5a675b997d330e792eb58f1045d7d9 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/InvoicePaypalBraintreeTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/InvoicePaypalBraintreeTest.xml
@@ -15,10 +15,10 @@
             <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">139.9</item>
+                <item name="grandTotal" xsi:type="string">139.90</item>
             </data>
             <data name="capturedPrices" xsi:type="array">
-                <item name="0" xsi:type="string">139.9</item>
+                <item name="0" xsi:type="string">139.90</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree_paypal</data>
             <data name="configData" xsi:type="string">braintree, braintree_paypal, braintree_paypal_skip_order_review</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutAcceptPaymentTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutAcceptPaymentTest.xml
index 841145d7a5fdfaa92f1a82ac00c9bf51f0601643..1b9540c443650216b2288dedab699f292f20aa77 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutAcceptPaymentTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutAcceptPaymentTest.xml
@@ -17,8 +17,8 @@
             <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="configData" xsi:type="string">braintree,braintree_fraudprotection</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S2</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDeclinedTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDeclinedTest.xml
index 4a2aa551a18170002045f821de2d492ddb7a2082..510d27d324f928e46571708ea457256be5ad93a8 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDeclinedTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDeclinedTest.xml
@@ -15,7 +15,6 @@
             <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree_fraud_rejected</data>
             <data name="expectedErrorMessage" xsi:type="string">Transaction has been declined. Please try again later.</data>
             <data name="configData" xsi:type="string">braintree_fraud_tool_enabled_account, braintree_fraudprotection</data>
@@ -31,8 +30,8 @@
             <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="expectedErrorMessage" xsi:type="string">Sorry, but something went wrong</data>
             <data name="configData" xsi:type="string">braintree, braintree_incorrect_merchant_account_id</data>
             <data name="status" xsi:type="string">Processing</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDenyPaymentTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDenyPaymentTest.xml
index 95d07079ef36c9ae66672ec8cc465325273ecda4..8d16fcc3fcae11aa51f45c426406d842804fe936 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDenyPaymentTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDenyPaymentTest.xml
@@ -17,8 +17,8 @@
             <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="configData" xsi:type="string">braintree,braintree_fraudprotection</data>
             <data name="status" xsi:type="string">Canceled</data>
             <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S2</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutTest.xml
index 54fdfc96dc947db330c37b701132bfc0e3fcbeb0..c99a855b236a5ee45f7eba8d604bd3c0db50bb7a 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutTest.xml
@@ -21,7 +21,6 @@
                 <item name="grandTotal" xsi:type="string">145.98</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree_3dsecure</data>
             <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">braintree, braintree_3d_secure_not_triggered_due_threshold</data>
@@ -45,7 +44,6 @@
                 <item name="grandTotal" xsi:type="string">145.98</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree_3dsecure</data>
             <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">braintree, braintree_3d_secure_uk</data>
@@ -69,8 +67,8 @@
                 <item name="grandTotal" xsi:type="string">145.98</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">braintree</data>
             <data name="status" xsi:type="string">Processing</data>
@@ -97,8 +95,8 @@
                 <item name="0" xsi:type="string">145.98</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">braintree, braintree_sale</data>
             <data name="status" xsi:type="string">Processing</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.xml
index 2a17d1496a72dfb1bb63073ccd982abf3522ca9f..12cde9b6233a96f0ff94396adf9e42e057af883b 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.xml
@@ -15,7 +15,6 @@
             <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree_3dsecure_failed</data>
             <data name="secure3d/dataset" xsi:type="string">secure3d_braintree</data>
             <data name="configData" xsi:type="string">braintree, braintree_3d_secure</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureTest.xml
index 295a9dcd5c5332dce7d6e5fad9dfcdc6f5352596..051700480fcb3f49f551190d557f210b3686e719 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureTest.xml
@@ -22,7 +22,6 @@
                 <item name="grandTotal" xsi:type="string">145.98</item>
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree_3dsecure</data>
             <data name="paymentInformation" xsi:type="array">
                 <item name="Liability Shifted" xsi:type="string">1</item>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWithDiscountTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWithDiscountTest.xml
index f8ffa51982f1fae4d34a6290e1bebce28ba85712..06299e2e5a10c3ea7658ff3e06c42861820edc13 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWithDiscountTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWithDiscountTest.xml
@@ -17,8 +17,8 @@
             <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="payment/method" xsi:type="string">braintree</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="prices" xsi:type="array">
                 <item name="grandTotal" xsi:type="string">10.00</item>
             </data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml
index 5f5e2f50594bf8d0473b65ee584e50f47bc852a4..1b7d248d537dc839ae258f3a1d16040d12f95fd1 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml
@@ -21,8 +21,8 @@
             <data name="payment/method" xsi:type="string">braintree</data>
             <data name="vault/method" xsi:type="string">braintree_cc_vault</data>
             <data name="isVaultPresent" xsi:type="boolean">false</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="configData" xsi:type="string">braintree, braintree_use_vault</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/UseVaultOnCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/UseVaultOnCheckoutTest.xml
index 35d55784b676236d808cf0f54fc969fc65193b0b..327a1f8eb2ca2b9db845f7c78a98db11feb047ef 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/UseVaultOnCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/UseVaultOnCheckoutTest.xml
@@ -17,8 +17,8 @@
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="payment/method" xsi:type="string">braintree</data>
             <data name="vault/method" xsi:type="string">braintree_cc_vault</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/data/payment_code" xsi:type="string">braintree</data>
             <data name="creditCardSave" xsi:type="string">Yes</data>
             <data name="configData" xsi:type="string">braintree, braintree_use_vault</data>
             <data name="status" xsi:type="string">Processing</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/UseVaultWith3dSecureOnCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/UseVaultWith3dSecureOnCheckoutTest.xml
index a5aa7645148e158ad62a174bc26d08abfd037192..8dd9239d38526622b5facb9ab71b1c9e3e1511b3 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/UseVaultWith3dSecureOnCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/UseVaultWith3dSecureOnCheckoutTest.xml
@@ -17,7 +17,6 @@
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="payment/method" xsi:type="string">braintree</data>
             <data name="vault/method" xsi:type="string">braintree_cc_vault</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree_3dsecure</data>
             <data name="paymentInformation" xsi:type="array">
                 <item name="Liability Shifted" xsi:type="string">1</item>
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/Cart/Item.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/Cart/Item.php
index cb46e728191bffb5a770a2809019fb2833f9f0d3..be3abf935c5a42557bea3b6feea86e4301b001f1 100644
--- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/Cart/Item.php
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/Cart/Item.php
@@ -6,9 +6,6 @@
 
 namespace Magento\Bundle\Test\Fixture\Cart;
 
-use Magento\Bundle\Test\Fixture\BundleProduct;
-use Magento\Mtf\Fixture\FixtureInterface;
-
 /**
  * Data for verify cart item block on checkout page.
  *
@@ -18,42 +15,32 @@ use Magento\Mtf\Fixture\FixtureInterface;
 class Item extends \Magento\Catalog\Test\Fixture\Cart\Item
 {
     /**
-     * @constructor
-     * @param FixtureInterface $product
+     * Return prepared dataset.
+     *
+     * @param null|string $key
+     * @return array
      */
-    public function __construct(FixtureInterface $product)
+    public function getData($key = null)
     {
-        parent::__construct($product);
-
-        /** @var BundleProduct $product */
-        $bundleSelection = $product->getBundleSelections();
-        $checkoutData = $product->getCheckoutData();
+        parent::getData($key);
+        $bundleSelection = $this->product->getBundleSelections();
+        $checkoutData = $this->product->getCheckoutData();
         $checkoutBundleOptions = isset($checkoutData['options']['bundle_options'])
             ? $checkoutData['options']['bundle_options']
             : [];
 
+        $productSku = [$this->product->getSku()];
         foreach ($checkoutBundleOptions as $checkoutOptionKey => $checkoutOption) {
-            // Find option and value keys
-            $attributeKey = null;
-            $optionKey = null;
-            foreach ($bundleSelection['bundle_options'] as $key => $option) {
-                if ($option['title'] == $checkoutOption['title']) {
-                    $attributeKey = $key;
-
-                    foreach ($option['assigned_products'] as $valueKey => $value) {
-                        if (false !== strpos($value['search_data']['name'], $checkoutOption['value']['name'])) {
-                            $optionKey = $valueKey;
-                        }
-                    }
-                }
-            }
-
+            $keys = $this->getKeys($bundleSelection['bundle_options'], $checkoutOption);
+            $attributeKey = $keys['attribute'];
+            $optionKey = $keys['option'];
             // Prepare option data
             $bundleSelectionAttribute = $bundleSelection['products'][$attributeKey];
             $bundleOptions = $bundleSelection['bundle_options'][$attributeKey];
             $value = $bundleSelectionAttribute[$optionKey]->getName();
+            $this->product->getSkuType() == 'No' ?: $productSku[] = $bundleSelectionAttribute[$optionKey]->getSku();
             $qty = $bundleOptions['assigned_products'][$optionKey]['data']['selection_qty'];
-            $price = $product->getPriceType() == 'Yes'
+            $price = $this->product->getPriceType() == 'Yes'
                 ? number_format($bundleSelectionAttribute[$optionKey]->getPrice(), 2)
                 : number_format($bundleOptions['assigned_products'][$optionKey]['data']['selection_price_value'], 2);
             $optionData = [
@@ -64,6 +51,47 @@ class Item extends \Magento\Catalog\Test\Fixture\Cart\Item
             $checkoutBundleOptions[$checkoutOptionKey] = $optionData;
         }
 
+        $this->data['sku'] = implode('-', $productSku);
         $this->data['options'] += $checkoutBundleOptions;
+
+        return $this->data;
+    }
+
+    /**
+     * Get option key.
+     *
+     * @param array $assignedProducts
+     * @param string $checkoutOption
+     * @return null|string
+     */
+    private function getOptionKey(array $assignedProducts, $checkoutOption)
+    {
+        foreach ($assignedProducts as $key => $value) {
+            if (false !== strpos($value['search_data']['name'], $checkoutOption)) {
+                return $key;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Find option and attribute keys.
+     *
+     * @param array $bundleOptions
+     * @param string $checkoutOption
+     * @return array
+     */
+    private function getKeys(array $bundleOptions, $checkoutOption)
+    {
+        $keys = [];
+        foreach ($bundleOptions as $key => $option) {
+            if ($option['title'] == $checkoutOption['title']) {
+                $keys['attribute'] = $key;
+                $keys['option'] = $this->getOptionKey($option['assigned_products'], $checkoutOption['value']['name']);
+            }
+        }
+
+        return $keys;
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/CustomAttribute.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/CustomAttribute.php
index 53fe49b759c64ec85b5eb8fedd8bae8aa7627757..3c324de0cabab5d35abf23d4d9ae354675bfdbe6 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/CustomAttribute.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/CustomAttribute.php
@@ -102,7 +102,7 @@ class CustomAttribute extends SimpleElement
     {
         $element = null;
         foreach (array_keys($this->classReferences) as $key) {
-            if (strpos($class, $key) !== false) {
+            if ($class == $key) {
                 return $this->classReferences[$class];
             }
         }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTierPriceInCart.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTierPriceInCart.php
index 1bc689d8e1b1e3009bbf2f3fc563b3aa51ccc3c7..f8266026b3927798fa2a04128deb65a70254188e 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTierPriceInCart.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTierPriceInCart.php
@@ -110,7 +110,7 @@ class AssertProductTierPriceInCart extends AbstractConstraint
     {
         $tierPrice = $product->getDataFieldConfig('tier_price')['source']->getData()[0];
 
-        if ($tierPrice['value_type'] === "Percent") {
+        if ($tierPrice['value_type'] === "Discount") {
             $this->fixtureActualPrice = $this->fixturePrice * (1 - $tierPrice['percentage_value'] / 100);
         } else {
             $this->fixtureActualPrice = $tierPrice['price'];
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/Cart/Item.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/Cart/Item.php
index c7dbba386958a30f19ec9001add2566da76a7b7f..fb0ecca863582cd50f619320f62d0b4ffc1f1a58 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/Cart/Item.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/Cart/Item.php
@@ -8,7 +8,6 @@ namespace Magento\Catalog\Test\Fixture\Cart;
 
 use Magento\Mtf\Fixture\DataSource;
 use Magento\Mtf\Fixture\FixtureInterface;
-use Magento\Catalog\Test\Fixture\CatalogProductSimple;
 
 /**
  * Data for verify cart item block on checkout page.
@@ -21,15 +20,31 @@ use Magento\Catalog\Test\Fixture\CatalogProductSimple;
 class Item extends DataSource
 {
     /**
-     * @constructor
+     * Product fixture.
+     *
+     * @var FixtureInterface
+     */
+    protected $product;
+
+    /**
      * @param FixtureInterface $product
      */
     public function __construct(FixtureInterface $product)
     {
-        /** @var CatalogProductSimple $product */
-        $checkoutData = $product->getCheckoutData();
+        $this->product = $product;
+    }
+
+    /**
+     * Return prepared dataset.
+     *
+     * @param null|string $key
+     * @return array
+     */
+    public function getData($key = null)
+    {
+        $checkoutData = $this->product->getCheckoutData();
         $cartItem = isset($checkoutData['cartItem']) ? $checkoutData['cartItem'] : [];
-        $customOptions = $product->hasData('custom_options') ? $product->getCustomOptions() : [];
+        $customOptions = $this->product->hasData('custom_options') ? $this->product->getCustomOptions() : [];
         $checkoutCustomOptions = isset($checkoutData['options']['custom_options'])
             ? $checkoutData['options']['custom_options']
             : [];
@@ -52,9 +67,12 @@ class Item extends DataSource
             ? $cartItem['options'] + $checkoutCustomOptions
             : $checkoutCustomOptions;
         $cartItem['qty'] = isset($checkoutData['qty'])
-                ? $checkoutData['qty']
-                : 1;
-
+            ? $checkoutData['qty']
+            : 1;
+        $cartItem['sku'] = $this->product->getSku();
+        $cartItem['name'] = $this->product->getName();
         $this->data = $cartItem;
+
+        return parent::getData($key);
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/Category.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/Category.xml
index 2fd8c04d1d80dfe643616ee7c550699da91aeece..dc5e9c12ebcaebc1e49c8394f4d4308a11762309 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/Category.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/Category.xml
@@ -72,5 +72,18 @@
             <field name="is_active" xsi:type="string">Yes</field>
             <field name="include_in_menu" xsi:type="string">Yes</field>
         </dataset>
+
+        <dataset name="default_subcategory_with_assigned_simple_product">
+            <field name="name" xsi:type="string">Category%isolation%</field>
+            <field name="url_key" xsi:type="string">category%isolation%</field>
+            <field name="is_active" xsi:type="string">Yes</field>
+            <field name="include_in_menu" xsi:type="string">Yes</field>
+            <field name="parent_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">default_category</item>
+            </field>
+            <field name="category_products" xsi:type="array">
+                <item name="dataset" xsi:type="string">catalogProductSimple::default</item>
+            </field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/Product/TierPrice.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/Product/TierPrice.xml
index 2f517f4d6cf3cc03020abc575d4e91cd7f7188da..9581427d16ec6f9e597e420dcee0329c2dddee32 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/Product/TierPrice.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/Product/TierPrice.xml
@@ -92,7 +92,7 @@
 
         <dataset name="custom_with_percentage_discount">
             <field name="0" xsi:type="array">
-                <item name="value_type" xsi:type="string">Percent</item>
+                <item name="value_type" xsi:type="string">Discount</item>
                 <item name="percentage_value" xsi:type="string">3</item>
                 <item name="website" xsi:type="string">All Websites [USD]</item>
                 <item name="price_qty" xsi:type="string">10</item>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/di.xml
index 82a7c263b1ca9671d8b125ac6a3f07e6324fa072..fee6efedff2e281742738d02cfdf36a644203b4e 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/di.xml
@@ -167,7 +167,7 @@
                     <item name="selector" xsi:type="string">[name="product[%code%]"]</item>
                     <item name="type" xsi:type="string">null</item>
                 </item>
-                <item name="hasDatepicker" xsi:type="array">
+                <item name="admin__control-text _has-datepicker" xsi:type="array">
                     <item name="selector" xsi:type="string">[name="product[%code%]"]</item>
                     <item name="type" xsi:type="string">datepicker</item>
                 </item>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Payment.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Payment.php
index ce8f5a4cbfd99b41e990a11fc89527f28b0fec5f..31002bd8129c4f39d6a2ffd670f70af7fcf48da2 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Payment.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Payment.php
@@ -7,7 +7,7 @@
 namespace Magento\Checkout\Test\Block\Onepage;
 
 use Magento\Mtf\Block\Block;
-use Magento\Mtf\Fixture\InjectableFixture;
+use Magento\Payment\Test\Fixture\CreditCard;
 
 /**
  * Checkout payment block.
@@ -47,7 +47,7 @@ class Payment extends Block
      *
      * @var string
      */
-    protected $placeOrder = '.action.primary.checkout';
+    protected $placeOrder = '.payment-method._active .action.primary.checkout';
     
     /**
      * Wait element.
@@ -74,14 +74,19 @@ class Payment extends Block
      * Select payment method.
      *
      * @param array $payment
-     * @param InjectableFixture|null $creditCard
+     * @param CreditCard|null $creditCard
+     * @param bool $fillCreditCardOn3rdParty
      * @throws \Exception
      * @return void
      */
-    public function selectPaymentMethod(array $payment, InjectableFixture $creditCard = null)
-    {
-        $paymentSelector = sprintf($this->paymentMethodInput, $payment['method']);
-        $paymentLabelSelector = sprintf($this->paymentMethodLabel, $payment['method']);
+    public function selectPaymentMethod(
+        array $payment,
+        CreditCard $creditCard = null,
+        $fillCreditCardOn3rdParty = false
+    ) {
+        $paymentMethod = $payment['method'];
+        $paymentSelector = sprintf($this->paymentMethodInput, $paymentMethod);
+        $paymentLabelSelector = sprintf($this->paymentMethodLabel, $paymentMethod);
 
         try {
             $this->waitForElementNotVisible($this->waitElement);
@@ -100,16 +105,15 @@ class Payment extends Block
             $paymentRadioButton->click();
         }
 
-        if ($payment['method'] == "purchaseorder") {
+        if ($paymentMethod == "purchaseorder") {
             $this->_rootElement->find($this->purchaseOrderNumber)->setValue($payment['po_number']);
         }
-        if ($creditCard !== null) {
-            $class = explode('\\', get_class($creditCard));
-            $module = $class[1];
-            /** @var \Magento\Payment\Test\Block\Form\Cc $formBlock */
+        if ($creditCard !== null && $fillCreditCardOn3rdParty === false) {
+            $module = $creditCard->hasData('payment_code') ? ucfirst($creditCard->getPaymentCode()) : 'Payment';
+            /** @var \Magento\Payment\Test\Block\Form\PaymentCc $formBlock */
             $formBlock = $this->blockFactory->create(
-                "\\Magento\\{$module}\\Test\\Block\\Form\\Cc",
-                ['element' => $this->_rootElement->find('#payment_form_' . $payment['method'])]
+                "\\Magento\\{$module}\\Test\\Block\\Form\\{$module}Cc",
+                ['element' => $this->_rootElement->find('#payment_form_' . $paymentMethod)]
             );
             $formBlock->fill($creditCard);
         }
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/AddressModal.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/AddressModal.php
index 8a949c474bc847942f1bd5922d00514cd6133d08..43bd771f609cd86fddcfb99c21ac05687bfe06a9 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/AddressModal.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/AddressModal.php
@@ -65,4 +65,20 @@ class AddressModal extends Form
 
         return $result;
     }
+
+    /**
+     * Fixture mapping.
+     *
+     * @param array|null $fields
+     * @param string|null $parent
+     * @return array
+     */
+    protected function dataMapping(array $fields = null, $parent = null)
+    {
+        if (isset($fields['custom_attribute'])) {
+            $this->placeholders = ['attribute_code' => $fields['custom_attribute']['code']];
+            $this->applyPlaceholders();
+        }
+        return parent::dataMapping($fields, $parent);
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/AddressModal.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/AddressModal.xml
index 13403b792684512c9741bca74a78f7c84036eb48..4a6160698839382c83809824913ebcf3770a0f7f 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/AddressModal.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/AddressModal.xml
@@ -22,5 +22,8 @@
         </country_id>
         <telephone />
         <postcode />
+        <custom_attribute>
+            <selector>[name="custom_attributes[%attribute_code%]"]</selector>
+        </custom_attribute>
     </fields>
 </mapping>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Fixture/Cart.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/Fixture/Cart.xml
index 04b191b2b65834a0786510a61fd4c3170530476b..5286881980704c62438816aa23155f092a6eb56c 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Fixture/Cart.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Fixture/Cart.xml
@@ -10,7 +10,6 @@
              module="Magento_Checkout"
              type="flat"
              entity_type="quote"
-             repository_class="Magento\Checkout\Test\Repository\Cart"
              handler_interface="Magento\Checkout\Test\Handler\Cart\CartInterface"
              class="Magento\Checkout\Test\Fixture\Cart">
         <field name="entity_id" is_required="1" />
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.php
index 0733d778b9662dba9c857eff90b213b4da77e4c3..e41af50cca9f624c489dd8af497d601f0d41a426 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.php
@@ -30,6 +30,7 @@ class AddProductsToShoppingCartEntityTest extends Injectable
 {
     /* tags */
     const MVP = 'yes';
+    const SEVERITY = 'S0';
     /* end tags */
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.xml
index 9a539d856e7082ae5131e903d7d86eec5f37d6c5..cac5e0a9c2182a05e8925a375396b7fe6f610a99 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.xml
@@ -8,7 +8,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\AddProductsToShoppingCartEntityTest" summary="Add Products to Shopping Cart" ticketId="MAGETWO-25382">
         <variation name="AddProductsToShoppingCartEntityTestVariation1">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">to_maintain:yes, severity:S2</data>
             <data name="productsData/0" xsi:type="string">bundleProduct::bundle_dynamic_product</data>
             <data name="cart/data/grand_total" xsi:type="string">210</data>
             <data name="cart/data/subtotal" xsi:type="string">200</data>
@@ -21,7 +21,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertSubtotalInMiniShoppingCart" />
         </variation>
         <variation name="AddProductsToShoppingCartEntityTestVariation2">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">to_maintain:yes, severity:S2</data>
             <data name="productsData/0" xsi:type="string">bundleProduct::bundle_fixed_product</data>
             <data name="cart/data/grand_total" xsi:type="string">761</data>
             <data name="cart/data/subtotal" xsi:type="string">756</data>
@@ -34,7 +34,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertSubtotalInMiniShoppingCart" />
         </variation>
         <variation name="AddProductsToShoppingCartEntityTestVariation3">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">to_maintain:yes, severity:S0</data>
             <data name="productsData/0" xsi:type="string">catalogProductSimple::with_two_custom_option</data>
             <data name="cart/data/grand_total" xsi:type="string">345</data>
             <data name="cart/data/subtotal" xsi:type="string">340</data>
@@ -47,7 +47,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertSubtotalInMiniShoppingCart" />
         </variation>
         <variation name="AddProductsToShoppingCartEntityTestVariation4">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">to_maintain:yes, severity:S1</data>
             <data name="productsData/0" xsi:type="string">catalogProductVirtual::product_50_dollar</data>
             <data name="cart/data/grand_total" xsi:type="string">50</data>
             <data name="cart/data/subtotal" xsi:type="string">50</data>
@@ -60,7 +60,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertSubtotalInMiniShoppingCart" />
         </variation>
         <variation name="AddProductsToShoppingCartEntityTestVariation5">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">to_maintain:yes, severity:S0</data>
             <data name="productsData/0" xsi:type="string">configurableProduct::default</data>
             <data name="cart/data/grand_total" xsi:type="string">135</data>
             <data name="cart/data/subtotal" xsi:type="string">120</data>
@@ -73,6 +73,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertSubtotalInMiniShoppingCart" />
         </variation>
         <variation name="AddProductsToShoppingCartEntityTestVariation6">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="productsData/0" xsi:type="string">downloadableProduct::with_two_separately_links</data>
             <data name="cart/data/grand_total" xsi:type="string">22.43</data>
             <data name="cart/data/subtotal" xsi:type="string">22.43</data>
@@ -85,7 +86,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertSubtotalInMiniShoppingCart" />
         </variation>
         <variation name="AddProductsToShoppingCartEntityTestVariation7">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">to_maintain:yes, severity:S2</data>
             <data name="productsData/0" xsi:type="string">groupedProduct::three_simple_products</data>
             <data name="cart/data/grand_total" xsi:type="string">1950</data>
             <data name="cart/data/subtotal" xsi:type="string">1920</data>
@@ -98,7 +99,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertSubtotalInMiniShoppingCart" />
         </variation>
         <variation name="AddProductsToShoppingCartEntityTestVariation8">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">to_maintain:yes, severity:S0</data>
             <data name="productsData/0" xsi:type="string">catalogProductSimple::with_two_custom_option</data>
             <data name="productsData/1" xsi:type="string">catalogProductVirtual::product_50_dollar</data>
             <data name="productsData/2" xsi:type="string">downloadableProduct::with_two_separately_links</data>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductFromMiniShoppingCartTest.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductFromMiniShoppingCartTest.php
index f2a809656ed65449fc63d5405b3449f8587005c5..d19ad5497b5dc6009d6e825571dd2f0ab8d67df4 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductFromMiniShoppingCartTest.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductFromMiniShoppingCartTest.php
@@ -32,6 +32,7 @@ class DeleteProductFromMiniShoppingCartTest extends Injectable
 {
     /* tags */
     const MVP = 'yes';
+    const SEVERITY = 'S0';
     /* end tags */
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
index 10f1245c2e4fbf20764519641b443e978bc04bf6..47387bb32ca9ebc857cf5df0d4c9129c8f459742 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductFromMiniShoppingCartTest.xml
@@ -8,6 +8,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\DeleteProductFromMiniShoppingCartTest" summary="Delete Product from Mini Shopping Cart" ticketId="MAGETWO-29104">
         <variation name="DeleteProductFromMiniShoppingCartTestVariation1">
+            <data name="tag" xsi:type="string">severity:S0</data>
             <data name="description" xsi:type="string">delete Simple</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="products/1" xsi:type="string">catalogProductVirtual::default</data>
@@ -16,6 +17,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertProductPresentInMiniShoppingCart" />
         </variation>
         <variation name="DeleteProductFromMiniShoppingCartTestVariation2">
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="description" xsi:type="string">delete Simple</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="deletedProductIndex" xsi:type="string">0</data>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductsFromShoppingCartTest.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductsFromShoppingCartTest.php
index ae48e6e6b79487571539aa28567f7dd930b57237..877fd28593cfb060a0b1ac1e2d33bc3d42a425f7 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductsFromShoppingCartTest.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductsFromShoppingCartTest.php
@@ -30,6 +30,7 @@ class DeleteProductsFromShoppingCartTest extends Injectable
 {
     /* tags */
     const MVP = 'yes';
+    const SEVERITY = 'S1';
     /* end tags */
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductsFromShoppingCartTest.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductsFromShoppingCartTest.xml
index 033ea76a2a5ff17c5233d7f1b543f6b72f013c61..2af59cbaac6a49bd64706d52477e9b481a28e976 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductsFromShoppingCartTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/DeleteProductsFromShoppingCartTest.xml
@@ -8,36 +8,42 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Checkout\Test\TestCase\DeleteProductsFromShoppingCartTest" summary="Delete Products from Shopping Cart" ticketId="MAGETWO-25218">
         <variation name="DeleteProductsFromShoppingCartTestVariation1">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="productsData/0" xsi:type="string">bundleProduct::bundle_dynamic_product</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
         </variation>
         <variation name="DeleteProductsFromShoppingCartTestVariation2">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="productsData/0" xsi:type="string">bundleProduct::bundle_fixed_product</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
         </variation>
         <variation name="DeleteProductsFromShoppingCartTestVariation3">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">to_maintain:yes, severity:S1</data>
             <data name="productsData/0" xsi:type="string">catalogProductSimple::with_two_custom_option</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
         </variation>
         <variation name="DeleteProductsFromShoppingCartTestVariation4">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="productsData/0" xsi:type="string">catalogProductVirtual::product_50_dollar</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
         </variation>
         <variation name="DeleteProductsFromShoppingCartTestVariation5">
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="productsData/0" xsi:type="string">configurableProduct::default</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
         </variation>
         <variation name="DeleteProductsFromShoppingCartTestVariation6">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="productsData/0" xsi:type="string">downloadableProduct::with_two_separately_links</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
         </variation>
         <variation name="DeleteProductsFromShoppingCartTestVariation7">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="productsData/0" xsi:type="string">groupedProduct::three_simple_products</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty" />
         </variation>
         <variation name="DeleteProductsFromShoppingCartTestVariation8">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">to_maintain:yes, severity:S1</data>
             <data name="productsData/0" xsi:type="string">catalogProductSimple::with_two_custom_option</data>
             <data name="productsData/1" xsi:type="string">catalogProductVirtual::product_50_dollar</data>
             <data name="productsData/2" xsi:type="string">downloadableProduct::with_two_separately_links</data>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutJsValidationTest.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutJsValidationTest.php
index 5361ee6e3c127bafc03e53cd717ac067688f826a..a3ba73a1caf41c3d5ab2220feeab58ff3bc510df 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutJsValidationTest.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutJsValidationTest.php
@@ -21,6 +21,10 @@ use Magento\Mtf\TestCase\Scenario;
  */
 class OnePageCheckoutJsValidationTest extends Scenario
 {
+    /* tags */
+    const SEVERITY = 'S2';
+    /* end tags */
+
     /**
      * Runs one page checkout js validation test.
      *
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutJsValidationTest.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutJsValidationTest.xml
index e930ff29882ceed4e8f99947a6a6ef4b4acc1c7a..f8f9b93661aa1b914e6fd4000cd0ece8f7dac302 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutJsValidationTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutJsValidationTest.xml
@@ -8,6 +8,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\OnePageCheckoutJsValidationTest" summary="JS validation verification for Checkout flow" ticketId="MAGETWO-59697">
         <variation name="OnePageCheckoutJsValidationTestVariation1" summary="JS validation is not applied for empty required checkout fields if customer did not fill them">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="checkoutMethod" xsi:type="string">guest</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertShippingAddressJsValidationMessagesIsAbsent" />
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
index 25922102e1269c95280697db6c3175c36d6253fc..63454c8137975a4a64ee36e20ac596c5fcbc4f7d 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutTest.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutTest.php
@@ -41,6 +41,7 @@ class OnePageCheckoutTest extends Scenario
     /* tags */
     const MVP = 'yes';
     const TEST_TYPE = 'acceptance_test, extended_acceptance_test, 3rd_party_test';
+    const SEVERITY = 'S0';
     /* end tags */
 
     /**
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 14d8ecccd1dc34e5dbde389f2c74ff15fcca6c20..1b6f78148a129a1bd575fe12a91b99e7cbde87aa 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
@@ -8,6 +8,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" summary="OnePageCheckout within Offline Payment Methods" ticketId="MAGETWO-27485">
         <variation name="OnePageCheckoutUsingLoginPopup" summary="Customer is redirected to checkout on login if guest is disabled, flow for existed Customer" ticketId="MAGETWO-49916">
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="customer/dataset" xsi:type="string">johndoe_with_addresses</data>
             <data name="checkoutMethod" xsi:type="string">login</data>
@@ -21,6 +22,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
         </variation>
         <variation name="OnePageCheckoutUsingRegisterLink" summary="Customer is redirected to checkout on login if guest is disabled, flow with registration new Customer" ticketId="MAGETWO-49917">
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="issue" xsi:type="string">MAGETWO-59816: Redirect works improperly in a browser incognito mode</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="customer/dataset" xsi:type="string">register_customer</data>
@@ -36,6 +38,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
         </variation>
         <variation name="OnePageCheckoutTestVariation1" summary="Checkout as UK guest with virtual product and downloadable product using coupon for not logged in customers">
+            <data name="tag" xsi:type="string">severity:S0</data>
             <data name="products/0" xsi:type="string">catalogProductVirtual::default</data>
             <data name="products/1" xsi:type="string">downloadableProduct::with_two_separately_links</data>
             <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups</data>
@@ -55,7 +58,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
         </variation>
         <variation name="OnePageCheckoutTestVariation2" summary="US customer during checkout using coupon for all customer groups">
-            <data name="tag" xsi:type="string">stable:no</data>
+            <data name="tag" xsi:type="string">stable:no, severity:S0</data>
             <data name="products/0" 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>
@@ -77,7 +80,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
         </variation>
         <variation name="OnePageCheckoutTestVariation3" summary="Checkout as UK guest with simple product" ticketId="MAGETWO-42603">
-            <data name="tag" xsi:type="string">stable:no</data>
+            <data name="tag" xsi:type="string">stable:no, severity:S1</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="customer/dataset" xsi:type="string">default</data>
             <data name="checkoutMethod" xsi:type="string">guest</data>
@@ -98,7 +101,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
         </variation>
         <variation name="OnePageCheckoutTestVariation4" summary="One Page Checkout Products with Special Prices" ticketId="MAGETWO-12429">
-            <data name="tag" xsi:type="string">test_type:acceptance_test, test_type:extended_acceptance_test</data>
+            <data name="tag" xsi:type="string">test_type:acceptance_test, test_type:extended_acceptance_test, severity:S0</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::product_with_special_price</data>
             <data name="products/1" xsi:type="string">configurableProduct::product_with_special_price</data>
             <data name="customer/dataset" xsi:type="string">default</data>
@@ -120,7 +123,7 @@
             <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="tag" xsi:type="string">test_type:acceptance_test, test_type:extended_acceptance_test, stable:no</data>
+            <data name="tag" xsi:type="string">test_type:acceptance_test, test_type:extended_acceptance_test, stable:no, severity:S0</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
             <data name="products/1" xsi:type="string">configurableProduct::with_one_option</data>
             <data name="products/2" xsi:type="string">bundleProduct::bundle_fixed_100_dollar_product</data>
@@ -144,6 +147,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
         </variation>
         <variation name="OnePageCheckoutTestVariation6" summary="Checkout as UK guest with virtual product using coupon for not logged in customers with Zero Subtotal Checkout payment method">
+            <data name="tag" xsi:type="string">severity:S0</data>
             <data name="products/0" xsi:type="string">catalogProductVirtual::product_50_dollar</data>
             <data name="salesRule" xsi:type="string">active_sales_rule_with_fixed_price_discount_coupon</data>
             <data name="customer/dataset" xsi:type="string">default</data>
@@ -163,6 +167,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
         </variation>
         <variation name="OnePageCheckoutTestVariation7" summary="Checkout as UK guest with condition available product qty = ordered product qty">
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::product_with_qty_25</data>
             <data name="checkoutMethod" xsi:type="string">guest</data>
             <data name="shippingAddress/dataset" xsi:type="string">UK_address</data>
@@ -182,6 +187,7 @@
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductsOutOfStock" />
         </variation>
         <variation name="OnePageCheckoutTestVariation8" summary="Checkout as UK customer with different shipping/billing address and register checkout method">
+            <data name="tag" xsi:type="string">severity:S0</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="customer/dataset" xsi:type="string">default</data>
             <data name="checkoutMethod" xsi:type="string">register</data>
@@ -197,7 +203,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
         </variation>
         <variation name="OnePageCheckoutTestVariation9" summary="One Page Checkout Products with different shipping/billing address and Tier Prices" ticketId="MAGETWO-42604">
-            <data name="tag" xsi:type="string">stable:no</data>
+            <data name="tag" xsi:type="string">stable:no, severity:S1</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::simple_with_tier_price_and_order_qty_3</data>
             <data name="customer/dataset" xsi:type="string">default</data>
             <data name="checkoutMethod" xsi:type="string">login</data>
@@ -216,7 +222,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
         </variation>
         <variation name="OnePageCheckoutTestVariation10" summary="One Page Checkout with all product types">
-            <data name="tag" xsi:type="string">stable:no</data>
+            <data name="tag" xsi:type="string">stable:no, severity:S0</data>
             <data name="products/0" xsi:type="string">catalogProductVirtual::default</data>
             <data name="products/1" xsi:type="string">downloadableProduct::with_two_separately_links</data>
             <data name="products/2" xsi:type="string">configurableProduct::with_one_option</data>
@@ -237,6 +243,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
         </variation>
         <variation name="OnePageCheckoutUsingSingInLink" summary="Login during checkout using 'Sign In' link" ticketId="MAGETWO-42547">
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="customer/dataset" xsi:type="string">customer_UK_US_addresses</data>
             <data name="checkoutMethod" xsi:type="string">sign_in</data>
@@ -257,6 +264,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderAddresses" />
         </variation>
         <variation name="OnePageCheckoutUsingNonDefaultAddress" summary="Checkout as Customer using non default address" ticketId="MAGETWO-42602">
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="customer/dataset" xsi:type="string">customer_US_DE_UK</data>
             <data name="checkoutMethod" xsi:type="string">login</data>
@@ -278,6 +286,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderAddresses" />
         </variation>
         <variation name="OnePageCheckoutUsingNewAddress" summary="Checkout as Customer using New address" ticketId="MAGETWO-42601">
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="customer/dataset" xsi:type="string">johndoe_with_addresses</data>
             <data name="checkoutMethod" xsi:type="string">sign_in</data>
@@ -296,6 +305,7 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderAddresses" />
         </variation>
         <variation name="OnePageCheckoutTestVariation11" summary="Checkout as Customer using default address" ticketId="MAGETWO-42600, MAGETWO-42546">
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="customer/dataset" xsi:type="string">customer_UK_US_addresses</data>
             <data name="checkoutMethod" xsi:type="string">login</data>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateProductFromMiniShoppingCartEntityTest.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateProductFromMiniShoppingCartEntityTest.php
index 0bfe42f7fe78ced0ffb2282d69790ca42c4a1dec..3a9d381de3d810b59437fd3a73028bb058d3915c 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateProductFromMiniShoppingCartEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateProductFromMiniShoppingCartEntityTest.php
@@ -34,6 +34,7 @@ class UpdateProductFromMiniShoppingCartEntityTest extends Injectable
     /* tags */
     const MVP = 'yes';
     const TEST_TYPE = 'extended_acceptance_test';
+    const SEVERITY = 'S0';
     /* end tags */
 
     /**
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 cd500a935485cd0e08981d32a53b9280a7d2ad57..f7a675d36c5bd38c5ffc2153f0c7f47fe60f986f 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
@@ -8,7 +8,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\UpdateProductFromMiniShoppingCartEntityTest" summary="Update Product from Mini Shopping Cart" ticketId="MAGETWO-29812">
         <variation name="UpdateProductFromMiniShoppingCartEntityTestVariation1" summary="Update Product Qty on Mini Shopping Cart" ticketId=" MAGETWO-35536">
-            <data name="tag" xsi:type="string">test_type:extended_acceptance_test</data>
+            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, severity:S0</data>
             <data name="originalProduct/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="checkoutData/dataset" xsi:type="string">simple_order_qty_2</data>
             <data name="use_minicart_to_edit_qty" xsi:type="boolean">true</data>
@@ -25,7 +25,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertCustomerIsRedirectedToCheckoutFromCart" />
         </variation>
         <variation name="UpdateProductFromMiniShoppingCartEntityTestVariation2" summary="Update Configurable and verify previous product was updated to new one in shopping cart and mini shopping cart">
-            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, to_maintain:yes</data>
+            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, to_maintain:yes, severity:S0</data>
             <data name="originalProduct/0" xsi:type="string">configurableProduct::default</data>
             <data name="checkoutData/dataset" xsi:type="string">configurable_update_mini_shopping_cart</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartItemsOptions" />
@@ -34,7 +34,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertProductOptionsAbsentInShoppingCart" />
         </variation>
         <variation name="UpdateProductFromMiniShoppingCartEntityTestVariation3" summary="Update Bundle and verify previous product was updated to new one in shopping cart and mini shopping cart">
-            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, to_maintain:yes</data>
+            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, to_maintain:yes, severity:S0</data>
             <data name="originalProduct/0" xsi:type="string">bundleProduct::bundle_fixed_product</data>
             <data name="checkoutData/dataset" xsi:type="string">bundle_update_mini_shopping_cart</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartItemsOptions" />
@@ -43,7 +43,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertProductOptionsAbsentInShoppingCart" />
         </variation>
         <variation name="UpdateProductFromMiniShoppingCartEntityTestVariation4" summary="Update Downloadable and check previous link was updated to new one in shopping cart and mini shopping cart">
-            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, to_maintain:yes</data>
+            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, to_maintain:yes, severity:S1</data>
             <data name="originalProduct/0" xsi:type="string">downloadableProduct::with_two_separately_links</data>
             <data name="checkoutData/dataset" xsi:type="string">downloadable_update_mini_shopping_cart</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertCartItemsOptions" />
@@ -52,7 +52,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertProductOptionsAbsentInShoppingCart" />
         </variation>
         <variation name="UpdateProductFromMiniShoppingCartEntityTestVariation5" summary="Update Virtual product in mini shopping cart">
-            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, to_maintain:yes</data>
+            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, to_maintain:yes, severity:S1</data>
             <data name="originalProduct/0" 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\AssertProductDataInMiniShoppingCart" />
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateShoppingCartTest.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateShoppingCartTest.php
index 3dba57e26e003726e856577f5e4b48a427428a24..57ef98528c877e96bd21d0773aa16d79466aed7a 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateShoppingCartTest.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateShoppingCartTest.php
@@ -34,6 +34,7 @@ class UpdateShoppingCartTest extends Injectable
     /* tags */
     const MVP = 'yes';
     const STABLE = 'no';
+    const SEVERITY = 'S0';
     /* end tags */
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateShoppingCartTest.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateShoppingCartTest.xml
index 42428189f44b06b3c33550efb453d34900045133..912bb57e3f1eb2b00e4e481b8fa83c64975380dd 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateShoppingCartTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/UpdateShoppingCartTest.xml
@@ -8,6 +8,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\UpdateShoppingCartTest" summary="Update Shopping Cart" ticketId="MAGETWO-25081">
         <variation name="UpdateShoppingCartTestVariation1">
+            <data name="tag" xsi:type="string">severity:S0</data>
             <data name="product/dataset" xsi:type="string">default</data>
             <data name="product/data/price/value" xsi:type="string">100</data>
             <data name="product/data/checkout_data/qty" xsi:type="string">3</data>
@@ -19,6 +20,7 @@
             <constraint name="Magento\Checkout\Test\Constraint\AssertSubtotalInShoppingCart" />
         </variation>
         <variation name="UpdateShoppingCartTestVariation2">
+            <data name="tag" xsi:type="string">severity:S0</data>
             <data name="product/dataset" xsi:type="string">with_two_custom_option</data>
             <data name="product/data/price/value" xsi:type="string">50</data>
             <data name="product/data/checkout_data/qty" xsi:type="string">11</data>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/AddProductsToTheCartStep.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/AddProductsToTheCartStep.php
index 37df8ea8b89255ca5a1d522b1b0c7c6bc6ffcf5c..d6fb3a272b4290f50a32c88a739f5620c0066c99 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/AddProductsToTheCartStep.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/AddProductsToTheCartStep.php
@@ -10,6 +10,7 @@ use Magento\Catalog\Test\Page\Product\CatalogProductView;
 use Magento\Checkout\Test\Page\CheckoutCart;
 use Magento\Cms\Test\Page\CmsIndex;
 use Magento\Mtf\Client\BrowserInterface;
+use Magento\Mtf\Fixture\FixtureFactory;
 use Magento\Mtf\TestStep\TestStepInterface;
 
 /**
@@ -18,46 +19,53 @@ use Magento\Mtf\TestStep\TestStepInterface;
 class AddProductsToTheCartStep implements TestStepInterface
 {
     /**
-     * Array with products
+     * Array with products.
      *
      * @var array
      */
-    protected $products;
+    private $products;
 
     /**
-     * Frontend product view page
+     * Storefront product view page.
      *
      * @var CatalogProductView
      */
-    protected $catalogProductView;
+    private $catalogProductView;
 
     /**
-     * Page of checkout page
+     * Page of checkout page.
      *
      * @var CheckoutCart
      */
-    protected $checkoutCart;
+    private $checkoutCart;
 
     /**
-     * Cms index page
+     * Cms index page.
      *
      * @var CmsIndex
      */
-    protected $cmsIndex;
+    private $cmsIndex;
 
     /**
-     * Interface Browser
+     * Client Browser instance.
      *
      * @var BrowserInterface
      */
-    protected $browser;
+    private $browser;
+
+    /**
+     * Fixture factory.
+     *
+     * @var FixtureFactory
+     */
+    private $fixtureFactory;
 
     /**
-     * @constructor
      * @param CatalogProductView $catalogProductView
      * @param CheckoutCart $checkoutCart
      * @param CmsIndex $cmsIndex
      * @param BrowserInterface $browser
+     * @param FixtureFactory $fixtureFactory
      * @param array $products
      */
     public function __construct(
@@ -65,19 +73,21 @@ class AddProductsToTheCartStep implements TestStepInterface
         CheckoutCart $checkoutCart,
         CmsIndex $cmsIndex,
         BrowserInterface $browser,
+        FixtureFactory $fixtureFactory,
         array $products
     ) {
-        $this->products = $products;
         $this->catalogProductView = $catalogProductView;
         $this->checkoutCart = $checkoutCart;
         $this->cmsIndex = $cmsIndex;
         $this->browser = $browser;
+        $this->fixtureFactory = $fixtureFactory;
+        $this->products = $products;
     }
 
     /**
-     * Add products to the cart
+     * Add products to the cart.
      *
-     * @return void
+     * @return array
      */
     public function run()
     {
@@ -89,5 +99,7 @@ class AddProductsToTheCartStep implements TestStepInterface
             $this->catalogProductView->getViewBlock()->addToCart($product);
             $this->catalogProductView->getMessagesBlock()->waitSuccessMessage();
         }
+        $cart['data']['items'] = ['products' => $this->products];
+        return ['cart' => $this->fixtureFactory->createByCode('cart', $cart)];
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/GetPlacedOrderIdStep.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/GetPlacedOrderIdStep.php
new file mode 100644
index 0000000000000000000000000000000000000000..8d4fa8e471fbc18519f9c9cc3a5917c51789a066
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/GetPlacedOrderIdStep.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Checkout\Test\TestStep;
+
+use Magento\Mtf\TestStep\TestStepInterface;
+use Magento\Checkout\Test\Page\CheckoutOnepageSuccess;
+use Magento\Mtf\Util\Protocol\CurlTransport\WebapiDecorator;
+
+/**
+ * Get successfully placed order id.
+ */
+class GetPlacedOrderIdStep implements TestStepInterface
+{
+    /**
+     * Order success page.
+     *
+     * @var CheckoutOnepageSuccess
+     */
+    private $checkoutOnepageSuccess;
+
+    /**
+     * Curl transport on webapi.
+     *
+     * @var WebapiDecorator
+     */
+    private $decorator;
+
+    /**
+     * @param CheckoutOnepageSuccess $checkoutOnepageSuccess
+     * @param WebapiDecorator $decorator
+     */
+    public function __construct(
+        CheckoutOnepageSuccess $checkoutOnepageSuccess,
+        WebapiDecorator $decorator
+    ) {
+        $this->checkoutOnepageSuccess = $checkoutOnepageSuccess;
+        $this->decorator = $decorator;
+    }
+
+    /**
+     * Get success placed order id.
+     *
+     * @return array
+     */
+    public function run()
+    {
+        $incrementId = $this->checkoutOnepageSuccess->getSuccessBlock()->getGuestOrderId();
+        return [
+            'entityId' => $this->getEntityId($incrementId),
+            'orderId' => $incrementId
+        ];
+    }
+
+    /**
+     * Get order entity id by increment id.
+     *
+     * @param string $incrementId
+     * @return string
+     */
+    private function getEntityId($incrementId)
+    {
+        $url = $_ENV['app_frontend_url'] . 'rest/V1/orders/';
+        $url .= '?searchCriteria[filterGroups][0][filters][0][field]=increment_id';
+        $url .= '&searchCriteria[filterGroups][0][filters][0][value]=' . $incrementId;
+        $this->decorator->write($url, [], WebapiDecorator::GET);
+        $response = json_decode($this->decorator->read(), true);
+        $this->decorator->close();
+        return $response['items'][0]['entity_id'];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/PlaceOrderStep.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/PlaceOrderStep.php
index 2bfd346fbcaebe0545a3b65ce76af7a8bc52de25..8beada29036b8a3cf2ff367a0b30b59b78faf0e8 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/PlaceOrderStep.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/PlaceOrderStep.php
@@ -22,41 +22,44 @@ class PlaceOrderStep implements TestStepInterface
      *
      * @var CheckoutOnepage
      */
-    protected $checkoutOnepage;
+    private $checkoutOnepage;
 
     /**
      * Assert that Order Grand Total is correct on checkout page review block.
      *
      * @var AssertGrandTotalOrderReview
      */
-    protected $assertGrandTotalOrderReview;
+    private $assertGrandTotalOrderReview;
 
     /**
      * One page checkout success page.
      *
      * @var CheckoutOnepageSuccess
      */
-    protected $checkoutOnepageSuccess;
+    private $checkoutOnepageSuccess;
 
     /**
      * Price array.
      *
      * @var array
      */
-    protected $prices;
+    private $prices;
 
     /**
+     * Factory for fixtures.
+     *
      * @var FixtureFactory
      */
     private $fixtureFactory;
 
     /**
+     * Array of product entities.
+     *
      * @var array
      */
     private $products;
 
     /**
-     * @construct
      * @param CheckoutOnepage $checkoutOnepage
      * @param AssertGrandTotalOrderReview $assertGrandTotalOrderReview
      * @param CheckoutOnepageSuccess $checkoutOnepageSuccess
@@ -74,10 +77,10 @@ class PlaceOrderStep implements TestStepInterface
     ) {
         $this->checkoutOnepage = $checkoutOnepage;
         $this->assertGrandTotalOrderReview = $assertGrandTotalOrderReview;
-        $this->prices = $prices;
         $this->checkoutOnepageSuccess = $checkoutOnepageSuccess;
         $this->fixtureFactory = $fixtureFactory;
         $this->products = $products;
+        $this->prices = $prices;
     }
 
     /**
@@ -91,18 +94,20 @@ class PlaceOrderStep implements TestStepInterface
             $this->assertGrandTotalOrderReview->processAssert($this->checkoutOnepage, $this->prices['grandTotal']);
         }
         $this->checkoutOnepage->getPaymentBlock()->getSelectedPaymentMethodBlock()->clickPlaceOrder();
+        $orderId = $this->checkoutOnepageSuccess->getSuccessBlock()->getGuestOrderId();
         $order = $this->fixtureFactory->createByCode(
             'orderInjectable',
             [
                 'data' => [
-                    'entity_id' => ['products' => $this->products]
+                    'id' => $orderId,
+                    'entity_id' => ['products' => $this->products],
                 ]
             ]
         );
 
         return [
-            'orderId' => $this->checkoutOnepageSuccess->getSuccessBlock()->getGuestOrderId(),
-            'order' => $order
+            'orderId' => $orderId,
+            'order' => $order,
         ];
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/SelectPaymentMethodStep.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/SelectPaymentMethodStep.php
index 1f5d80bdbde49f35a62dad5dd9fbefb326107b45..5eea876f02b40c6dd93de18d9f7c378179772756 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/SelectPaymentMethodStep.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/SelectPaymentMethodStep.php
@@ -7,68 +7,73 @@
 namespace Magento\Checkout\Test\TestStep;
 
 use Magento\Checkout\Test\Page\CheckoutOnepage;
-use Magento\Mtf\Fixture\FixtureFactory;
 use Magento\Mtf\TestStep\TestStepInterface;
 use Magento\Payment\Test\Fixture\CreditCard;
 
 /**
- * Class SelectPaymentMethodStep
- * Selecting payment method
+ * Select payment method step.
  */
 class SelectPaymentMethodStep implements TestStepInterface
 {
     /**
-     * Onepage checkout page
+     * Onepage checkout page.
      *
      * @var CheckoutOnepage
      */
     protected $checkoutOnepage;
 
     /**
-     * Payment information
+     * Payment information.
      *
      * @var string
      */
     protected $payment;
 
     /**
-     * Credit card information
+     * Credit card information.
      *
      * @var string
      */
     protected $creditCard;
 
     /**
-     * @constructor
+     * If fill credit card data should be filled on 3rd party side.
+     *
+     * @var bool
+     */
+    private $fillCreditCardOn3rdParty;
+
+    /**
      * @param CheckoutOnepage $checkoutOnepage
      * @param array $payment
-     * @param FixtureFactory $fixtureFactory
-     * @param string $creditCardClass
-     * @param array|CreditCard|null $creditCard
+     * @param CreditCard|null $creditCard
+     * @param bool $fillCreditCardOn3rdParty
      */
     public function __construct(
         CheckoutOnepage $checkoutOnepage,
         array $payment,
-        FixtureFactory $fixtureFactory,
-        $creditCardClass = 'credit_card',
-        $creditCard = null
+        CreditCard $creditCard = null,
+        $fillCreditCardOn3rdParty = false
     ) {
         $this->checkoutOnepage = $checkoutOnepage;
         $this->payment = $payment;
-        if (isset($creditCard['dataset'])) {
-            $this->creditCard = $fixtureFactory->createByCode($creditCardClass, ['dataset' => $creditCard['dataset']]);
-        }
+        $this->creditCard = $creditCard;
+        $this->fillCreditCardOn3rdParty = $fillCreditCardOn3rdParty;
     }
 
     /**
-     * Run step that selecting payment method
+     * Run step that selecting payment method.
      *
      * @return void
      */
     public function run()
     {
         if ($this->payment['method'] !== 'free') {
-            $this->checkoutOnepage->getPaymentBlock()->selectPaymentMethod($this->payment, $this->creditCard);
+            $this->checkoutOnepage->getPaymentBlock()->selectPaymentMethod(
+                $this->payment,
+                $this->creditCard,
+                $this->fillCreditCardOn3rdParty
+            );
         }
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/di.xml
index d7a61b0eaaa2fece41b7d1f464f0e56bdb80d159..9f13d8dddb9a768442f7051a6e11be16f7df9233 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/di.xml
@@ -7,9 +7,9 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
-    <type name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty">
+    <type name="Magento\Checkout\Test\Constraint\AssertAddedProductToCartSuccessMessage">
         <arguments>
-            <argument name="severity" xsi:type="string">middle</argument>
+            <argument name="severity" xsi:type="string">S2</argument>
         </arguments>
     </type>
     <type name="Magento\Checkout\Test\Constraint\AssertBillingAddressAbsentInPayment">
@@ -17,9 +17,19 @@
             <argument name="severity" xsi:type="string">S2</argument>
         </arguments>
     </type>
-    <type name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage">
+    <type name="Magento\Checkout\Test\Constraint\AssertBillingAddressSameAsShippingCheckbox">
         <arguments>
-            <argument name="severity" xsi:type="string">S0</argument>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertCartItemsOptions">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
         </arguments>
     </type>
     <type name="Magento\Checkout\Test\Constraint\AssertCheckoutErrorMessage">
@@ -27,4 +37,124 @@
             <argument name="severity" xsi:type="string">S1</argument>
         </arguments>
     </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertCustomerIsRedirectedToCheckoutFromCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertDiscountInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertEstimateShippingAndTax">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertGrandTotalInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertGrandTotalOrderReview">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertMinicartEmpty">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage">
+        <arguments>
+            <argument name="severity" xsi:type="string">S0</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertPriceInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertProductAbsentInMiniShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertProductDataInMiniShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertProductIsNotEditable">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertProductOptionsAbsentInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertProductPresentInMiniShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertProductPresentInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertProductQtyInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertProductsAbsentInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertShippingAddressJsValidationMessagesIsAbsent">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertShippingInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertShippingTotalOrderReview">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertSubtotalInMiniShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertSubtotalInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertSubTotalOrderReview">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertTaxInShoppingCart">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertTaxTotalOrderReview">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
 </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 21f48abef963d288415d09b24d08a3fe8fd34ebe..b397b73f3a43d6c3d819d105e82efdb48568ec76 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
@@ -27,6 +27,7 @@ class CreateTermEntityTest extends Scenario
     /* tags */
     const MVP = 'yes';
     const TEST_TYPE = 'extended_acceptance_test';
+    const SEVERITY = 'S3';
     /* end tags */
 
     /**
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 8b1c1929d0f9d068d5a78382beb8237e3dced4fe..8f418b92e09a5ff53c44d3d4bacd538347e2ccfa 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
@@ -8,7 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\CheckoutAgreements\Test\TestCase\CreateTermEntityTest" summary="Create Terms And Conditions" ticketId="MAGETWO-29586">
         <variation name="CreateTermEntityTestVariation1" summary="Create enabled term entity with text value">
-            <data name="tag" xsi:type="string">test_type:extended_acceptance_test</data>
+            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, severity:S3</data>
             <data name="configData" xsi:type="string">checkout_term_condition</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="agreement/data/name" xsi:type="string">name%isolation%</data>
@@ -26,6 +26,7 @@
             <constraint name="Magento\CheckoutAgreements\Test\Constraint\AssertTermOnCheckout" />
         </variation>
         <variation name="CreateTermEntityTestVariation2" summary="Create enabled term entity with HTML value">
+            <data name="tag" xsi:type="string">severity:S3</data>
             <data name="configData" xsi:type="string">checkout_term_condition</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="agreement/data/name" xsi:type="string">name%isolation%</data>
@@ -43,6 +44,7 @@
             <constraint name="Magento\CheckoutAgreements\Test\Constraint\AssertTermOnCheckout" />
         </variation>
         <variation name="CreateTermEntityTestVariation3" summary="Create disabled term entity">
+            <data name="tag" xsi:type="string">severity:S3</data>
             <data name="configData" xsi:type="string">checkout_term_condition</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="agreement/data/name" xsi:type="string">name%isolation%</data>
@@ -60,7 +62,7 @@
             <constraint name="Magento\CheckoutAgreements\Test\Constraint\AssertTermAbsentOnCheckout" />
         </variation>
         <variation name="CreateTermEntityTestVariation4" summary="Terms and conditions on multishipping" ticketId="MAGETWO-32499">
-            <data name="tag" xsi:type="string">test_type:extended_acceptance_test</data>
+            <data name="tag" xsi:type="string">test_type:extended_acceptance_test, severity:S3</data>
             <data name="configData" xsi:type="string">checkout_term_condition</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="products/1" xsi:type="string">catalogProductSimple::default</data>
diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/DeleteTermEntityTest.php b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/DeleteTermEntityTest.php
index 2c65150aa697371c1fe050e5e4f5f9dfbdcb25b1..0f7dd2c1bf1631557de590ee37fb804c020c5ad9 100644
--- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/DeleteTermEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/DeleteTermEntityTest.php
@@ -26,6 +26,7 @@ class DeleteTermEntityTest extends Scenario
 {
     /* tags */
     const MVP = 'yes';
+    const SEVERITY = 'S3';
     /* end tags */
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/DeleteTermEntityTest.xml b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/DeleteTermEntityTest.xml
index 50e4af5a2dc36ce151de313ad22fc906921a59ac..3bfd5a63cc4e387c3ec52cba76def7601eff5cb1 100644
--- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/DeleteTermEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/DeleteTermEntityTest.xml
@@ -8,6 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\CheckoutAgreements\Test\TestCase\DeleteTermEntityTest" summary="Delete Terms And Conditions" ticketId="MAGETWO-29687">
         <variation name="DeleteTermEntityTestVariation1">
+            <data name="tag" xsi:type="string">severity:S3</data>
             <data name="configData" xsi:type="string">checkout_term_condition</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="agreement/dataset" xsi:type="string">term_enabled_text</data>
diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/NavigateMenuTest.xml b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/NavigateMenuTest.xml
index 1387c7e1e1268085d100112302054fa9c374cde5..57580e2f10e1dc07a8034b414a28b556b6337897 100644
--- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/NavigateMenuTest.xml
+++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/NavigateMenuTest.xml
@@ -8,6 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Backend\Test\TestCase\NavigateMenuTest">
         <variation name="NavigateMenuTest17">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="menuItem" xsi:type="string">Stores > Terms and Conditions</data>
             <data name="pageTitle" xsi:type="string">Terms and Conditions</data>
             <constraint name="Magento\Backend\Test\Constraint\AssertBackendPageIsAvailable"/>
diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/UpdateTermEntityTest.php b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/UpdateTermEntityTest.php
index 277f38e0c7e1f1bdda9f122183415b35aa772f40..4266338ac6ef7818a5a670646be2090c64bf20a9 100644
--- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/UpdateTermEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/UpdateTermEntityTest.php
@@ -27,6 +27,7 @@ class UpdateTermEntityTest extends Scenario
 {
     /* tags */
     const MVP = 'yes';
+    const SEVERITY = 'S2';
     /* end tags */
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/UpdateTermEntityTest.xml b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/UpdateTermEntityTest.xml
index 69ea6309843d1ad7452c463a7d951675c745714d..537c61d83d7b5d079a6e80a174544f5aa7cbbead 100644
--- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/UpdateTermEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/TestCase/UpdateTermEntityTest.xml
@@ -8,6 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\CheckoutAgreements\Test\TestCase\UpdateTermEntityTest" summary="Update Terms And Conditions" ticketId="MAGETWO-29635">
         <variation name="UpdateTermEntityTestVariation1">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="configData" xsi:type="string">checkout_term_condition</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="agreement/dataset" xsi:type="string">term_disabled_text</data>
@@ -26,6 +27,7 @@
             <constraint name="Magento\CheckoutAgreements\Test\Constraint\AssertTermOnCheckout" />
         </variation>
         <variation name="UpdateTermEntityTestVariation2">
+            <data name="tag" xsi:type="string">severity:S3</data>
             <data name="configData" xsi:type="string">checkout_term_condition</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="agreement/dataset" xsi:type="string">term_disabled_html</data>
@@ -44,6 +46,7 @@
             <constraint name="Magento\CheckoutAgreements\Test\Constraint\AssertTermOnCheckout" />
         </variation>
         <variation name="UpdateTermEntityTestVariation3">
+            <data name="tag" xsi:type="string">severity:S3</data>
             <data name="configData" xsi:type="string">checkout_term_condition</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="agreement/dataset" xsi:type="string">term_enabled_text</data>
diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/etc/di.xml
index 7dc8356351f2f7228a2c4ac5ceec524380dcd5e6..66381d8985802ed12fd9a83633e2ef8c1eebc75c 100644
--- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/etc/di.xml
@@ -6,9 +6,39 @@
  */
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
-  <type name="Magento\CheckoutAgreements\Test\Constraint\AssertTermRequireMessageOnMultishippingCheckout">
-    <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
-    </arguments>
-  </type>
+    <type name="Magento\CheckoutAgreements\Test\Constraint\AssertTermRequireMessageOnMultishippingCheckout">
+        <arguments>
+            <argument name="severity" xsi:type="string">S3</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CheckoutAgreements\Test\Constraint\AssertTermSuccessSaveMessage">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CheckoutAgreements\Test\Constraint\AssertTermInGrid">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CheckoutAgreements\Test\Constraint\AssertTermOnCheckout">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CheckoutAgreements\Test\Constraint\AssertTermAbsentOnCheckout">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CheckoutAgreements\Test\Constraint\AssertTermSuccessDeleteMessage">
+        <arguments>
+            <argument name="severity" xsi:type="string">S2</argument>
+        </arguments>
+    </type>
+    <type name="Magento\CheckoutAgreements\Test\Constraint\AssertTermAbsentInGrid">
+        <arguments>
+            <argument name="severity" xsi:type="string">S3</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Fixture/Cart/Item.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Fixture/Cart/Item.php
index d2a999627cb95d8336314bc643e194e5fb3461c8..46cf2ceefe8ac9e830b029e0357c0735465503b2 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Fixture/Cart/Item.php
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Fixture/Cart/Item.php
@@ -6,9 +6,6 @@
 
 namespace Magento\ConfigurableProduct\Test\Fixture\Cart;
 
-use Magento\ConfigurableProduct\Test\Fixture\ConfigurableProduct;
-use Magento\Mtf\Fixture\FixtureInterface;
-
 /**
  * Data for verify cart item block on checkout page.
  *
@@ -20,25 +17,27 @@ use Magento\Mtf\Fixture\FixtureInterface;
 class Item extends \Magento\Catalog\Test\Fixture\Cart\Item
 {
     /**
-     * @constructor
-     * @param FixtureInterface $product
+     * Return prepared dataset.
+     *
+     * @param null|string $key
+     * @return array
      */
-    public function __construct(FixtureInterface $product)
+    public function getData($key = null)
     {
-        parent::__construct($product);
-
-        /** @var ConfigurableProduct $product */
-        $checkoutData = $product->getCheckoutData();
+        parent::getData($key);
+        $productData = $this->product->getData();
+        $checkoutData = $this->product->getCheckoutData();
         $cartItem = isset($checkoutData['cartItem']) ? $checkoutData['cartItem'] : [];
-        $attributesData = $product->getConfigurableAttributesData()['attributes_data'];
+        $attributesData = $this->product->getConfigurableAttributesData()['attributes_data'];
         $checkoutConfigurableOptions = isset($checkoutData['options']['configurable_options'])
             ? $checkoutData['options']['configurable_options']
             : [];
 
+        $attributeKey = [];
         foreach ($checkoutConfigurableOptions as $key => $checkoutConfigurableOption) {
             $attribute = $checkoutConfigurableOption['title'];
             $option = $checkoutConfigurableOption['value'];
-
+            $attributeKey[] = "$attribute:$option";
             $checkoutConfigurableOptions[$key] = [
                 'title' => isset($attributesData[$attribute]['label'])
                     ? $attributesData[$attribute]['label']
@@ -48,10 +47,15 @@ class Item extends \Magento\Catalog\Test\Fixture\Cart\Item
                     : $option,
             ];
         }
+        $attributeKey = implode(' ', $attributeKey);
+        $cartItem['sku'] = $productData['configurable_attributes_data']['matrix'][$attributeKey]['sku'];
+        $cartItem['name'] = $productData['name'];
 
         $cartItem['options'] = isset($cartItem['options'])
             ? $cartItem['options'] + $checkoutConfigurableOptions
             : $checkoutConfigurableOptions;
         $this->data = $cartItem;
+
+        return $this->data;
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Repository/ConfigData.xml b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Repository/ConfigData.xml
index 3a099d79d370a97b9d75afb419bd36860e559a1a..77b311bd7a51f80b0347ba092dc700e467c2cf84 100644
--- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Repository/ConfigData.xml
+++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Repository/ConfigData.xml
@@ -17,7 +17,6 @@
                 </item>
             </field>
         </dataset>
-
         <dataset name="config_currency_symbols_usd_and_uah_rollback">
             <field name="currency/options/allow" xsi:type="array">
                 <item name="scope" xsi:type="string">currency</item>
@@ -83,7 +82,6 @@
                 <item name="value" xsi:type="string">CHF</item>
             </field>
         </dataset>
-
         <dataset name="config_base_currency_ch_rollback">
             <field name="currency/options/allow" xsi:type="array">
                 <item name="scope" xsi:type="string">currency</item>
@@ -127,7 +125,6 @@
                 <item name="value" xsi:type="string">GBP</item>
             </field>
         </dataset>
-
         <dataset name="config_base_currency_gb_rollback">
             <field name="currency/options/allow" xsi:type="array">
                 <item name="scope" xsi:type="string">currency</item>
@@ -150,6 +147,49 @@
             </field>
         </dataset>
 
+        <dataset name="config_base_currency_aud">
+            <field name="currency/options/allow" xsi:type="array">
+                <item name="scope" xsi:type="string">currency</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="value" xsi:type="array">
+                    <item name="Australian Dollar" xsi:type="string">AUD</item>
+                </item>
+            </field>
+            <field name="currency/options/base" xsi:type="array">
+                <item name="scope" xsi:type="string">currency</item>
+                <item name="label" xsi:type="string">Australian Dollar</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="value" xsi:type="string">AUD</item>
+            </field>
+            <field name="currency/options/default" xsi:type="array">
+                <item name="scope" xsi:type="string">currency</item>
+                <item name="label" xsi:type="string">Australian Dollar</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="value" xsi:type="string">AUD</item>
+            </field>
+        </dataset>
+        <dataset name="config_base_currency_aud_rollback">
+            <field name="currency/options/allow" xsi:type="array">
+                <item name="scope" xsi:type="string">currency</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="value" xsi:type="array">
+                    <item name="US Dollar" xsi:type="string">USD</item>
+                </item>
+            </field>
+            <field name="currency/options/base" xsi:type="array">
+                <item name="scope" xsi:type="string">currency</item>
+                <item name="label" xsi:type="string">US Dollar</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="value" xsi:type="string">USD</item>
+            </field>
+            <field name="currency/options/default" xsi:type="array">
+                <item name="scope" xsi:type="string">currency</item>
+                <item name="label" xsi:type="string">US Dollar</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="value" xsi:type="string">USD</item>
+            </field>
+        </dataset>
+
         <dataset name="config_currency_symbols_usd_and_eur">
             <field name="currency/options/allow" xsi:type="array">
                 <item name="scope" xsi:type="string">currency</item>
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Address/Edit.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Address/Edit.php
index b9d5f3c3af01e10559e2c942e546f4eeda6576c3..78eaf403826bc054996c570c2167600ac4fac0ff 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Address/Edit.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Address/Edit.php
@@ -61,4 +61,20 @@ class Edit extends Form
     {
         $this->_rootElement->find($this->saveAddress)->click();
     }
+
+    /**
+     * Fixture mapping.
+     *
+     * @param array|null $fields
+     * @param string|null $parent
+     * @return array
+     */
+    protected function dataMapping(array $fields = null, $parent = null)
+    {
+        if (isset($fields['custom_attribute'])) {
+            $this->placeholders = ['attribute_code' => $fields['custom_attribute']['code']];
+            $this->applyPlaceholders();
+        }
+        return parent::dataMapping($fields, $parent);
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAddressEdit.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAddressEdit.php
deleted file mode 100644
index 4946f0825870974337a3724fae591e58b8d861be..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAddressEdit.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Customer\Test\Page;
-
-use Magento\Mtf\Client\Locator;
-use Magento\Mtf\Factory\Factory;
-use Magento\Mtf\Page\Page;
-
-/**
- * Customer Address Edit page.
- */
-class CustomerAddressEdit extends Page
-{
-    /**
-     * URL for Customer Address Edit page.
-     */
-    const MCA = 'customer/address/edit';
-
-    /**
-     * Customer Address Edit form.
-     *
-     * @var string
-     */
-    protected $editForm = '#form-validate';
-
-    /**
-     * Init page. Set page url.
-     *
-     * @return void
-     */
-    protected function initUrl()
-    {
-        $this->url = $_ENV['app_frontend_url'] . self::MCA;
-    }
-
-    /**
-     * Get Customer Address Edit form.
-     *
-     * @return \Magento\Customer\Test\Block\Address\Edit
-     */
-    public function getEditForm()
-    {
-        return Factory::getBlockFactory()->getMagentoCustomerAddressEdit(
-            $this->browser->find($this->editForm, Locator::SELECTOR_CSS)
-        );
-    }
-}
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAddressEdit.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAddressEdit.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2f3738d05e5e3d0439496b2df70532613b9144d8
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Page/CustomerAddressEdit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 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="CustomerAddressEdit" mca="customer/address/edit" module="Magento_Customer">
+        <block name="editForm" class="Magento\Customer\Test\Block\Address\Edit" locator="#form-validate" strategy="css selector" />
+    </page>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml
index ba85d0d13bfc68761ea562802f259dcda28ff738..2edc328b5c5df40df321e66a34fa1ee7c6d4e835 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml
@@ -285,5 +285,17 @@
                 <item name="dataset" xsi:type="string">UK_address_default_billing, US_address_default_shipping</item>
             </field>
         </dataset>
+
+        <dataset name="AVS_street_match_address">
+            <field name="firstname" xsi:type="string">John</field>
+            <field name="lastname" xsi:type="string">Doe</field>
+            <field name="company" xsi:type="string">Magento %isolation%</field>
+            <field name="city" xsi:type="string">Culver City</field>
+            <field name="street" xsi:type="string">24285 Elm</field>
+            <field name="telephone" xsi:type="string">555-55-555-55</field>
+            <field name="country_id" xsi:type="string">United States</field>
+            <field name="region_id" xsi:type="string">California</field>
+            <field name="postcode" xsi:type="string">90230</field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Fixture/Cart/Item.php b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Fixture/Cart/Item.php
index dd388ae11d2f66990e3f2bb54e83399ec7562d5c..1d0fabeceb771ebd61d73ee16bed79ba91efcc3a 100644
--- a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Fixture/Cart/Item.php
+++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Fixture/Cart/Item.php
@@ -6,9 +6,6 @@
 
 namespace Magento\Downloadable\Test\Fixture\Cart;
 
-use Magento\Downloadable\Test\Fixture\DownloadableProduct;
-use Magento\Mtf\Fixture\FixtureInterface;
-
 /**
  * Data for verify cart item block on checkout page.
  *
@@ -18,17 +15,17 @@ use Magento\Mtf\Fixture\FixtureInterface;
 class Item extends \Magento\Catalog\Test\Fixture\Cart\Item
 {
     /**
-     * @constructor
-     * @param FixtureInterface $product
+     * Return prepared dataset.
+     *
+     * @param null|string $key
+     * @return array
      */
-    public function __construct(FixtureInterface $product)
+    public function getData($key = null)
     {
-        parent::__construct($product);
-
-        /** @var DownloadableProduct $product */
+        parent::getData($key);
         $checkoutDownloadableOptions = [];
-        $checkoutData = $product->getCheckoutData();
-        $downloadableOptions = $product->getDownloadableLinks();
+        $checkoutData = $this->product->getCheckoutData();
+        $downloadableOptions = $this->product->getDownloadableLinks();
         foreach ($checkoutData['options']['links'] as $link) {
             $keyLink = str_replace('link_', '', $link['label']);
             $checkoutDownloadableOptions[] = [
@@ -38,5 +35,7 @@ class Item extends \Magento\Catalog\Test\Fixture\Cart\Item
         }
 
         $this->data['options'] += $checkoutDownloadableOptions;
+
+        return $this->data;
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.php b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.php
index e33adb68be4eb6eeb05753b072d394804acefb4a..40b622882d357a8c4770ace4b555230a134554f9 100644
--- a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.php
+++ b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.php
@@ -29,6 +29,7 @@ class CheckoutWithGiftMessagesTest extends Scenario
 {
     /* tags */
     const MVP = 'no';
+    const SEVERITY = 'S2';
     const TO_MAINTAIN = 'yes'; // Consider variation #2 to work correctly with Virtual products
     /* end tags */
 
diff --git a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml
index 6226713f316c5f0a90f06291a3a8160a65ac912f..c4f03f0f3d317f3f8b4caa5eae6ad22ed0d475a9 100644
--- a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml
+++ b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml
@@ -8,6 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\GiftMessage\Test\TestCase\CheckoutWithGiftMessagesTest" summary="One Page Checkout with Gift Messages" ticketId="MAGETWO-28978">
         <variation name="CheckoutWithGiftMessagesTestVariation1">
+            <data name="tag" xsi:type="string">severity:S2</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="products/1" xsi:type="string">catalogProductVirtual::default</data>
             <data name="customer/dataset" xsi:type="string">default</data>
@@ -27,7 +28,7 @@
             <constraint name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInFrontendOrder" />
         </variation>
         <variation name="CheckoutWithGiftMessagesTestVariation2">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
+            <data name="tag" xsi:type="string">severity:S2,to_maintain:yes</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="products/1" xsi:type="string">catalogProductVirtual::default</data>
             <data name="customer/dataset" xsi:type="string">default</data>
diff --git a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CreateGiftMessageOnBackendTest.php b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CreateGiftMessageOnBackendTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..962d94ab6d59acf09f89c4b9b21a07dcf5e2cb92
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CreateGiftMessageOnBackendTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\GiftMessage\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+
+/**
+ * Preconditions:
+ * 1. Create Product according dataset.
+ * 2. Enable Gift Messages (Order/Items level).
+ *
+ * Steps:
+ * 1. Login to backend
+ * 2. Go to Sales >Orders
+ * 3. Create new order
+ * 4. Fill data form dataset
+ * 5. Perform all asserts
+ *
+ * @group Gift_Messages
+ * @ZephyrId MAGETWO-29642
+ */
+class CreateGiftMessageOnBackendTest extends Scenario
+{
+    /* tags */
+    const MVP = 'no';
+    const SEVERITY = 'S2';
+    const TO_MAINTAIN = 'yes';
+    /* end tags */
+
+    /**
+     * Run CreateGiftMessageOnBackend test.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CreateGiftMessageOnBackendTest.xml b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CreateGiftMessageOnBackendTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bc29b300b220e190e3ac6d00149520c44b493a7a
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CreateGiftMessageOnBackendTest.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 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\GiftMessage\Test\TestCase\CreateGiftMessageOnBackendTest" summary="Create Gift Message On Backend" ticketId="MAGETWO-29642">
+        <variation name="CreateGiftMessageOnBackendTestVariation1">
+            <data name="tag" xsi:type="string">severity:S2</data>
+            <data name="configData" xsi:type="string">cashondelivery, enable_gift_messages</data>
+            <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
+            <data name="products/1" xsi:type="string">catalogProductVirtual::default</data>
+            <data name="customer/dataset" xsi:type="string">johndoe_with_addresses</data>
+            <data name="billingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
+            <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
+            <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
+            <data name="giftMessage/data/allow_gift_options" xsi:type="string">Yes</data>
+            <data name="giftMessage/data/allow_gift_options_for_items" xsi:type="string">Yes</data>
+            <data name="giftMessage/data/sender" xsi:type="string">John Doe</data>
+            <data name="giftMessage/data/recipient" xsi:type="string">Jane Doe</data>
+            <data name="giftMessage/data/message" xsi:type="string">text_gift_message</data>
+            <data name="giftMessage/data/items/datasets" xsi:type="string">default</data>
+            <data name="payment/method" xsi:type="string">cashondelivery</data>
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderSuccessCreateMessage" />
+            <constraint name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInBackendOrder" />
+            <constraint name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInFrontendOrderItems" />
+        </variation>
+        <variation name="CreateGiftMessageOnBackendTestVariation2">
+            <data name="tag" xsi:type="string">severity:S2</data>
+            <data name="configData" xsi:type="string">cashondelivery, enable_gift_messages</data>
+            <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
+            <data name="products/1" xsi:type="string">catalogProductVirtual::default</data>
+            <data name="customer/dataset" xsi:type="string">johndoe_with_addresses</data>
+            <data name="billingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
+            <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
+            <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
+            <data name="giftMessage/data/allow_gift_options" xsi:type="string">Yes</data>
+            <data name="giftMessage/data/allow_gift_messages_for_order" xsi:type="string">Yes</data>
+            <data name="giftMessage/data/allow_gift_options_for_items" xsi:type="string">-</data>
+            <data name="giftMessage/data/sender" xsi:type="string">John Doe</data>
+            <data name="giftMessage/data/recipient" xsi:type="string">Jane Doe</data>
+            <data name="giftMessage/data/message" xsi:type="string">text_gift_message</data>
+            <data name="payment/method" xsi:type="string">cashondelivery</data>
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderSuccessCreateMessage" />
+            <constraint name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInBackendOrder" />
+            <constraint name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInFrontendOrder" />
+        </variation>
+        <variation name="CreateGiftMessageOnBackendTestVariation3">
+            <data name="tag" xsi:type="string">severity:S2</data>
+            <data name="configData" xsi:type="string">cashondelivery, enable_gift_messages</data>
+            <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
+            <data name="products/1" xsi:type="string">catalogProductVirtual::default</data>
+            <data name="customer/dataset" xsi:type="string">johndoe_with_addresses</data>
+            <data name="billingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
+            <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
+            <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
+            <data name="giftMessage/data/allow_gift_options" xsi:type="string">Yes</data>
+            <data name="giftMessage/data/allow_gift_messages_for_order" xsi:type="string">Yes</data>
+            <data name="giftMessage/data/allow_gift_options_for_items" xsi:type="string">Yes</data>
+            <data name="giftMessage/data/sender" xsi:type="string">John Doe</data>
+            <data name="giftMessage/data/recipient" xsi:type="string">Jane Doe</data>
+            <data name="giftMessage/data/message" xsi:type="string">text_gift_message</data>
+            <data name="giftMessage/data/items/datasets" xsi:type="string">default</data>
+            <data name="payment/method" xsi:type="string">cashondelivery</data>
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderSuccessCreateMessage" />
+            <constraint name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInBackendOrder" />
+            <constraint name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInFrontendOrder" />
+            <constraint name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInFrontendOrderItems" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/etc/di.xml
index bda2dc3ea97b95dead3597444f2a1438b88e2da7..a7ff131c0674637fd0c5c6c333d520649834b1cd 100644
--- a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/etc/di.xml
@@ -8,17 +8,17 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
   <type name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInFrontendOrderItems">
     <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
+      <argument name="severity" xsi:type="string">S2</argument>
     </arguments>
   </type>
   <type name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInFrontendOrder">
     <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
+      <argument name="severity" xsi:type="string">S2</argument>
     </arguments>
   </type>
   <type name="Magento\GiftMessage\Test\Constraint\AssertGiftMessageInBackendOrder">
     <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
+      <argument name="severity" xsi:type="string">S2</argument>
     </arguments>
   </type>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View.php
index bd774f806053eb90b28ff70003cd703f315e1b2d..31ce18926b51ba89d70d8e5a73508562d405c9cf 100644
--- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View.php
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View.php
@@ -94,4 +94,19 @@ class View extends ParentView
     {
         $this->getGroupedProductBlock()->fill($product);
     }
+
+    /**
+     * Set quantity and click add to cart.
+     * @param FixtureInterface $product
+     * @param string|int $qty
+     */
+    public function setQtyAndClickAddToCartGrouped(FixtureInterface $product, $qty)
+    {
+        $associatedProducts = $product->getAssociated()['products'];
+        $groupedProductBlock = $this->getGroupedProductBlock();
+        foreach ($associatedProducts as $product) {
+            $groupedProductBlock->setQty($product->getId(), $qty);
+        }
+        $this->clickAddToCart();
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View/Type/Grouped.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View/Type/Grouped.php
index 42b3b0dfcf76047bcd3c23ed1fcf117e497dcbf2..7498c3c56587dd1bace2b00727c90428af19435d 100644
--- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View/Type/Grouped.php
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View/Type/Grouped.php
@@ -65,6 +65,18 @@ class Grouped extends Block
         return $this->_rootElement->find(sprintf($this->qtySubProductById, $subProductId))->getValue();
     }
 
+    /**
+     * Set qty to subproduct block
+     *
+     * @param int $subProductId
+     * @param string|int $qty
+     * @return void
+     */
+    public function setQty($subProductId, $qty)
+    {
+        $this->_rootElement->find(sprintf($this->qtySubProductById, $subProductId))->setValue($qty);
+    }
+
     /**
      * Fill product options on view page.
      *
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Checkout/Cart/CartItem.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Checkout/Cart/CartItem.php
index f843482eca1ca860869bb3a4413f71c632f05719..9db1477946df13464d6fabbb2a95cfed7a4046c6 100644
--- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Checkout/Cart/CartItem.php
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Checkout/Cart/CartItem.php
@@ -8,6 +8,7 @@ namespace Magento\GroupedProduct\Test\Block\Checkout\Cart;
 
 use Magento\Checkout\Test\Block\Cart\AbstractCartItem;
 use Magento\Checkout\Test\Block\Cart\CartItem as CheckoutCartItem;
+use Magento\Mtf\Client\Locator;
 
 /**
  * Class CartItem
@@ -119,4 +120,57 @@ class CartItem extends AbstractCartItem
             $cartItem->removeItem();
         }
     }
+
+    /**
+     * Get product price including tax
+     *
+     * @return string|null
+     */
+    public function getPriceInclTax()
+    {
+        return $this->getPriceByType($this->priceInclTax, Locator::SELECTOR_XPATH);
+    }
+
+    /**
+     * Get product price excluding tax
+     *
+     * @return string|null
+     */
+    public function getPriceExclTax()
+    {
+        return $this->getPriceByType($this->priceExclTax, Locator::SELECTOR_XPATH);
+    }
+
+    /**
+     * Get sub-total excluding tax for the specified item in the cart
+     *
+     * @return string|null
+     */
+    public function getSubtotalPriceExclTax()
+    {
+        return $this->getPriceByType($this->subTotalPriceExclTax);
+    }
+
+    /**
+     * Get price for the specified item in the cart by the price type
+     *
+     * @return string|null
+     */
+    public function getSubtotalPriceInclTax()
+    {
+        return $this->getPriceByType($this->subTotalPriceInclTax);
+    }
+
+    /**
+     * @param string $priceType
+     * @param string $strategy
+     * @return mixed|null
+     */
+    private function getPriceByType($priceType, $strategy = Locator::SELECTOR_CSS)
+    {
+        $cartProductPrice = $this->_rootElement->find($priceType, $strategy);
+        return $cartProductPrice->isVisible()
+            ? str_replace(',', '', $this->escapeCurrency($cartProductPrice->getText()))
+            : null;
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AbstractAssertTaxRuleIsAppliedToAllPricesOnGroupedProductPage.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AbstractAssertTaxRuleIsAppliedToAllPricesOnGroupedProductPage.php
new file mode 100644
index 0000000000000000000000000000000000000000..9fd3ebe177b3a2f5b0cfb10141f4a3e64f41a8b9
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AbstractAssertTaxRuleIsAppliedToAllPricesOnGroupedProductPage.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\GroupedProduct\Test\Constraint;
+
+use Magento\Cms\Test\Page\CmsIndex;
+use Magento\Catalog\Test\Page\Category\CatalogCategoryView;
+use Magento\Catalog\Test\Page\Product\CatalogProductView;
+use Magento\Checkout\Test\Page\CheckoutCart;
+use Magento\Tax\Test\Constraint\AbstractAssertTaxRuleIsAppliedToAllPrices;
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\Fixture\InjectableFixture;
+
+/**
+ * Checks that prices excl tax on category, product and cart pages are equal to specified in dataset.
+ */
+abstract class AbstractAssertTaxRuleIsAppliedToAllPricesOnGroupedProductPage extends
+ AbstractAssertTaxRuleIsAppliedToAllPrices
+{
+
+    /**
+     * Get grouped product view prices.
+     *
+     * @param FixtureInterface $product
+     * @param array $actualPrices
+     * @return array
+     */
+    abstract protected function getGroupedProductPagePrices(FixtureInterface $product, array $actualPrices);
+
+    /**
+     * Assert that specified prices are actual on category, product and cart pages.
+     *
+     * @param InjectableFixture $product
+     * @param array $prices
+     * @param int $qty
+     * @param CmsIndex $cmsIndex
+     * @param CatalogCategoryView $catalogCategoryView
+     * @param CatalogProductView $catalogProductView
+     * @param CheckoutCart $checkoutCart
+     * @param FixtureFactory $fixtureFactory
+     * @return void
+     */
+    public function processAssert(
+        InjectableFixture $product,
+        array $prices,
+        $qty,
+        CmsIndex $cmsIndex,
+        CatalogCategoryView $catalogCategoryView,
+        CatalogProductView $catalogProductView,
+        CheckoutCart $checkoutCart,
+        FixtureFactory $fixtureFactory
+    ) {
+        $this->cmsIndex = $cmsIndex;
+        $this->catalogCategoryView = $catalogCategoryView;
+        $this->catalogProductView = $catalogProductView;
+        $this->checkoutCart = $checkoutCart;
+        //Preconditions
+        $address = $fixtureFactory->createByCode('address', ['dataset' => 'US_address_NY']);
+        $shipping = ['shipping_service' => 'Flat Rate', 'shipping_method' => 'Fixed'];
+        $actualPrices = [];
+        //Assertion steps
+        $productCategory = $product->getCategoryIds()[0];
+        $this->openCategory($productCategory);
+        $actualPrices = $this->getCategoryPrices($product, $actualPrices);
+        $catalogCategoryView->getListProductBlock()->getProductItem($product)->open();
+        $catalogProductView->getGroupedProductViewBlock()->fillOptions($product);
+        $actualPrices = $this->getGroupedProductPagePrices($product, $actualPrices);
+        $catalogProductView->getGroupedProductViewBlock()->setQtyAndClickAddToCartGrouped($product, $qty);
+        $catalogProductView->getMessagesBlock()->waitSuccessMessage();
+        $this->checkoutCart->open();
+        $this->fillEstimateBlock($address, $shipping);
+        $actualPrices = $this->getCartPrices($product, $actualPrices);
+        $actualPrices = $this->getTotals($actualPrices);
+        //Prices verification
+        $message = 'Prices from dataset should be equal to prices on frontend.';
+        \PHPUnit_Framework_Assert::assertEquals($prices, $actualPrices, $message);
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AssertTaxRuleIsAppliedToAllPricesGroupedExcludingIncludingTax.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AssertTaxRuleIsAppliedToAllPricesGroupedExcludingIncludingTax.php
new file mode 100644
index 0000000000000000000000000000000000000000..57853d344672b0e09a2f6aa9a821146108295cb4
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AssertTaxRuleIsAppliedToAllPricesGroupedExcludingIncludingTax.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\GroupedProduct\Test\Constraint;
+
+use Magento\Mtf\Fixture\FixtureInterface;
+
+/**
+ * Checks that prices excl tax on category, product and cart pages are equal to specified in dataset.
+ */
+class AssertTaxRuleIsAppliedToAllPricesGroupedExcludingIncludingTax extends
+ AbstractAssertTaxRuleIsAppliedToAllPricesOnGroupedProductPage
+{
+    /**
+     * @inheritdoc
+     */
+    public function getCategoryPrices(FixtureInterface $product, $actualPrices)
+    {
+        $priceBlock = $this->catalogCategoryView->getListProductBlock()->getProductItem($product)->getPriceBlock();
+        $actualPrices['category_price_excl_tax'] = $priceBlock->getPriceExcludingTax();
+        $actualPrices['category_price_incl_tax'] = $priceBlock->getPriceIncludingTax();
+
+        return $actualPrices;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getGroupedProductPagePrices(FixtureInterface $product, array $actualPrices)
+    {
+        $associatedProducts = $product->getAssociated();
+        /** @var \Magento\GroupedProduct\Test\Block\Catalog\Product\View $groupedProductBlock */
+        $this->catalogProductView = $this->catalogProductView->getGroupedProductViewBlock();
+        foreach (array_keys($associatedProducts['products']) as $productIndex) {
+            //Process assertions
+            $this->catalogProductView ->itemPriceProductBlock(++$productIndex);
+            $actualPrices['sub_product_view_prices_' . $productIndex] =  $this->getProductPagePrices($actualPrices);
+        }
+        return $actualPrices;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getProductPagePrices($actualPrices)
+    {
+        $priceBlock = $this->catalogProductView ->getPriceBlock();
+        $productPrices['product_view_price_excl_tax'] = $priceBlock->getPriceExcludingTax();
+        $productPrices['product_view_price_incl_tax'] = $priceBlock->getPriceIncludingTax();
+
+        return $productPrices;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getTotals($actualPrices)
+    {
+        $totalsBlock = $this->checkoutCart->getTotalsBlock();
+        $actualPrices['subtotal_excl_tax'] = $totalsBlock->getSubtotalExcludingTax();
+        $actualPrices['subtotal_incl_tax'] = $totalsBlock->getSubtotalIncludingTax();
+        $actualPrices['discount'] = $totalsBlock->getDiscount();
+        $actualPrices['shipping_excl_tax'] = $totalsBlock->getShippingPrice();
+        $actualPrices['shipping_incl_tax'] = $totalsBlock->getShippingPriceInclTax();
+        $actualPrices['tax'] = $totalsBlock->getTax();
+        $actualPrices['grand_total_excl_tax'] = $totalsBlock->getGrandTotalExcludingTax();
+        $actualPrices['grand_total_incl_tax'] = $totalsBlock->getGrandTotalIncludingTax();
+
+        return $actualPrices;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Fixture/Cart/Item.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Fixture/Cart/Item.php
index cc0cd2e9f09a49b04de46062905406bba68b7916..2aaf1253885a158f63a3a2aaf2df049d2c1ab105 100644
--- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Fixture/Cart/Item.php
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Fixture/Cart/Item.php
@@ -6,9 +6,6 @@
 
 namespace Magento\GroupedProduct\Test\Fixture\Cart;
 
-use Magento\GroupedProduct\Test\Fixture\GroupedProduct;
-use Magento\Mtf\Fixture\FixtureInterface;
-
 /**
  * Data for verify cart item block on checkout page.
  *
@@ -18,18 +15,19 @@ use Magento\Mtf\Fixture\FixtureInterface;
 class Item extends \Magento\Catalog\Test\Fixture\Cart\Item
 {
     /**
-     * @constructor
-     * @param FixtureInterface $product
+     * Return prepared dataset.
+     *
+     * @param null|string $key
+     * @return array
      */
-    public function __construct(FixtureInterface $product)
+    public function getData($key = null)
     {
-        /** @var GroupedProduct $product */
-        $checkoutData = $product->getCheckoutData();
+        $checkoutData = $this->product->getCheckoutData();
         $this->data = isset($checkoutData['cartItem']) ? $checkoutData['cartItem'] : [];
         $associatedProducts = [];
         $cartItem = [];
 
-        foreach ($product->getAssociated()['products'] as $key => $product) {
+        foreach ($this->product->getAssociated()['products'] as $key => $product) {
             $key = 'product_key_' . $key;
             $associatedProducts[$key] = $product;
         }
@@ -51,5 +49,7 @@ class Item extends \Magento\Catalog\Test\Fixture\Cart\Item
         }
 
         $this->data = $cartItem;
+
+        return $this->data;
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct.xml
index bbdbc011ae8c9c8859d16dcfbd6b2e7428d46246..7f1fd69d8e784d08363b07837c35e9ec30c54ea0 100644
--- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct.xml
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct.xml
@@ -33,6 +33,9 @@
             <field name="attribute_set_id" xsi:type="array">
                 <item name="dataset" xsi:type="string">default</item>
             </field>
+            <field name="checkout_data" xsi:type="array">
+                <item name="dataset" xsi:type="string">default</item>
+            </field>
         </dataset>
 
         <dataset name="grouped_product_out_of_stock">
@@ -125,5 +128,33 @@
                 <item name="dataset" xsi:type="string">grouped_three_simple_products</item>
             </field>
         </dataset>
+
+        <dataset name="grouped_product_with_special_price">
+            <field name="name" xsi:type="string">Test grouped product with special price %isolation%</field>
+            <field name="sku" xsi:type="string">sku_test_grouped_product_with_special_price_%isolation%</field>
+            <field name="category_ids" xsi:type="array">
+                <item name="dataset" xsi:type="string">default</item>
+            </field>
+            <field name="associated" xsi:type="array">
+                <item name="dataset" xsi:type="string">defaultSimpleProduct_with_specialPrice</item>
+            </field>
+            <field name="status" xsi:type="string">Yes</field>
+            <field name="visibility" xsi:type="string">Catalog, Search</field>
+            <field name="tax_class_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">taxable_goods</item>
+            </field>
+            <field name="url_key" xsi:type="string">test-grouped-product-with-special-price-%isolation%</field>
+            <field name="quantity_and_stock_status" xsi:type="array">
+                <item name="is_in_stock" xsi:type="string">In Stock</item>
+            </field>
+            <field name="website_ids" xsi:type="array">
+                <item name="0" xsi:type="array">
+                    <item name="dataset" xsi:type="string">default</item>
+                </item>
+            </field>
+            <field name="attribute_set_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">default</item>
+            </field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct/CheckoutData.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct/CheckoutData.xml
index e6529d1afe6778f9c97396c20186be44f110545d..e2e17977b7dd6f43f68de86f0bfc2b060693a50e 100644
--- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct/CheckoutData.xml
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Repository/GroupedProduct/CheckoutData.xml
@@ -7,6 +7,33 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/Magento/Mtf/Repository/etc/repository.xsd">
     <repository class="Magento\GroupedProduct\Test\Repository\GroupedProduct\CheckoutData">
+        <dataset name="default">
+            <field name="options" xsi:type="array">
+                <item name="0" xsi:type="array">
+                    <item name="name" xsi:type="string">product_key_0</item>
+                    <item name="qty" xsi:type="string">2</item>
+                </item>
+                <item name="1" xsi:type="array">
+                    <item name="name" xsi:type="string">product_key_1</item>
+                    <item name="qty" xsi:type="string">1</item>
+                </item>
+            </field>
+            <field name="cartItem" xsi:type="array">
+                <item name="price" xsi:type="array">
+                    <item name="product_key_0" xsi:type="string">100</item>
+                    <item name="product_key_1" xsi:type="string">560</item>
+                </item>
+                <item name="qty" xsi:type="array">
+                    <item name="product_key_0" xsi:type="string">2</item>
+                    <item name="product_key_1" xsi:type="string">1</item>
+                </item>
+                <item name="subtotal" xsi:type="array">
+                    <item name="product_key_0" xsi:type="string">200</item>
+                    <item name="product_key_1" xsi:type="string">560</item>
+                </item>
+            </field>
+        </dataset>
+
         <dataset name="grouped_three_simple_products">
             <field name="options" xsi:type="array">
                 <item name="0" xsi:type="array">
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/TaxCalculationTest.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/TaxCalculationTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c57afc28b88683e3b08917ae2c1d8942a7c3b614
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/TaxCalculationTest.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Tax\Test\TestCase\TaxCalculationTest" summary="Apply Taxes for grouped products" ticketId="MAGETWO-60576">
+        <variation name="TaxCalculationTestGroupedProduct">
+            <data name="product" xsi:type="string">groupedProduct::grouped_product_with_special_price</data>
+            <data name="taxRule" xsi:type="string">us_full_tax_rule</data>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1</data>
+            <data name="customer/dataset" xsi:type="string">johndoe_unique</data>
+            <data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups_no_coupon</data>
+            <data name="catalogRule" xsi:type="string">-</data>
+            <data name="configData" xsi:type="string">total_cat_excl_ship_incl_after_disc_on_excl, display_excluding_including_tax</data>
+            <data name="flushCache" xsi:type="boolean">true</data>
+            <data name="qty" xsi:type="string">3</data>
+            <data name="prices/category_price_excl_tax" xsi:type="string">9.00</data>
+            <data name="prices/category_price_incl_tax" xsi:type="string">9.90</data>
+            <data name="prices/sub_product_view_prices_1/product_view_price_excl_tax" xsi:type="string">9.00</data>
+            <data name="prices/sub_product_view_prices_1/product_view_price_incl_tax" xsi:type="string">9.90</data>
+            <data name="prices/sub_product_view_prices_2/product_view_price_excl_tax" xsi:type="string">9.00</data>
+            <data name="prices/sub_product_view_prices_2/product_view_price_incl_tax" xsi:type="string">9.90</data>
+            <data name="prices/cart_item_price_excl_tax" xsi:type="string">9.00</data>
+            <data name="prices/cart_item_price_incl_tax" xsi:type="string">9.90</data>
+            <data name="prices/cart_item_subtotal_excl_tax" xsi:type="string">27.00</data>
+            <data name="prices/cart_item_subtotal_incl_tax" xsi:type="string">29.70</data>
+            <data name="prices/subtotal_excl_tax" xsi:type="string">54.00</data>
+            <data name="prices/subtotal_incl_tax" xsi:type="string">59.40</data>
+            <data name="prices/shipping_excl_tax" xsi:type="string">30.00</data>
+            <data name="prices/shipping_incl_tax" xsi:type="string">30.00</data>
+            <data name="prices/discount" xsi:type="string">27.00</data>
+            <data name="prices/tax" xsi:type="string">2.70</data>
+            <data name="prices/grand_total_excl_tax" xsi:type="string">57.00</data>
+            <data name="prices/grand_total_incl_tax" xsi:type="string">59.70</data>
+            <constraint name="Magento\GroupedProduct\Test\Constraint\AssertTaxRuleIsAppliedToAllPricesGroupedExcludingIncludingTax" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Integration/Test/TestCase/DeleteIntegrationEntityTest.xml b/dev/tests/functional/tests/app/Magento/Integration/Test/TestCase/DeleteIntegrationEntityTest.xml
index 56431ee145d18d1fcae4df990a0a388a9e7f99f0..6594757fe15ee54f2d2b2e0f34344a3b40812a0b 100644
--- a/dev/tests/functional/tests/app/Magento/Integration/Test/TestCase/DeleteIntegrationEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Integration/Test/TestCase/DeleteIntegrationEntityTest.xml
@@ -8,6 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Integration\Test\TestCase\DeleteIntegrationEntityTest" summary="Delete Integration" ticketId="MAGETWO-26058">
         <variation name="DeleteIntegrationEntityTestVariation1">
+            <data name="integration/dataset" xsi:type="string">default</data>
             <constraint name="Magento\Integration\Test\Constraint\AssertIntegrationSuccessDeleteMessage" />
             <constraint name="Magento\Integration\Test\Constraint\AssertIntegrationNotInGrid" />
         </variation>
diff --git a/dev/tests/functional/tests/app/Magento/Multishipping/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Multishipping/Test/etc/di.xml
index 2eac5848ace436ca634913d40d9b88cbeac67f7c..c792d650be0c1a4f8d2b094c78a8e59ee71346b4 100644
--- a/dev/tests/functional/tests/app/Magento/Multishipping/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/Multishipping/Test/etc/di.xml
@@ -8,7 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
   <type name="Magento\Multishipping\Test\Constraint\AssertMultishippingOrderSuccessPlacedMessage">
     <arguments>
-      <argument name="severity" xsi:type="string">high</argument>
+      <argument name="severity" xsi:type="string">S3</argument>
     </arguments>
   </type>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/Cc.php b/dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/Cc.php
deleted file mode 100644
index 3e8226d371ff4546d7b243834485d2b0dff37d8a..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/Cc.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Payment\Test\Block\Form;
-
-use Magento\Mtf\Block\Form;
-
-/**
- * Form for filling credit card data.
- */
-class Cc extends Form
-{
-    //
-}
diff --git a/dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/PaymentCc.php b/dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/PaymentCc.php
new file mode 100644
index 0000000000000000000000000000000000000000..474052114c4d396476f5c5083c53e42109f662e6
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/PaymentCc.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Payment\Test\Block\Form;
+
+use Magento\Mtf\Block\Form;
+use Magento\Mtf\Client\Element\SimpleElement;
+use Magento\Mtf\Fixture\FixtureInterface;
+
+/**
+ * Form for filling credit card data.
+ */
+class PaymentCc extends Form
+{
+    /**
+     * Fill credit card form.
+     *
+     * @param FixtureInterface $fixture
+     * @param SimpleElement|null $element
+     * @return $this
+     */
+    public function fill(FixtureInterface $fixture, SimpleElement $element = null)
+    {
+        $data = $fixture->getData();
+        unset($data['payment_code']);
+        $mapping = $this->dataMapping($data);
+        $this->_fill($mapping, $element);
+
+        return $this;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/Cc.xml b/dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/PaymentCc.xml
similarity index 100%
rename from dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/Cc.xml
rename to dev/tests/functional/tests/app/Magento/Payment/Test/Block/Form/PaymentCc.xml
diff --git a/dev/tests/functional/tests/app/Magento/Payment/Test/Constraint/AssertCardRequiredFields.php b/dev/tests/functional/tests/app/Magento/Payment/Test/Constraint/AssertCardRequiredFields.php
index 2b1d9bdcf2df8fdb32869731b7b3af05d47bc417..c8b52ed317d0fe7454277464d638c63209556298 100644
--- a/dev/tests/functional/tests/app/Magento/Payment/Test/Constraint/AssertCardRequiredFields.php
+++ b/dev/tests/functional/tests/app/Magento/Payment/Test/Constraint/AssertCardRequiredFields.php
@@ -7,7 +7,7 @@
 namespace Magento\Payment\Test\Constraint;
 
 use Magento\Mtf\Constraint\AbstractConstraint;
-use Magento\Payment\Test\Repository\CreditCardAdmin;
+use Magento\Payment\Test\Repository\CreditCard;
 use Magento\Sales\Test\Page\Adminhtml\OrderCreateIndex;
 
 /**
@@ -30,10 +30,10 @@ class AssertCardRequiredFields extends AbstractConstraint
     /**
      * Assert required fields on credit card payment method in backend.
      * @param OrderCreateIndex $orderCreateIndex
-     * @param CreditCardAdmin $creditCard
+     * @param CreditCard $creditCard
      * @return void
      */
-    public function processAssert(OrderCreateIndex $orderCreateIndex, CreditCardAdmin $creditCard)
+    public function processAssert(OrderCreateIndex $orderCreateIndex, CreditCard $creditCard)
     {
         $actualRequiredFields = $orderCreateIndex->getCreateBlock()->getBillingMethodBlock()
             ->getJsErrors();
diff --git a/dev/tests/functional/tests/app/Magento/Payment/Test/Fixture/CreditCard.xml b/dev/tests/functional/tests/app/Magento/Payment/Test/Fixture/CreditCard.xml
index 6fd5d8675b8b0f38d929d1372dbde9b3aeb601b7..2fe0da150438a784742c3930a41ad5e0362e40a1 100644
--- a/dev/tests/functional/tests/app/Magento/Payment/Test/Fixture/CreditCard.xml
+++ b/dev/tests/functional/tests/app/Magento/Payment/Test/Fixture/CreditCard.xml
@@ -12,6 +12,8 @@
              entity_type="credit_card"
              repository_class="Magento\Payment\Test\Repository\CreditCard"
              class="Magento\Payment\Test\Fixture\CreditCard">
+        <field name="payment_code" />
+        <field name="cc_type" />
         <field name="cc_number" />
         <field name="cc_exp_month" />
         <field name="cc_exp_year" />
diff --git a/dev/tests/functional/tests/app/Magento/Payment/Test/Fixture/CreditCardAdmin.xml b/dev/tests/functional/tests/app/Magento/Payment/Test/Fixture/CreditCardAdmin.xml
deleted file mode 100644
index 87e69cee86addd91d612fb66c594b1bfb89c2638..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Payment/Test/Fixture/CreditCardAdmin.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd">
-    <fixture name="credit_card_admin"
-             module="Magento_Payment"
-             type="virtual"
-             entity_type="credit_card_admin"
-             repository_class="Magento\Payment\Test\Repository\CreditCardAdmin"
-             class="Magento\Payment\Test\Fixture\CreditCardAdmin">
-        <field name="cc_type" />
-        <field name="cc_number" />
-        <field name="cc_exp_month" />
-        <field name="cc_exp_year" />
-        <field name="cc_cid" />
-    </fixture>
-</config>
diff --git a/dev/tests/functional/tests/app/Magento/Payment/Test/Repository/CreditCard.xml b/dev/tests/functional/tests/app/Magento/Payment/Test/Repository/CreditCard.xml
index 8e742ab30ba960dd022870fea86e08c74d71c3fd..80c337d0a8578fb9115ff6382fabba5f6b1b844b 100644
--- a/dev/tests/functional/tests/app/Magento/Payment/Test/Repository/CreditCard.xml
+++ b/dev/tests/functional/tests/app/Magento/Payment/Test/Repository/CreditCard.xml
@@ -14,6 +14,14 @@
             <field name="cc_cid" xsi:type="string">123</field>
         </dataset>
 
+        <dataset name="visa_default_admin">
+            <field name="cc_type" xsi:type="string">Visa</field>
+            <field name="cc_number" xsi:type="string">4111111111111111</field>
+            <field name="cc_exp_month" xsi:type="string">01 - January</field>
+            <field name="cc_exp_year" xsi:type="string">2020</field>
+            <field name="cc_cid" xsi:type="string">123</field>
+        </dataset>
+
         <dataset name="visa_alt">
             <field name="cc_number" xsi:type="string">4012888888881881</field>
             <field name="cc_exp_month" xsi:type="string">02 - February</field>
@@ -34,5 +42,13 @@
             <field name="cc_exp_year" xsi:type="string">2020</field>
             <field name="cc_cid" xsi:type="string">123</field>
         </dataset>
+
+        <dataset name="visa_empty">
+            <field name="cc_type" xsi:type="string" />
+            <field name="cc_number" xsi:type="string" />
+            <field name="cc_exp_month" xsi:type="string" />
+            <field name="cc_exp_year" xsi:type="string" />
+            <field name="cc_cid" xsi:type="string" />
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Payment/Test/Repository/CreditCardAdmin.xml b/dev/tests/functional/tests/app/Magento/Payment/Test/Repository/CreditCardAdmin.xml
deleted file mode 100644
index 371c8f350c6af028ddc544c23142f2886d699dbd..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Payment/Test/Repository/CreditCardAdmin.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" ?>
-<!--
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/Magento/Mtf/Repository/etc/repository.xsd">
-    <repository class="Magento\Payment\Test\Repository\CreditCardAdmin">
-        <dataset name="visa_default">
-            <field name="cc_type" xsi:type="string">Visa</field>
-            <field name="cc_number" xsi:type="string">4111111111111111</field>
-            <field name="cc_exp_month" xsi:type="string">01 - January</field>
-            <field name="cc_exp_year" xsi:type="string">2020</field>
-            <field name="cc_cid" xsi:type="string">123</field>
-        </dataset>
-
-        <dataset name="visa_direct">
-            <field name="cc_type" xsi:type="string">Visa</field>
-            <field name="cc_number" xsi:type="string">4617747819866651</field>
-            <field name="cc_exp_month" xsi:type="string">01 - January</field>
-            <field name="cc_exp_year" xsi:type="string">2020</field>
-            <field name="cc_cid" xsi:type="string">123</field>
-        </dataset>
-        <dataset name="visa_empty">
-            <field name="cc_type" xsi:type="string">Please Select</field>
-            <field name="cc_number" xsi:type="string" />
-            <field name="cc_exp_month" xsi:type="string">Month</field>
-            <field name="cc_cid" xsi:type="string" />
-        </dataset>
-    </repository>
-</config>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/HostedPro/Cc.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/HostedPro/Cc.php
new file mode 100644
index 0000000000000000000000000000000000000000..53fd258b84cbb0ca65b588672eaeeaaf21f43041
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/HostedPro/Cc.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\Block\Form\HostedPro;
+
+use Magento\Payment\Test\Block\Form\PaymentCc as CreditCard;
+
+/**
+ * Form for filling credit card data for Hosted Pro payment method.
+ */
+class Cc extends CreditCard
+{
+    //
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/HostedPro/Cc.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/HostedPro/Cc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b6a0945a693a954bd2602031ebf0ae4f94b81beb
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/HostedPro/Cc.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<mapping strict="0">
+    <fields>
+        <cc_type>
+            <input>select</input>
+            <selector>#credit_card_type</selector>
+        </cc_type>
+        <cc_number>
+            <selector>#credit_card_number</selector>
+        </cc_number>
+        <cc_exp_month>
+            <selector>[name=expiryMonth]</selector>
+        </cc_exp_month>
+        <cc_exp_year>
+            <selector>[name=expiryYear]</selector>
+        </cc_exp_year>
+        <cc_cid>
+            <selector>[name=cvv2]</selector>
+        </cc_cid>
+    </fields>
+</mapping>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PayflowLink/Cc.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PayflowLink/Cc.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f369efc7e829c2e427e883320183a51565006d4
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PayflowLink/Cc.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\Block\Form\PayflowLink;
+
+use Magento\Payment\Test\Block\Form\PaymentCc as CreditCard;
+
+/**
+ * Form for filling credit card data for Payflow Link payment method.
+ */
+class Cc extends CreditCard
+{
+    //
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PayflowLink/Cc.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PayflowLink/Cc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1eaabeede0d49c5dc1387e7e27c560510e6db0a3
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PayflowLink/Cc.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" ?>
+<!--
+/**
+* Copyright © 2016 Magento. All rights reserved.
+* See COPYING.txt for license details.
+*/
+-->
+<mapping strict="0">
+    <fields>
+        <cc_number>
+            <selector>#cc_number</selector>
+        </cc_number>
+        <cc_exp_month>
+            <selector>#expdate_month</selector>
+        </cc_exp_month>
+        <cc_exp_year>
+            <selector>#expdate_year</selector>
+        </cc_exp_year>
+        <cc_cid>
+            <selector>#cvv2_number</selector>
+        </cc_cid>
+    </fields>
+</mapping>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PaymentsAdvanced/Cc.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PaymentsAdvanced/Cc.php
new file mode 100644
index 0000000000000000000000000000000000000000..a990a41cd69afa9e9969ed6668e17125647aee77
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PaymentsAdvanced/Cc.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\Block\Form\PaymentsAdvanced;
+
+use Magento\Payment\Test\Block\Form\PaymentCc as CreditCard;
+
+/**
+ * Form for filling credit card data for Payments Advanced payment method.
+ */
+class Cc extends CreditCard
+{
+    //
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PaymentsAdvanced/Cc.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PaymentsAdvanced/Cc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1eaabeede0d49c5dc1387e7e27c560510e6db0a3
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Form/PaymentsAdvanced/Cc.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" ?>
+<!--
+/**
+* Copyright © 2016 Magento. All rights reserved.
+* See COPYING.txt for license details.
+*/
+-->
+<mapping strict="0">
+    <fields>
+        <cc_number>
+            <selector>#cc_number</selector>
+        </cc_number>
+        <cc_exp_month>
+            <selector>#expdate_month</selector>
+        </cc_exp_month>
+        <cc_exp_year>
+            <selector>#expdate_year</selector>
+        </cc_exp_year>
+        <cc_cid>
+            <selector>#cvv2_number</selector>
+        </cc_cid>
+    </fields>
+</mapping>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/HostedPro.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/HostedPro.php
new file mode 100644
index 0000000000000000000000000000000000000000..f7ee9fc20947e5c4a7bf0acc5bf2ff829aad87c0
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/HostedPro.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\Block\Onepage\Payment;
+
+/**
+ * Hosted Pro credit card block.
+ */
+class HostedPro extends PaypalIframe
+{
+    /**
+     * Block for filling credit card data for Hosted Pro payment method.
+     *
+     * @var string
+     */
+    protected $formBlockCc = \Magento\Paypal\Test\Block\Form\HostedPro\Cc::class;
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/PayflowLink.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/PayflowLink.php
new file mode 100644
index 0000000000000000000000000000000000000000..c6b8d37dc3faa1634450e9152636171e44ec9139
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/PayflowLink.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\Block\Onepage\Payment;
+
+/**
+ * Payflow Link credit card block.
+ */
+class PayflowLink extends PaypalIframe
+{
+    /**
+     * Block for filling credit card data for Payflow Link payment method.
+     *
+     * @var string
+     */
+    protected $formBlockCc = \Magento\Paypal\Test\Block\Form\PayflowLink\Cc::class;
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/PaymentsAdvanced.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/PaymentsAdvanced.php
new file mode 100644
index 0000000000000000000000000000000000000000..bb80ab1ccfc3be3892813f744da23f56a0f11ac3
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/PaymentsAdvanced.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\Block\Onepage\Payment;
+
+/**
+ * Payments Advanced credit card block.
+ */
+class PaymentsAdvanced extends PaypalIframe
+{
+    /**
+     * Block for filling credit card data for Payments Advanced payment method.
+     *
+     * @var string
+     */
+    protected $formBlockCc = \Magento\Paypal\Test\Block\Form\PaymentsAdvanced\Cc::class;
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/PaypalIframe.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/PaypalIframe.php
new file mode 100644
index 0000000000000000000000000000000000000000..574dc256589b6afec1ea5d4f2252bf390b31a7e5
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Block/Onepage/Payment/PaypalIframe.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\Block\Onepage\Payment;
+
+use Magento\Checkout\Test\Block\Onepage\Payment\Method;
+use Magento\Mtf\Client\ElementInterface;
+use Magento\Mtf\Fixture\FixtureInterface;
+
+/**
+ * Paypal Iframe block.
+ */
+class PaypalIframe extends Method
+{
+    /**
+     * 'Pay Now' button selector.
+     *
+     * @var string
+     */
+    private $payNowButton = '#btn_pay_cc';
+
+    /**
+     * PayPal iframe selector.
+     *
+     * @var string
+     */
+    private $paypalIframe = '.paypal.iframe';
+
+    /**
+     * Credit card form selector.
+     *
+     * @var string
+     */
+    private $creditCardForm = '#formCreditCard';
+
+    /**
+     * Error message selector.
+     *
+     * @var string
+     */
+    private $errorMessage = '#messageBox';
+
+    /**
+     * Block for filling credit card data for payment method.
+     *
+     * @var string
+     */
+    protected $formBlockCc;
+
+    /**
+     * Fill credit card data in PayPal iframe form.
+     *
+     * @param FixtureInterface $creditCard
+     * @return void
+     */
+    public function fillPaymentData(FixtureInterface $creditCard)
+    {
+        $iframeRootElement = $this->switchToPaypalFrame();
+        $formBlock = $this->blockFactory->create(
+            $this->formBlockCc,
+            ['element' => $this->_rootElement->find($this->creditCardForm)]
+        );
+        $formBlock->fill($creditCard, $iframeRootElement);
+        $iframeRootElement->find($this->payNowButton)->click();
+        $this->browser->switchToFrame();
+    }
+
+    /**
+     * Check if error message is appeared.
+     *
+     * @return bool
+     */
+    public function isErrorMessageVisible()
+    {
+        $isErrorMessageVisible = false;
+        if ($this->_rootElement->find($this->paypalIframe)->isPresent()) {
+            $iframeRootElement = $this->switchToPaypalFrame();
+            $isErrorMessageVisible = $iframeRootElement->find($this->errorMessage)->isVisible();
+            $this->browser->switchToFrame();
+        }
+        return $isErrorMessageVisible;
+    }
+
+    /**
+     * Change the focus to a PayPal frame.
+     *
+     * @return ElementInterface
+     */
+    private function switchToPaypalFrame()
+    {
+        $iframeLocator = $this->browser->find($this->paypalIframe)->getLocator();
+        $this->browser->switchToFrame($iframeLocator);
+        return $this->browser->find('body');
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Page/CheckoutOnepage.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/Page/CheckoutOnepage.xml
new file mode 100644
index 0000000000000000000000000000000000000000..da37a44f9bf3db04ff42c1a14a0f36e0e499b9c7
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Page/CheckoutOnepage.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 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="CheckoutOnepage" mca="checkout" module="Magento_Checkout">
+        <block name="payflowLinkBlock" class="Magento\Paypal\Test\Block\Onepage\Payment\PayflowLink" locator="#checkout-step-payment" strategy="css selector" />
+        <block name="paymentsAdvancedBlock" class="Magento\Paypal\Test\Block\Onepage\Payment\PaymentsAdvanced" locator="#checkout-step-payment" strategy="css selector" />
+        <block name="hostedProBlock" class="Magento\Paypal\Test\Block\Onepage\Payment\HostedPro" locator="#checkout-step-payment" strategy="css selector" />
+    </page>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/Repository/ConfigData.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/Repository/ConfigData.xml
index 0706f45beeb4bdfa39bfd65f6a76094ef77574e7..1669352dc026ef02c295fce1153f63e3beabf225 100644
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/Repository/ConfigData.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Repository/ConfigData.xml
@@ -7,6 +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\Config\Test\Repository\ConfigData">
+        <dataset name="merchant_country_gb">
+            <field name="paypal/general/merchant_country" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">United Kingdom</item>
+                <item name="value" xsi:type="string">GB</item>
+            </field>
+        </dataset>
+        <dataset name="merchant_country_gb_rollback">
+            <field name="paypal/general/merchant_country" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">United States</item>
+                <item name="value" xsi:type="string">US</item>
+            </field>
+        </dataset>
+
         <dataset name="paypal_direct">
             <field name="payment/paypal_group_all_in_one/wpp_usuk/wpp_required_settings/wpp_and_express_checkout/business_account" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -64,32 +81,32 @@
             <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/business_account" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string">Yes</item>
-                <item name="value" xsi:type="string">PAYPAL_BUSINESS_ACCOUNT</item>
+                <item name="label" xsi:type="string">Email Associated with PayPal Merchant Account (Optional)</item>
+                <item name="value" xsi:type="string">%payflow_pro_business_account%</item>
             </field>
             <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/partner" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string"/>
-                <item name="value" xsi:type="string">PAYMENT_PAYFLOWPRO_PARTNER</item>
+                <item name="label" xsi:type="string">Partner</item>
+                <item name="value" xsi:type="string">%payflow_pro_partner%</item>
             </field>
             <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/user" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string"/>
-                <item name="value" xsi:type="string">PAYMENT_PAYFLOWPRO_USER</item>
+                <item name="label" xsi:type="string">User</item>
+                <item name="value" xsi:type="string">%payflow_pro_user%</item>
             </field>
             <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/pwd" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string"/>
-                <item name="value" xsi:type="string">PAYMENT_PAYFLOWPRO_PWD</item>
+                <item name="label" xsi:type="string">Password</item>
+                <item name="value" xsi:type="string">%payflow_pro_pwd%</item>
             </field>
             <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/vendor" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string"/>
-                <item name="value" xsi:type="string">PAYMENT_PAYFLOWPRO_VENDOR</item>
+                <item name="label" xsi:type="string">Vendor</item>
+                <item name="value" xsi:type="string">%payflow_pro_vendor%</item>
             </field>
             <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/sandbox_flag" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -124,9 +141,133 @@
         </dataset>
         <dataset name="payflowpro_rollback">
             <field name="payment/payflowpro/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">No</item>
+                <item name="value" xsi:type="number">0</item>
+            </field>
+        </dataset>
+
+        <dataset name="payflowpro_fraud_filters_enabled">
+            <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/business_account" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Email Associated with PayPal Merchant Account (Optional)</item>
+                <item name="value" xsi:type="string">%payflow_pro_fraud_protection_enabled_business_account%</item>
+            </field>
+            <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/partner" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Partner</item>
+                <item name="value" xsi:type="string">%payflow_pro_fraud_protection_enabled_partner%</item>
+            </field>
+            <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/user" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">User</item>
+                <item name="value" xsi:type="string">%payflow_pro_fraud_protection_enabled_user%</item>
+            </field>
+            <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/pwd" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Password</item>
+                <item name="value" xsi:type="string">%payflow_pro_fraud_protection_enabled_pwd%</item>
+            </field>
+            <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/vendor" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Vendor</item>
+                <item name="value" xsi:type="string">%payflow_pro_fraud_protection_enabled_vendor%</item>
+            </field>
+            <field name="payment/paypal_payment_gateways/paypal_payflowpro_with_express_checkout/paypal_payflow_required/paypal_payflow_api_settings/sandbox_flag" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string"/>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+            <field name="payment/payflowpro/debug" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+            <field name="payment/payflowpro/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+            <field name="payment/payflow_express/debug" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
                 <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+            <field name="payment/payflow_express/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+        </dataset>
+        <dataset name="payflowpro_fraud_filters_enabled_rollback">
+            <field name="payment/payflowpro/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">No</item>
+                <item name="value" xsi:type="number">0</item>
+            </field>
+        </dataset>
+
+        <dataset name="hosted_pro">
+            <field name="payment/paypal_group_all_in_one/payments_pro_hosted_solution_with_express_checkout/pphs_required_settings/pphs_required_settings_pphs/business_account" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="string">HOSTED_PRO_BUSINESS_ACCOUNT</item>
+            </field>
+            <field name="payment/paypal_group_all_in_one/payments_pro_hosted_solution_with_express_checkout/pphs_required_settings/pphs_required_settings_pphs/api_username" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string"/>
+                <item name="value" xsi:type="string">HOSTED_PRO_API_USERNAME</item>
+            </field>
+            <field name="payment/paypal_group_all_in_one/payments_pro_hosted_solution_with_express_checkout/pphs_required_settings/pphs_required_settings_pphs/api_password" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string"/>
+                <item name="value" xsi:type="string">HOSTED_PRO_API_PASSWORD</item>
+            </field>
+            <field name="payment/paypal_group_all_in_one/payments_pro_hosted_solution_with_express_checkout/pphs_required_settings/pphs_required_settings_pphs/api_signature" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string"/>
+                <item name="value" xsi:type="string">HOSTED_PRO_API_SIGNATURE</item>
+            </field>
+            <field name="payment/paypal_group_all_in_one/payments_pro_hosted_solution_with_express_checkout/pphs_required_settings/pphs_required_settings_pphs/sandbox_flag" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+            <field name="payment/hosted_pro/debug" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+            <field name="payment/hosted_pro/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+        </dataset>
+        <dataset name="hosted_pro_rollback">
+            <field name="payment/hosted_pro/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">No</item>
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
@@ -184,41 +325,100 @@
             </field>
         </dataset>
 
+        <dataset name="payments_advanced">
+            <field name="payment/paypal_group_all_in_one/payflow_advanced/required_settings/payments_advanced/business_account" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Email Associated with PayPal Merchant Account</item>
+                <item name="value" xsi:type="string">%payflow_link_business_account_email%</item>
+            </field>
+            <field name="payment/paypal_group_all_in_one/payflow_advanced/required_settings/payments_advanced/partner" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Partner</item>
+                <item name="value" xsi:type="string">%payflow_link_partner%</item>
+            </field>
+            <field name="payment/paypal_group_all_in_one/payflow_advanced/required_settings/payments_advanced/user" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">User</item>
+                <item name="value" xsi:type="string">%payflow_link_user%</item>
+            </field>
+            <field name="payment/paypal_group_all_in_one/payflow_advanced/required_settings/payments_advanced/pwd" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Password</item>
+                <item name="value" xsi:type="string">%payflow_link_password%</item>
+            </field>
+            <field name="payment/paypal_group_all_in_one/payflow_advanced/required_settings/payments_advanced/vendor" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Vendor</item>
+                <item name="value" xsi:type="string">%payflow_link_vendor%</item>
+            </field>
+            <field name="payment/paypal_group_all_in_one/payflow_advanced/required_settings/payments_advanced/sandbox_flag" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+            <field name="payment/payflow_advanced/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+        </dataset>
+        <dataset name="payments_advanced_rollback">
+            <field name="payment/payflow_advanced/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">No</item>
+                <item name="value" xsi:type="number">0</item>
+            </field>
+        </dataset>
+
         <dataset name="payflowlink">
             <field name="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/business_account" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string">Yes</item>
-                <item name="value" xsi:type="string">PAYPAL_BUSINESS_ACCOUNT</item>
+                <item name="label" xsi:type="string">Email Associated with PayPal Merchant Account</item>
+                <item name="value" xsi:type="string">%payflow_link_business_account_email%</item>
             </field>
             <field name="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/partner" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string"/>
-                <item name="value" xsi:type="string">PAYMENT_PAYFLOWLINK_PARTNER</item>
+                <item name="label" xsi:type="string">Partner</item>
+                <item name="value" xsi:type="string">%payflow_link_partner%</item>
             </field>
             <field name="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/user" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string"/>
-                <item name="value" xsi:type="string">PAYMENT_PAYFLOWLINK_USER</item>
+                <item name="label" xsi:type="string">User</item>
+                <item name="value" xsi:type="string">%payflow_link_user%</item>
             </field>
             <field name="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/pwd" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string"/>
-                <item name="value" xsi:type="string">PAYMENT_PAYFLOWLINK_PWD</item>
+                <item name="label" xsi:type="string">Password</item>
+                <item name="value" xsi:type="string">%payflow_link_password%</item>
             </field>
             <field name="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/vendor" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string"/>
-                <item name="value" xsi:type="string">PAYMENT_PAYFLOWLINK_VENDOR</item>
+                <item name="label" xsi:type="string">Vendor</item>
+                <item name="value" xsi:type="string">%payflow_link_vendor%</item>
             </field>
             <field name="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/payflow_link_payflow_link/sandbox_flag" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string"/>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+            <field name="payment/paypal_payment_gateways/payflow_link_us/payflow_link_required/enable_payflow_link" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
                 <item name="value" xsi:type="number">1</item>
             </field>
             <field name="payment/payflowlink/debug" xsi:type="array">
@@ -250,7 +450,7 @@
             <field name="payment/payflowlink/active" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string">Yes</item>
+                <item name="label" xsi:type="string">No</item>
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
diff --git a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Repository/CreditCard.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/Repository/CreditCard.xml
similarity index 60%
rename from dev/tests/functional/tests/app/Magento/Authorizenet/Test/Repository/CreditCard.xml
rename to dev/tests/functional/tests/app/Magento/Paypal/Test/Repository/CreditCard.xml
index c6b8eab58205e649e87e0acb760339bb9aafc273..9383dcd3faf4b40b23e665c4fb243cd45954e215 100644
--- a/dev/tests/functional/tests/app/Magento/Authorizenet/Test/Repository/CreditCard.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/Repository/CreditCard.xml
@@ -6,10 +6,11 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/Magento/Mtf/Repository/etc/repository.xsd">
-    <repository class="Magento\Authorizenet\Test\Repository\CreditCard">
-        <dataset name="visa_authorizenet">
-            <field name="cc_number" xsi:type="string">4111111111111111</field>
-            <field name="cc_exp_month" xsi:type="string">01 - January</field>
+    <repository class="Magento\Payment\Test\Repository\CreditCard">
+        <dataset name="visa_hosted_pro">
+            <field name="cc_type" xsi:type="string">V</field>
+            <field name="cc_number" xsi:type="string">4032034402702800</field>
+            <field name="cc_exp_month" xsi:type="string">01</field>
             <field name="cc_exp_year" xsi:type="string">2020</field>
             <field name="cc_cid" xsi:type="string">123</field>
         </dataset>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CloseSalesWithHostedProTest.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CloseSalesWithHostedProTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..11acf819c992692a856cf93c679c79a5c7a1aa8b
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CloseSalesWithHostedProTest.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+
+/**
+ * Preconditions:
+ * 1. Order is placed via WPPHS.
+ *
+ * Steps:
+ * 1. Log in to Admin.
+ * 2. Go to Sales > Orders page.
+ * 3. Open order.
+ * 4. Click 'Ship' button and submit shipment.
+ * 5. Click 'Invoice' button.
+ * 6. Select Amount=Capture Online.
+ * 7. Click 'Submit Invoice' button.
+ * 11. Perform assertions.
+ *
+ * @group Paypal
+ * @ZephyrId MAGETWO-13016
+ */
+class CloseSalesWithHostedProTest extends Scenario
+{
+    /* tags */
+    const MVP = 'yes';
+    const TEST_TYPE = '3rd_party_test';
+    /* end tags */
+
+    /**
+     * Complete order paid PayPal Payments Pro Hosted Solution.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CloseSalesWithHostedProTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CloseSalesWithHostedProTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a7e058b4fba445c74febc19a71f7962c3b4af3b6
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CloseSalesWithHostedProTest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 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\Paypal\Test\TestCase\CloseSalesWithHostedProTest" summary="Complete order paid with PayPal Payments Pro Hosted Solution">
+        <variation name="CloseSalesWithHostedProVariation1" summary="Complete order paid with PayPal Payments Pro Hosted Solution" ticketId="MAGETWO-13016">
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="products/1" xsi:type="string">configurableProduct::with_one_option</data>
+            <data name="products/2" xsi:type="string">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>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</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="payment/method" xsi:type="string">hosted_pro</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">145.98</item>
+            </data>
+            <data name="capturedPrices" xsi:type="array">
+                <item name="0" xsi:type="string">145.98</item>
+            </data>
+            <data name="creditCardClass" xsi:type="string">credit_card_hostedpro</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_hosted_pro</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
+            <data name="status" xsi:type="string">Complete</data>
+            <data name="configData" xsi:type="string">merchant_country_gb, hosted_pro, config_base_currency_gb</data>
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S0</data>
+            <constraint name="Magento\Sales\Test\Constraint\AssertInvoiceItems" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertCaptureInCommentsHistory" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderStatusIsCorrect" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreatePayFlowOrderBackendNegativeTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreatePayFlowOrderBackendNegativeTest.xml
index 4ad751de68a71f0330aa547bf74481c3e306f379..ea4dc7b7231466e1473fe4690d73a5ffe3af376b 100644
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreatePayFlowOrderBackendNegativeTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreatePayFlowOrderBackendNegativeTest.xml
@@ -19,7 +19,6 @@
                 <item name="grandTotal" xsi:type="string">15.00</item>
             </data>
             <data name="payment/method" xsi:type="string">payflowpro</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_admin</data>
             <data name="creditCard/dataset" xsi:type="string">visa_empty</data>
             <data name="creditCardSave" xsi:type="string">Yes</data>
             <data name="configData" xsi:type="string">payflowpro, payflowpro_use_vault</data>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreateVaultOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreateVaultOrderBackendTest.xml
index ca26ad42a020c80ab0540c21a2928b8a1874cae7..53e9c7b83900ac1c9422d0ed52ce761b05e24dc0 100644
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreateVaultOrderBackendTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreateVaultOrderBackendTest.xml
@@ -20,8 +20,7 @@
             </data>
             <data name="payment/method" xsi:type="string">payflowpro</data>
             <data name="vault/method" xsi:type="string">payflowpro_cc_vault</data>
-            <data name="creditCardClass" xsi:type="string">credit_card_admin</data>
-            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default_admin</data>
             <data name="creditCardSave" xsi:type="string">Yes</data>
             <data name="configData" xsi:type="string">payflowpro, payflowpro_use_vault</data>
             <data name="status" xsi:type="string">Processing</data>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutHostedProTest.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutHostedProTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..12cedd4ffa458d3418f6834ea330a12c9b0c3c6b
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutHostedProTest.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+
+/**
+ * Preconditions:
+ * 1. Configure shipping method.
+ * 2. Configure payment method.
+ * 3. Create products.
+ * 4. Create sales rule according to dataset.
+ *
+ * Steps:
+ * 1. Go to Storefront.
+ * 2. Add products to the cart.
+ * 3. Click the 'Go to Checkout' button.
+ * 4. Fill shipping information.
+ * 5. Select shipping method.
+ * 6. Click 'Next' button.
+ * 7. Select Hosted Pro method.
+ * 8. Click 'Continue' button.
+ * 9. Specify credit card data in Paypal iframe.
+ * 10. Click 'Pay Now' button.
+ * 11. Perform assertions.
+ *
+ * @group Paypal
+ * @ZephyrId MAGETWO-12971
+ */
+class OnePageCheckoutHostedProTest extends Scenario
+{
+    /* tags */
+    const MVP = 'yes';
+    const TEST_TYPE = '3rd_party_test';
+    const SEVERITY = 'S0';
+    /* end tags */
+
+    /**
+     * Place order using PayPal Payments Pro Hosted Solution.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutHostedProTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutHostedProTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6583aa9cc873c9e3c8fc17255127a1fc62680cb5
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutHostedProTest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 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\Paypal\Test\TestCase\OnePageCheckoutHostedProTest" summary="Guest Checkout using PayPal Payments Pro Hosted Solution and Offline Shipping Method">
+        <variation name="OnePageCheckoutHostedProVariation1" summary="Guest Checkout using PayPal Payments Pro Hosted Solution and Offline Shipping Method" ticketId="MAGETWO-12971">
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="products/1" xsi:type="string">configurableProduct::with_one_option</data>
+            <data name="products/2" xsi:type="string">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>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</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="payment/method" xsi:type="string">hosted_pro</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">145.98</item>
+            </data>
+            <data name="creditCardClass" xsi:type="string">credit_card_hostedpro</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_hosted_pro</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
+            <data name="configData" xsi:type="string">merchant_country_gb, hosted_pro, config_base_currency_gb</data>
+            <data name="status" xsi:type="string">Processing</data>
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S0</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertAuthorizationInCommentsHistory" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPayflowLinkTest.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPayflowLinkTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..726d6833660be0cfd2c838985724a88f680cea44
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPayflowLinkTest.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+
+/**
+ * Preconditions:
+ * 1. Configure shipping method.
+ * 2. Configure payment method.
+ * 3. Create products.
+ * 4. Create tax rule according to dataset.
+ *
+ * Steps:
+ * 1. Go to Storefront.
+ * 2. Add products to the cart.
+ * 3. Click the 'Go to Checkout' button.
+ * 4. Fill shipping information.
+ * 5. Select shipping method.
+ * 6. Click 'Next' button.
+ * 7. Select 'Credit Card' method.
+ * 8. Click 'Continue' button.
+ * 9. Specify credit card data in Paypal iframe.
+ * 10. Click 'Pay Now' button.
+ * 11. Perform assertions.
+ *
+ * @group Paypal
+ * @ZephyrId MAGETWO-12974
+ */
+class OnePageCheckoutPayflowLinkTest extends Scenario
+{
+    /* tags */
+    const MVP = 'yes';
+    const TEST_TYPE = '3rd_party_test';
+    const SEVERITY = 'S0';
+    /* end tags */
+
+    /**
+     * Place order using PayPal Payflow Link Solution.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPayflowLinkTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPayflowLinkTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b23a1c6ae9d79e20bee3af1fcd81f2e116fd6d8e
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPayflowLinkTest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 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\Paypal\Test\TestCase\OnePageCheckoutPayflowLinkTest" summary="Guest Checkout using PayPal Payflow Link and Flat Rate">
+        <variation name="OnePageCheckoutPayflowLinkVariation1" summary="Guest Checkout using PayPal Payflow Link and Flat Rate" ticketId="MAGETWO-12974">
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="products/1" xsi:type="string">configurableProduct::with_one_option</data>
+            <data name="products/2" xsi:type="string">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>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</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="payment/method" xsi:type="string">payflow_link</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">145.98</item>
+            </data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
+            <data name="configData" xsi:type="string">payflowlink</data>
+            <data name="status" xsi:type="string">Processing</data>
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S0</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertAuthorizationInCommentsHistory" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPaymentsAdvancedTest.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPaymentsAdvancedTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..789b5ddd27faaf2723e0feb909e1561e164df56d
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPaymentsAdvancedTest.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+
+/**
+ * Preconditions:
+ * 1. Configure shipping method.
+ * 2. Configure payment method.
+ * 3. Create products.
+ * 4. Create tax rule according to dataset.
+ *
+ * Steps:
+ * 1. Go to Storefront.
+ * 2. Add products to the cart.
+ * 3. Click the 'Go to Checkout' button.
+ * 4. Fill shipping information.
+ * 5. Select shipping method.
+ * 6. Click 'Next' button.
+ * 7. Select 'Credit Card' method.
+ * 8. Click 'Continue' button.
+ * 9. Specify credit card data in Paypal iframe.
+ * 10. Click 'Pay Now' button.
+ * 11. Perform assertions.
+ *
+ * @group Paypal
+ * @ZephyrId MAGETWO-12991
+ */
+class OnePageCheckoutPaymentsAdvancedTest extends Scenario
+{
+    /* tags */
+    const MVP = 'yes';
+    const TEST_TYPE = '3rd_party_test';
+    const SEVERITY = 'S0';
+    /* end tags */
+
+    /**
+     * Place order using PayPal Payments Advanced Solution.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPaymentsAdvancedTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPaymentsAdvancedTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..279a47689548ba0e3a08ba0d8070490bb417e09a
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutPaymentsAdvancedTest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 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\Paypal\Test\TestCase\OnePageCheckoutPaymentsAdvancedTest" summary="Guest Checkout using PayPal Payments Advanced and Flat Rate">
+        <variation name="OnePageCheckoutPaymentsAdvancedVariation1" summary="Guest Checkout using PayPal Payments Advanced and Flat Rate" ticketId="MAGETWO-12991">
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="products/1" xsi:type="string">configurableProduct::with_one_option</data>
+            <data name="products/2" xsi:type="string">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>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</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="payment/method" xsi:type="string">payflow_advanced</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">145.98</item>
+            </data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
+            <data name="configData" xsi:type="string">payments_advanced</data>
+            <data name="status" xsi:type="string">Processing</data>
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S0</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertAuthorizationInCommentsHistory" />
+        </variation>
+    </testCase>
+</config>
\ No newline at end of file
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutTest.xml
index 11f9d9d5270e679df9cd5237b4a51139cb51475e..655b2f5f9d3fb83eaca544d74db4e9adf0732bbe 100644
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutTest.xml
@@ -19,7 +19,6 @@
             <data name="prices" xsi:type="array">
                 <item name="grandTotal" xsi:type="string">15.83</item>
             </data>
-            <data name="creditCardClass" xsi:type="string">credit_card</data>
             <data name="creditCard/dataset" xsi:type="string">visa_default</data>
             <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">payflowpro</data>
@@ -28,5 +27,58 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
             <constraint name="Magento\Sales\Test\Constraint\AssertAuthorizationInCommentsHistory" />
         </variation>
+        <variation name="OnePageCheckoutPayflowProWithInternationalAVSFilter" summary="Place order via Payflow Pro with fraud filters triggering" ticketId="MAGETWO-37476">
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="billingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
+            <data name="shippingAddress/dataset" xsi:type="string">UK_address_without_email</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="payment/method" xsi:type="string">payflowpro</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">15.00</item>
+            </data>
+            <data name="creditCardClass" xsi:type="string">credit_card</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
+            <data name="configData" xsi:type="string">payflowpro_fraud_filters_enabled</data>
+            <data name="paymentInfo" xsi:type="array">
+                <item name="Triggered Fraud Filters" xsi:type="string">Under review by Fraud Service</item>
+                <item name="International AVS response" xsi:type="string">#N: No Details matched</item>
+            </data>
+            <data name="status" xsi:type="string">Processing</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderStatusIsCorrect" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderGrandTotal" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertAuthorizationInCommentsHistory" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderPaymentInformation" />
+        </variation>
+        <variation name="OnePageCheckoutPayflowProWithAVSStreetMatches" summary="Place Order via Payflow Pro with success AVS Street verification" ticketId="MAGETWO-37479">
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="shippingAddress/dataset" xsi:type="string">AVS_street_match_address</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="payment/method" xsi:type="string">payflowpro</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">15.00</item>
+            </data>
+            <data name="creditCardClass" xsi:type="string">credit_card</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_default</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
+            <data name="configData" xsi:type="string">payflowpro_fraud_filters_enabled</data>
+            <data name="paymentInfo" xsi:type="array">
+                <item name="AVS Street Match" xsi:type="string">#Y: Yes. Matched Address and five-didgit ZIP</item>
+            </data>
+            <data name="status" xsi:type="string">Processing</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderInOrdersGrid" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderStatusIsCorrect" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderPaymentInformation" />
+        </variation>
     </testCase>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml
index ad937cf472de7145429b16983288df69bb851134..f5dd4b9604e0a1843c67cc470d607aaf93684eec 100644
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml
@@ -20,7 +20,6 @@
             </data>
             <data name="payment/method" xsi:type="string">payflowpro</data>
             <data name="vault/method" xsi:type="string">payflowpro_cc_vault</data>
-            <data name="creditCardClass" xsi:type="string">credit_card</data>
             <data name="creditCard/dataset" xsi:type="string">visa_default</data>
             <data name="configData" xsi:type="string">payflowpro, payflowpro_use_vault</data>
             <data name="status" xsi:type="string">Processing</data>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/UseVaultOnCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/UseVaultOnCheckoutTest.xml
index 92b4be03b5937ffa318f9d3cd05f6e6d2290f6bc..b81d36ad33038279d0563ca704098b759e93773e 100644
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/UseVaultOnCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/UseVaultOnCheckoutTest.xml
@@ -16,7 +16,6 @@
             <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
             <data name="payment/method" xsi:type="string">payflowpro</data>
             <data name="vault/method" xsi:type="string">payflowpro_cc_vault</data>
-            <data name="creditCardClass" xsi:type="string">credit_card</data>
             <data name="creditCard/dataset" xsi:type="string">visa_default</data>
             <data name="creditCardSave" xsi:type="string">Yes</data>
             <data name="configData" xsi:type="string">payflowpro, payflowpro_use_vault</data>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/GetPlacedOrderIdStep.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/GetPlacedOrderIdStep.php
deleted file mode 100644
index bb1e1416dc9339498c35fda85d1703b5fe62d69b..0000000000000000000000000000000000000000
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/GetPlacedOrderIdStep.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Paypal\Test\TestStep;
-
-use Magento\Mtf\TestStep\TestStepInterface;
-use Magento\Checkout\Test\Page\CheckoutOnepageSuccess;
-
-/**
- * Get success placed order id.
- */
-class GetPlacedOrderIdStep implements TestStepInterface
-{
-    /**
-     * Order success page.
-     *
-     * @var CheckoutOnepageSuccess
-     */
-    protected $checkoutOnepageSuccess;
-
-    /**
-     * @constructor
-     * @param CheckoutOnepageSuccess $checkoutOnepageSuccess
-     */
-    public function __construct(CheckoutOnepageSuccess $checkoutOnepageSuccess)
-    {
-        $this->checkoutOnepageSuccess = $checkoutOnepageSuccess;
-    }
-
-    /**
-     * Get success placed order id.
-     *
-     * @return array
-     */
-    public function run()
-    {
-        return [
-            'orderId' => $this->checkoutOnepageSuccess->getSuccessBlock()->getGuestOrderId(),
-        ];
-    }
-}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/PlaceOrderWithHostedProStep.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/PlaceOrderWithHostedProStep.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf602190a6286d30a860633fc3fb61fca718fe3a
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/PlaceOrderWithHostedProStep.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\TestStep;
+
+use Magento\Checkout\Test\Page\CheckoutOnepage;
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Mtf\Fixture\FixtureInterface;
+use Magento\Mtf\TestStep\TestStepInterface;
+use Magento\Payment\Test\Fixture\CreditCard;
+use Magento\Sales\Test\Fixture\OrderInjectable;
+
+/**
+ * Place order using PayPal Payments Pro Hosted Solution during one page checkout.
+ */
+class PlaceOrderWithHostedProStep implements TestStepInterface
+{
+    /**
+     * Onepage checkout page.
+     *
+     * @var CheckoutOnepage
+     */
+    private $checkoutOnepage;
+
+    /**
+     * Fixture factory.
+     *
+     * @var FixtureFactory
+     */
+    private $fixtureFactory;
+
+    /**
+     * Products fixtures.
+     *
+     * @var FixtureInterface[]
+     */
+    private $products;
+
+    /**
+     * Payment information.
+     *
+     * @var string
+     */
+    private $payment;
+
+    /**
+     * Credit card information.
+     *
+     * @var string
+     */
+    private $creditCard;
+
+    /**
+     * @param CheckoutOnepage $checkoutOnepage
+     * @param FixtureFactory $fixtureFactory
+     * @param CreditCard $creditCard
+     * @param array $payment
+     * @param array $products
+     */
+    public function __construct(
+        CheckoutOnepage $checkoutOnepage,
+        FixtureFactory $fixtureFactory,
+        CreditCard $creditCard,
+        array $payment,
+        array $products
+    ) {
+        $this->checkoutOnepage = $checkoutOnepage;
+        $this->fixtureFactory = $fixtureFactory;
+        $this->creditCard = $creditCard;
+        $this->payment = $payment;
+        $this->products = $products;
+    }
+
+    /**
+     * Place order with Hosted Pro.
+     *
+     * @return array
+     */
+    public function run()
+    {
+        $attempts = 1;
+        $this->checkoutOnepage->getPaymentBlock()->selectPaymentMethod($this->payment);
+        $this->checkoutOnepage->getPaymentBlock()->getSelectedPaymentMethodBlock()->clickPlaceOrder();
+        $this->checkoutOnepage->getHostedProBlock()->fillPaymentData($this->creditCard);
+        // As Paypal Sandbox is not stable there are three attempts given to place order
+        while ($this->checkoutOnepage->getHostedProBlock()->isErrorMessageVisible() && $attempts <= 3) {
+            $this->checkoutOnepage->getHostedProBlock()->fillPaymentData($this->creditCard);
+            $attempts++;
+        }
+        /** @var OrderInjectable $order */
+        $order = $this->fixtureFactory->createByCode(
+            'orderInjectable',
+            [
+                'data' => [
+                    'entity_id' => ['products' => $this->products]
+                ]
+            ]
+        );
+        return ['order' => $order];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/PlaceOrderWithPayflowLinkStep.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/PlaceOrderWithPayflowLinkStep.php
new file mode 100644
index 0000000000000000000000000000000000000000..926dabe9722b65e8c906cb18fb1a1e9df462dc4a
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/PlaceOrderWithPayflowLinkStep.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\TestStep;
+
+use Magento\Checkout\Test\Page\CheckoutOnepage;
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Mtf\TestStep\TestStepInterface;
+use Magento\Payment\Test\Fixture\CreditCard;
+use Magento\Sales\Test\Fixture\OrderInjectable;
+
+/**
+ * Place order using PayPal Payflow Link Solution during one page checkout.
+ */
+class PlaceOrderWithPayflowLinkStep implements TestStepInterface
+{
+    /**
+     * Onepage checkout page.
+     *
+     * @var CheckoutOnepage
+     */
+    private $checkoutOnepage;
+
+    /**
+     * Fixture factory.
+     *
+     * @var FixtureFactory
+     */
+    private $fixtureFactory;
+
+    /**
+     * Products fixtures.
+     *
+     * @var array
+     */
+    private $products;
+
+    /**
+     * Payment information.
+     *
+     * @var array
+     */
+    private $payment;
+
+    /**
+     * Credit card information.
+     *
+     * @var CreditCard
+     */
+    private $creditCard;
+
+    /**
+     * @param CheckoutOnepage $checkoutOnepage
+     * @param FixtureFactory $fixtureFactory
+     * @param CreditCard $creditCard
+     * @param array $payment
+     * @param array $products
+     */
+    public function __construct(
+        CheckoutOnepage $checkoutOnepage,
+        FixtureFactory $fixtureFactory,
+        CreditCard $creditCard,
+        array $payment,
+        array $products
+    ) {
+        $this->checkoutOnepage = $checkoutOnepage;
+        $this->fixtureFactory = $fixtureFactory;
+        $this->creditCard = $creditCard;
+        $this->payment = $payment;
+        $this->products = $products;
+    }
+
+    /**
+     * Place order with Payflow Link.
+     *
+     * @return array
+     */
+    public function run()
+    {
+        $this->checkoutOnepage->getPaymentBlock()->selectPaymentMethod($this->payment);
+        $this->checkoutOnepage->getPaymentBlock()->getSelectedPaymentMethodBlock()->clickPlaceOrder();
+        $this->checkoutOnepage->getPayflowLinkBlock()->fillPaymentData($this->creditCard);
+
+        /** @var OrderInjectable $order */
+        $order = $this->fixtureFactory->createByCode(
+            'orderInjectable',
+            [
+                'data' => [
+                    'entity_id' => ['products' => $this->products]
+                ]
+            ]
+        );
+        return ['order' => $order];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/PlaceOrderWithPaymentsAdvancedStep.php b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/PlaceOrderWithPaymentsAdvancedStep.php
new file mode 100644
index 0000000000000000000000000000000000000000..c39a742c07c091cad853bdf716e7e3122f7c0965
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestStep/PlaceOrderWithPaymentsAdvancedStep.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Paypal\Test\TestStep;
+
+use Magento\Checkout\Test\Page\CheckoutOnepage;
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Mtf\TestStep\TestStepInterface;
+use Magento\Payment\Test\Fixture\CreditCard;
+use Magento\Sales\Test\Fixture\OrderInjectable;
+
+/**
+ * Place order using PayPal Payments Advanced Solution during one page checkout.
+ */
+class PlaceOrderWithPaymentsAdvancedStep implements TestStepInterface
+{
+    /**
+     * Onepage checkout page.
+     *
+     * @var CheckoutOnepage
+     */
+    private $checkoutOnepage;
+
+    /**
+     * Fixture factory.
+     *
+     * @var FixtureFactory
+     */
+    private $fixtureFactory;
+
+    /**
+     * Products fixtures.
+     *
+     * @var array
+     */
+    private $products;
+
+    /**
+     * Payment information.
+     *
+     * @var array
+     */
+    private $payment;
+
+    /**
+     * Credit card information.
+     *
+     * @var CreditCard
+     */
+    private $creditCard;
+
+    /**
+     * @param CheckoutOnepage $checkoutOnepage
+     * @param FixtureFactory $fixtureFactory
+     * @param CreditCard $creditCard
+     * @param array $payment
+     * @param array $products
+     */
+    public function __construct(
+        CheckoutOnepage $checkoutOnepage,
+        FixtureFactory $fixtureFactory,
+        CreditCard $creditCard,
+        array $payment,
+        array $products
+    ) {
+        $this->checkoutOnepage = $checkoutOnepage;
+        $this->fixtureFactory = $fixtureFactory;
+        $this->creditCard = $creditCard;
+        $this->payment = $payment;
+        $this->products = $products;
+    }
+
+    /**
+     * Place order with Payments Advanced.
+     *
+     * @return array
+     */
+    public function run()
+    {
+        $this->checkoutOnepage->getPaymentBlock()->selectPaymentMethod($this->payment);
+        $this->checkoutOnepage->getPaymentBlock()->getSelectedPaymentMethodBlock()->clickPlaceOrder();
+        $this->checkoutOnepage->getPaymentsAdvancedBlock()->fillPaymentData($this->creditCard);
+
+        /** @var OrderInjectable $order */
+        $order = $this->fixtureFactory->createByCode(
+            'orderInjectable',
+            [
+                'data' => [
+                    'entity_id' => ['products' => $this->products]
+                ]
+            ]
+        );
+        return ['order' => $order];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/etc/testcase.xml
index 89cf35b73bc3ed292a152358fd5265a71d566983..e333b4b4ffefcf02ce59d632b9346831d974fb0b 100644
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/etc/testcase.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/etc/testcase.xml
@@ -13,7 +13,7 @@
         <step name="addProductsToTheCart" module="Magento_Checkout" next="proceedToCheckout" />
         <step name="proceedToCheckout" module="Magento_Checkout" next="createCustomer" />
         <step name="createCustomer" module="Magento_Customer" next="selectCheckoutMethod" />
-        <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress"/>
+        <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress" />
         <step name="fillShippingAddress" module="Magento_Checkout" next="fillShippingMethod" />
         <step name="fillShippingMethod" module="Magento_Checkout" next="selectPaymentMethod" />
         <step name="selectPaymentMethod" module="Magento_Checkout" next="continueToPaypalInContext" />
@@ -59,7 +59,7 @@
         <step name="selectPaymentMethod" module="Magento_Checkout" next="continueToPaypal" />
         <step name="continueToPaypal" module="Magento_Paypal" next="continuePaypalCheckout" />
         <step name="continuePaypalCheckout" module="Magento_Paypal" next="getPlacedOrderId" />
-        <step name="getPlacedOrderId" module="Magento_Paypal" />
+        <step name="getPlacedOrderId" module="Magento_Checkout" />
     </scenario>
     <scenario name="ConflictResolutionTest" firstStep="checkExpressConfig">
         <step name="checkExpressConfig" module="Magento_Paypal" next="checkBraintreeConfig" />
@@ -85,4 +85,58 @@
         <step name="saveCreditCardOnBackend" module="Magento_Vault" next="submitOrderNegative" />
         <step name="submitOrderNegative" module="Magento_Sales" />
     </scenario>
+    <scenario name="OnePageCheckoutHostedProTest" firstStep="setupConfiguration">
+        <step name="setupConfiguration" module="Magento_Config" next="createProducts" />
+        <step name="createProducts" module="Magento_Catalog" next="createTaxRule" />
+        <step name="createTaxRule" module="Magento_Tax" next="addProductsToTheCart" />
+        <step name="addProductsToTheCart" module="Magento_Checkout" next="proceedToCheckout" />
+        <step name="proceedToCheckout" module="Magento_Checkout" next="createCustomer" />
+        <step name="createCustomer" module="Magento_Customer" next="selectCheckoutMethod" />
+        <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress" />
+        <step name="fillShippingAddress" module="Magento_Checkout" next="fillShippingMethod" />
+        <step name="fillShippingMethod" module="Magento_Checkout" next="placeOrderWithHostedPro" />
+        <step name="placeOrderWithHostedPro" module="Magento_Paypal" next="getPlacedOrderId" />
+        <step name="getPlacedOrderId" module="Magento_Checkout" />
+    </scenario>
+    <scenario name="CloseSalesWithHostedProTest" firstStep="setupConfiguration">
+        <step name="setupConfiguration" module="Magento_Config" next="createProducts" />
+        <step name="createProducts" module="Magento_Catalog" next="createTaxRule" />
+        <step name="createTaxRule" module="Magento_Tax" next="addProductsToTheCart" />
+        <step name="addProductsToTheCart" module="Magento_Checkout" next="proceedToCheckout" />
+        <step name="proceedToCheckout" module="Magento_Checkout" next="createCustomer" />
+        <step name="createCustomer" module="Magento_Customer" next="selectCheckoutMethod" />
+        <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress"/>
+        <step name="fillShippingAddress" module="Magento_Checkout" next="fillShippingMethod" />
+        <step name="fillShippingMethod" module="Magento_Checkout" next="placeOrderWithHostedPro" />
+        <step name="placeOrderWithHostedPro" module="Magento_Paypal" next="getPlacedOrderId" />
+        <step name="getPlacedOrderId" module="Magento_Checkout" next="createInvoice" />
+        <step name="createInvoice" module="Magento_Sales" next="createShipment" />
+        <step name="createShipment" module="Magento_Sales" />
+    </scenario>
+    <scenario name="OnePageCheckoutPaymentsAdvancedTest" firstStep="setupConfiguration">
+        <step name="setupConfiguration" module="Magento_Config" next="createProducts" />
+        <step name="createProducts" module="Magento_Catalog" next="createTaxRule" />
+        <step name="createTaxRule" module="Magento_Tax" next="addProductsToTheCart" />
+        <step name="addProductsToTheCart" module="Magento_Checkout" next="proceedToCheckout" />
+        <step name="proceedToCheckout" module="Magento_Checkout" next="createCustomer" />
+        <step name="createCustomer" module="Magento_Customer" next="selectCheckoutMethod" />
+        <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress" />
+        <step name="fillShippingAddress" module="Magento_Checkout" next="fillShippingMethod" />
+        <step name="fillShippingMethod" module="Magento_Checkout" next="placeOrderWithPaymentsAdvanced" />
+        <step name="placeOrderWithPaymentsAdvanced" module="Magento_Paypal" next="getPlacedOrderId" />
+        <step name="getPlacedOrderId" module="Magento_Checkout" />
+    </scenario>
+    <scenario name="OnePageCheckoutPayflowLinkTest" firstStep="setupConfiguration">
+        <step name="setupConfiguration" module="Magento_Config" next="createProducts" />
+        <step name="createProducts" module="Magento_Catalog" next="createTaxRule" />
+        <step name="createTaxRule" module="Magento_Tax" next="addProductsToTheCart" />
+        <step name="addProductsToTheCart" module="Magento_Checkout" next="proceedToCheckout" />
+        <step name="proceedToCheckout" module="Magento_Checkout" next="createCustomer" />
+        <step name="createCustomer" module="Magento_Customer" next="selectCheckoutMethod" />
+        <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress" />
+        <step name="fillShippingAddress" module="Magento_Checkout" next="fillShippingMethod" />
+        <step name="fillShippingMethod" module="Magento_Checkout" next="placeOrderWithPayflowLink" />
+        <step name="placeOrderWithPayflowLink" module="Magento_Paypal" next="getPlacedOrderId" />
+        <step name="getPlacedOrderId" module="Magento_Checkout" />
+    </scenario>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/AbstractItems.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/AbstractItems.php
index d76461b9ae5f071d8dcdddc2c473ebba01698bfc..d7a89b68c553808cfdbb7de9854ce37e82464618 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/AbstractItems.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/AbstractItems.php
@@ -7,6 +7,7 @@
 namespace Magento\Sales\Test\Block\Adminhtml\Order;
 
 use Magento\Mtf\Block\Block;
+use Magento\Mtf\Client\ElementInterface;
 
 /**
  * Base Items block on Credit Memo, Invoice, Shipment view page.
@@ -18,56 +19,63 @@ class AbstractItems extends Block
      *
      * @var string
      */
-    protected $rowItem = 'tbody';
+    private $rowItem = 'tbody';
 
     /**
-     * Locator for "Product" column.
+     * Locator for product sku column.
      *
      * @var string
      */
-    protected $product = '.col-product';
+    private $sku = '.col-product .product-sku-block';
+
+    /**
+     * Locator for product title column.
+     *
+     * @var string
+     */
+    private $title = '.col-product .product-title';
 
     /**
      * Locator for "Price" column.
      *
      * @var string
      */
-    protected $price = '.col-price .price';
+    private $price = '.col-price .price';
 
     /**
      * Locator for "Qty" column.
      *
      * @var string
      */
-    protected $qty = '.col-qty';
+    private $qty = '.col-qty';
 
     /**
      * Locator for "Subtotal" column.
      *
      * @var string
      */
-    protected $subtotal = '.col-subtotal .price';
+    private $subtotal = '.col-subtotal .price';
 
     /**
      * Locator for "Tax Amount" column.
      *
      * @var string
      */
-    protected $taxAmount = '.col-tax .price';
+    private $taxAmount = '.col-tax .price';
 
     /**
      * Locator for "Discount Amount" column.
      *
      * @var string
      */
-    protected $discountAmount = '.col-discount .price';
+    private $discountAmount = '.col-discount .price';
 
     /**
      * Locator for "Row total" column.
      *
      * @var string
      */
-    protected $rowTotal = '.col-total .price';
+    private $rowTotal = '.col-total .price';
 
     /**
      * Get items data.
@@ -82,9 +90,10 @@ class AbstractItems extends Block
         foreach ($items as $item) {
             $itemData = [];
 
-            $itemData += $this->parseProductName($item->find($this->product)->getText());
+            $itemData['product'] = preg_replace('/\n|\r/', '', $item->find($this->title)->getText());
+            $itemData['sku'] = $this->getSku($item);
             $itemData['price'] = $this->escapePrice($item->find($this->price)->getText());
-            $itemData['qty'] = $item->find($this->qty)->getText();
+            $itemData['qty'] = $this->getQty($item);
             $itemData['subtotal'] = $this->escapePrice($item->find($this->subtotal)->getText());
             $itemData['tax'] = $this->escapePrice($item->find($this->taxAmount)->getText());
             $itemData['discount'] = $this->escapePrice($item->find($this->discountAmount)->getText());
@@ -97,18 +106,33 @@ class AbstractItems extends Block
     }
 
     /**
-     * Parse product name to title and sku product.
+     * Get product quantity.
      *
-     * @param string $product
-     * @return array
+     * @param ElementInterface $item
+     * @return null|int
+     */
+    private function getQty(ElementInterface $item)
+    {
+        $qty = null;
+        $elements = $item->getElements($this->qty);
+        foreach ($elements as $element) {
+            $qty += (int) $element->getText();
+        }
+        return $qty;
+    }
+
+    /**
+     * Get product SKU.
+     *
+     * @param ElementInterface $item
+     * @return string
      */
-    protected function parseProductName($product)
+    private function getSku(ElementInterface $item)
     {
-        $data = array_map('trim', explode('SKU:', str_replace("\n", '', $product)));
-        return [
-            'product' => $data[0],
-            'sku' => isset($data[1]) ? $data[1] : ''
-        ];
+        $itemContent = $item->find($this->sku)->getText();
+        $itemContent = preg_replace('/\n|\r/', '', $itemContent);
+        $itemContent = str_replace('SKU: ', '', $itemContent);
+        return $itemContent;
     }
 
     /**
@@ -117,7 +141,7 @@ class AbstractItems extends Block
      * @var string $price
      * @return string
      */
-    protected function escapePrice($price)
+    private function escapePrice($price)
     {
         return preg_replace('[^0-9\.]', '', $price);
     }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Method.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Method.php
index 8477af0087fd47e07b8fee3e6c5138c690369d05..0d443eb1db9ff3c5e3eee8a4efcaffbea5d44df9 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Method.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Method.php
@@ -7,8 +7,8 @@
 namespace Magento\Sales\Test\Block\Adminhtml\Order\Create\Billing;
 
 use Magento\Mtf\Block\Block;
-use Magento\Mtf\Fixture\InjectableFixture;
 use Magento\Mtf\Client\Locator;
+use Magento\Payment\Test\Fixture\CreditCard;
 
 /**
  * Adminhtml sales order create payment method block.
@@ -20,66 +20,60 @@ class Method extends Block
      *
      * @var string
      */
-    protected $paymentMethod = '#p_method_%s';
+    private $paymentMethod = '#p_method_%s';
 
     /**
      * Purchase order number selector.
      *
      * @var string
      */
-    protected $purchaseOrderNumber = '#po_number';
-
-    /**
-     * Payment form.
-     *
-     * @var string
-     */
-    protected $paymentForm = '#payment_form_%s';
+    private $purchaseOrderNumber = '#po_number';
 
     /**
      * Magento loader selector.
      *
      * @var string
      */
-    protected $loader = '[data-role=loader]';
+    private $loader = '[data-role=loader]';
 
     /**
      * Field with Mage error.
      *
      * @var string
      */
-    protected $mageErrorField = '//fieldset/*[contains(@class,"field ")][.//*[contains(@class,"error")]]';
+    private $mageErrorField = './/*[contains(@name, "payment[")]/following-sibling::label[@class="mage-error"]';
 
     /**
-     * Mage error text.
+     * Error label preceding field of credit card form.
      *
      * @var string
      */
-    protected $mageErrorText = './/label[contains(@class,"error")]';
+    private $errorLabelPrecedingField = './preceding-sibling::*[1][contains(@name, "payment")]';
 
     /**
      * Select payment method.
      *
-     * @param array $paymentCode
-     * @param InjectableFixture|null $creditCard
+     * @param array $payment
+     * @param CreditCard|null $creditCard
+     * @return void
      */
-    public function selectPaymentMethod(array $paymentCode, InjectableFixture $creditCard = null)
+    public function selectPaymentMethod(array $payment, CreditCard $creditCard = null)
     {
-        $paymentInput = $this->_rootElement->find(sprintf($this->paymentMethod, $paymentCode['method']));
+        $paymentMethod = $payment['method'];
+        $paymentInput = $this->_rootElement->find(sprintf($this->paymentMethod, $paymentMethod));
         if ($paymentInput->isVisible()) {
             $paymentInput->click();
             $this->waitForElementNotVisible($this->loader);
         }
-        if (isset($paymentCode['po_number'])) {
-            $this->_rootElement->find($this->purchaseOrderNumber)->setValue($paymentCode['po_number']);
+        if (isset($payment['po_number'])) {
+            $this->_rootElement->find($this->purchaseOrderNumber)->setValue($payment['po_number']);
         }
         if ($creditCard !== null) {
-            $class = explode('\\', get_class($creditCard));
-            $module = $class[1];
-            /** @var \Magento\Payment\Test\Block\Form\Cc $formBlock */
+            $module = $creditCard->hasData('payment_code') ? ucfirst($creditCard->getPaymentCode()) : 'Payment';
+            /** @var \Magento\Payment\Test\Block\Form\PaymentCc $formBlock */
             $formBlock = $this->blockFactory->create(
-                "\\Magento\\{$module}\\Test\\Block\\Form\\Cc",
-                ['element' => $this->_rootElement->find('#payment_form_' . $paymentCode['method'])]
+                "\\Magento\\{$module}\\Test\\Block\\Form\\{$module}Cc",
+                ['element' => $this->_rootElement->find('#payment_form_' . $paymentMethod)]
             );
             $formBlock->fill($creditCard);
         }
@@ -92,10 +86,9 @@ class Method extends Block
     {
         $data = [];
         $elements = $this->_rootElement->getElements($this->mageErrorField, Locator::SELECTOR_XPATH);
-        foreach ($elements as $element) {
-            $error = $element->find($this->mageErrorText, Locator::SELECTOR_XPATH);
+        foreach ($elements as $error) {
             if ($error->isVisible()) {
-                $label = $element->find('.//*[contains(@name,"payment")]', Locator::SELECTOR_XPATH);
+                $label = $error->find($this->errorLabelPrecedingField, Locator::SELECTOR_XPATH);
                 $label = $label->getAttribute('name');
                 $label = preg_replace('/payment\[(.*)\]/u', '$1', $label);
                 $data[$label] = $error->getText();
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Invoice/Totals.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Invoice/Totals.php
index b6b14670c0f56ce8c6439c26fb606b2c35e85dc9..3433447222ccbbd92ee75f161c2c4f24dfb453c1 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Invoice/Totals.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Invoice/Totals.php
@@ -28,6 +28,13 @@ class Totals extends \Magento\Sales\Test\Block\Adminhtml\Order\Totals
      */
     protected $capture = '[name="invoice[capture_case]"]';
 
+    /**
+     * Offline capture text message selector.
+     *
+     * @var string
+     */
+    private $captureOfflineMessage = './/input[@value="offline"]/following-sibling::div[1]';
+
     /**
      * Submit invoice
      *
@@ -58,4 +65,15 @@ class Totals extends \Magento\Sales\Test\Block\Adminhtml\Order\Totals
     {
         $this->_rootElement->find($this->capture, Locator::SELECTOR_CSS, 'select')->setValue($option);
     }
+
+    /**
+     * Get message that invoice can be created only offline.
+     *
+     * @return null|string
+     */
+    public function getCaptureOfflineMessage()
+    {
+        $captureCaseMessage = $this->_rootElement->find($this->captureOfflineMessage, Locator::SELECTOR_XPATH);
+        return $captureCaseMessage->isVisible() ? $captureCaseMessage->getText() : null;
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/OrderForm.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/OrderForm.php
index 757a025605b9b69271e33848a019dd299f6034d9..2261257ca70fe093db941bca8a693d34ce813ae4 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/OrderForm.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/OrderForm.php
@@ -7,30 +7,11 @@
 namespace Magento\Sales\Test\Block\Adminhtml\Order\View;
 
 use Magento\Backend\Test\Block\Widget\FormTabs;
-use Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info as OrderInformationBlock;
 
 /**
- * Order view tabs
+ * Order view tabs.
  */
 class OrderForm extends FormTabs
 {
-    /**
-     * Order information block.
-     *
-     * @var string
-     */
-    protected $orderInfoBlock = '[data-ui-id="sales-order-tabs-tab-content-order-info"]';
-
-    /**
-     * Get order information block.
-     *
-     * @return OrderInformationBlock
-     */
-    public function getOrderInfoBlock()
-    {
-        return $this->blockFactory->create(
-            \Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info::class,
-            ['element' => $this->_rootElement->find($this->orderInfoBlock)]
-        );
-    }
+    //
 }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/OrderForm.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/OrderForm.xml
index 383dfb8b7b6aade39bf531312101387fc5c9bac7..0a5aa8e1993a8e84963b981849f18b19a8a22372 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/OrderForm.xml
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/OrderForm.xml
@@ -6,6 +6,11 @@
  */
 -->
 <tabs>
+    <info>
+        <class>Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info</class>
+        <selector>#sales_order_view_tabs_order_info</selector>
+        <strategy>css selector</strategy>
+    </info>
     <invoices>
         <class>Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Invoices</class>
         <selector>#sales_order_view_tabs_order_invoices</selector>
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Info.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Info.php
index 50c5a077e9b5511bd98d15306a5f3de15f6ad6a0..146e3facccb6196f154af1487053f8e8b17e1991 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Info.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Info.php
@@ -6,22 +6,30 @@
 
 namespace Magento\Sales\Test\Block\Adminhtml\Order\View\Tab;
 
-use Magento\Mtf\Block\Block;
+use Magento\Backend\Test\Block\Widget\Tab;
+use Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info\PaymentInfoBlock;
 
 /**
  * Order information tab block.
  */
-class Info extends Block
+class Info extends Tab
 {
     /**
-     * Order status selector
+     * Order status selector.
      *
      * @var string
      */
     protected $orderStatus = '#order_status';
 
     /**
-     * Get order status from info block
+     * Selector for 'Payment Information' block.
+     *
+     * @var string
+     */
+    private $paymentInfoBlockSelector = '.order-payment-method';
+
+    /**
+     * Get order status from info block.
      *
      * @return array|string
      */
@@ -29,4 +37,17 @@ class Info extends Block
     {
         return $this->_rootElement->find($this->orderStatus)->getText();
     }
+
+    /**
+     * Returns Payment Information block.
+     *
+     * @return PaymentInfoBlock
+     */
+    public function getPaymentInfoBlock()
+    {
+        return $this->blockFactory->create(
+            PaymentInfoBlock::class,
+            ['element' => $this->_rootElement->find($this->paymentInfoBlockSelector)]
+        );
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Info/PaymentInfoBlock.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Info/PaymentInfoBlock.php
new file mode 100644
index 0000000000000000000000000000000000000000..818a9b9717cb989c5b352dfed121525f2b7bc4c3
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Info/PaymentInfoBlock.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info;
+
+use Magento\Mtf\Block\Block;
+
+/**
+ * Order payment information block.
+ */
+class PaymentInfoBlock extends Block
+{
+    /**
+     * Payment info row selector.
+     *
+     * @var string
+     */
+    private $info = 'tr';
+
+    /**
+     * Get payment information block data.
+     *
+     * @return array
+     */
+    public function getData()
+    {
+        $result = [];
+        $elements = $this->_rootElement->getElements($this->info);
+        foreach ($elements as $row) {
+            $key = rtrim($row->find('th')->getText(), ':');
+            $value = $row->find('td')->getText();
+            $result[$key] = $value;
+        }
+
+        return $result;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Invoices/Grid.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Invoices/Grid.php
index 4b3768295799695fbb45db1a17e75acb193b91f7..41fbd8979b58df8fb58f000e3ea79e0f289344c4 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Invoices/Grid.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Invoices/Grid.php
@@ -25,6 +25,13 @@ class Grid extends \Magento\Ui\Test\Block\Adminhtml\DataGrid
      */
     protected $invoiceId = 'tbody td:nth-child(2)';
 
+    /**
+     * Invoices data grid loader locator.
+     *
+     * @var string
+     */
+    protected $loader = '[data-component="sales_order_view_invoice_grid"]';
+
     /**
      * Filters array mapping.
      *
@@ -57,6 +64,7 @@ class Grid extends \Magento\Ui\Test\Block\Adminhtml\DataGrid
     public function getIds()
     {
         $result = [];
+        $this->waitForElementNotVisible($this->loader);
         $invoiceIds = $this->_rootElement->getElements($this->invoiceId);
         foreach ($invoiceIds as $invoiceId) {
             $result[] = trim($invoiceId->getText());
@@ -72,6 +80,7 @@ class Grid extends \Magento\Ui\Test\Block\Adminhtml\DataGrid
      */
     public function viewInvoice()
     {
+        $this->waitForElementNotVisible($this->loader);
         $this->_rootElement->find($this->invoiceId)->click();
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AbstractAssertItems.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AbstractAssertItems.php
index 26978343fb2c26336e3e9902f46ca730a54ce6d8..fc9bd8275d650f19bedfebec0fe3f52c836d0623 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AbstractAssertItems.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AbstractAssertItems.php
@@ -6,25 +6,25 @@
 
 namespace Magento\Sales\Test\Constraint;
 
-use Magento\Catalog\Test\Fixture\CatalogProductSimple;
-use Magento\Sales\Test\Fixture\OrderInjectable;
+use Magento\Checkout\Test\Fixture\Cart;
 use Magento\Mtf\Constraint\AbstractAssertForm;
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Sales\Test\Fixture\OrderInjectable;
 
 /**
- * Class AbstractAssertArchiveItems
- * Assert items represented in order's entity view page
+ * Assert items represented in order's entity view page.
  */
 abstract class AbstractAssertItems extends AbstractAssertForm
 {
     /**
-     * Key for sort data
+     * Key for sort data.
      *
      * @var string
      */
     protected $sortKey = "::sku";
 
     /**
-     * List compare fields
+     * List compare fields.
      *
      * @var array
      */
@@ -35,25 +35,29 @@ abstract class AbstractAssertItems extends AbstractAssertForm
     ];
 
     /**
-     * Prepare order products
+     * Prepare order products.
      *
      * @param OrderInjectable $order
      * @param array|null $data [optional]
+     * @param Cart|null $cart [optional]
      * @return array
      */
-    protected function prepareOrderProducts(OrderInjectable $order, array $data = null)
+    protected function prepareOrderProducts(OrderInjectable $order, array $data = null, Cart $cart = null)
     {
-        $products = $order->getEntityId()['products'];
         $productsData = [];
-
-        /** @var CatalogProductSimple $product */
-        foreach ($products as $key => $product) {
+        if ($cart === null) {
+            $cart['data']['items'] = ['products' => $order->getEntityId()['products']];
+            $fixtureFactory = $this->objectManager->create(FixtureFactory::class);
+            $cart = $fixtureFactory->createByCode('cart', $cart);
+        }
+        /** @var \Magento\Catalog\Test\Fixture\Cart\Item $item */
+        foreach ($cart->getItems() as $key => $item) {
             $productsData[] = [
-                'product' => $product->getName(),
-                'sku' => $product->getSku(),
+                'product' => $item->getData()['name'],
+                'sku' => $item->getData()['sku'],
                 'qty' => (isset($data[$key]['qty']) && $data[$key]['qty'] != '-')
                     ? $data[$key]['qty']
-                    : $product->getCheckoutData()['qty'],
+                    : $item->getData()['qty'],
             ];
         }
 
@@ -61,7 +65,7 @@ abstract class AbstractAssertItems extends AbstractAssertForm
     }
 
     /**
-     * Prepare invoice data
+     * Prepare invoice data.
      *
      * @param array $itemsData
      * @return array
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertAuthorizationInCommentsHistory.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertAuthorizationInCommentsHistory.php
index a6b8e8983d2b617953b93490dc4c3a3e1079cec2..8b34837bc8df3efe77a348070abdcf12de71ac7f 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertAuthorizationInCommentsHistory.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertAuthorizationInCommentsHistory.php
@@ -6,8 +6,8 @@
 
 namespace Magento\Sales\Test\Constraint;
 
-use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
 use Magento\Sales\Test\Page\Adminhtml\OrderIndex;
+use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
 use Magento\Mtf\Constraint\AbstractConstraint;
 
 /**
@@ -16,9 +16,9 @@ use Magento\Mtf\Constraint\AbstractConstraint;
 class AssertAuthorizationInCommentsHistory extends AbstractConstraint
 {
     /**
-     * Message about authorized amount in order.
+     * Pattern of message about authorized amount in order.
      */
-    const AUTHORIZED_AMOUNT = 'Authorized amount of $';
+    const AUTHORIZED_AMOUNT_PATTERN = '/(IPN "Pending" )*Authorized amount of \w*\W{1,2}%s. Transaction ID: "[\w\-]*"/';
 
     /**
      * Assert that comment about authorized amount exist in Comments History section on order page in Admin.
@@ -37,11 +37,10 @@ class AssertAuthorizationInCommentsHistory extends AbstractConstraint
     ) {
         $salesOrder->open();
         $salesOrder->getSalesOrderGrid()->searchAndOpen(['id' => $orderId]);
-
         $actualAuthorizedAmount = $salesOrderView->getOrderHistoryBlock()->getAuthorizedAmount();
 
-        \PHPUnit_Framework_Assert::assertContains(
-            self::AUTHORIZED_AMOUNT . $prices['grandTotal'],
+        \PHPUnit_Framework_Assert::assertRegExp(
+            sprintf(self::AUTHORIZED_AMOUNT_PATTERN, $prices['grandTotal']),
             $actualAuthorizedAmount,
             'Incorrect authorized amount value for the order #' . $orderId
         );
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertCaptureInCommentsHistory.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertCaptureInCommentsHistory.php
index c46a161cc63723b6fc4d2376e6f3160ed5e7eb54..90e0e7b091a11f51c04e8f719b3e1b4382080d61 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertCaptureInCommentsHistory.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertCaptureInCommentsHistory.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Sales\Test\Constraint;
 
+use Magento\Sales\Test\Fixture\OrderInjectable;
 use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
 use Magento\Sales\Test\Page\Adminhtml\OrderIndex;
 use Magento\Mtf\Constraint\AbstractConstraint;
@@ -16,9 +17,9 @@ use Magento\Mtf\Constraint\AbstractConstraint;
 class AssertCaptureInCommentsHistory extends AbstractConstraint
 {
     /**
-     * Message about captured amount in order.
+     * Pattern of message about captured amount in order.
      */
-    const CAPTURED_AMOUNT = 'Captured amount of $';
+    const CAPTURED_AMOUNT_PATTERN = '/^Captured amount of \w*\W{1,2}%s online. Transaction ID: "[\w\-]*"/';
 
     /**
      * Assert that comment about captured amount exist in Comments History section on order page in Admin.
@@ -40,8 +41,8 @@ class AssertCaptureInCommentsHistory extends AbstractConstraint
 
         $actualCapturedAmount = $salesOrderView->getOrderHistoryBlock()->getCapturedAmount();
         foreach ($capturedPrices as $key => $capturedPrice) {
-            \PHPUnit_Framework_Assert::assertContains(
-                self::CAPTURED_AMOUNT . $capturedPrice,
+            \PHPUnit_Framework_Assert::assertRegExp(
+                sprintf(self::CAPTURED_AMOUNT_PATTERN, $capturedPrice),
                 $actualCapturedAmount[$key],
                 'Incorrect captured amount value for the order #' . $orderId
             );
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceItems.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceItems.php
index 9b43a3917aac199a5dc2e2255f6db5e2eb615dc6..cbcb725df05ffb0516497847f26440ee3f0790d7 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceItems.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceItems.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Sales\Test\Constraint;
 
+use Magento\Checkout\Test\Fixture\Cart;
 use Magento\Sales\Test\Fixture\OrderInjectable;
 use Magento\Sales\Test\Page\Adminhtml\InvoiceIndex;
 use Magento\Sales\Test\Page\Adminhtml\SalesInvoiceView;
@@ -23,6 +24,7 @@ class AssertInvoiceItems extends AbstractAssertItems
      * @param OrderInjectable $order
      * @param array $ids
      * @param array|null $data [optional]
+     * @param Cart|null $cart [optional]
      * @return void
      */
     public function processAssert(
@@ -30,10 +32,11 @@ class AssertInvoiceItems extends AbstractAssertItems
         SalesInvoiceView $salesInvoiceView,
         OrderInjectable $order,
         array $ids,
-        array $data = null
+        array $data = null,
+        Cart $cart = null
     ) {
         $orderId = $order->getId();
-        $productsData = $this->prepareOrderProducts($order, $data['items_data']);
+        $productsData = $this->prepareOrderProducts($order, $data['items_data'], $cart);
         foreach ($ids['invoiceIds'] as $invoiceId) {
             $filter = [
                 'order_id' => $orderId,
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOnlineInvoiceCannotBeCreated.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOnlineInvoiceCannotBeCreated.php
new file mode 100644
index 0000000000000000000000000000000000000000..437dc8cc1be280f2edfd46baac79cad24e5748c0
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOnlineInvoiceCannotBeCreated.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Sales\Test\Constraint;
+
+use Magento\Sales\Test\Page\Adminhtml\OrderInvoiceNew;
+use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
+use Magento\Sales\Test\Page\Adminhtml\OrderIndex;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Assert message that invoice can be created only offline is present.
+ */
+class AssertOnlineInvoiceCannotBeCreated extends AbstractConstraint
+{
+    /**
+     * Message that invoice can be created only offline.
+     */
+    const OFFLINE_INVOICE_MESSAGE = 'The invoice will be created offline without the payment gateway.';
+
+    /**
+     * Assert message that invoice can be created only offline is present.
+     *
+     * @param SalesOrderView $salesOrderView
+     * @param OrderIndex $salesOrder
+     * @param OrderInvoiceNew $orderInvoiceNew
+     * @param string $orderId
+     * @return void
+     */
+    public function processAssert(
+        SalesOrderView $salesOrderView,
+        OrderIndex $salesOrder,
+        OrderInvoiceNew $orderInvoiceNew,
+        $orderId
+    ) {
+        $salesOrder->open();
+        $salesOrder->getSalesOrderGrid()->searchAndOpen(['id' => $orderId]);
+        $salesOrderView->getPageActions()->invoice();
+
+        \PHPUnit_Framework_Assert::assertEquals(
+            self::OFFLINE_INVOICE_MESSAGE,
+            $orderInvoiceNew->getTotalsBlock()->getCaptureOfflineMessage(),
+            'Message incorrect or is not present.'
+        );
+    }
+
+    /**
+     * Returns string representation of successful assertion.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return "Message that invoice can be created only offline is present.";
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderGrandTotal.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderGrandTotal.php
index 4c30d5f68d208a2b53f54fd7607f7fec276c7c63..1de6de50612481e6bd90b209fcef59e5b3f68706 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderGrandTotal.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderGrandTotal.php
@@ -6,29 +6,29 @@
 
 namespace Magento\Sales\Test\Constraint;
 
-use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
 use Magento\Sales\Test\Page\Adminhtml\OrderIndex;
+use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
 use Magento\Mtf\Constraint\AbstractConstraint;
 
 /**
- * Assert that Order Grand Total is correct on order page in backend
+ * Assert that Order Grand Total is correct on order page in Admin.
  */
 class AssertOrderGrandTotal extends AbstractConstraint
 {
     /**
-     * Assert that Order Grand Total is correct on order page in backend
+     * Assert that Order Grand Total is correct on order page in Admin.
      *
      * @param SalesOrderView $salesOrderView
-     * @param string $orderId
      * @param OrderIndex $salesOrder
      * @param array $prices
+     * @param string $orderId
      * @return void
      */
     public function processAssert(
         SalesOrderView $salesOrderView,
         OrderIndex $salesOrder,
-        $orderId,
-        array $prices
+        array $prices,
+        $orderId
     ) {
         $salesOrder->open();
         $salesOrder->getSalesOrderGrid()->searchAndOpen(['id' => $orderId]);
@@ -41,7 +41,7 @@ class AssertOrderGrandTotal extends AbstractConstraint
     }
 
     /**
-     * Returns a string representation of the object
+     * Returns a string representation of the object.
      *
      * @return string
      */
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderPaymentInformation.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderPaymentInformation.php
new file mode 100644
index 0000000000000000000000000000000000000000..18119ddbf95d6864311e750bd6844ba43062c73b
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderPaymentInformation.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Sales\Test\Constraint;
+
+use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\Sales\Test\Fixture\OrderInjectable;
+use Magento\Sales\Test\Page\Adminhtml\OrderIndex;
+use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
+
+/**
+ * Assert that payment information is valid and matches with expected values.
+ */
+class AssertOrderPaymentInformation extends AbstractConstraint
+{
+    /**
+     * Assert that payment information is valid and matches with expected values.
+     *
+     * @param OrderInjectable $order
+     * @param OrderIndex $orderIndex
+     * @param SalesOrderView $salesOrderView
+     * @param array $paymentInfo
+     * @return void
+     */
+    public function processAssert(
+        OrderInjectable $order,
+        OrderIndex $orderIndex,
+        SalesOrderView $salesOrderView,
+        array $paymentInfo
+    ) {
+        $orderIndex->open();
+        $orderIndex->getSalesOrderGrid()->searchAndOpen(['id' => $order->getId()]);
+        /** @var \Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info $infoTab */
+        $infoTab = $salesOrderView->getOrderForm()->openTab('info')->getTab('info');
+        $actualPaymentInformation = $infoTab->getPaymentInfoBlock()->getData();
+
+        \PHPUnit_Framework_Assert::assertEmpty(
+            array_diff($paymentInfo, $actualPaymentInformation),
+            'Payment Information missmatch with expected values.'
+        );
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Payment Information valid and matches with expected values.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusIsCorrect.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusIsCorrect.php
index 056e97c1b62626e0e10352d1bae9a078dea9021d..3623de40b06f165bf4f891d19d379f4d9104f336 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusIsCorrect.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusIsCorrect.php
@@ -11,13 +11,12 @@ use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
 use Magento\Mtf\Constraint\AbstractConstraint;
 
 /**
- * Class AssertOrderStatusIsCorrect
- * Assert that status is correct on order page in backend (same with value of orderStatus variable)
+ * Assert that status is correct on order page in admin panel (same with value of orderStatus variable).
  */
 class AssertOrderStatusIsCorrect extends AbstractConstraint
 {
     /**
-     * Assert that status is correct on order page in backend (same with value of orderStatus variable)
+     * Assert that status is correct on order page in admin panel (same with value of orderStatus variable).
      *
      * @param string $status
      * @param string $orderId
@@ -37,14 +36,16 @@ class AssertOrderStatusIsCorrect extends AbstractConstraint
         $salesOrder->getSalesOrderGrid()->searchAndOpen(['id' => $orderId]);
         $orderStatus = $statusToCheck == null ? $status : $statusToCheck;
 
+        /** @var \Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info $infoTab */
+        $infoTab = $salesOrderView->getOrderForm()->openTab('info')->getTab('info');
         \PHPUnit_Framework_Assert::assertEquals(
-            $salesOrderView->getOrderForm()->getOrderInfoBlock()->getOrderStatus(),
+            $infoTab->getOrderStatus(),
             $orderStatus
         );
     }
 
     /**
-     * Returns a string representation of the object
+     * Returns a string representation of the object.
      *
      * @return string
      */
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundInCommentsHistory.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundInCommentsHistory.php
index 9cbb7b2c9ebbb684fcccbde61c7fc5e9bf82cee4..c0ce2a87fc1c3f62b1a934852c206358a3e76760 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundInCommentsHistory.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundInCommentsHistory.php
@@ -16,9 +16,9 @@ use Magento\Mtf\Constraint\AbstractConstraint;
 class AssertRefundInCommentsHistory extends AbstractConstraint
 {
     /**
-     * Message about refunded amount in order.
+     * Pattern of message about refunded amount in order.
      */
-    const REFUNDED_AMOUNT = 'We refunded $';
+    const REFUNDED_AMOUNT_PATTERN = '/^We refunded \w*\W{1,2}%s online. Transaction ID: "[\w\-]*"/';
 
     /**
      * Assert that comment about refunded amount exist in Comments History section on order page in Admin.
@@ -40,8 +40,8 @@ class AssertRefundInCommentsHistory extends AbstractConstraint
 
         $actualRefundedAmount = $salesOrderView->getOrderHistoryBlock()->getRefundedAmount();
         foreach ($refundedPrices as $key => $refundedPrice) {
-            \PHPUnit_Framework_Assert::assertContains(
-                self::REFUNDED_AMOUNT . $refundedPrice,
+            \PHPUnit_Framework_Assert::assertRegExp(
+                sprintf(self::REFUNDED_AMOUNT_PATTERN, $refundedPrice),
                 $actualRefundedAmount[$key],
                 'Incorrect refunded amount value for the order #' . $orderId
             );
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundOrderStatusInCommentsHistory.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundOrderStatusInCommentsHistory.php
index 89faffc8ec0729082c81839ccd4762fdc335a8f3..557e29a0b9830200381f7651e3807cff39247040 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundOrderStatusInCommentsHistory.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundOrderStatusInCommentsHistory.php
@@ -11,7 +11,7 @@ use Magento\Mtf\Constraint\AbstractConstraint;
 use Magento\Sales\Test\Fixture\OrderInjectable;
 
 /**
- * Class AssertRefundOrderStatusInCommentsHistory
+ * Assert that comment about refunded amount exist in Comments History section on order page in Admin.
  */
 class AssertRefundOrderStatusInCommentsHistory extends AbstractConstraint
 {
@@ -30,8 +30,11 @@ class AssertRefundOrderStatusInCommentsHistory extends AbstractConstraint
     ) {
         $salesOrder->open();
         $salesOrder->getSalesOrderGrid()->searchAndOpen(['id' => $order->getId()]);
+
+        /** @var \Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info $infoTab */
+        $infoTab = $salesOrderView->getOrderForm()->openTab('info')->getTab('info');
         \PHPUnit_Framework_Assert::assertContains(
-            $salesOrderView->getOrderForm()->getOrderInfoBlock()->getOrderStatus(),
+            $infoTab->getOrderStatus(),
             $salesOrderView->getOrderHistoryBlock()->getStatus()
         );
     }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertReorderStatusIsCorrect.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertReorderStatusIsCorrect.php
index 804c607814a3da0cf081cbd9b5fa1b34617d0988..9c034d2ea7085d3aa35bfe5cf06af42edcd672a1 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertReorderStatusIsCorrect.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertReorderStatusIsCorrect.php
@@ -12,13 +12,12 @@ use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
 use Magento\Mtf\Constraint\AbstractConstraint;
 
 /**
- * Class AssertReorderStatusIsCorrect
- * Assert that status is correct on order page in backend
+ * Assert that status is correct on order page in admin panel.
  */
 class AssertReorderStatusIsCorrect extends AbstractConstraint
 {
     /**
-     * Assert that status is correct on order page in backend (same with value of orderStatus variable)
+     * Assert that status is correct on order page in admin panel (same with value of orderStatus variable).
      *
      * @param string $previousOrderStatus
      * @param OrderInjectable $order
@@ -35,15 +34,17 @@ class AssertReorderStatusIsCorrect extends AbstractConstraint
         $salesOrder->open();
         $salesOrder->getSalesOrderGrid()->searchAndOpen(['id' => $order->getId()]);
 
+        /** @var \Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info $infoTab */
+        $infoTab = $salesOrderView->getOrderForm()->openTab('info')->getTab('info');
         \PHPUnit_Framework_Assert::assertEquals(
             $previousOrderStatus,
-            $salesOrderView->getOrderForm()->getOrderInfoBlock()->getOrderStatus(),
+            $infoTab->getOrderStatus(),
             'Order status is incorrect on order page in backend.'
         );
     }
 
     /**
-     * Returns a string representation of the object
+     * Returns a string representation of the object.
      *
      * @return string
      */
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/AddProductsStep.php b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/AddProductsStep.php
index 594f7098e45592f61ba83544f80a742f9eeb5b2e..0caeb235119c86debf0cc6de86e69cbb0f6b3883 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/AddProductsStep.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/AddProductsStep.php
@@ -6,44 +6,55 @@
 
 namespace Magento\Sales\Test\TestStep;
 
+use Magento\Mtf\Fixture\FixtureFactory;
 use Magento\Sales\Test\Page\Adminhtml\OrderCreateIndex;
 use Magento\Mtf\TestStep\TestStepInterface;
 
 /**
- * Class AddProductsStep
- * Add Products Step
+ * Add Products Step.
  */
 class AddProductsStep implements TestStepInterface
 {
     /**
-     * Sales order create index page
+     * Sales order create index page.
      *
      * @var OrderCreateIndex
      */
-    protected $orderCreateIndex;
+    private $orderCreateIndex;
 
     /**
-     * Array products
+     * Array products.
      *
      * @var array
      */
-    protected $products;
+    private $products;
+
+    /**
+     * Fixture factory.
+     *
+     * @var FixtureFactory
+     */
+    private $fixtureFactory;
 
     /**
-     * @constructor
      * @param OrderCreateIndex $orderCreateIndex
+     * @param FixtureFactory $fixtureFactory
      * @param array $products
      */
-    public function __construct(OrderCreateIndex $orderCreateIndex, array $products)
-    {
+    public function __construct(
+        OrderCreateIndex $orderCreateIndex,
+        FixtureFactory $fixtureFactory,
+        array $products
+    ) {
         $this->orderCreateIndex = $orderCreateIndex;
         $this->products = $products;
+        $this->fixtureFactory = $fixtureFactory;
     }
 
     /**
-     * Add product to sales
+     * Add product to sales.
      *
-     * @return void
+     * @return array
      */
     public function run()
     {
@@ -58,5 +69,8 @@ class AddProductsStep implements TestStepInterface
         }
         $createBlock->addSelectedProductsToOrder();
         $createBlock->getTemplateBlock()->waitLoader();
+
+        $cart['data']['items'] = ['products' => $this->products];
+        return ['cart' => $this->fixtureFactory->createByCode('cart', $cart)];
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/SelectPaymentMethodForOrderStep.php b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/SelectPaymentMethodForOrderStep.php
index c05dfc4fac2dcbb8bea98ec39c705c9ff419e559..fa0a62d79625e1e23602aed9f37ab153f8d2ee76 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/SelectPaymentMethodForOrderStep.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/SelectPaymentMethodForOrderStep.php
@@ -6,7 +6,6 @@
 
 namespace Magento\Sales\Test\TestStep;
 
-use Magento\Mtf\Fixture\FixtureFactory;
 use Magento\Sales\Test\Page\Adminhtml\OrderCreateIndex;
 use Magento\Mtf\TestStep\TestStepInterface;
 use Magento\Payment\Test\Fixture\CreditCard;
@@ -38,29 +37,22 @@ class SelectPaymentMethodForOrderStep implements TestStepInterface
     private $creditCard;
 
     /**
-     * @constructor
      * @param OrderCreateIndex $orderCreateIndex
      * @param array $payment
-     * @param FixtureFactory $fixtureFactory
-     * @param string $creditCardClass
-     * @param array|CreditCard|null $creditCard
+     * @param CreditCard|null $creditCard
      */
     public function __construct(
         OrderCreateIndex $orderCreateIndex,
         array $payment,
-        FixtureFactory $fixtureFactory,
-        $creditCardClass = 'credit_card',
-        array $creditCard = null
+        CreditCard $creditCard = null
     ) {
         $this->orderCreateIndex = $orderCreateIndex;
         $this->payment = $payment;
-        if (isset($creditCard['dataset'])) {
-            $this->creditCard = $fixtureFactory->createByCode($creditCardClass, ['dataset' => $creditCard['dataset']]);
-        }
+        $this->creditCard = $creditCard;
     }
 
     /**
-     * Fill Payment data
+     * Fill Payment data.
      *
      * @return void
      */
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml
index df10cccbd82136f027f4ee6b236cafe272cdbdc8..157dfc0f77302318bdce435dd3af7f6de5e261fb 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml
@@ -91,4 +91,19 @@
             <argument name="severity" xsi:type="string">S0</argument>
         </arguments>
     </type>
+    <type name="Magento\Sales\Test\Constraint\AssertOnlineInvoiceCannotBeCreated">
+        <arguments>
+            <argument name="severity" xsi:type="string">S1</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Sales\Test\Constraint\AssertOrderPaymentInformation">
+        <arguments>
+            <argument name="severity" xsi:type="string">S1</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Sales\Test\Constraint\AssertOnlineInvoiceCannotBeCreated">
+        <arguments>
+            <argument name="severity" xsi:type="string">S1</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Vault/Test/TestCase/DeleteSavedCreditCardTest.php b/dev/tests/functional/tests/app/Magento/Vault/Test/TestCase/DeleteSavedCreditCardTest.php
index e6462e4697aa612c1239b92b3c7b7e847bd252ba..37aa17e95b2ff4803d95d7865f4892190f940e15 100644
--- a/dev/tests/functional/tests/app/Magento/Vault/Test/TestCase/DeleteSavedCreditCardTest.php
+++ b/dev/tests/functional/tests/app/Magento/Vault/Test/TestCase/DeleteSavedCreditCardTest.php
@@ -6,6 +6,7 @@
 namespace Magento\Vault\Test\TestCase;
 
 use Magento\Checkout\Test\Page\CheckoutOnepage;
+use Magento\Customer\Test\Fixture\Customer;
 use Magento\Mtf\ObjectManager;
 use Magento\Mtf\TestCase\Injectable;
 use Magento\Vault\Test\Constraint\AssertCreditCardNotPresentOnCheckout;
@@ -95,7 +96,7 @@ class DeleteSavedCreditCardTest extends Injectable
             if ($key >= 2) { // if this order will be placed via stored credit card
                 $this->useSavedCreditCard($payment['vault']);
             } else {
-                $this->selectPaymentMethod($payment, $payment['creditCardClass'], $payment['creditCard']);
+                $this->selectPaymentMethod($payment, $payment['creditCard']);
                 $this->saveCreditCard($payment, $creditCardSave);
             }
             $this->placeOrder();
@@ -105,8 +106,7 @@ class DeleteSavedCreditCardTest extends Injectable
         for ($i = 2; $i < $paymentsCount; $i++) {
             $deletedCard = $this->deleteCreditCardFromMyAccount(
                 $customer,
-                $payments[$i]['creditCard'],
-                $payments[$i]['creditCardClass']
+                $payments[$i]['creditCard']
             );
             $this->addToCart($products);
             $this->proceedToCheckout();
@@ -119,9 +119,12 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Setup configuration step.
+     *
      * @param $configData
+     * @return void
      */
-    protected function setupConfiguration($configData)
+    private function setupConfiguration($configData)
     {
         $setupConfigurationStep = ObjectManager::getInstance()->create(
             \Magento\Config\Test\TestStep\SetupConfigurationStep::class,
@@ -132,7 +135,7 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
-     * Create products
+     * Create products step.
      *
      * @param string $productList
      * @return array
@@ -149,6 +152,8 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Add to cart step.
+     *
      * @param array $products
      * @return void
      */
@@ -162,6 +167,8 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Proceed to checkout step.
+     *
      * @return void
      */
     protected function proceedToCheckout()
@@ -173,7 +180,10 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Create customer step.
+     *
      * @param array $customer
+     * @return Customer
      */
     protected function createCustomer(array $customer)
     {
@@ -186,8 +196,11 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Select Checkout method step.
+     *
      * @param $checkoutMethod
      * @param $customer
+     * @return void
      */
     protected function selectCheckoutMethod($checkoutMethod, $customer)
     {
@@ -202,7 +215,10 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Fill shipping address step.
+     *
      * @param array $shippingAddress
+     * @return void
      */
     protected function fillShippingAddress(array $shippingAddress)
     {
@@ -214,9 +230,10 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
-     * Add products to cart
+     * Add products to cart.
      *
      * @param array $shipping
+     * @return void
      */
     protected function fillShippingMethod(array $shipping)
     {
@@ -228,17 +245,18 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Select payment method step.
+     *
      * @param array $payment
-     * @param $creditCardClass
      * @param array $creditCard
+     * @return void
      */
-    protected function selectPaymentMethod(array $payment, $creditCardClass, array $creditCard)
+    protected function selectPaymentMethod(array $payment, array $creditCard)
     {
         $selectPaymentMethodStep = ObjectManager::getInstance()->create(
             \Magento\Checkout\Test\TestStep\SelectPaymentMethodStep::class,
             [
                 'payment' => $payment,
-                'creditCardClass' => $creditCardClass,
                 'creditCard' => $creditCard,
             ]
         );
@@ -250,6 +268,7 @@ class DeleteSavedCreditCardTest extends Injectable
      *
      * @param $payment
      * @param $creditCardSave
+     * @return void
      */
     protected function saveCreditCard($payment, $creditCardSave)
     {
@@ -264,6 +283,8 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Fill billing information step.
+     *
      * @return void
      */
     protected function fillBillingInformation()
@@ -275,6 +296,8 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Place order step.
+     *
      * @return void
      */
     protected function placeOrder()
@@ -286,7 +309,10 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Use saved credit card step.
+     *
      * @param $payment
+     * @return void
      */
     protected function useSavedCreditCard($payment)
     {
@@ -298,18 +324,19 @@ class DeleteSavedCreditCardTest extends Injectable
     }
 
     /**
+     * Delete credit card from My Account step.
+     *
      * @param $customer
      * @param $creditCard
-     * @param $creditCardClass
+     * @return array
      */
-    protected function deleteCreditCardFromMyAccount($customer, $creditCard, $creditCardClass)
+    protected function deleteCreditCardFromMyAccount($customer, $creditCard)
     {
         $deleteCreditCardFromMyAccountStep = ObjectManager::getInstance()->create(
             \Magento\Vault\Test\TestStep\DeleteCreditCardFromMyAccountStep::class,
             [
                 'customer' => $customer,
-                'creditCard' => $creditCard,
-                'creditCardClass' => $creditCardClass
+                'creditCard' => $creditCard
             ]
         );
         $deletedCard = $deleteCreditCardFromMyAccountStep->run();
diff --git a/dev/tests/functional/tests/app/Magento/Vault/Test/TestCase/DeleteSavedCreditCardTest.xml b/dev/tests/functional/tests/app/Magento/Vault/Test/TestCase/DeleteSavedCreditCardTest.xml
index 2cafc815fed1dfc1865d1f2627f536d1ba909563..c6daa6ac89d58c68f9edc9c7e9372780107f56a7 100644
--- a/dev/tests/functional/tests/app/Magento/Vault/Test/TestCase/DeleteSavedCreditCardTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Vault/Test/TestCase/DeleteSavedCreditCardTest.xml
@@ -17,23 +17,29 @@
             <data name="payments" xsi:type="array">
                 <item name="0" xsi:type="array">
                     <item name="method" xsi:type="string">braintree</item>
-                    <item name="creditCardClass" xsi:type="string">credit_card_braintree</item>
                     <item name="creditCard" xsi:type="array">
-                        <item name="dataset" xsi:type="string">visa_braintree</item>
+                        <item name="dataset" xsi:type="string">visa_default</item>
+                        <item name="data" xsi:type="array">
+                            <item name="payment_code" xsi:type="string">braintree</item>
+                        </item>
                     </item>
                 </item>
                 <item name="1" xsi:type="array">
                     <item name="method" xsi:type="string">payflowpro</item>
-                    <item name="creditCardClass" xsi:type="string">credit_card</item>
                     <item name="creditCard" xsi:type="array">
                         <item name="dataset" xsi:type="string">visa_alt</item>
+                        <item name="data" xsi:type="array">
+                        <item name="payment_code" xsi:type="string">payment</item>
+                    </item>
                     </item>
                 </item>
                 <item name="2" xsi:type="array">
                     <item name="method" xsi:type="string">braintree</item>
-                    <item name="creditCardClass" xsi:type="string">credit_card_braintree</item>
                     <item name="creditCard" xsi:type="array">
-                        <item name="dataset" xsi:type="string">visa_braintree</item>
+                        <item name="dataset" xsi:type="string">visa_default</item>
+                        <item name="data" xsi:type="array">
+                            <item name="payment_code" xsi:type="string">braintree</item>
+                        </item>
                     </item>
                     <item name="vault" xsi:type="array">
                         <item name="method" xsi:type="string">braintree_cc_vault</item>
@@ -41,9 +47,11 @@
                 </item>
                 <item name="3" xsi:type="array">
                     <item name="method" xsi:type="string">payflowpro</item>
-                    <item name="creditCardClass" xsi:type="string">credit_card</item>
                     <item name="creditCard" xsi:type="array">
                         <item name="dataset" xsi:type="string">visa_alt</item>
+                        <item name="data" xsi:type="array">
+                            <item name="payment_code" xsi:type="string">payment</item>
+                        </item>
                     </item>
                     <item name="vault" xsi:type="array">
                         <item name="method" xsi:type="string">payflowpro_cc_vault</item>
diff --git a/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/DeleteCreditCardFromMyAccountStep.php b/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/DeleteCreditCardFromMyAccountStep.php
index c3cb46347dd8c50bfa372b84df66231086e054a5..f751108d28b16600c0b61050923174f81a98678c 100644
--- a/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/DeleteCreditCardFromMyAccountStep.php
+++ b/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/DeleteCreditCardFromMyAccountStep.php
@@ -7,86 +7,87 @@ namespace Magento\Vault\Test\TestStep;
 
 use Magento\Customer\Test\Fixture\Customer;
 use Magento\Customer\Test\Page\CustomerAccountIndex;
-use Magento\Mtf\Fixture\FixtureFactory;
-use Magento\Mtf\Fixture\InjectableFixture;
 use Magento\Mtf\ObjectManager;
 use Magento\Mtf\TestStep\TestStepInterface;
+use Magento\Payment\Test\Fixture\CreditCard;
 use Magento\Vault\Test\Constraint\AssertStoredPaymentDeletedMessage;
 use Magento\Vault\Test\Page\StoredPaymentMethods;
 
 /**
+ * Delete credit card from My Account step.
+ *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class DeleteCreditCardFromMyAccountStep implements TestStepInterface
 {
     /**
+     * Customer Fixture.
+     *
      * @var Customer
      */
     private $customer;
 
     /**
+     * Object manager.
+     *
      * @var ObjectManager
      */
     private $objectManager;
 
     /**
+     * Customer account index page.
+     *
      * @var CustomerAccountIndex
      */
     private $customerAccountIndex;
 
     /**
-     * @var FixtureFactory
-     */
-    private $fixtureFactory;
-
-    /**
-     * @var \Magento\Mtf\Fixture\FixtureInterface
+     * Credit card fixture.
+     *
+     * @var CreditCard
      */
     private $creditCard;
 
     /**
+     * Assert message of success deletion of stored payment method.
+     *
      * @var AssertStoredPaymentDeletedMessage
      */
     private $assertStoredPaymentDeletedMessage;
 
     /**
+     * Stored payment methods page.
+     *
      * @var StoredPaymentMethods
      */
     private $storedPaymentMethodsPage;
 
     /**
-     * DeleteCreditCardFromMyAccountStep constructor.
-     *
      * @param StoredPaymentMethods $storedPaymentMethodsPage
      * @param Customer $customer
      * @param ObjectManager $objectManager
      * @param CustomerAccountIndex $customerAccountIndex
-     * @param FixtureFactory $fixtureFactory
      * @param AssertStoredPaymentDeletedMessage $assertStoredPaymentDeletedMessage
-     * @param array $creditCard
-     * @param string $creditCardClass
+     * @param CreditCard $creditCard
      */
     public function __construct(
         StoredPaymentMethods $storedPaymentMethodsPage,
         Customer $customer,
         ObjectManager $objectManager,
         CustomerAccountIndex $customerAccountIndex,
-        FixtureFactory $fixtureFactory,
         AssertStoredPaymentDeletedMessage $assertStoredPaymentDeletedMessage,
-        array $creditCard,
-        $creditCardClass = 'credit_card'
+        CreditCard $creditCard
     ) {
         $this->storedPaymentMethodsPage = $storedPaymentMethodsPage;
         $this->customer = $customer;
         $this->objectManager = $objectManager;
         $this->customerAccountIndex = $customerAccountIndex;
-        $this->fixtureFactory = $fixtureFactory;
         $this->assertStoredPaymentDeletedMessage = $assertStoredPaymentDeletedMessage;
-        $this->creditCard = $fixtureFactory->createByCode($creditCardClass, ['dataset' => $creditCard['dataset']]);
+        $this->creditCard = $creditCard;
     }
 
     /**
-     * @inheritdoc
+     * Run Delete credit card from My Account step.
      *
      * @return array
      */
diff --git a/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/SaveCreditCardOnBackendStep.php b/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/SaveCreditCardOnBackendStep.php
index 24d1c76c01621fa9b6ce892aa8fd3262e3f7090a..3a378633bd4036737f391185ecd1bebb697609f1 100644
--- a/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/SaveCreditCardOnBackendStep.php
+++ b/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/SaveCreditCardOnBackendStep.php
@@ -5,13 +5,12 @@
  */
 namespace Magento\Vault\Test\TestStep;
 
-use Magento\Mtf\Fixture\FixtureFactory;
 use Magento\Mtf\TestStep\TestStepInterface;
 use Magento\Payment\Test\Fixture\CreditCard;
 use Magento\Sales\Test\Page\Adminhtml\OrderCreateIndex;
 
 /**
- * Class SaveCreditCardOnBackendStep
+ * Save credit card during order placement from Admin.
  */
 class SaveCreditCardOnBackendStep implements TestStepInterface
 {
@@ -44,22 +43,18 @@ class SaveCreditCardOnBackendStep implements TestStepInterface
     /**
      * @param OrderCreateIndex $orderCreateIndex
      * @param array $payment
-     * @param FixtureFactory $fixtureFactory
-     * @param $creditCardClass
-     * @param array $creditCard
+     * @param CreditCard $creditCard
      * @param string $creditCardSave
      */
     public function __construct(
         OrderCreateIndex $orderCreateIndex,
         array $payment,
-        FixtureFactory $fixtureFactory,
-        $creditCardClass,
-        array $creditCard,
+        CreditCard $creditCard,
         $creditCardSave = 'No'
     ) {
         $this->orderCreatePage = $orderCreateIndex;
         $this->payment = $payment;
-        $this->creditCard = $fixtureFactory->createByCode($creditCardClass, ['dataset' => $creditCard['dataset']]);
+        $this->creditCard = $creditCard;
         $this->creditCardSave = $creditCardSave;
     }
 
diff --git a/dev/tests/functional/utils/generate.php b/dev/tests/functional/utils/generate.php
index e374dae4ccfc2fec002e7be5d63782f7b9c357e3..d53ac44451376dd8d8a4dd0c69d5802a2ce6f1fe 100644
--- a/dev/tests/functional/utils/generate.php
+++ b/dev/tests/functional/utils/generate.php
@@ -3,12 +3,17 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\Filesystem;
+
 require_once dirname(__FILE__) . '/' . 'bootstrap.php';
 
 // Generate fixtures
 $magentoObjectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER);
 $magentoObjectManager = $magentoObjectManagerFactory->create($_SERVER);
-
+// Remove previously generated static classes
+$fs = $magentoObjectManager->create(Filesystem::class);
+$fs->getDirectoryWrite(DirectoryList::ROOT)->delete('dev/tests/functional/generated/');
 // Generate factories for old end-to-end tests
 $magentoObjectManager->create(\Magento\Mtf\Util\Generate\Factory::class)->launch();
 
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/MassactionTest.php b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/MassactionTest.php
index 1bbf40ca6dc72999e4d2bd0c65987d25ee2e6f2a..8c0a7dd201d62abd7e823de4c31c2e9aec57f954 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/MassactionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/MassactionTest.php
@@ -3,11 +3,10 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
-// @codingStandardsIgnoreFile
-
 namespace Magento\Backend\Block\Widget\Grid;
 
+use Magento\TestFramework\App\State;
+
 /**
  * @magentoAppArea adminhtml
  * @magentoComponentsDir Magento/Backend/Block/_files/design
@@ -25,18 +24,43 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
      */
     protected $_layout;
 
+    /**
+     * @var \Magento\Framework\ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var string
+     */
+    private $mageMode;
+
     protected function setUp()
     {
-        $this->markTestIncomplete('MAGETWO-6406');
-
         parent::setUp();
 
-        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+        $this->mageMode = $this->objectManager->get(State::class)->getMode();
+
         /** @var \Magento\Theme\Model\Theme\Registration $registration */
-        $registration = $objectManager->get(\Magento\Theme\Model\Theme\Registration::class);
+        $registration = $this->objectManager->get(\Magento\Theme\Model\Theme\Registration::class);
         $registration->register();
-        $objectManager->get(\Magento\Framework\View\DesignInterface::class)->setDesignTheme('BackendTest/test_default');
-        $this->_layout = $objectManager->create(
+        $this->objectManager->get(\Magento\Framework\View\DesignInterface::class)
+            ->setDesignTheme('BackendTest/test_default');
+    }
+
+    protected function tearDown()
+    {
+        $this->objectManager->get(State::class)->setMode($this->mageMode);
+    }
+
+    /**
+     * @param string $mageMode
+     */
+    private function loadLayout($mageMode = State::MODE_DEVELOPER)
+    {
+        $this->objectManager->get(State::class)->setMode($mageMode);
+        $this->_layout = $this->objectManager->create(
             \Magento\Framework\View\LayoutInterface::class,
             ['area' => 'adminhtml']
         );
@@ -48,20 +72,14 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
         $this->assertNotFalse($this->_block, 'Could not load the block for testing');
     }
 
-    /**
-     * @covers \Magento\Backend\Block\Widget\Grid\Massaction::getItems
-     * @covers \Magento\Backend\Block\Widget\Grid\Massaction::getCount
-     * @covers \Magento\Backend\Block\Widget\Grid\Massaction::getItemsJson
-     * @covers \Magento\Backend\Block\Widget\Grid\Massaction::isAvailable
-     */
     public function testMassactionDefaultValues()
     {
+        $this->loadLayout();
+
         /** @var $blockEmpty \Magento\Backend\Block\Widget\Grid\Massaction */
-        $blockEmpty = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
-            \Magento\Framework\View\LayoutInterface::class
-        )->createBlock(
-            \Magento\Backend\Block\Widget\Grid\Massaction::class
-        );
+        $blockEmpty = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get(\Magento\Framework\View\LayoutInterface::class)
+            ->createBlock(\Magento\Backend\Block\Widget\Grid\Massaction::class);
         $this->assertEmpty($blockEmpty->getItems());
         $this->assertEquals(0, $blockEmpty->getCount());
         $this->assertSame('[]', $blockEmpty->getItemsJson());
@@ -71,6 +89,8 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
 
     public function testGetJavaScript()
     {
+        $this->loadLayout();
+
         $javascript = $this->_block->getJavaScript();
 
         $expectedItemFirst = '#"option_id1":{"label":"Option One",' .
@@ -86,6 +106,8 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
 
     public function testGetJavaScriptWithAddedItem()
     {
+        $this->loadLayout();
+
         $input = [
             'id' => 'option_id3',
             'label' => 'Option Three',
@@ -100,20 +122,49 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
         $this->assertRegExp($expected, $this->_block->getJavaScript());
     }
 
-    public function testGetCount()
+    /**
+     * @param string $mageMode
+     * @param int $expectedCount
+     * @dataProvider getCountDataProvider
+     */
+    public function testGetCount($mageMode, $expectedCount)
     {
-        $this->assertEquals(2, $this->_block->getCount());
+        $this->loadLayout($mageMode);
+        $this->assertEquals($expectedCount, $this->_block->getCount());
+    }
+
+    /**
+     * @return array
+     */
+    public function getCountDataProvider()
+    {
+        return [
+            [
+                'mageMode' => State::MODE_DEVELOPER,
+                'expectedCount' => 3,
+            ],
+            [
+                'mageMode' => State::MODE_DEFAULT,
+                'expectedCount' => 3,
+            ],
+            [
+                'mageMode' => State::MODE_PRODUCTION,
+                'expectedCount' => 2,
+            ],
+        ];
     }
 
     /**
-     * @param $itemId
-     * @param $expectedItem
+     * @param string $itemId
+     * @param array $expectedItem
      * @dataProvider getItemsDataProvider
      */
     public function testGetItems($itemId, $expectedItem)
     {
+        $this->loadLayout();
+
         $items = $this->_block->getItems();
-        $this->assertCount(2, $items);
+        $this->assertCount(3, $items);
         $this->assertArrayHasKey($itemId, $items);
 
         $actualItem = $items[$itemId];
@@ -149,19 +200,29 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
                     'selected' => false,
                     'blockname' => ''
                 ]
+            ],
+            [
+                'option_id3',
+                [
+                    'id' => 'option_id3',
+                    'label' => 'Option Three',
+                    'url' => '#http:\/\/localhost\/index\.php\/(?:key\/([\w\d]+)\/)?#',
+                    'selected' => false,
+                    'blockname' => ''
+                ]
             ]
         ];
     }
 
     public function testGridContainsMassactionColumn()
     {
+        $this->loadLayout();
         $this->_layout->getBlock('admin.test.grid')->toHtml();
 
-        $gridMassactionColumn = $this->_layout->getBlock(
-            'admin.test.grid'
-        )->getColumnSet()->getChildBlock(
-            'massaction'
-        );
+        $gridMassactionColumn = $this->_layout->getBlock('admin.test.grid')
+            ->getColumnSet()
+            ->getChildBlock('massaction');
+
         $this->assertNotNull($gridMassactionColumn, 'Massaction column does not exist in the grid column set');
         $this->assertInstanceOf(
             \Magento\Backend\Block\Widget\Grid\Column::class,
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/_files/design/adminhtml/Magento/test_default/Magento_Backend/layout/layout_test_grid_handle.xml b/dev/tests/integration/testsuite/Magento/Backend/Block/_files/design/adminhtml/Magento/test_default/Magento_Backend/layout/layout_test_grid_handle.xml
index 5f9a80a5a3dbda9a86915c99aefce1066074ffb6..c072532a1c27c3471602abbb2442611fa49c6a59 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Block/_files/design/adminhtml/Magento/test_default/Magento_Backend/layout/layout_test_grid_handle.xml
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/_files/design/adminhtml/Magento/test_default/Magento_Backend/layout/layout_test_grid_handle.xml
@@ -6,60 +6,68 @@
  */
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <block class="Magento\Backend\Block\Widget\Grid" name="admin.test.grid" Output="1">
+    <block class="Magento\Backend\Block\Widget\Grid" name="admin.test.grid">
         <arguments>
-            <dataSource type="object">Magento\Framework\Data\Collection</dataSource>
+            <argument name="dataSource" xsi:type="object">Magento\Framework\Data\Collection</argument>
         </arguments>
-        <block class="Magento\Backend\Block\Widget\Grid\ColumnSet" as="grid.columnSet" name="admin.test.grid.columnSet" Output="1">
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="product_name" Output="1">
+        <block class="Magento\Backend\Block\Widget\Grid\ColumnSet" as="grid.columnSet" name="admin.test.grid.columnSet">
+            <block class="Magento\Backend\Block\Widget\Grid\Column" as="product_name">
                 <arguments>
-                    <header>Product name 1</header>
-                    <index>product_name</index>
-                    <type>text</type>
+                    <argument name="header" xsi:type="string" translate="true">Product name 1</argument>
+                    <argument name="id" xsi:type="string">product_name</argument>
+                    <argument name="index" xsi:type="string">product_name</argument>
+                    <argument name="type" xsi:type="string">text</argument>
                 </arguments>
             </block>
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="description" output="1">
+            <block class="Magento\Backend\Block\Widget\Grid\Column" as="description">
                 <arguments>
-                    <header>User Description</header>
-                    <index>description</index>
-                    <type>text</type>
+                    <argument name="header" xsi:type="string" translate="true">User Description</argument>
+                    <argument name="id" xsi:type="string">description</argument>
+                    <argument name="index" xsi:type="string">description</argument>
+                    <argument name="type" xsi:type="string">text</argument>
                 </arguments>
             </block>
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="qty" output="1">
+            <block class="Magento\Backend\Block\Widget\Grid\Column" as="qty">
                 <arguments>
-                    <header>Qty</header>
-                    <index>qty</index>
-                    <type>number</type>
-                    <width>60px</width>
+                    <argument name="header" xsi:type="string" translate="true">Qty</argument>
+                    <argument name="id" xsi:type="string">qty</argument>
+                    <argument name="index" xsi:type="string">qty</argument>
+                    <argument name="type" xsi:type="string">number</argument>
+                    <argument name="width" xsi:type="string">60</argument>
                 </arguments>
             </block>
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="added_at" output="1">
+            <block class="Magento\Backend\Block\Widget\Grid\Column" as="added_at">
                 <arguments>
-                    <header>Date Added</header>
-                    <index>added_at</index>
-                    <gmtoffset>1</gmtoffset>
-                    <type>date</type>
+                    <argument name="header" xsi:type="string" translate="true">Date Added</argument>
+                    <argument name="id" xsi:type="string">added_at</argument>
+                    <argument name="index" xsi:type="string">added_at</argument>
+                    <argument name="type" xsi:type="string">date</argument>
+                    <argument name="gmtoffset" xsi:type="string">1</argument>
                 </arguments>
             </block>
         </block>
-        <block class="Magento\Backend\Block\Widget\Grid\Massaction" as="grid.massaction" name='admin.test.grid.massaction' output="1">
+        <block class="Magento\Backend\Block\Widget\Grid\Massaction" as="grid.massaction" name='admin.test.grid.massaction'>
             <arguments>
-                <massaction_id_field>test_id</massaction_id_field>
-                <massaction_id_filter>test_id</massaction_id_filter>
-                <form_field_name>test</form_field_name>
-                <use_select_all>1</use_select_all>
-                <options>
-                    <option_id1>
-                        <label>Option One</label>
-                        <url>*/*/option1</url>
-                        <complete>Test</complete>
-                    </option_id1>
-                    <option_id2>
-                        <label>Option Two</label>
-                        <url>*/*/option2</url>
-                        <confirm>Are you sure?</confirm>
-                    </option_id2>
-                </options>
+                <argument name="massaction_id_field" xsi:type="string">test_id</argument>
+                <argument name="form_field_name" xsi:type="string">test_id</argument>
+                <argument name="use_select_all" xsi:type="string">1</argument>
+                <argument name="options" xsi:type="array">
+                    <item name="option_id1" xsi:type="array">
+                        <item name="label" xsi:type="string" translate="true">Option One</item>
+                        <item name="url" xsi:type="string">*/*/option1</item>
+                        <item name="complete" xsi:type="string">Test</item>
+                    </item>
+                    <item name="option_id2" xsi:type="array">
+                        <item name="label" xsi:type="string" translate="true">Option Two</item>
+                        <item name="url" xsi:type="string">*/*/option2</item>
+                        <item name="confirm" xsi:type="string">Are you sure?</item>
+                    </item>
+                    <item name="option_id3" xsi:type="array">
+                        <item name="label" xsi:type="string" translate="true">Option Three</item>
+                        <item name="url" xsi:type="string">*/*/option3</item>
+                        <item name="visible" xsi:type="object">Magento\Backend\Block\Cache\Grid\Massaction\ProductionModeVisibilityChecker</item>
+                    </item>
+                </argument>
             </arguments>
         </block>
     </block>
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php
index e9fbb76f513d545eb4d710423bfd58a0cbb3d03e..a1034643ae3dcd6064caea87cf13f052db967f0f 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php
@@ -3,13 +3,13 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Backend\Controller\Adminhtml\Cache;
 
 use Magento\Framework\App\Cache\State;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\Framework\Config\File\ConfigFilePool;
 use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\TestFramework\App\State as AppState;
 
 class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendController
 {
@@ -20,6 +20,11 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
      */
     private static $typesConfig;
 
+    /**
+     * @var string
+     */
+    private $mageState;
+
     public static function setUpBeforeClass()
     {
         /** @var \Magento\Framework\App\DeploymentConfig $config */
@@ -27,8 +32,15 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
         self::$typesConfig = $config->get(State::CACHE_KEY);
     }
 
+    protected function setUp()
+    {
+        parent::setUp();
+        $this->mageState = Bootstrap::getObjectManager()->get(AppState::class)->getMode();
+    }
+
     protected function tearDown()
     {
+        Bootstrap::getObjectManager()->get(AppState::class)->setMode($this->mageState);
         /** @var $cacheState \Magento\Framework\App\Cache\StateInterface */
         $cacheState = Bootstrap::getObjectManager()->get(\Magento\Framework\App\Cache\StateInterface::class);
         foreach (self::$typesConfig as $type => $value) {
@@ -42,7 +54,7 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
      * @dataProvider massActionsDataProvider
      * @param array $typesToEnable
      */
-    public function testMassEnableAction($typesToEnable = [])
+    public function testMassEnableActionDeveloperMode($typesToEnable = [])
     {
         $this->setAll(false);
 
@@ -53,16 +65,33 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
             if (in_array($cacheType, $typesToEnable)) {
                 $this->assertEquals(1, $cacheState, "Type '{$cacheType}' has not been enabled");
             } else {
-                $this->assertEquals(0, $cacheState, "Type '{$cacheType}' has not been enabled");
+                $this->assertEquals(0, $cacheState, "Type '{$cacheType}' must remain disabled");
             }
         }
     }
 
+    /**
+     * @dataProvider massActionsDataProvider
+     * @param array $typesToEnable
+     */
+    public function testMassEnableActionProductionMode($typesToEnable = [])
+    {
+        Bootstrap::getObjectManager()->get(AppState::class)->setMode(AppState::MODE_PRODUCTION);
+        $this->setAll(false);
+
+        $this->getRequest()->setParams(['types' => $typesToEnable]);
+        $this->dispatch('backend/admin/cache/massEnable');
+
+        foreach ($this->getCacheStates() as $cacheType => $cacheState) {
+            $this->assertEquals(0, $cacheState, "Type '{$cacheType}' must remain disabled");
+        }
+    }
+
     /**
      * @dataProvider massActionsDataProvider
      * @param array $typesToDisable
      */
-    public function testMassDisableAction($typesToDisable = [])
+    public function testMassDisableActionDeveloperMode($typesToDisable = [])
     {
         $this->setAll(true);
 
@@ -78,6 +107,23 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
         }
     }
 
+    /**
+     * @dataProvider massActionsDataProvider
+     * @param array $typesToDisable
+     */
+    public function testMassDisableActionProductionMode($typesToDisable = [])
+    {
+        Bootstrap::getObjectManager()->get(AppState::class)->setMode(AppState::MODE_PRODUCTION);
+        $this->setAll(true);
+
+        $this->getRequest()->setParams(['types' => $typesToDisable]);
+        $this->dispatch('backend/admin/cache/massDisable');
+
+        foreach ($this->getCacheStates() as $cacheType => $cacheState) {
+            $this->assertEquals(1, $cacheState, "Type '{$cacheType}' must remain enabled");
+        }
+    }
+
     /**
      * Retrieve cache states (enabled/disabled) information
      *
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithTierPriceCalculatorTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithTierPriceCalculatorTest.php
index 0be5adcb304f772218e588795f3f6ef26ce0721c..c2c62aa2ce093e3b52502ec5c234d3932cdbe3b4 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithTierPriceCalculatorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithTierPriceCalculatorTest.php
@@ -201,7 +201,8 @@ class DynamicBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -239,7 +240,8 @@ class DynamicBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -281,7 +283,8 @@ class DynamicBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -323,7 +326,8 @@ class DynamicBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -365,7 +369,8 @@ class DynamicBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -422,7 +427,8 @@ class DynamicBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -479,7 +485,8 @@ class DynamicBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -536,7 +543,8 @@ class DynamicBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -578,7 +586,8 @@ class DynamicBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         $tierPriceSimpleProductData = [
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithTierPriceCalculatorTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithTierPriceCalculatorTest.php
index bd148080631aea892cccb0fab6fd0321d08c231b..aa020fe1f5a2b89e6d1e1eb922c0dee8412f4de7 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithTierPriceCalculatorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithTierPriceCalculatorTest.php
@@ -495,7 +495,8 @@ class FixedBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -544,7 +545,8 @@ class FixedBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -601,7 +603,8 @@ class FixedBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -664,7 +667,8 @@ class FixedBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -727,7 +731,8 @@ class FixedBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -790,7 +795,8 @@ class FixedBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
@@ -872,7 +878,8 @@ class FixedBundleWithTierPriceCalculatorTest extends BundlePriceAbstract
         $tierPriceData = [
             'customer_group_id' => \Magento\Customer\Model\Group::NOT_LOGGED_IN_ID,
             'qty' => 1,
-            'value' => 50
+            'value' => 50,
+            'extension_attributes' => new \Magento\Framework\DataObject(['percentage_value' => 50])
         ];
 
         return [
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/_files/product_with_tier_pricing.php b/dev/tests/integration/testsuite/Magento/Bundle/_files/product_with_tier_pricing.php
index 6d6d10ce4d220fc45047d140621a784ea44413c6..9574948dae900e292e38d55a306d4a7fe8706955 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/_files/product_with_tier_pricing.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/_files/product_with_tier_pricing.php
@@ -41,18 +41,21 @@ $product->setTypeId('bundle')
                'cust_group' => \Magento\Customer\Model\GroupManagement::CUST_GROUP_ALL,
                'price_qty'  => 2,
                'price'      => 8,
+               'percentage_value' => 8
            ],
             [
                 'website_id' => 0,
                 'cust_group' => \Magento\Customer\Model\GroupManagement::CUST_GROUP_ALL,
                 'price_qty'  => 5,
                 'price'      => 30,
+                'percentage_value' => 30
             ],
            [
                'website_id' => 0,
                'cust_group' => \Magento\Customer\Model\GroupManagement::NOT_LOGGED_IN_ID,
                'price_qty'  => 3,
                'price'      => 20,
+               'percentage_value' => 20
            ],
         ]
     )
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php
index fc2763aea017dee37b05216a1b881665a29dc551..c17553629ae59a3b0c8ef7c1643112743cd82bf8 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php
@@ -45,6 +45,47 @@ class AttributeTest extends \Magento\TestFramework\TestCase\AbstractBackendContr
         $this->assertTrue($isRedirectPresent);
     }
 
+    /**
+     * @covers \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute\Save::execute
+     *
+     * @dataProvider saveActionVisibilityAttrDataProvider
+     * @param array $attributes
+     * @magentoDataFixture Magento/Catalog/_files/product_simple.php
+     */
+    public function testSaveActionChangeVisibility($attributes)
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $repository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+            \Magento\Catalog\Model\ProductRepository::class
+        );
+        $product = $repository->get('simple');
+        $product->setOrigData();
+        $product->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_NOT_VISIBLE);
+        $product->save();
+
+        /** @var $session \Magento\Backend\Model\Session */
+        $session = $objectManager->get(\Magento\Backend\Model\Session::class);
+        $session->setProductIds([$product->getId()]);
+        $this->getRequest()->setParam('attributes', $attributes);
+
+        $this->dispatch('backend/catalog/product_action_attribute/save/store/0');
+        /** @var \Magento\Catalog\Model\Category $category */
+        $categoryFactory = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+            \Magento\Catalog\Model\CategoryFactory::class
+        );
+        /** @var \Magento\Catalog\Block\Product\ListProduct $listProduct */
+        $listProduct = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+            \Magento\Catalog\Block\Product\ListProduct::class
+        );
+
+        $category = $categoryFactory->create()->load(2);
+        $layer = $listProduct->getLayer();
+        $layer->setCurrentCategory($category);
+        $productCollection = $layer->getProductCollection();
+        $productItem = $productCollection->getFirstItem();
+        $this->assertEquals($session->getProductIds(), [$productItem->getId()]);
+    }
+
     /**
      * @covers \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute\Validate::execute
      *
@@ -97,4 +138,17 @@ class AttributeTest extends \Magento\TestFramework\TestCase\AbstractBackendContr
             ]
         ];
     }
+
+    /**
+     * Data Provider for save with visibility attribute
+     *
+     * @return array
+     */
+    public function saveActionVisibilityAttrDataProvider()
+    {
+        return [
+            ['arguments' => ['visibility' => \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH]],
+            ['arguments' => ['visibility' => \Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_CATALOG]]
+        ];
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/ImageTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/ImageTest.php
index 88fd7797e768fb5fb227a8fc888ad481794d4347..8b0d1b393f467641bd87bc65fb425dbe8000bff6 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/ImageTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/ImageTest.php
@@ -23,8 +23,15 @@ class ImageTest extends \PHPUnit_Framework_TestCase
         $model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
             \Magento\Catalog\Model\Product\Image::class
         );
-        $model->setDestinationSubdir('image')->setBaseFile('');
-        $this->assertEmpty($model->getBaseFile());
+        /** @var \Magento\Catalog\Model\View\Asset\Placeholder $defualtPlaceholder */
+        $defualtPlaceholder = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create(\Magento\Catalog\Model\View\Asset\Placeholder::class,
+                ['type' => 'image']
+            );
+
+        $model->setDestinationSubdir('image');
+        $model->setBaseFile('');
+        $this->assertEquals($defualtPlaceholder->getSourceFile(), $model->getBaseFile());
         return $model;
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Config/Model/Config/Processor/EnvironmentPlaceholderTest.php b/dev/tests/integration/testsuite/Magento/Config/Model/Config/Processor/EnvironmentPlaceholderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1e2b6aacc931446cee8f42accb17d684c4bb413c
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Config/Model/Config/Processor/EnvironmentPlaceholderTest.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Model\Config\Processor;
+
+use Magento\Framework\ObjectManagerInterface;
+
+class EnvironmentPlaceholderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var EnvironmentPlaceholder
+     */
+    private $model;
+
+    /**
+     * @var array
+     */
+    private $env = [];
+
+    protected function setUp()
+    {
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->model = $this->objectManager->get(EnvironmentPlaceholder::class);
+        $this->env = $_ENV;
+    }
+
+    public function testProcess()
+    {
+        $_ENV = array_merge(
+            $_ENV,
+            [
+                'CONFIG__DEFAULT__WEB__UNSECURE__BASE_URL' => 'http://expected.local',
+                'CONFIG__TEST__TEST__DESIGN__HEADER__WELCOME' => 'Expected header',
+                'TEST__TEST__WEB__SECURE__BASE_URL' => 'http://wrong_pattern.local',
+                'CONFIG__DEFAULT__GENERAL__REGION__DISPLAY_ALL' => 1
+            ]
+        );
+        $expected = [
+            'default' => [
+                'web' => [
+                    'unsecure' => [
+                        'base_url' => 'http://expected.local'
+                    ],
+                    'secure' => [
+                        'base_url' => 'https://original.local'
+                    ]
+                ],
+                'general' => [
+                    'region' => [
+                        'display_all' => 1
+                    ],
+                ],
+            ],
+            'test' => [
+                'test' => [
+                    'design' => [
+                        'header' => [
+                            'welcome' => 'Expected header'
+                        ]
+                    ],
+                ],
+            ]
+        ];
+        $config = [
+            'default' => [
+                'web' => [
+                    'unsecure' => [
+                        'base_url' => 'http://original.local',
+                    ],
+                    'secure' => [
+                        'base_url' => 'https://original.local'
+                    ]
+                ]
+            ],
+            'test' => [
+                'test' => [
+                    'design' => [
+                        'header' => [
+                            'welcome' => 'Original header'
+                        ]
+                    ],
+                ],
+            ]
+        ];
+
+        $this->assertSame(
+            $expected,
+            $this->model->process($config)
+        );
+    }
+
+    protected function tearDown()
+    {
+        $_ENV = $this->env;
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/ConfigurableTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/ConfigurableTest.php
index 5db97cc36614924ae915b7b924b2c7a1f575e344..2e339e4347cf65ad13474de26ba61c3237cfafe9 100644
--- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/ConfigurableTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/ConfigurableTest.php
@@ -67,4 +67,40 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
             ->getFirstItem();
         $this->assertEquals(20, $configurableProduct->getMinimalPrice());
     }
+
+    /**
+     * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
+     */
+    public function testGetProductFinalPriceIfOneOfChildIsDisabledPerStore()
+    {
+        /** @var Collection $collection */
+        $collection = Bootstrap::getObjectManager()->get(CollectionFactory::class)
+            ->create();
+        $configurableProduct = $collection
+            ->addIdFilter([1])
+            ->addMinimalPrice()
+            ->load()
+            ->getFirstItem();
+        $this->assertEquals(10, $configurableProduct->getMinimalPrice());
+
+        $childProduct = $this->productRepository->getById(10, false, null, true);
+        $childProduct->setStatus(Status::STATUS_DISABLED);
+
+        // update in default store scope
+        $currentStoreId = $this->storeManager->getStore()->getId();
+        $defaultStore = $this->storeManager->getDefaultStoreView();
+        $this->storeManager->setCurrentStore($defaultStore->getId());
+        $this->productRepository->save($childProduct);
+        $this->storeManager->setCurrentStore($currentStoreId);
+
+        /** @var Collection $collection */
+        $collection = Bootstrap::getObjectManager()->get(CollectionFactory::class)
+            ->create();
+        $configurableProduct = $collection
+            ->addIdFilter([1])
+            ->addMinimalPrice()
+            ->load()
+            ->getFirstItem();
+        $this->assertEquals(20, $configurableProduct->getMinimalPrice());
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Pricing/Price/LowestPriceOptionProviderTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Pricing/Price/LowestPriceOptionProviderTest.php
index 50787c7962412b0611edf093825563061da67119..58df9f50f7f0c10a8750c1fdf31c68561b6fdb87 100644
--- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Pricing/Price/LowestPriceOptionProviderTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Pricing/Price/LowestPriceOptionProviderTest.php
@@ -68,6 +68,38 @@ class LowestPriceOptionProviderTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals(20, $lowestPriceChildrenProduct->getPrice());
     }
 
+    /**
+     * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
+     */
+    public function testGetProductsIfOneOfChildIsDisabledPerStore()
+    {
+        $configurableProduct = $this->productRepository->getById(1, false, null, true);
+        $lowestPriceChildrenProducts = $this->lowestPriceOptionsProvider->getProducts($configurableProduct);
+        $this->assertCount(1, $lowestPriceChildrenProducts);
+        $lowestPriceChildrenProduct = reset($lowestPriceChildrenProducts);
+        $this->assertEquals(10, $lowestPriceChildrenProduct->getPrice());
+
+        // load full aggregation root
+        $lowestPriceChildProduct = $this->productRepository->get(
+            $lowestPriceChildrenProduct->getSku(),
+            false,
+            null,
+            true
+        );
+        $lowestPriceChildProduct->setStatus(Status::STATUS_DISABLED);
+        // update in default store scope
+        $currentStoreId = $this->storeManager->getStore()->getId();
+        $defaultStore = $this->storeManager->getDefaultStoreView();
+        $this->storeManager->setCurrentStore($defaultStore->getId());
+        $this->productRepository->save($lowestPriceChildProduct);
+        $this->storeManager->setCurrentStore($currentStoreId);
+
+        $lowestPriceChildrenProducts = $this->lowestPriceOptionsProvider->getProducts($configurableProduct);
+        $this->assertCount(1, $lowestPriceChildrenProducts);
+        $lowestPriceChildrenProduct = reset($lowestPriceChildrenProducts);
+        $this->assertEquals(20, $lowestPriceChildrenProduct->getPrice());
+    }
+
     /**
      * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
      */
diff --git a/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php b/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php
index a229b64bb7dd10ef29acd5e824dfb5a9b28bfcc8..170d186e20af812a1c40bc4937559c6d5342942a 100644
--- a/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php
+++ b/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php
@@ -7,7 +7,6 @@ namespace Magento\Deploy\Console\Command\App;
 
 use Magento\Framework\App\DeploymentConfig;
 use Magento\Framework\App\Filesystem\DirectoryList;
-use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Config\File\ConfigFilePool;
 use Magento\Framework\Filesystem\DriverPool;
 use Magento\Framework\ObjectManagerInterface;
@@ -18,37 +17,73 @@ use Symfony\Component\Console\Output\OutputInterface;
 class ApplicationDumpCommandTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var ApplicationDumpCommand
+     * @var ObjectManagerInterface
      */
-    private $command;
+    private $objectManager;
 
     /**
-     * @var ObjectManagerInterface
+     * @var DeploymentConfig\Reader
      */
-    private $objectManager;
+    private $reader;
 
     public function setUp()
     {
-        $this->command = Bootstrap::getObjectManager()->get(ApplicationDumpCommand::class);
         $this->objectManager = Bootstrap::getObjectManager();
+        $this->reader = $this->objectManager->get(DeploymentConfig\Reader::class);
     }
 
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoDataFixture Magento/Deploy/_files/config_data.php
+     */
     public function testExecute()
     {
-        $inputMock = $this->getMock(InputInterface::class);
+        $this->objectManager->configure([
+            \Magento\Config\Model\Config\Export\ExcludeList::class => [
+                'arguments' => [
+                    'configs' => [
+                        'web/test/test_value_1' => '',
+                        'web/test/test_value_2' => '',
+                        'web/test/test_sensitive' => '1',
+                    ],
+                ],
+            ],
+        ]);
+
+        $comment = 'The configuration file doesn\'t contain sensitive data for security reasons. '
+            . 'Sensitive data can be stored in the following environment variables:'
+            . "\nCONFIG__DEFAULT__WEB__TEST__TEST_SENSITIVE for web/test/test_sensitive";
         $outputMock = $this->getMock(OutputInterface::class);
-        $outputMock->expects($this->once())
+        $outputMock->expects($this->at(0))
+            ->method('writeln')
+            ->with(['system' => $comment]);
+        $outputMock->expects($this->at(1))
             ->method('writeln')
             ->with('<info>Done.</info>');
-        $this->assertEquals(0, $this->command->run($inputMock, $outputMock));
+
+        /** @var ApplicationDumpCommand command */
+        $command = $this->objectManager->create(ApplicationDumpCommand::class);
+        $command->run($this->getMock(InputInterface::class), $outputMock);
+
+        $config = $this->reader->loadConfigFile(ConfigFilePool::APP_CONFIG, $this->getFileName());
+
+        $this->assertArrayHasKey(
+            'test_value_1',
+            $config['system']['default']['web']['test']
+        );
+        $this->assertArrayHasKey(
+            'test_value_2',
+            $config['system']['default']['web']['test']
+        );
+        $this->assertArrayNotHasKey(
+            'test_sensitive',
+            $config['system']['default']['web']['test']
+        );
     }
 
     public function tearDown()
     {
-        /** @var ConfigFilePool $configFilePool */
-        $configFilePool = $this->objectManager->get(ConfigFilePool::class);
-        $filePool = $configFilePool->getInitialFilePools();
-        $file = $filePool[ConfigFilePool::LOCAL][ConfigFilePool::APP_CONFIG];
+        $file = $this->getFileName();
         /** @var DirectoryList $dirList */
         $dirList = $this->objectManager->get(DirectoryList::class);
         $path = $dirList->getPath(DirectoryList::CONFIG);
@@ -61,4 +96,16 @@ class ApplicationDumpCommandTest extends \PHPUnit_Framework_TestCase
         $deploymentConfig = $this->objectManager->get(DeploymentConfig::class);
         $deploymentConfig->resetData();
     }
+
+    /**
+     * @return string
+     */
+    private function getFileName()
+    {
+        /** @var ConfigFilePool $configFilePool */
+        $configFilePool = $this->objectManager->get(ConfigFilePool::class);
+        $filePool = $configFilePool->getInitialFilePools();
+
+        return $filePool[ConfigFilePool::LOCAL][ConfigFilePool::APP_CONFIG];
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Deploy/_files/config_data.php b/dev/tests/integration/testsuite/Magento/Deploy/_files/config_data.php
new file mode 100644
index 0000000000000000000000000000000000000000..bd8e69262e1e03f98b3ce41735bbf2264e234292
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Deploy/_files/config_data.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+$configData = [
+    'default' => [
+        '' => [
+            'web/test/test_value_1' => 'http://local2.test/',
+            'web/test/test_value_2' => 5,
+            'web/test/test_sensitive' => 10,
+        ]
+    ],
+];
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+$configFactory = $objectManager->create(\Magento\Config\Model\Config\Factory::class);
+
+foreach ($configData as $scope => $data) {
+    foreach ($data as $scopeCode => $scopeData) {
+        foreach ($scopeData as $path => $value) {
+            $config = $configFactory->create();
+            $config->setCope($scope);
+
+            if ($scopeCode) {
+                $config->setScopeCode($scopeCode);
+            }
+
+            $config->setDataByPath($path, $value);
+            $config->save();
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Store/Model/StoreManagerTest.php b/dev/tests/integration/testsuite/Magento/Store/Model/StoreManagerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c42856d865649d5206df2c76de323fff521c5482
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Store/Model/StoreManagerTest.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model;
+
+use Magento\Framework\ObjectManagerInterface as ObjectManager;
+use Magento\Store\Model\Store;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class StoreManagerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var StoreManagerInterface
+     */
+    private $storeManager;
+
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * Class dependencies initialization
+     *
+     * @return void
+     */
+    protected function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+        $this->storeManager = $this->objectManager->get(StoreManagerInterface::class);
+    }
+
+    /**
+     * Check that behavior of setting and getting store into StoreManager is correct
+     * Setting: Magento\Store\Model\StoreManagerInterface::setCurrentStore
+     * Getting: Magento\Store\Model\StoreManagerInterface::getStore
+     *
+     * @return void
+     */
+    public function testDefaultStoreIdIsSetCorrectly()
+    {
+        $this->storeManager->setCurrentStore(Store::DEFAULT_STORE_ID);
+        $this->assertEquals(Store::DEFAULT_STORE_ID, $this->storeManager->getStore()->getId());
+    }
+}
diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Review/view/frontend/web/js/process-review.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Review/view/frontend/web/js/process-review.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..66c9ccccb23bea8565ec37477056b69b320d092b
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Review/view/frontend/web/js/process-review.test.js
@@ -0,0 +1,76 @@
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/*eslint max-nested-callbacks: 0*/
+/*jscs:disable jsDoc*/
+
+define([
+    'jquery',
+    'Magento_Review/js/process-reviews'
+], function ($, reviewProcessor) {
+    'use strict';
+
+    describe('Test product page reviews processor', function () {
+        var element,
+        config = {
+            reviewsTabSelector: '#review-tab'
+        };
+
+        beforeEach(function () {
+            element = $('<div id="review-tab" role="tab"></div>');
+
+            $('body').append(element);
+        });
+
+        afterEach(function () {
+            element.remove();
+        });
+
+        it('Should automatically load reviews after page load if review tab is active', function () {
+            element.addClass('active');
+
+            spyOn($, 'ajax').and.callFake(function () {
+                var d = $.Deferred();
+
+                d.promise().complete = function () {};
+
+                return d.promise();
+            });
+
+            reviewProcessor(config, null);
+
+            expect($.ajax).toHaveBeenCalled();
+        });
+
+        it('Should not automatically load reviews after page load if review tab is not active', function () {
+            spyOn($, 'ajax').and.callFake(function () {
+                var d = $.Deferred();
+
+                d.promise().complete = function () {};
+
+                return d.promise();
+            });
+
+            reviewProcessor(config, null);
+
+            expect($.ajax).not.toHaveBeenCalled();
+        });
+
+        it('Should load reviews if non active review tab was opened', function () {
+            spyOn($, 'ajax').and.callFake(function () {
+                var d = $.Deferred();
+
+                d.promise().complete = function () {};
+
+                return d.promise();
+            });
+
+            reviewProcessor(config, null);
+            element.trigger('beforeOpen');
+
+            expect($.ajax).toHaveBeenCalled();
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/element/date.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/element/date.test.js
index de6b83eaf2005d06c324c3b7da997b541d305522..51a998e6eb2a04ea2e63c64933a90335dadd96cc 100644
--- a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/element/date.test.js
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/element/date.test.js
@@ -6,8 +6,9 @@
 /*eslint max-nested-callbacks: 0*/
 
 define([
-    'Magento_Ui/js/form/element/date'
-], function (DateElement) {
+    'Magento_Ui/js/form/element/date',
+    'mageUtils'
+], function (DateElement, utils) {
     'use strict';
 
     describe('Magento_Ui/js/form/element/date', function () {
@@ -19,5 +20,12 @@ define([
             };
             model = new DateElement(params);
         });
+
+        it('Check prepareDateTimeFormats function', function () {
+            spyOn(utils, 'convertToMomentFormat');
+            model.prepareDateTimeFormats();
+            expect(utils.convertToMomentFormat).toHaveBeenCalled();
+        });
+
     });
 });
diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/lib/ko/bind/datepicker.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/lib/ko/bind/datepicker.test.js
index a8c06b7b34cc055ce052f73d0a231613f8944f1c..e5f90863ec63071f191b82b0df7fdbba0ac411fa 100644
--- a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/lib/ko/bind/datepicker.test.js
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/lib/ko/bind/datepicker.test.js
@@ -7,21 +7,32 @@ define([
     'ko',
     'jquery',
     'moment',
+    'mageUtils',
     'Magento_Ui/js/lib/knockout/bindings/datepicker'
-], function (ko, $, moment) {
+], function (ko, $, moment, utils) {
     'use strict';
 
     describe('Datepicker binding', function () {
         var observable,
-            element;
+            element,
+            config;
 
         beforeEach(function () {
             element    = $('<input />');
             observable = ko.observable();
 
+            config = {
+                options : {
+                    dateFormat: 'M/d/yy',
+                    'storeLocale': 'en_US',
+                    'timeFormat': 'h:mm: a'
+                },
+                storage:ko.observable(moment().format('MM/DD/YYYY'))
+            };
+
             $(document.body).append(element);
 
-            ko.applyBindingsToNode(element[0], { datepicker: observable });
+            ko.applyBindingsToNode(element[0], { datepicker: config });
         });
 
         afterEach(function () {
@@ -29,22 +40,18 @@ define([
         });
 
         it('writes picked date\'s value to assigned observable', function () {
-            var openBtn,
-                todayBtn,
-                todayDate,
-                dateFormat,
-                result;
+            var todayDate,
+                momentFormat,
+                result,
+                inputFormat;
 
-            dateFormat  = element.datepicker('option', 'dateFormat');
-            todayDate   = moment().format(dateFormat);
+            inputFormat = 'M/d/yy';
 
-            openBtn  = $('img.ui-datepicker-trigger');
-            todayBtn = $('[data-handler="today"]');
+            momentFormat = utils.convertToMomentFormat(inputFormat);
 
-            openBtn.click();
-            todayBtn.click();
+            todayDate   = moment().format(momentFormat);
 
-            result = moment(observable()).format(dateFormat);
+            result = $('input:last').val();
 
             expect(todayDate).toEqual(result);
         });
diff --git a/dev/tests/js/jasmine/tests/lib/mage/misc.test.js b/dev/tests/js/jasmine/tests/lib/mage/misc.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a9ea5ed90192fa46e3e223802d872be0a32afba2
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/misc.test.js
@@ -0,0 +1,638 @@
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+define([
+    'mageUtils',
+    'moment'
+], function (utils, moment) {
+    'use strict';
+
+    describe('mageUtils', function () {
+
+        it('Check convertToMomentFormat function', function () {
+            var format, momentFormat;
+
+            format = 'M/d/yy';
+            momentFormat = 'MM/DD/YYYY';
+            expect(utils.convertToMomentFormat(format)).toBe(momentFormat);
+        });
+
+        it('Check convertToMomentFormat function for all Magento supported locales', function () {
+
+            var fixture,
+            localeValues,
+            format,
+            expectedValue,
+            momentFormat,
+            dt,
+            m,
+            p;
+
+            fixture = {
+                'af_ZA': {
+                    'locale': 'af_ZA',
+                    'localeInfo': {
+                        'format': 'y-MM-dd',
+                        'expectedValue': '2016-11-17'
+                    }
+                },
+                'az_Latn_AZ': {
+                    'locale': 'az_Latn_AZ',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'id_ID': {
+                    'locale': 'id_ID',
+                    'localeInfo': {
+                        'format': 'dd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'ms_Latn_MY': {
+                    'locale': 'ms_Latn_MY',
+                    'localeInfo': {
+                        'format': 'd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'bs_Latn_BA': {
+                    'locale': 'bs_Latn_BA',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy.',
+                        'expectedValue': '17.11.2016.'
+                    }
+                },
+                'ca_ES': {
+                    'locale': 'ca_ES',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'cy_GB': {
+                    'locale': 'cy_GB',
+                    'localeInfo': {
+                        'format': 'dd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'da_DK': {
+                    'locale': 'da_DK',
+                    'localeInfo': {
+                        'format': 'dd/MM/y',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'de_DE': {
+                    'locale': 'de_DE',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'de_CH': {
+                    'locale': 'de_CH',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'de_AT': {
+                    'locale': 'de_AT',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'et_EE': {
+                    'locale': 'et_EE',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'en_AU': {
+                    'locale': 'en_AU',
+                    'localeInfo': {
+                        'format': 'd/MM/y',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'en_CA': {
+                    'locale': 'en_CA',
+                    'localeInfo': {
+                        'format': 'y-MM-dd',
+                        'expectedValue': '2016-11-17'
+                    }
+                },
+                'en_IE': {
+                    'locale': 'en_IE',
+                    'localeInfo': {
+                        'format': 'dd/MM/y',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'en_NZ': {
+                    'locale': 'en_NZ',
+                    'localeInfo': {
+                        'format': 'd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'en_GB': {
+                    'locale': 'en_GB',
+                    'localeInfo': {
+                        'format': 'dd/MM/y',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'en_US': {
+                    'locale': 'en_US',
+                    'localeInfo': {
+                        'format': 'M/d/yy',
+                        'expectedValue': '11/17/2016'
+                    }
+                },
+                'es_AR': {
+                    'locale': 'es_AR',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'es_CL': {
+                    'locale': 'es_CL',
+                    'localeInfo': {
+                        'format': 'dd-MM-yy',
+                        'expectedValue': '17-11-2016'
+                    }
+                },
+                'es_CO': {
+                    'locale': 'es_CO',
+                    'localeInfo': {
+                        'format': 'd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'es_CR': {
+                    'locale': 'es_CR',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'es_ES': {
+                    'locale': 'es_ES',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'es_MX': {
+                    'locale': 'es_MX',
+                    'localeInfo': {
+                        'format': 'dd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'es_PA': {
+                    'locale': 'es_PA',
+                    'localeInfo': {
+                        'format': 'MM/dd/yy',
+                        'expectedValue': '11/17/2016'
+                    }
+                },
+                'es_PE': {
+                    'locale': 'es_PE',
+                    'localeInfo': {
+                        'format': 'd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'es_VE': {
+                    'locale': 'es_VE',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'eu_ES': {
+                    'locale': 'eu_ES',
+                    'localeInfo': {
+                        'format': 'y/MM/dd',
+                        'expectedValue': '2016/11/17'
+                    }
+                },
+                'fil_PH': {
+                    'locale': 'fil_PH',
+                    'localeInfo': {
+                        'format': 'M/d/yy',
+                        'expectedValue': '11/17/2016'
+                    }
+                },
+                'fr_BE': {
+                    'locale': 'fr_BE',
+                    'localeInfo': {
+                        'format': 'd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'fr_CA': {
+                    'locale': 'fr_CA',
+                    'localeInfo': {
+                        'format': 'yy-MM-dd',
+                        'expectedValue': '2016-11-17'
+                    }
+                },
+                'fr_FR': {
+                    'locale': 'fr_FR',
+                    'localeInfo': {
+                        'format': 'dd/MM/y',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'gl_ES': {
+                    'locale': 'gl_ES',
+                    'localeInfo': {
+                        'format': 'dd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'hr_HR': {
+                    'locale': 'hr_HR',
+                    'localeInfo': {
+                        'format': 'dd.MM.y.',
+                        'expectedValue': '17.11.2016.'
+                    }
+                },
+                'it_IT': {
+                    'locale': 'it_IT',
+                    'localeInfo': {
+                        'format': 'dd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'it_CH': {
+                    'locale': 'it_CH',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'sw_KE': {
+                    'locale': 'sw_KE',
+                    'localeInfo': {
+                        'format': 'dd/MM/y',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'lv_LV': {
+                    'locale': 'lv_LV',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'lt_LT': {
+                    'locale': 'lt_LT',
+                    'localeInfo': {
+                        'format': 'y-MM-dd',
+                        'expectedValue': '2016-11-17'
+                    }
+                },
+                'hu_HU': {
+                    'locale': 'hu_HU',
+                    'localeInfo': {
+                        'format': 'y. MM. dd.',
+                        'expectedValue': '2016. 11. 17.'
+                    }
+                },
+                'nl_BE': {
+                    'locale': 'nl_BE',
+                    'localeInfo': {
+                        'format': 'd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'nl_NL': {
+                    'locale': 'nl_NL',
+                    'localeInfo': {
+                        'format': 'dd-MM-yy',
+                        'expectedValue': '17-11-2016'
+                    }
+                },
+                'nb_NO': {
+                    'locale': 'nb_NO',
+                    'localeInfo': {
+                        'format': 'dd.MM.y',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'nn_NO': {
+                    'locale': 'nn_NO',
+                    'localeInfo': {
+                        'format': 'dd.MM.y',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'pl_PL': {
+                    'locale': 'pl_PL',
+                    'localeInfo': {
+                        'format': 'dd.MM.y',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'pt_BR': {
+                    'locale': 'pt_BR',
+                    'localeInfo': {
+                        'format': 'dd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'pt_PT': {
+                    'locale': 'pt_PT',
+                    'localeInfo': {
+                        'format': 'dd/MM/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'ro_RO': {
+                    'locale': 'ro_RO',
+                    'localeInfo': {
+                        'format': 'dd.MM.y',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'sq_AL': {
+                    'locale': 'sq_AL',
+                    'localeInfo': {
+                        'format': 'd.M.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'sk_SK': {
+                    'locale': 'sk_SK',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'sl_SI': {
+                    'locale': 'sl_SI',
+                    'localeInfo': {
+                        'format': 'd. MM. yy',
+                        'expectedValue': '17. 11. 2016'
+                    }
+                },
+                'fi_FI': {
+                    'locale': 'fi_FI',
+                    'localeInfo': {
+                        'format': 'd.M.y',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'sv_SE': {
+                    'locale': 'sv_SE',
+                    'localeInfo': {
+                        'format': 'y-MM-dd',
+                        'expectedValue': '2016-11-17'
+                    }
+                },
+                'vi_VN': {
+                    'locale': 'vi_VN',
+                    'localeInfo': {
+                        'format': 'dd/MM/y',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'tr_TR': {
+                    'locale': 'tr_TR',
+                    'localeInfo': {
+                        'format': 'd.MM.y',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'is_IS': {
+                    'locale': 'is_IS',
+                    'localeInfo': {
+                        'format': 'd.M.y',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'cs_CZ': {
+                    'locale': 'cs_CZ',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'el_GR': {
+                    'locale': 'el_GR',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'be_BY': {
+                    'locale': 'be_BY',
+                    'localeInfo': {
+                        'format': 'd.M.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'bg_BG': {
+                    'locale': 'bg_BG',
+                    'localeInfo': {
+                        'format': 'd.MM.yy г.',
+                        'expectedValue': '17.11.2016 г.'
+                    }
+                },
+                'mk_MK': {
+                    'locale': 'mk_MK',
+                    'localeInfo': {
+                        'format': 'dd.M.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'mn_Cyrl_MN': {
+                    'locale': 'mn_Cyrl_MN',
+                    'localeInfo': {
+                        'format': 'y-MM-dd',
+                        'expectedValue': '2016-11-17'
+                    }
+                },
+                'ru_RU': {
+                    'locale': 'ru_RU',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'sr_Cyrl_RS': {
+                    'locale': 'sr_Cyrl_RS',
+                    'localeInfo': {
+                        'format': 'd.M.yy.',
+                        'expectedValue': '17.11.2016.'
+                    }
+                },
+                'uk_UA': {
+                    'locale': 'uk_UA',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'he_IL': {
+                    'locale': 'he_IL',
+                    'localeInfo': {
+                        'format': 'd.M.y',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'ar_DZ': {
+                    'locale': 'ar_DZ',
+                    'localeInfo': {
+                        'format': 'd‏/M‏/y',
+                        'expectedValue': '17‏/11‏/2016'
+                    }
+                },
+                'ar_KW': {
+                    'locale': 'ar_KW',
+                    'localeInfo': {
+                        'format': 'd‏/M‏/y',
+                        'expectedValue': '17‏/11‏/2016'
+                    }
+                },
+                'ar_MA': {
+                    'locale': 'ar_MA',
+                    'localeInfo': {
+                        'format': 'd‏/M‏/y',
+                        'expectedValue': '17‏/11‏/2016'
+                    }
+                },
+                'ar_SA': {
+                    'locale': 'ar_SA',
+                    'localeInfo': {
+                        'format': 'd‏/M‏/y',
+                        'expectedValue': '17‏/11‏/2016'
+                    }
+                },
+                'ar_EG': {
+                    'locale': 'ar_EG',
+                    'localeInfo': {
+                        'format': 'd‏/M‏/y',
+                        'expectedValue':  '17‏/11‏/2016'
+                    }
+                },
+                'fa_IR': {
+                    'locale': 'fa_IR',
+                    'localeInfo': {
+                        'format': 'y/M/d G',
+                        'expectedValue': '2016/11/17 G'
+                    }
+                },
+                'hi_IN': {
+                    'locale': 'hi_IN',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'bn_BD': {
+                    'locale': 'bn_BD',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'gu_IN': {
+                    'locale': 'gu_IN',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'th_TH': {
+                    'locale': 'th_TH',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'lo_LA': {
+                    'locale': 'lo_LA',
+                    'localeInfo': {
+                        'format': 'd/M/y',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'ka_GE': {
+                    'locale': 'ka_GE',
+                    'localeInfo': {
+                        'format': 'dd.MM.yy',
+                        'expectedValue': '17.11.2016'
+                    }
+                },
+                'km_KH': {
+                    'locale': 'km_KH',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'zh_Hans_CN': {
+                    'locale': 'zh_Hans_CN',
+                    'localeInfo': {
+                        'format': 'yy/M/d',
+                        'expectedValue': '2016/11/17'
+                    }
+                },
+                'zh_Hant_HK': {
+                    'locale': 'zh_Hant_HK',
+                    'localeInfo': {
+                        'format': 'd/M/yy',
+                        'expectedValue': '17/11/2016'
+                    }
+                },
+                'zh_Hant_TW': {
+                    'locale': 'zh_Hant_TW',
+                    'localeInfo': {
+                        'format': 'y/M/d',
+                        'expectedValue': '2016/11/17'
+                    }
+                },
+                'ja_JP': {
+                    'locale': 'ja_JP',
+                    'localeInfo': {
+                        'format': 'y/MM/dd',
+                        'expectedValue': '2016/11/17'
+                    }
+                },
+                'ko_KR': {
+                    'locale': 'ko_KR',
+                    'localeInfo': {
+                        'format': 'yy. M. d.',
+                        'expectedValue': '2016. 11. 17.'
+                    }
+                }
+            };
+
+            for (p in fixture) {
+                if (fixture.hasOwnProperty(p)) {
+                    localeValues = fixture[p];
+                    format = localeValues.localeInfo.format;
+                    expectedValue = localeValues.localeInfo.expectedValue;
+                    momentFormat = utils.convertToMomentFormat(format);
+                    dt = moment('2016-11-17');
+                    m = moment(dt, momentFormat);
+
+                    expect(m.format(momentFormat)).toBe(expectedValue);
+                }
+            }
+        });
+    });
+});
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/ObserverImplementationTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/ObserverImplementationTest.php
index 037069e8fd2ca551a216a1e3fe349e1793aa8768..6c4bc5f52c0c06b08f44f2a70554fd3d11c9bca7 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/ObserverImplementationTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/ObserverImplementationTest.php
@@ -22,29 +22,6 @@ class ObserverImplementationTest extends \PHPUnit_Framework_TestCase
      */
     protected static $observerClasses = [];
 
-    /**
-     * @var array
-     */
-    protected static $blackList = [
-        // not support of virtual types
-        'SalesOrderIndexGridAsyncInsertObserver',
-        'SalesInvoiceIndexGridAsyncInsertObserver',
-        'SalesShipmentIndexGridAsyncInsertObserver',
-        'SalesCreditmemoIndexGridAsyncInsertObserver',
-        'SalesOrderIndexGridSyncInsert',
-        'SalesInvoiceIndexGridSyncInsert',
-        'SalesShipmentIndexGridSyncInsert',
-        'SalesCreditmemoIndexGridSyncInsert',
-        'SalesOrderIndexGridSyncRemove',
-        'SalesInvoiceIndexGridSyncRemove',
-        'SalesShipmentIndexGridSyncRemove',
-        'SalesCreditmemoIndexGridSyncRemove',
-        'SalesOrderSendEmailsObserver',
-        'SalesOrderInvoiceSendEmailsObserver',
-        'SalesOrderShipmentSendEmailsObserver',
-        'SalesOrderCreditmemoSendEmailsObserver',
-    ];
-
     public static function setUpBeforeClass()
     {
         self::$observerClasses = array_merge(
@@ -116,9 +93,18 @@ class ObserverImplementationTest extends \PHPUnit_Framework_TestCase
                 }
             }
         }
+
+        $blacklistFiles = str_replace('\\', '/', realpath(__DIR__)) . '/_files/blacklist/observers*.txt';
+        $blacklistExceptions = [];
+        foreach (glob($blacklistFiles) as $fileName) {
+            $blacklistExceptions = array_merge(
+                $blacklistExceptions,
+                file($fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)
+            );
+        }
         return array_diff(
             array_unique($observerClasses),
-            self::$blackList
+            $blacklistExceptions
         );
     }
 }
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/observers.txt b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/observers.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3e9b19322cb09773f161b0e502ed7d84e7826a7e
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/observers.txt
@@ -0,0 +1,16 @@
+SalesOrderIndexGridAsyncInsertObserver
+SalesInvoiceIndexGridAsyncInsertObserver
+SalesShipmentIndexGridAsyncInsertObserver
+SalesCreditmemoIndexGridAsyncInsertObserver
+SalesOrderIndexGridSyncInsert
+SalesInvoiceIndexGridSyncInsert
+SalesShipmentIndexGridSyncInsert
+SalesCreditmemoIndexGridSyncInsert
+SalesOrderIndexGridSyncRemove
+SalesInvoiceIndexGridSyncRemove
+SalesShipmentIndexGridSyncRemove
+SalesCreditmemoIndexGridSyncRemove
+SalesOrderSendEmailsObserver
+SalesOrderInvoiceSendEmailsObserver
+SalesOrderShipmentSendEmailsObserver
+SalesOrderCreditmemoSendEmailsObserver
diff --git a/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/magento.txt b/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/magento.txt
index 29b5280ec6693f70c8d65a1f40e25c644897ace1..4f27497305353e0903207a48ed81d22885e66120 100644
--- a/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/magento.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/magento.txt
@@ -923,7 +923,6 @@ vendor/magento/module-ui/view/base/web/js/form/components/html.js
 vendor/magento/module-ui/view/base/web/js/form/components/tab_group.js
 vendor/magento/module-ui/view/base/web/js/form/components/tab.js
 vendor/magento/module-ui/view/base/web/js/form/element/abstract.js
-vendor/magento/module-ui/view/base/web/js/form/element/date.js
 vendor/magento/module-ui/view/base/web/js/form/element/helpers/options.js
 vendor/magento/module-ui/view/base/web/js/form/element/multiselect.js
 vendor/magento/module-ui/view/base/web/js/form/element/post-code.js
diff --git a/lib/internal/Magento/Framework/App/Config/CommentInterface.php b/lib/internal/Magento/Framework/App/Config/CommentInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..902d63668f368912208ed38c9d19ebb985af8b31
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/CommentInterface.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Provide access to data. Each Source can be responsible for each storage, where config data can be placed
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+/**
+ * Interface CommentInterface
+ */
+interface CommentInterface
+{
+    /**
+     * Retrieve comment for configuration data.
+     *
+     * @return string
+     */
+    public function get();
+}
diff --git a/lib/internal/Magento/Framework/App/Config/PreProcessorComposite.php b/lib/internal/Magento/Framework/App/Config/PreProcessorComposite.php
new file mode 100644
index 0000000000000000000000000000000000000000..10c355d290dfc43f818fa3799ad8b46807d7e6cd
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/PreProcessorComposite.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+use Magento\Framework\App\Config\Spi\PreProcessorInterface;
+
+/**
+ * Class PreProcessorComposite
+ */
+class PreProcessorComposite implements PreProcessorInterface
+{
+    /**
+     * @var PreProcessorInterface[]
+     */
+    private $processors = [];
+
+    /**
+     * @param PreProcessorInterface[] $processors
+     */
+    public function __construct(array $processors = [])
+    {
+        $this->processors = $processors;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function process(array $config)
+    {
+        /** @var PreProcessorInterface $processor */
+        foreach ($this->processors as $processor) {
+            $config = $processor->process($config);
+        }
+
+        return $config;
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Config/Spi/PreProcessorInterface.php b/lib/internal/Magento/Framework/App/Config/Spi/PreProcessorInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..1be0783d7f7deb9ec393a40eff2e2d0df3197281
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/Spi/PreProcessorInterface.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config\Spi;
+
+/**
+ * Allows to use custom callbacks and functions before applying fallback
+ */
+interface PreProcessorInterface
+{
+    /**
+     * Pre-processing of config
+     *
+     * @param array $config
+     * @return array
+     */
+    public function process(array $config);
+}
diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php
index a1635fc4b2670d3749adbc8ac7bb88bab31904cf..d5a224d1b50b221d0afcf7c6127325d702c5217d 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php
@@ -149,7 +149,9 @@ class Reader
             foreach ($initialFilePools as $initialFiles) {
                 if (isset($initialFiles[$fileKey]) && $fileDriver->isExists($path . '/' . $initialFiles[$fileKey])) {
                     $fileBuffer = include $path . '/' . $initialFiles[$fileKey];
-                    $result = array_replace_recursive($result, $fileBuffer);
+                    if (is_array($fileBuffer)) {
+                        $result = array_replace_recursive($result, $fileBuffer);
+                    }
                 }
             }
         }
@@ -159,6 +161,13 @@ class Reader
             $result = array_replace_recursive($result, $fileBuffer);
         }
 
+        if ($fileDriver->isExists($path . '/' . $pathConfig)) {
+            $configResult = include $path . '/' . $pathConfig;
+            if (is_array($configResult)) {
+                $result = array_replace_recursive($result, $configResult);
+            }
+        }
+
         return $result;
     }
 
diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php
index 6cead0305a6c6ada899060a2a7debdbfe71f6f1a..2d8e7a14aaf55519d33376f1ee09f80b9b46cec6 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php
@@ -94,10 +94,11 @@ class Writer
      * @param array $data
      * @param bool $override
      * @param string $pool
+     * @param array $comments
      * @return void
      * @throws FileSystemException
      */
-    public function saveConfig(array $data, $override = false, $pool = null)
+    public function saveConfig(array $data, $override = false, $pool = null, array $comments = [])
     {
         foreach ($data as $fileKey => $config) {
             $paths = $pool ? $this->configFilePool->getPathsByPool($pool) : $this->configFilePool->getPaths();
@@ -112,7 +113,7 @@ class Writer
                     }
                 }
 
-                $contents = $this->formatter->format($config);
+                $contents = $this->formatter->format($config, $comments);
                 try {
                     $writeFilePath = $paths[$fileKey];
                     $this->filesystem->getDirectoryWrite(DirectoryList::CONFIG)->writeFile($writeFilePath, $contents);
diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/FormatterInterface.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/FormatterInterface.php
index 24e31074501f3aae16a12bed0473ccfd43d45ac0..640bcb61d2031abd4d671e6f02de0636b252b16d 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/FormatterInterface.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/FormatterInterface.php
@@ -12,7 +12,8 @@ interface FormatterInterface
      * Format deployment configuration
      *
      * @param array $data
+     * @param array $comments
      * @return string
      */
-    public function format($data);
+    public function format($data, array $comments = []);
 }
diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
index 1ab99358cef1adacff5dc2dabc1ea884885e5d95..91bd906e3ca4d83438188e3131ba5e9537af939c 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
@@ -12,10 +12,26 @@ namespace Magento\Framework\App\DeploymentConfig\Writer;
 class PhpFormatter implements FormatterInterface
 {
     /**
+     * Format deployment configuration.
+     * If $comments is present, each item will be added
+     * as comment to the corresponding section
+     *
      * {@inheritdoc}
      */
-    public function format($data)
+    public function format($data, array $comments = [])
     {
+        if (!empty($comments) && is_array($data)) {
+            $elements = [];
+            foreach ($data as $key => $value) {
+                $comment = '  ';
+                if (!empty($comments[$key])) {
+                    $comment = "  /**\n * " . str_replace("\n", "\n * ", var_export($comments[$key], true)) . "\n */\n";
+                }
+                $space = is_array($value) ? " \n" : ' ';
+                $elements[] = $comment . var_export($key, true) . ' =>' . $space . var_export($value, true);
+            }
+            return "<?php\nreturn array (\n" . implode(",\n", str_replace("\n", "\n  ", $elements)) . "\n);\n";
+        }
         return "<?php\nreturn " . var_export($data, true) . ";\n";
     }
 }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/PreProcessorCompositeTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/PreProcessorCompositeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..291bef1266134f7956919a2c831af4a7fd4715e2
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/PreProcessorCompositeTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Test\Unit\Config;
+
+use Magento\Framework\App\Config\PreProcessorComposite;
+use Magento\Framework\App\Config\Spi\PreProcessorInterface;
+
+class PreProcessorCompositeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var PreProcessorComposite
+     */
+    private $model;
+
+    /**
+     * @var PreProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $preProcessorMock;
+
+    protected function setUp()
+    {
+        $this->preProcessorMock = $this->getMockBuilder(PreProcessorInterface::class)
+            ->getMockForAbstractClass();
+
+        $this->model = new PreProcessorComposite([$this->preProcessorMock]);
+    }
+
+    public function testProcess()
+    {
+        $this->preProcessorMock->expects($this->once())
+            ->method('process')
+            ->with(['test' => 'data'])
+            ->willReturn(['test' => 'data2']);
+
+        $this->assertSame(['test' => 'data2'], $this->model->process(['test' => 'data']));
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php
index a9b5bc04a12768f8de76e5cdc514e226fb4af05b..2ab8b209272f1cc882c14fb1a2dd9a15c22605f4 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php
@@ -10,10 +10,128 @@ use \Magento\Framework\App\DeploymentConfig\Writer\PhpFormatter;
 
 class PhpFormatterTest extends \PHPUnit_Framework_TestCase
 {
-    public function testFormat()
+    /**
+     * @dataProvider formatWithCommentDataProvider
+     * @param string|array $data
+     * @param array $comments
+     * @param string $expectedResult
+     */
+    public function testFormat($data, $comments, $expectedResult)
     {
         $formatter = new PhpFormatter();
-        $data = 'test';
-        $this->assertEquals("<?php\nreturn 'test';\n", $formatter->format($data));
+        $this->assertEquals($expectedResult, $formatter->format($data, $comments));
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     */
+    public function formatWithCommentDataProvider()
+    {
+        $array = [
+            'ns1' => [
+                's1' => [
+                    's11',
+                    's12'
+                ],
+                's2' => [
+                    's21',
+                    's22'
+                ],
+            ],
+            'ns2' => [
+                's1' => [
+                    's11'
+                ],
+            ],
+            'ns3' => 'just text',
+            'ns4' => 'just text'
+        ];
+        $comments1 = ['ns2' => 'comment for namespace 2'];
+        $comments2 = [
+            'ns1' => 'comment for namespace 1',
+            'ns2' => "comment for namespace 2.\nNext comment for namespace 2",
+            'ns3' => 'comment for namespace 3',
+            'ns4' => 'comment for namespace 4',
+            'ns5' => 'comment for unexisted namespace 5',
+        ];
+        $expectedResult1 = <<<TEXT
+<?php
+return array (
+  'ns1' => 
+  array (
+    's1' => 
+    array (
+      0 => 's11',
+      1 => 's12',
+    ),
+    's2' => 
+    array (
+      0 => 's21',
+      1 => 's22',
+    ),
+  ),
+  /**
+   * 'comment for namespace 2'
+   */
+  'ns2' => 
+  array (
+    's1' => 
+    array (
+      0 => 's11',
+    ),
+  ),
+  'ns3' => 'just text',
+  'ns4' => 'just text'
+);
+
+TEXT;
+        $expectedResult2 = <<<TEXT
+<?php
+return array (
+  /**
+   * 'comment for namespace 1'
+   */
+  'ns1' => 
+  array (
+    's1' => 
+    array (
+      0 => 's11',
+      1 => 's12',
+    ),
+    's2' => 
+    array (
+      0 => 's21',
+      1 => 's22',
+    ),
+  ),
+  /**
+   * 'comment for namespace 2.
+   * Next comment for namespace 2'
+   */
+  'ns2' => 
+  array (
+    's1' => 
+    array (
+      0 => 's11',
+    ),
+  ),
+  /**
+   * 'comment for namespace 3'
+   */
+  'ns3' => 'just text',
+  /**
+   * 'comment for namespace 4'
+   */
+  'ns4' => 'just text'
+);
+
+TEXT;
+        return [
+            ['string', [], "<?php\nreturn 'string';\n"],
+            ['string', ['comment'], "<?php\nreturn 'string';\n"],
+            [$array, [], "<?php\nreturn " . var_export($array, true) . ";\n"],
+            [$array, $comments1, $expectedResult1],
+            [$array, $comments2, $expectedResult2],
+        ];
     }
 }
diff --git a/lib/internal/Magento/Framework/Crontab/CrontabManager.php b/lib/internal/Magento/Framework/Crontab/CrontabManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..2b597b8eb638fb21af887ab7b47490f5533fafae
--- /dev/null
+++ b/lib/internal/Magento/Framework/Crontab/CrontabManager.php
@@ -0,0 +1,199 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Crontab;
+
+use Magento\Framework\ShellInterface;
+use Magento\Framework\Phrase;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Filesystem;
+use Magento\Framework\App\Filesystem\DirectoryList;
+
+/**
+ * Manager works with cron tasks
+ */
+class CrontabManager implements CrontabManagerInterface
+{
+    /**
+     * @var ShellInterface
+     */
+    private $shell;
+
+    /**
+     * @var Filesystem
+     */
+    private $filesystem;
+
+    /**
+     * @param ShellInterface $shell
+     * @param Filesystem $filesystem
+     */
+    public function __construct(
+        ShellInterface $shell,
+        Filesystem $filesystem
+    ) {
+        $this->shell = $shell;
+        $this->filesystem = $filesystem;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTasks()
+    {
+        $this->checkSupportedOs();
+        $content = $this->getCrontabContent();
+        $pattern = '!(' . self::TASKS_BLOCK_START . ')(.*?)(' . self::TASKS_BLOCK_END . ')!s';
+
+        if (preg_match($pattern, $content, $matches)) {
+            $tasks = trim($matches[2], PHP_EOL);
+            $tasks = explode(PHP_EOL, $tasks);
+            return $tasks;
+        }
+
+        return [];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveTasks(array $tasks)
+    {
+        $this->checkSupportedOs();
+        $baseDir = $this->filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath();
+        $logDir = $this->filesystem->getDirectoryRead(DirectoryList::LOG)->getAbsolutePath();
+
+        if (!$tasks) {
+            throw new LocalizedException(new Phrase('List of tasks is empty'));
+        }
+
+        foreach ($tasks as $key => $task) {
+            if (empty($task['expression'])) {
+                $tasks[$key]['expression'] = '* * * * *';
+            }
+
+            if (empty($task['command'])) {
+                throw new LocalizedException(new Phrase('Command should not be empty'));
+            }
+
+            $tasks[$key]['command'] = str_replace(
+                ['{magentoRoot}', '{magentoLog}'],
+                [$baseDir, $logDir],
+                $task['command']
+            );
+        }
+
+        $content = $this->getCrontabContent();
+        $content = $this->cleanMagentoSection($content);
+        $content = $this->generateSection($content, $tasks);
+
+        $this->save($content);
+    }
+
+    /**
+     * {@inheritdoc}
+     * @throws LocalizedException
+     */
+    public function removeTasks()
+    {
+        $this->checkSupportedOs();
+        $content = $this->getCrontabContent();
+        $content = $this->cleanMagentoSection($content);
+        $this->save($content);
+    }
+
+    /**
+     * Generate Magento Tasks Section
+     *
+     * @param string $content
+     * @param array $tasks
+     * @return string
+     */
+    private function generateSection($content, $tasks = [])
+    {
+        if ($tasks) {
+            $content .= self::TASKS_BLOCK_START . PHP_EOL;
+            foreach ($tasks as $task) {
+                $content .=  $task['expression'] . ' ' . PHP_BINARY . ' '. $task['command'] . PHP_EOL;
+            }
+            $content .= self::TASKS_BLOCK_END . PHP_EOL;
+        }
+
+        return $content;
+    }
+
+    /**
+     * Clean Magento Tasks Section in crontab content
+     *
+     * @param string $content
+     * @return string
+     */
+    private function cleanMagentoSection($content)
+    {
+        $content = preg_replace(
+            '!' . preg_quote(self::TASKS_BLOCK_START) . '.*?' . preg_quote(self::TASKS_BLOCK_END . PHP_EOL) . '!s',
+            '',
+            $content
+        );
+
+        return $content;
+    }
+
+    /**
+     * Get crontab content without Magento Tasks Section
+     *
+     * In case of some exceptions the empty content is returned
+     *
+     * @return string
+     */
+    private function getCrontabContent()
+    {
+        try {
+            $content = (string)$this->shell->execute('crontab -l');
+        } catch (LocalizedException $e) {
+            return '';
+        }
+
+        return $content;
+    }
+
+    /**
+     * Save crontab
+     *
+     * @param string $content
+     * @return void
+     * @throws LocalizedException
+     */
+    private function save($content)
+    {
+        $content = str_replace('%', '%%', $content);
+
+        try {
+            $this->shell->execute('echo "' . $content . '" | crontab -');
+        } catch (LocalizedException $e) {
+            throw new LocalizedException(
+                new Phrase('Error during saving of crontab: %1', [$e->getPrevious()->getMessage()]),
+                $e
+            );
+        }
+    }
+
+    /**
+     * Check that OS is supported
+     *
+     * If OS is not supported then no possibility to work with crontab
+     *
+     * @return void
+     * @throws LocalizedException
+     */
+    private function checkSupportedOs()
+    {
+        if (stripos(PHP_OS, 'WIN') === 0) {
+            throw new LocalizedException(
+                new Phrase('Your operation system is not supported to work with this command')
+            );
+        }
+    }
+}
diff --git a/lib/internal/Magento/Framework/Crontab/CrontabManagerInterface.php b/lib/internal/Magento/Framework/Crontab/CrontabManagerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..c00ab41d8b873a46dc27abbb1af37a23b7e7fd86
--- /dev/null
+++ b/lib/internal/Magento/Framework/Crontab/CrontabManagerInterface.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Crontab;
+
+use Magento\Framework\Exception\LocalizedException;
+
+interface CrontabManagerInterface
+{
+    /**#@+
+     * Constants for wrapping Magento section in crontab
+     */
+    const TASKS_BLOCK_START = '#~ MAGENTO START';
+    const TASKS_BLOCK_END = '#~ MAGENTO END';
+    /**#@-*/
+
+    /**
+     * Get list of Magento Tasks
+     *
+     * @return array
+     * @throws LocalizedException
+     */
+    public function getTasks();
+
+    /**
+     * Save Magento Tasks to crontab
+     *
+     * @param array $tasks
+     * @return void
+     * @throws LocalizedException
+     */
+    public function saveTasks(array $tasks);
+
+    /**
+     * Remove Magento Tasks form crontab
+     *
+     * @return void
+     * @throws LocalizedException
+     */
+    public function removeTasks();
+}
diff --git a/lib/internal/Magento/Framework/Crontab/README.md b/lib/internal/Magento/Framework/Crontab/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..bfbf194715dc8f9f359137ecb79be5a1adbd5c5e
--- /dev/null
+++ b/lib/internal/Magento/Framework/Crontab/README.md
@@ -0,0 +1,12 @@
+Library for working with crontab
+
+The library has the next interfaces:
+* CrontabManagerInterface
+* TasksProviderInterface
+
+*CrontabManagerInterface* provides working with crontab:
+* *getTasks* - get list of Magento cron tasks from crontab
+* *saveTasks* - save Magento cron tasks to crontab
+* *removeTasks* - remove Magento cron tasks from crontab
+
+*TasksProviderInterface* has only one method *getTasks*. This interface provides transportation the list of tasks from DI
\ No newline at end of file
diff --git a/lib/internal/Magento/Framework/Crontab/TasksProvider.php b/lib/internal/Magento/Framework/Crontab/TasksProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..94524fd2bbd19b4395a8ba36daaa0f43c2b6c648
--- /dev/null
+++ b/lib/internal/Magento/Framework/Crontab/TasksProvider.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Crontab;
+
+/**
+ * TasksProvider collects list of tasks
+ */
+class TasksProvider implements TasksProviderInterface
+{
+    /**
+     * @var array
+     */
+    private $tasks = [];
+
+    /**
+     * @param array $tasks
+     */
+    public function __construct(array $tasks = [])
+    {
+        $this->tasks = $tasks;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTasks()
+    {
+        return $this->tasks;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Crontab/TasksProviderInterface.php b/lib/internal/Magento/Framework/Crontab/TasksProviderInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..bb02c30797be4cbf015c5858ac1c88825bde54a7
--- /dev/null
+++ b/lib/internal/Magento/Framework/Crontab/TasksProviderInterface.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Crontab;
+
+interface TasksProviderInterface
+{
+    /**
+     * Get list of tasks
+     *
+     * @return array
+     */
+    public function getTasks();
+}
diff --git a/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php b/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7cafd386c629a4b48350d5ca4937b58fd49da4b6
--- /dev/null
+++ b/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php
@@ -0,0 +1,333 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Crontab\Test\Unit;
+
+use Magento\Framework\Crontab\CrontabManager;
+use Magento\Framework\Crontab\CrontabManagerInterface;
+use Magento\Framework\ShellInterface;
+use Magento\Framework\Phrase;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Filesystem;
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\Filesystem\Directory\ReadInterface;
+use Magento\Framework\Filesystem\DriverPool;
+
+class CrontabManagerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ShellInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $shellMock;
+
+    /**
+     * @var Filesystem|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $filesystemMock;
+
+    /**
+     * @var CrontabManager
+     */
+    private $crontabManager;
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $this->shellMock = $this->getMockBuilder(ShellInterface::class)
+            ->getMockForAbstractClass();
+        $this->filesystemMock = $this->getMockBuilder(Filesystem::class)
+            ->disableOriginalClone()
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->crontabManager = new CrontabManager($this->shellMock, $this->filesystemMock);
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetTasksNoCrontab()
+    {
+        $exception = new \Exception('crontab: no crontab for user');
+        $localizedException = new LocalizedException(new Phrase('Some error'), $exception);
+
+        $this->shellMock->expects($this->once())
+            ->method('execute')
+            ->with('crontab -l', [])
+            ->willThrowException($localizedException);
+
+        $this->assertEquals([], $this->crontabManager->getTasks());
+    }
+
+    /**
+     * @param string $content
+     * @param array $tasks
+     * @return void
+     * @dataProvider getTasksDataProvider
+     */
+    public function testGetTasks($content, $tasks)
+    {
+        $this->shellMock->expects($this->once())
+            ->method('execute')
+            ->with('crontab -l', [])
+            ->willReturn($content);
+
+        $this->assertEquals($tasks, $this->crontabManager->getTasks());
+    }
+
+    /**
+     * @return array
+     */
+    public function getTasksDataProvider()
+    {
+        return [
+            [
+                'content' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+                    . '* * * * * /bin/php /var/www/magento/bin/magento cron:run' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
+                'tasks' => ['* * * * * /bin/php /var/www/magento/bin/magento cron:run'],
+            ],
+            [
+                'content' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+                    . '* * * * * /bin/php /var/www/magento/bin/magento cron:run' . PHP_EOL
+                    . '* * * * * /bin/php /var/www/magento/bin/magento setup:cron:run' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
+                'tasks' => [
+                    '* * * * * /bin/php /var/www/magento/bin/magento cron:run',
+                    '* * * * * /bin/php /var/www/magento/bin/magento setup:cron:run',
+                ],
+            ],
+            [
+                'content' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL,
+                'tasks' => [],
+            ],
+            [
+                'content' => '',
+                'tasks' => [],
+            ],
+        ];
+    }
+
+    /**
+     * @return void
+     * @expectedException \Magento\Framework\Exception\LocalizedException
+     * @expectedExceptionMessage Shell error
+     */
+    public function testRemoveTasksWithException()
+    {
+        $exception = new \Exception('Shell error');
+        $localizedException = new LocalizedException(new Phrase('Some error'), $exception);
+
+        $this->shellMock->expects($this->at(0))
+            ->method('execute')
+            ->with('crontab -l', [])
+            ->willReturn('');
+
+        $this->shellMock->expects($this->at(1))
+            ->method('execute')
+            ->with('echo "" | crontab -', [])
+            ->willThrowException($localizedException);
+
+        $this->crontabManager->removeTasks();
+    }
+
+    /**
+     * @param string $contentBefore
+     * @param string $contentAfter
+     * @return void
+     * @dataProvider removeTasksDataProvider
+     */
+    public function testRemoveTasks($contentBefore, $contentAfter)
+    {
+        $this->shellMock->expects($this->at(0))
+            ->method('execute')
+            ->with('crontab -l', [])
+            ->willReturn($contentBefore);
+
+        $this->shellMock->expects($this->at(1))
+            ->method('execute')
+            ->with('echo "' . $contentAfter . '" | crontab -', []);
+
+        $this->crontabManager->removeTasks();
+    }
+
+    /**
+     * @return array
+     */
+    public function removeTasksDataProvider()
+    {
+        return [
+            [
+                'contentBefore' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+                    . '* * * * * /bin/php /var/www/magento/bin/magento cron:run' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
+                'contentAfter' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+            ],
+            [
+                'contentBefore' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+                    . '* * * * * /bin/php /var/www/magento/bin/magento cron:run' . PHP_EOL
+                    . '* * * * * /bin/php /var/www/magento/bin/magento setup:cron:run' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
+                'contentAfter' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+            ],
+            [
+                'contentBefore' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL,
+                'contentAfter' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+            ],
+            [
+                'contentBefore' => '',
+                'contentAfter' => ''
+            ],
+        ];
+    }
+
+    /**
+     * @return void
+     * @expectedException \Magento\Framework\Exception\LocalizedException
+     * @expectedExceptionMessage List of tasks is empty
+     */
+    public function testSaveTasksWithEmptyTasksList()
+    {
+        $baseDirMock = $this->getMockBuilder(ReadInterface::class)
+            ->getMockForAbstractClass();
+        $baseDirMock->expects($this->once())
+            ->method('getAbsolutePath')
+            ->willReturn('/var/www/magento2/');
+        $logDirMock = $this->getMockBuilder(ReadInterface::class)
+            ->getMockForAbstractClass();
+        $logDirMock->expects($this->once())
+            ->method('getAbsolutePath')
+            ->willReturn('/var/www/magento2/var/log/');
+
+        $this->filesystemMock->expects($this->any())
+            ->method('getDirectoryRead')
+            ->willReturnMap([
+                [DirectoryList::ROOT, DriverPool::FILE, $baseDirMock],
+                [DirectoryList::LOG, DriverPool::FILE, $logDirMock],
+            ]);
+
+        $this->crontabManager->saveTasks([]);
+    }
+
+    /**
+     * @return void
+     * @expectedException \Magento\Framework\Exception\LocalizedException
+     * @expectedExceptionMessage Command should not be empty
+     */
+    public function testSaveTasksWithoutCommand()
+    {
+        $baseDirMock = $this->getMockBuilder(ReadInterface::class)
+            ->getMockForAbstractClass();
+        $baseDirMock->expects($this->once())
+            ->method('getAbsolutePath')
+            ->willReturn('/var/www/magento2/');
+        $logDirMock = $this->getMockBuilder(ReadInterface::class)
+            ->getMockForAbstractClass();
+        $logDirMock->expects($this->once())
+            ->method('getAbsolutePath')
+            ->willReturn('/var/www/magento2/var/log/');
+
+        $this->filesystemMock->expects($this->any())
+            ->method('getDirectoryRead')
+            ->willReturnMap([
+                [DirectoryList::ROOT, DriverPool::FILE, $baseDirMock],
+                [DirectoryList::LOG, DriverPool::FILE, $logDirMock],
+            ]);
+
+        $this->crontabManager->saveTasks([
+            'myCron' => ['expression' => '* * * * *']
+        ]);
+    }
+
+    /**
+     * @param array $tasks
+     * @param string $content
+     * @param string $contentToSave
+     * @return void
+     * @dataProvider saveTasksDataProvider
+     */
+    public function testSaveTasks($tasks, $content, $contentToSave)
+    {
+        $baseDirMock = $this->getMockBuilder(ReadInterface::class)
+            ->getMockForAbstractClass();
+        $baseDirMock->expects($this->once())
+            ->method('getAbsolutePath')
+            ->willReturn('/var/www/magento2/');
+        $logDirMock = $this->getMockBuilder(ReadInterface::class)
+            ->getMockForAbstractClass();
+        $logDirMock->expects($this->once())
+            ->method('getAbsolutePath')
+            ->willReturn('/var/www/magento2/var/log/');
+
+        $this->filesystemMock->expects($this->any())
+            ->method('getDirectoryRead')
+            ->willReturnMap([
+                [DirectoryList::ROOT, DriverPool::FILE, $baseDirMock],
+                [DirectoryList::LOG, DriverPool::FILE, $logDirMock],
+            ]);
+
+        $this->shellMock->expects($this->at(0))
+            ->method('execute')
+            ->with('crontab -l', [])
+            ->willReturn($content);
+
+        $this->shellMock->expects($this->at(1))
+            ->method('execute')
+            ->with('echo "' . $contentToSave . '" | crontab -', []);
+
+        $this->crontabManager->saveTasks($tasks);
+    }
+
+    /**
+     * @return array
+     */
+    public function saveTasksDataProvider()
+    {
+        $content = '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+            . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+            . '* * * * * /bin/php /var/www/magento/bin/magento cron:run' . PHP_EOL
+            . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL;
+
+        return [
+            [
+                'tasks' => [
+                    ['expression' => '* * * * *', 'command' => 'run.php']
+                ],
+                'content' => $content,
+                'contentToSave' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+                    . '* * * * * ' . PHP_BINARY . ' run.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
+            ],
+            [
+                'tasks' => [
+                    ['expression' => '1 2 3 4 5', 'command' => 'run.php']
+                ],
+                'content' => $content,
+                'contentToSave' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+                    . '1 2 3 4 5 ' . PHP_BINARY . ' run.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
+            ],
+            [
+                'tasks' => [
+                    ['command' => '{magentoRoot}run.php >> {magentoLog}cron.log']
+                ],
+                'content' => $content,
+                'contentToSave' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+                    . '* * * * * ' . PHP_BINARY . ' /var/www/magento2/run.php >>'
+                    . ' /var/www/magento2/var/log/cron.log' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
+            ],
+        ];
+    }
+}
diff --git a/lib/internal/Magento/Framework/Crontab/Test/Unit/TasksProviderTest.php b/lib/internal/Magento/Framework/Crontab/Test/Unit/TasksProviderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..80be47cda5ef4973ad1999968dd636da0bd1757a
--- /dev/null
+++ b/lib/internal/Magento/Framework/Crontab/Test/Unit/TasksProviderTest.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Crontab\Test\Unit;
+
+use Magento\Framework\Crontab\TasksProvider;
+
+class TasksProviderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @return void
+     */
+    public function testTasksProviderEmpty()
+    {
+        /** @var $tasksProvider $tasksProvider */
+        $tasksProvider = new TasksProvider();
+        $this->assertSame([], $tasksProvider->getTasks());
+    }
+
+    public function testTasksProvider()
+    {
+        $tasks = [
+            'magentoCron' => ['expressin' => '* * * * *', 'command' => 'bin/magento cron:run'],
+            'magentoSetup' => ['command' => 'bin/magento setup:cron:run'],
+        ];
+
+        /** @var $tasksProvider $tasksProvider */
+        $tasksProvider = new TasksProvider($tasks);
+        $this->assertSame($tasks, $tasksProvider->getTasks());
+    }
+}
diff --git a/lib/internal/Magento/Framework/Data/CollectionDataSourceInterface.php b/lib/internal/Magento/Framework/Data/CollectionDataSourceInterface.php
index eeff60c1f61c887ef87439b680e8d73fbf6791f2..4bdf29fd1c8fc167af98cc79fd1d20c9696c7b50 100644
--- a/lib/internal/Magento/Framework/Data/CollectionDataSourceInterface.php
+++ b/lib/internal/Magento/Framework/Data/CollectionDataSourceInterface.php
@@ -5,9 +5,11 @@
  */
 namespace Magento\Framework\Data;
 
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
 /**
  * Interface CollectionDataSourceInterface
  */
-interface CollectionDataSourceInterface
+interface CollectionDataSourceInterface extends ArgumentInterface
 {
 }
diff --git a/lib/internal/Magento/Framework/File/Mime.php b/lib/internal/Magento/Framework/File/Mime.php
index c8fe56eaa9e68ee9e61c9bcec7cf038b29fbff34..d698f9cced06ff7b3761ebfd226fa4cfca3b39f2 100644
--- a/lib/internal/Magento/Framework/File/Mime.php
+++ b/lib/internal/Magento/Framework/File/Mime.php
@@ -71,7 +71,7 @@ class Mime
             throw new \InvalidArgumentException("File '$file' doesn't exist");
         }
 
-        $extension = pathinfo($file, PATHINFO_EXTENSION);
+        $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
         if (isset($this->mimeTypes[$extension])) {
             $result = $this->mimeTypes[$extension];
         }
diff --git a/lib/internal/Magento/Framework/File/Test/Unit/MimeTest.php b/lib/internal/Magento/Framework/File/Test/Unit/MimeTest.php
index 7c2a1d71279c440953ba8bea4ef101412a53f5e6..90b970b7f8d8a1471c3f36fe5466838b11c49c97 100644
--- a/lib/internal/Magento/Framework/File/Test/Unit/MimeTest.php
+++ b/lib/internal/Magento/Framework/File/Test/Unit/MimeTest.php
@@ -47,6 +47,7 @@ class MimeTest extends \PHPUnit_Framework_TestCase
         return [
             'javascript' => [__DIR__ . '/_files/javascript.js', 'application/javascript'],
             'weird extension' => [__DIR__ . '/_files/file.weird', 'application/octet-stream'],
+            'weird uppercase extension' => [__DIR__ . '/_files/UPPERCASE.WEIRD', 'application/octet-stream'],
         ];
     }
 }
diff --git a/lib/internal/Magento/Framework/File/Test/Unit/_files/UPPERCASE.WEIRD b/lib/internal/Magento/Framework/File/Test/Unit/_files/UPPERCASE.WEIRD
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php b/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php
index 35d7b3ac5ee20ae669ccc66775498b3c0d9348b4..e2ea747218f60485e644ba6c3ba9b65da68409ab 100644
--- a/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php
+++ b/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php
@@ -27,8 +27,7 @@ class Curl implements \Zend_Http_Client_Adapter_Interface
             | CURLPROTO_FTPS
         ),
         'verifypeer' => true,
-        'verifyhost' => 2,
-        'sslversion' => 6
+        'verifyhost' => 2
     ];
 
     /**
diff --git a/lib/internal/Magento/Framework/HTTP/Client/Curl.php b/lib/internal/Magento/Framework/HTTP/Client/Curl.php
index 5ebc92abf70d9063af63683f5f530dd01470865a..c1d1299a1bd3fd578d1a40c2f173682dc079f004 100644
--- a/lib/internal/Magento/Framework/HTTP/Client/Curl.php
+++ b/lib/internal/Magento/Framework/HTTP/Client/Curl.php
@@ -13,8 +13,6 @@ namespace Magento\Framework\HTTP\Client;
  */
 class Curl implements \Magento\Framework\HTTP\ClientInterface
 {
-    const SSL_VERSION = 6;
-
     /**
      * Max supported protocol by curl CURL_SSLVERSION_TLSv1_2
      * @var int
@@ -122,7 +120,7 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface
     /**
      * @param int|null $sslVersion
      */
-    public function __construct($sslVersion = self::SSL_VERSION)
+    public function __construct($sslVersion = null)
     {
         $this->sslVersion = $sslVersion;
     }
@@ -383,7 +381,9 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface
 
         $this->curlOption(CURLOPT_RETURNTRANSFER, 1);
         $this->curlOption(CURLOPT_HEADERFUNCTION, [$this, 'parseHeaders']);
-        $this->curlOption(CURLOPT_SSLVERSION, $this->sslVersion);
+        if ($this->sslVersion !== null) {
+            $this->curlOption(CURLOPT_SSLVERSION, $this->sslVersion);
+        }
 
         if (count($this->_curlUserOptions)) {
             foreach ($this->_curlUserOptions as $k => $v) {
diff --git a/lib/internal/Magento/Framework/View/Element/Block/ArgumentInterface.php b/lib/internal/Magento/Framework/View/Element/Block/ArgumentInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..123a75946ba775c0e1565e7689201fde8f8c9f0b
--- /dev/null
+++ b/lib/internal/Magento/Framework/View/Element/Block/ArgumentInterface.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\View\Element\Block;
+
+/**
+ * Block argument interface.
+ * All objects that are injected to block arguments should implement this interface.
+ */
+interface ArgumentInterface
+{
+}
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/ObjectTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/ObjectTest.php
index a8f2374cc0ce11efd32b7c6e0419db5c3a799086..8de579730b154035d02b38fbdb8d07ef3315d194 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/ObjectTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/ObjectTest.php
@@ -34,16 +34,11 @@ class ObjectTest extends \PHPUnit_Framework_TestCase
 
     public function testEvaluate()
     {
-        $input = ['value' => self::EXPECTED_CLASS];
-        $this->_objectManager->expects(
-            $this->once()
-        )->method(
-            'create'
-        )->with(
-            self::EXPECTED_CLASS
-        )->will(
-            $this->returnValue($this)
-        );
+        $input = ['name' => 'dataSource', 'value' => self::EXPECTED_CLASS];
+        $this->_objectManager->expects($this->once())
+            ->method('create')
+            ->with(self::EXPECTED_CLASS)
+            ->willReturn($this);
 
         $actual = $this->_model->evaluate($input);
         $this->assertSame($this, $actual);
@@ -56,17 +51,18 @@ class ObjectTest extends \PHPUnit_Framework_TestCase
     {
         $this->setExpectedException($expectedException, $expectedExceptionMessage);
         $self = $this;
-        $this->_objectManager->expects($this->any())->method('create')->will(
-            $this->returnCallback(
-                function ($className) use ($self) {
-                    return $self->getMock($className);
-                }
-            )
+        $this->_objectManager->expects($this->any())->method('create')->willReturnCallback(
+            function ($className) use ($self) {
+                return $self->getMock($className);
+            }
         );
 
         $this->_model->evaluate($input);
     }
 
+    /**
+     * @return array
+     */
     public function evaluateWrongClassDataProvider()
     {
         return [
diff --git a/lib/web/mage/calendar.js b/lib/web/mage/calendar.js
index 984274575aa3ab0af08faee6bf1f653f73782adb..5893b95f4bd38b21e17628353489c37af758848e 100644
--- a/lib/web/mage/calendar.js
+++ b/lib/web/mage/calendar.js
@@ -552,7 +552,7 @@
         //Set date/time according to timezone offset
         $(el).datepicker('setTimezoneDate')
             // To ensure that user can re-select date field without clicking outside it first.
-            .blur();
+            .blur().trigger('change');
     };
 
     return {
diff --git a/lib/web/mage/utils/misc.js b/lib/web/mage/utils/misc.js
index c6440b8929395419053ab53961f5fcc231ab7eee..29fed485f290c86f92099fc6cba68734711980d2 100644
--- a/lib/web/mage/utils/misc.js
+++ b/lib/web/mage/utils/misc.js
@@ -207,6 +207,22 @@ define([
             }
 
             return formData;
+        },
+
+        /**
+         * Converts PHP IntlFormatter format to moment format.
+         *
+         * @param {String} format - PHP format
+         * @returns {String} - moment compatible formatting
+         */
+        convertToMomentFormat: function (format) {
+            var newFormat;
+
+            newFormat = format.replace(/yy|y/gi, 'YYYY'); // replace the year
+            newFormat = newFormat.replace(/dd|d/g, 'DD'); // replace the date
+            newFormat = newFormat.replace(/mm|m/gi, 'MM'); //replace the month
+
+            return newFormat;
         }
     };
 });
diff --git a/setup/performance-toolkit/benchmark.jmx b/setup/performance-toolkit/benchmark.jmx
index c2ef9ebbea04d2250962ac7fe70d5ecc5435996f..576b8afc0bef99f098863feb97f093cf2c23ef42 100644
--- a/setup/performance-toolkit/benchmark.jmx
+++ b/setup/performance-toolkit/benchmark.jmx
@@ -3918,7 +3918,7 @@ vars.put("loadType", "Guest");</stringProp>
     </GaussianRandomTimer>
     <hashTree/>
   
-    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Estimate Shipping Methods ${__property(activeAdminThread)}(${testLabel})" enabled="true">
+    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Estimate Shipping Methods${__property(activeAdminThread)}(${testLabel})" enabled="true">
       <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
       <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
         <collectionProp name="Arguments.arguments">
@@ -3983,7 +3983,7 @@ vars.put("loadType", "Guest");</stringProp>
     </GaussianRandomTimer>
     <hashTree/>
   
-    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Billing/Shipping Information ${__property(activeAdminThread)}(${testLabel})" enabled="true">
+    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Billing/Shipping Information${__property(activeAdminThread)}(${testLabel})" enabled="true">
       <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
       <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
         <collectionProp name="Arguments.arguments">
@@ -4048,7 +4048,7 @@ vars.put("loadType", "Guest");</stringProp>
     </GaussianRandomTimer>
     <hashTree/>
   
-    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Payment Info/Place Order ${__property(activeAdminThread)}(${testLabel})" enabled="true">
+    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Payment Info/Place Order${__property(activeAdminThread)}(${testLabel})" enabled="true">
       <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
       <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
         <collectionProp name="Arguments.arguments">
@@ -5264,7 +5264,7 @@ vars.put("loadType", "Customer");</stringProp>
     </GaussianRandomTimer>
     <hashTree/>
   
-    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Estimate Shipping Methods ${__property(activeAdminThread)}(${testLabel})" enabled="true">
+    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Estimate Shipping Methods${__property(activeAdminThread)}(${testLabel})" enabled="true">
       <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
       <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
         <collectionProp name="Arguments.arguments">
diff --git a/setup/src/Magento/Setup/Fixtures/AttributeSetsFixture.php b/setup/src/Magento/Setup/Fixtures/AttributeSetsFixture.php
index 5617eca9a0e7e24694c151d508ed09a4cd547999..1bdffb253ae1f06f24647cf7efbc85d0801286f9 100644
--- a/setup/src/Magento/Setup/Fixtures/AttributeSetsFixture.php
+++ b/setup/src/Magento/Setup/Fixtures/AttributeSetsFixture.php
@@ -16,12 +16,27 @@ class AttributeSetsFixture extends Fixture
      */
     protected $priority = 25;
 
+    /**
+     * Cache for attribute IDs.
+     *
+     * @var array
+     */
+    private $attributeIdsCache = [];
+
+    /**
+     * Quantity of unique attributes to generate. Zero means infinity.
+     *
+     * @var int
+     */
+    protected $uniqueAttributesQuantity = 0;
+
     /**
      * {@inheritdoc}
      */
     public function execute()
     {
-        $attributeSets = $this->fixtureModel->getValue('attribute_sets', null);
+        $this->populateUniqueAttributesQuantity();
+        $attributeSets = $this->getAttributeSetsFixtureValue();
         if ($attributeSets === null) {
             return;
         }
@@ -71,37 +86,81 @@ class AttributeSetsFixture extends Fixture
             $attributesData = array_key_exists(0, $attributeSetData['attributes']['attribute'])
                 ? $attributeSetData['attributes']['attribute'] : [$attributeSetData['attributes']['attribute']];
             foreach ($attributesData as $attributeData) {
-                //Create Attribute
-                /** @var  \Magento\Catalog\Api\Data\ProductAttributeInterfaceFactory $attributeFactory */
-                $attributeFactory = $this->fixtureModel->getObjectManager()->create(
-                    \Magento\Catalog\Api\Data\ProductAttributeInterfaceFactory::class
-                );
-
-                $optionsData = array_key_exists(0, $attributeData['options']['option'])
-                    ? $attributeData['options']['option'] : [$attributeData['options']['option']];
-                $options = [];
-                foreach ($optionsData as $optionData) {
-                    /** @var \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory $optionFactory */
-                    $optionFactory = $this->fixtureModel->getObjectManager()->create(
-                        \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory::class
+                if ($this->uniqueAttributesQuantity === 0
+                    || (count($this->attributeIdsCache) < $this->uniqueAttributesQuantity)) {
+                    //Create Attribute
+                    /** @var  \Magento\Catalog\Api\Data\ProductAttributeInterfaceFactory $attributeFactory */
+                    $attributeFactory = $this->fixtureModel->getObjectManager()->create(
+                        \Magento\Catalog\Api\Data\ProductAttributeInterfaceFactory::class
                     );
-                    $option = $optionFactory->create(['data' => $optionData]);
-                    $options[] = $option;
-                }
 
-                $attribute = $attributeFactory->create(['data' => $attributeData]);
-                $attribute->setOptions($options);
+                    $optionsData = array_key_exists(0, $attributeData['options']['option'])
+                        ? $attributeData['options']['option'] : [$attributeData['options']['option']];
+                    $options = [];
+                    foreach ($optionsData as $optionData) {
+                        /** @var \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory $optionFactory */
+                        $optionFactory = $this->fixtureModel->getObjectManager()->create(
+                            \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory::class
+                        );
+                        $option = $optionFactory->create(['data' => $optionData]);
+                        $options[] = $option;
+                    }
 
-                $result = $attributeRepository->save($attribute);
-                $attributeId = $result->getAttributeId();
+                    $attribute = $attributeFactory->create(['data' => $attributeData]);
+                    $attribute->setOptions($options);
 
+                    $result = $attributeRepository->save($attribute);
+                    $attributeId = $result->getAttributeId();
+                    $this->fillAttributeIdsCache($attributeId);
+                } else {
+                    $attributeId = $this->getAttributeIdFromCache();
+                }
                 //Associate Attribute to Attribute Set
                 $sortOrder = 3;
+
                 $attributeManagement->assign($attributeSetId, $attributeGroupId, $attributeId, $sortOrder);
             }
         }
     }
 
+    /**
+     * Get attribute ID from cache.
+     *
+     * @return int
+     */
+    private function getAttributeIdFromCache()
+    {
+        $attributeId = next($this->attributeIdsCache);
+        if ($attributeId === false) {
+            $attributeId = reset($this->attributeIdsCache);
+        }
+
+        return $attributeId;
+    }
+
+    /**
+     * Fill attribute IDs cache.
+     *
+     * @param int $attributeId
+     * @return void
+     */
+    private function fillAttributeIdsCache($attributeId)
+    {
+        if ($this->uniqueAttributesQuantity !== 0) {
+            $this->attributeIdsCache[] = $attributeId;
+        }
+    }
+
+    /**
+     * Populate quantity of unique attributes to generate.
+     *
+     * @return void
+     */
+    protected function populateUniqueAttributesQuantity()
+    {
+        $this->uniqueAttributesQuantity = $this->fixtureModel->getValue('unique_attributes_quantity', 0);
+    }
+
     /**
      * {@inheritdoc}
      */
@@ -119,4 +178,14 @@ class AttributeSetsFixture extends Fixture
             'attribute_sets' => 'Attribute Sets'
         ];
     }
+
+    /**
+     * Get attribute sets fixture value.
+     *
+     * @return array|null
+     */
+    protected function getAttributeSetsFixtureValue()
+    {
+        return $this->fixtureModel->getValue('attribute_sets', null);
+    }
 }
diff --git a/setup/src/Magento/Setup/Fixtures/ConfigurableProductsFixture.php b/setup/src/Magento/Setup/Fixtures/ConfigurableProductsFixture.php
index 2340de71cf78363ed00fd9248577e7479b6dc012..9e84578281c5d65b8a84b384aab699b266c7286b 100644
--- a/setup/src/Magento/Setup/Fixtures/ConfigurableProductsFixture.php
+++ b/setup/src/Magento/Setup/Fixtures/ConfigurableProductsFixture.php
@@ -25,6 +25,13 @@ class ConfigurableProductsFixture extends SimpleProductsFixture
      */
     protected $searchConfig;
 
+    /**
+     * Variations count.
+     *
+     * @var int
+     */
+    protected $variationsCount;
+
     //@codingStandardsIgnoreStart
     /**
      * Get CSV template headers
@@ -169,7 +176,7 @@ class ConfigurableProductsFixture extends SimpleProductsFixture
     )
     {
         return [
-            'sku' => 'Configurable Product %s' . $suffix,
+            'sku' => $this->getConfigurableProductSkuPattern() . $suffix,
             'store_view_code' => '',
             'attribute_set_code' => $attributeSetClosure,
             'additional_attributes' => $additionalAttributesClosure,
@@ -225,8 +232,8 @@ class ConfigurableProductsFixture extends SimpleProductsFixture
             'updated_at' => '2013-10-25 15:12:39',
             'upsell_tgtr_position_behavior' => '',
             'upsell_tgtr_position_limit' => '',
-            'url_key' => "configurable-product-%s{$suffix}",
-            'url_path' => "configurable-product-%s{$suffix}",
+            'url_key' => $this->getUrlKeyPrefix() . "{$suffix}",
+            'url_path' => $this->getUrlKeyPrefix() . "{$suffix}",
             'visibility' => 'Catalog, Search',
             'weight' => '',
             'qty' => 333,
@@ -305,7 +312,7 @@ class ConfigurableProductsFixture extends SimpleProductsFixture
         $data = [];
         for ($i = 1; $i <= $optionsNumber; $i++) {
             $productData = [
-                'sku' => "Configurable Product %s-option {$i}{$suffix}",
+                'sku' => $this->getConfigurableOptionSkuPattern() . "{$i}{$suffix}",
                 'store_view_code' => '',
                 'attribute_set_code' => $attributeSetClosure,
                 'additional_attributes' => $additionalAttributesClosure,
@@ -361,8 +368,8 @@ class ConfigurableProductsFixture extends SimpleProductsFixture
                 'updated_at' => '2013-10-25 15:12:32',
                 'upsell_tgtr_position_behavior' => '',
                 'upsell_tgtr_position_limit' => '',
-                'url_key' => "simple-of-configurable-product-{$suffix}-%s-option-{$i}",
-                'url_path' => "simple-of-configurable-product-{$suffix}-%s-option-{$i}",
+                'url_key' => $this->getOptionUrlKeyPrefix() . "-{$suffix}-%s-option-{$i}",
+                'url_path' => $this->getOptionUrlKeyPrefix() . "-{$suffix}-%s-option-{$i}",
                 'variations' => '',
                 'variations_1382710717' => '',
                 'variations_1382710773' => '',
@@ -431,7 +438,7 @@ class ConfigurableProductsFixture extends SimpleProductsFixture
      */
     public function execute()
     {
-        $configurableProductsCount = $this->fixtureModel->getValue('configurable_products', 0);
+        $configurableProductsCount = $this->getConfigurableProductsValue();
         if (!$configurableProductsCount) {
             return;
         }
@@ -440,170 +447,147 @@ class ConfigurableProductsFixture extends SimpleProductsFixture
         $maxAmountOfWordsShortDescription = $this->getSearchConfigValue('max_amount_of_words_short_description');
         $minAmountOfWordsDescription = $this->getSearchConfigValue('min_amount_of_words_description');
         $minAmountOfWordsShortDescription = $this->getSearchConfigValue('min_amount_of_words_short_description');
+        $configurableProductsWithAttributes = [];
 
-        $attributes = $this->getAttributes();
-        $searchTerms = $this->getSearchTerms();
-        $this->fixtureModel->resetObjectManager();
-        $result = $this->getCategoriesAndWebsites();
-        $variationCount = $this->fixtureModel->getValue('configurable_products_variation', 3);
-        $result = array_values($result);
-        $dataGenerator = new DataGenerator(realpath(__DIR__ . '/' . 'dictionary.csv'));
-
-        $productWebsiteClosure = function ($index) use ($result) {
-            return $result[$index % count($result)][0];
-        };
-        $productCategoryClosure = function ($index) use ($result) {
-            return $result[$index % count($result)][2] . '/' . $result[$index % count($result)][1];
-        };
-        $shortDescriptionClosure = function ($index)
-        use (
-            $searchTerms,
-            $simpleProductsCount,
-            $configurableProductsCount,
-            $dataGenerator,
-            $maxAmountOfWordsShortDescription,
-            $minAmountOfWordsShortDescription
-        )
-        {
-            $count = $searchTerms === null
-                ? 0
-                : round(
-                    $searchTerms[$index % count($searchTerms)]['count'] * (
-                        $configurableProductsCount / ($simpleProductsCount + $configurableProductsCount)
-                    )
-                );
-            mt_srand($index);
-            return $dataGenerator->generate(
-                $minAmountOfWordsShortDescription,
-                $maxAmountOfWordsShortDescription,
-                'shortDescription-' . $index
-            ) . ($index <= ($count * count($searchTerms)) ? ' '
-                . $searchTerms[$index % count($searchTerms)]['term'] : '');
-        };
-        $descriptionClosure = function ($index)
-        use (
-            $searchTerms,
-            $simpleProductsCount,
-            $configurableProductsCount,
-            $dataGenerator,
-            $maxAmountOfWordsDescription,
-            $minAmountOfWordsDescription
-        )
-        {
-            $count = $searchTerms === null
-                ? 0
-                : round(
-                    $searchTerms[$index % count($searchTerms)]['count'] * (
-                        $configurableProductsCount / ($simpleProductsCount + $configurableProductsCount)
-                    )
-                );
-            mt_srand($index);
-            return $dataGenerator->generate(
-                $minAmountOfWordsDescription,
-                $maxAmountOfWordsDescription,
-                'description-' . $index
-            ) . ($index <= ($count * count($searchTerms))
-                ? ' ' . $searchTerms[$index % count($searchTerms)]['term'] : '');
-        };
-        $priceClosure = function($index) {
-            mt_srand($index);
-            switch (mt_rand(0,3)) {
-                case 0: return 9.99;
-                case 1: return 5;
-                case 2: return 1;
-                case 3: return mt_rand(1,10000)/10;
-            }
-        };
-        $attributeSetClosure = function($index) use ($attributes, $result) {
-            mt_srand($index);
-            $attributeSet =  (count(array_keys($attributes)) > (($index - 1) % count($result))
-                ? array_keys($attributes)[mt_rand(0, count(array_keys($attributes)) - 1)] : 'Default');
-            return $attributeSet;
-        };
-        $variationClosure = function($index, $variationIndex) use ($attributes, $result, $variationCount) {
-            mt_srand($index);
-            $attributeSetCode = (count(array_keys($attributes)) > (($index - 1) % count($result))
-                ? array_keys($attributes)[mt_rand(0, count(array_keys($attributes)) - 1)] : 'Default');
-            $skus = [];
-            for ($i=1; $i <= $variationCount; $i++) {
-                $skus[] = 'sku=Configurable Product ' . $index . '-option ' . $i;
-            }
-            $values = [];
-            if ($attributeSetCode == 'Default') {
-                for ($i=1; $i <= $variationCount; $i++) {
-                    $values[] =  'configurable_variation=option ' . $i;
-                }
+        if ($this->getAdditionalConfigurableProductsVariations() === null) {
+            $configurableProductsWithAttributes[$configurableProductsCount]
+                = $this->getConfigurableProductsVariationsValue();
+        } else {
+            if (strpos($this->getAdditionalConfigurableProductsVariations(), ',')) {
+                $variations = explode(',', $this->getAdditionalConfigurableProductsVariations());
             } else {
-                for ($i=$variationCount; $i > 0; $i--) {
-                    $attributeValues = '';
-                    foreach ($attributes[$attributeSetCode] as $attribute) {
-                        $attributeValues = $attributeValues . $attribute['name'] . "=" .
-                            $attribute['values'][($variationIndex - $i) % count($attribute['values'])] . ",";
-                    }
-                    $values [] = $attributeValues;
-                }
+                $variations = [$this->getAdditionalConfigurableProductsVariations()];
             }
-            $variations = [];
-            for ($i=0; $i < $variationCount; $i++) {
-                $variations[] = trim(implode(",",[$skus[$i],$values[$i]]), ",");
+
+            foreach ($variations as $variation) {
+                $value = explode(':', $variation);
+                $configurableProductsWithAttributes[$value[0]] = $value[1];
             }
-            return implode("|",$variations);
-        };
-        $additionalAttributesClosure = function($index, $variationIndex) use ($attributes, $result) {
-            $attributeValues = '';
-            mt_srand($index);
-            $attributeSetCode = (count(array_keys($attributes)) > (($index - 1) % count($result))
-                ? array_keys($attributes)[mt_rand(0, count(array_keys($attributes)) - 1)] : 'Default');
-            if ($attributeSetCode !== 'Default' ) {
-                foreach ($attributes[$attributeSetCode] as $attribute) {
-                    $attributeValues = $attributeValues . $attribute['name'] . "=" .
-                        $attribute['values'][$variationIndex %  count($attribute['values'])] . ",";
+        }
+
+        foreach ($configurableProductsWithAttributes as $productsCount => $variationsCount) {
+            $this->variationsCount = $variationsCount;
+            $configurableProductsCount = $productsCount;
+            $attributes = $this->getAttributes();
+            $searchTerms = $this->getSearchTerms();
+            $this->fixtureModel->resetObjectManager();
+            $result = $this->getCategoriesAndWebsites();
+            $result = array_values($result);
+            $dataGenerator = new DataGenerator(realpath(__DIR__ . '/' . 'dictionary.csv'));
+
+            $productWebsiteClosure = function ($index) use ($result) {
+                return $result[$index % count($result)][0];
+            };
+            $productCategoryClosure = function ($index) use ($result) {
+                return $result[$index % count($result)][2] . '/' . $result[$index % count($result)][1];
+            };
+            $shortDescriptionClosure = function ($index)
+            use (
+                $searchTerms,
+                $simpleProductsCount,
+                $configurableProductsCount,
+                $dataGenerator,
+                $maxAmountOfWordsShortDescription,
+                $minAmountOfWordsShortDescription
+            ) {
+                $count = $searchTerms === null
+                    ? 0
+                    : round(
+                        $searchTerms[$index % count($searchTerms)]['count'] * (
+                            $configurableProductsCount / ($simpleProductsCount + $configurableProductsCount)
+                        )
+                    );
+                mt_srand($index);
+                return $dataGenerator->generate(
+                    $minAmountOfWordsShortDescription,
+                    $maxAmountOfWordsShortDescription,
+                    'shortDescription-' . $index
+                ) . ($index <= ($count * count($searchTerms)) ? ' '
+                    . $searchTerms[$index % count($searchTerms)]['term'] : '');
+            };
+            $descriptionClosure = function ($index)
+            use (
+                $searchTerms,
+                $simpleProductsCount,
+                $configurableProductsCount,
+                $dataGenerator,
+                $maxAmountOfWordsDescription,
+                $minAmountOfWordsDescription
+            ) {
+                $count = $searchTerms === null
+                    ? 0
+                    : round(
+                        $searchTerms[$index % count($searchTerms)]['count'] * (
+                            $configurableProductsCount / ($simpleProductsCount + $configurableProductsCount)
+                        )
+                    );
+                mt_srand($index);
+                return $dataGenerator->generate(
+                    $minAmountOfWordsDescription,
+                    $maxAmountOfWordsDescription,
+                    'description-' . $index
+                ) . ($index <= ($count * count($searchTerms))
+                    ? ' ' . $searchTerms[$index % count($searchTerms)]['term'] : '');
+            };
+            $priceClosure = function ($index) {
+                mt_srand($index);
+                switch (mt_rand(0, 3)) {
+                    case 0:
+                        return 9.99;
+                    case 1:
+                        return 5;
+                    case 2:
+                        return 1;
+                    case 3:
+                        return mt_rand(1, 10000) / 10;
                 }
-            }
-            return trim($attributeValues, ",");
-        };
-        /**
-         * Create configurable products
-         */
-        $pattern = new Pattern();
-        $pattern->setHeaders($this->getHeaders());
-        $pattern->setRowsSet(
-            $this->getRows(
-                $productCategoryClosure,
-                $productWebsiteClosure,
-                $shortDescriptionClosure,
-                $descriptionClosure,
-                $priceClosure,
-                $attributeSetClosure,
-                $additionalAttributesClosure,
-                $variationClosure,
-                $variationCount
-            )
-        );
+            };
+            $attributeSetClosure = $this->getAttributeSetClosure($attributes, $result);
+            $variationClosure = $this->getVariationsClosure($attributes, $result, $variationsCount);
+            $additionalAttributesClosure = $this->getAdditionalAttributesClosure($attributes, $result);
+            /**
+             * Create configurable products
+             */
+            $pattern = new Pattern();
+            $pattern->setHeaders($this->getHeaders());
+            $pattern->setRowsSet(
+                $this->getRows(
+                    $productCategoryClosure,
+                    $productWebsiteClosure,
+                    $shortDescriptionClosure,
+                    $descriptionClosure,
+                    $priceClosure,
+                    $attributeSetClosure,
+                    $additionalAttributesClosure,
+                    $variationClosure,
+                    $variationsCount
+                )
+            );
 
-        /** @var \Magento\ImportExport\Model\Import $import */
-        $import = $this->fixtureModel->getObjectManager()->create(
-            \Magento\ImportExport\Model\Import::class,
-            [
-                'data' => [
-                    'entity' => 'catalog_product',
-                    'behavior' => 'append',
-                    'validation_strategy' => 'validation-stop-on-errors',
-                ],
-            ]
-        );
+            /** @var \Magento\ImportExport\Model\Import $import */
+            $import = $this->fixtureModel->getObjectManager()->create(
+                \Magento\ImportExport\Model\Import::class,
+                [
+                    'data' => [
+                        'entity' => 'catalog_product',
+                        'behavior' => 'append',
+                        'validation_strategy' => 'validation-stop-on-errors',
+                    ],
+                ]
+            );
 
-        $source = $this->fixtureModel->getObjectManager()->create(
-            Generator::class,
-            ['rowPattern' => $pattern, 'count' => $configurableProductsCount]
-        );
-        // it is not obvious, but the validateSource() will actually save import queue data to DB
-        if (!$import->validateSource($source)) {
-            throw new \Exception($import->getFormatedLogTrace());
-        }
-        // this converts import queue into actual entities
-        if (!$import->importSource()) {
-            throw new \Exception($import->getFormatedLogTrace());
+            $source = $this->fixtureModel->getObjectManager()->create(
+                Generator::class,
+                ['rowPattern' => $pattern, 'count' => $configurableProductsCount]
+            );
+            // it is not obvious, but the validateSource() will actually save import queue data to DB
+            if (!$import->validateSource($source)) {
+                throw new \Exception($import->getFormatedLogTrace());
+            }
+            // this converts import queue into actual entities
+            if (!$import->importSource()) {
+                throw new \Exception($import->getFormatedLogTrace());
+            }
         }
     }
     // @codingStandardsIgnoreEnd
@@ -674,4 +658,166 @@ class ConfigurableProductsFixture extends SimpleProductsFixture
         }
         return $result;
     }
+
+    /**
+     * Get configurable products value.
+     *
+     * @return int
+     */
+    protected function getConfigurableProductsValue()
+    {
+        return $this->fixtureModel->getValue('configurable_products', 0);
+    }
+
+    /**
+     * Get configurable products variations value.
+     *
+     * @return int
+     */
+    protected function getConfigurableProductsVariationsValue()
+    {
+        return $this->fixtureModel->getValue('configurable_products_variation', 3);
+    }
+
+    /**
+     * Get attribute set closure
+     *
+     * @param array $attributes
+     * @param array $result
+     * @return \Closure
+     */
+    protected function getAttributeSetClosure(array $attributes, array $result)
+    {
+        return function ($index) use ($attributes, $result) {
+            mt_srand($index);
+            $attributeSet =  (count(array_keys($attributes)) > (($index - 1) % count($result))
+                ? array_keys($attributes)[mt_rand(0, count(array_keys($attributes)) - 1)] : 'Default');
+            return $attributeSet;
+        };
+    }
+
+    /**
+     * Get additional attributes closure.
+     *
+     * @param array $attributes
+     * @param array $result
+     * @return \Closure
+     */
+    protected function getAdditionalAttributesClosure(array $attributes, array $result)
+    {
+        return function ($index, $variationIndex) use ($attributes, $result) {
+            $attributeValues = '';
+            mt_srand($index);
+            $attributeSetCode = (count(array_keys($attributes)) > (($index - 1) % count($result))
+                ? array_keys($attributes)[mt_rand(0, count(array_keys($attributes)) - 1)] : 'Default');
+            if ($attributeSetCode !== 'Default') {
+                foreach ($attributes[$attributeSetCode] as $attribute) {
+                    $attributeValues = $attributeValues . $attribute['name'] . "=" .
+                        $attribute['values'][$variationIndex %  count($attribute['values'])] . ",";
+                }
+            }
+            return trim($attributeValues, ",");
+        };
+    }
+
+    /**
+     * Get variations closure.
+     *
+     * @param array $attributes
+     * @param array $result
+     * @param int $variationCount
+     * @return \Closure
+     */
+    protected function getVariationsClosure(array $attributes, array $result, $variationCount)
+    {
+        return function ($index, $variationIndex) use ($attributes, $result, $variationCount) {
+            mt_srand($index);
+            $attributeSetCode = (count(array_keys($attributes)) > (($index - 1) % count($result))
+                ? array_keys($attributes)[mt_rand(0, count(array_keys($attributes)) - 1)] : 'Default');
+            $skus = [];
+            for ($i = 1; $i <= $variationCount; $i++) {
+                $skus[] = 'sku=' . sprintf($this->getConfigurableOptionSkuPattern(), $index) . $i;
+            }
+            $values = [];
+            if ($attributeSetCode == 'Default') {
+                for ($i = 1; $i <= $variationCount; $i++) {
+                    $values[] = 'configurable_variation=option ' . $i;
+                }
+            } else {
+                for ($i = $variationCount; $i > 0; $i--) {
+                    $attributeValues = '';
+                    foreach ($attributes[$attributeSetCode] as $attribute) {
+                        $attributeValues = $attributeValues . $attribute['name'] . "=" .
+                            $attribute['values'][($variationIndex - $i) % count($attribute['values'])] . ",";
+                    }
+                    $values [] = $attributeValues;
+                }
+            }
+            $variations = [];
+            for ($i = 0; $i < $variationCount; $i++) {
+                $variations[] = trim(implode(",", [$skus[$i], $values[$i]]), ",");
+            }
+            return implode("|", $variations);
+        };
+    }
+
+    /**
+     * Get configurable product sku pattern.
+     *
+     * @return string
+     */
+    private function getConfigurableProductSkuPattern()
+    {
+        return 'Configurable Product ' . $this->getConfigurableProductPrefix() . ' %s';
+    }
+
+    /**
+     * Get configurable option sku pattern.
+     *
+     * @return string
+     */
+    protected function getConfigurableOptionSkuPattern()
+    {
+        return 'Configurable Product ' . $this->getConfigurableProductPrefix() . '%s-option';
+    }
+
+    /**
+     * Get url key prefix.
+     *
+     * @return string
+     */
+    private function getUrlKeyPrefix()
+    {
+        return 'configurable-product' . $this->getConfigurableProductPrefix() . '-%s';
+    }
+
+    /**
+     * Get option url key prefix.
+     *
+     * @return string
+     */
+    private function getOptionUrlKeyPrefix()
+    {
+        return 'simple-of-configurable-product' . $this->getConfigurableProductPrefix();
+    }
+
+    /**
+     * Get additional configurations for configurable products.
+     *
+     * @return string|null
+     */
+    private function getAdditionalConfigurableProductsVariations()
+    {
+        return $this->fixtureModel->getValue('configurable_products_variations', null);
+    }
+
+    /**
+     * Get configurable product prefix.
+     *
+     * @return string
+     */
+    protected function getConfigurableProductPrefix()
+    {
+        return '';
+    }
 }
diff --git a/setup/src/Magento/Setup/Fixtures/SimpleProductsFixture.php b/setup/src/Magento/Setup/Fixtures/SimpleProductsFixture.php
index fbb28d35269b177762410e8da7560612dd64db9c..43270676cb94f0a16729d7c16dab4913247f105c 100644
--- a/setup/src/Magento/Setup/Fixtures/SimpleProductsFixture.php
+++ b/setup/src/Magento/Setup/Fixtures/SimpleProductsFixture.php
@@ -235,7 +235,7 @@ class SimpleProductsFixture extends Fixture
      */
     protected function getAttributes()
     {
-        $attributeSets = $this->fixtureModel->getValue('attribute_sets', null);
+        $attributeSets = $this->getAttributeSets();
         $attributes = [];
 
         if ($attributeSets !== null && array_key_exists('attribute_set', $attributeSets)) {
@@ -337,4 +337,14 @@ class SimpleProductsFixture extends Fixture
         }
         return $searchTerms;
     }
+
+    /**
+     * Get attribute sets.
+     *
+     * @return array|null
+     */
+    private function getAttributeSets()
+    {
+        return $this->fixtureModel->getValue('attribute_sets', null);
+    }
 }
diff --git a/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSetsFixtureTest.php b/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSetsFixtureTest.php
index 674f444fbde10666b75aa5dadfef3719e3177152..2192f4e84e26e7d39e5fa09b2e5ee752eb659b10 100644
--- a/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSetsFixtureTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Fixtures/AttributeSetsFixtureTest.php
@@ -202,7 +202,7 @@ class AttributeSetsFixtureTest extends \PHPUnit_Framework_TestCase
             ->willReturn($optionFactoryMock);
 
         $this->fixtureModelMock
-            ->expects($this->once())
+            ->expects($this->any())
             ->method('getValue')
             ->willReturn($attributeSets);
 
@@ -267,7 +267,7 @@ class AttributeSetsFixtureTest extends \PHPUnit_Framework_TestCase
             ->method('getObjectManager')
             ->will($this->returnValue($objectManagerMock));
         $this->fixtureModelMock
-            ->expects($this->once())
+            ->expects($this->any())
             ->method('getValue')
             ->willReturn(null);