diff --git a/app/code/Magento/Backend/view/adminhtml/ui_component/design_config_form.xml b/app/code/Magento/Backend/view/adminhtml/ui_component/design_config_form.xml
index e1f79d4c8aaf8ef5f1ccb2bcafa934d663010fe6..f5ffbb48e97a619db471049d5535b55d3ea0b3c8 100644
--- a/app/code/Magento/Backend/view/adminhtml/ui_component/design_config_form.xml
+++ b/app/code/Magento/Backend/view/adminhtml/ui_component/design_config_form.xml
@@ -69,6 +69,9 @@
                             <item name="fit" xsi:type="boolean">false</item>
                             <item name="label" xsi:type="string">Search String</item>
                             <item name="showFallbackReset" xsi:type="boolean">false</item>
+                            <item name="validation" xsi:type="array">
+                                <item name="required-entry" xsi:type="boolean">true</item>
+                            </item>
                         </item>
                     </argument>
                 </field>
@@ -82,6 +85,9 @@
                             <item name="fit" xsi:type="boolean">false</item>
                             <item name="label" xsi:type="string">Theme Name</item>
                             <item name="showFallbackReset" xsi:type="boolean">false</item>
+                            <item name="validation" xsi:type="array">
+                                <item name="required-entry" xsi:type="boolean">true</item>
+                            </item>
                         </item>
                     </argument>
                 </field>
diff --git a/app/code/Magento/Backend/view/adminhtml/web/template/dynamic-rows/cells/action-delete.html b/app/code/Magento/Backend/view/adminhtml/web/template/dynamic-rows/cells/action-delete.html
index 117eee7e69fdc9bfc92f9afde5868e9ec5206006..44c460825b45d809c67a5e40b89ccce48d7a0e41 100644
--- a/app/code/Magento/Backend/view/adminhtml/web/template/dynamic-rows/cells/action-delete.html
+++ b/app/code/Magento/Backend/view/adminhtml/web/template/dynamic-rows/cells/action-delete.html
@@ -11,5 +11,5 @@
                 title: $parent.deleteButtonLabel
             }
         ">
-    <span data-bind="text: $parent.deleteButtonLabel"></span>
+    <span translate="$parent.deleteButtonLabel"></span>
 </button>
diff --git a/app/code/Magento/Backend/view/adminhtml/web/template/dynamic-rows/grid.html b/app/code/Magento/Backend/view/adminhtml/web/template/dynamic-rows/grid.html
index 6e24ee96a62a07f76832113eb7f77841b542424a..63a3196ff3385f2db16d08267f5ddcc71f4f984e 100644
--- a/app/code/Magento/Backend/view/adminhtml/web/template/dynamic-rows/grid.html
+++ b/app/code/Magento/Backend/view/adminhtml/web/template/dynamic-rows/grid.html
@@ -16,7 +16,7 @@
                 class="action-secondary"
                 type="button"
                 click="processingAddChild.bind($data, false, false, false)">
-            <span text="addButtonLabel"/>
+            <span translate="addButtonLabel"/>
         </button>
     </div>
 
@@ -30,7 +30,7 @@
      css="element.setClasses(element)"
      attr="'data-index': index">
     <label if="element.label" class="admin__field-label" attr="for: element.uid">
-        <span text="element.label"/>
+        <span translate="element.label"/>
     </label>
 
     <div class="admin__field-control" data-role="grid-wrapper">
@@ -51,7 +51,7 @@
 
                         <th repeat="foreach: labels, item: '$label'"
                             class="data-grid-th"
-                            text="$label().label"
+                            translate="$label().label"
                             visible="$label().visible"
                             disable="$label().disabled"
                             css="setClasses($label())">
diff --git a/app/code/Magento/Braintree/Gateway/Command/CaptureStrategyCommand.php b/app/code/Magento/Braintree/Gateway/Command/CaptureStrategyCommand.php
index 3119042b776e2cb59598f628244f72620fba5d6a..a03546b36604587fbea2158890d183570ba4015a 100644
--- a/app/code/Magento/Braintree/Gateway/Command/CaptureStrategyCommand.php
+++ b/app/code/Magento/Braintree/Gateway/Command/CaptureStrategyCommand.php
@@ -166,16 +166,25 @@ class CaptureStrategyCommand implements CommandInterface
      */
     private function isExistsCaptureTransaction(OrderPaymentInterface $payment)
     {
-        $filters[] = $this->filterBuilder->setField('payment_id')
-            ->setValue($payment->getId())
-            ->create();
+        $this->searchCriteriaBuilder->addFilters(
+            [
+                $this->filterBuilder
+                    ->setField('payment_id')
+                    ->setValue($payment->getId())
+                    ->create(),
+            ]
+        );
 
-        $filters[] = $this->filterBuilder->setField('txn_type')
-            ->setValue(TransactionInterface::TYPE_CAPTURE)
-            ->create();
+        $this->searchCriteriaBuilder->addFilters(
+            [
+                $this->filterBuilder
+                    ->setField('txn_type')
+                    ->setValue(TransactionInterface::TYPE_CAPTURE)
+                    ->create(),
+            ]
+        );
 
-        $searchCriteria = $this->searchCriteriaBuilder->addFilters($filters)
-            ->create();
+        $searchCriteria = $this->searchCriteriaBuilder->create();
 
         $count = $this->transactionRepository->getList($searchCriteria)->getTotalCount();
         return (boolean) $count;
diff --git a/app/code/Magento/Braintree/Test/Unit/Gateway/Command/CaptureStrategyCommandTest.php b/app/code/Magento/Braintree/Test/Unit/Gateway/Command/CaptureStrategyCommandTest.php
index fda3e85d167c28438afd5b084bb14c9b019f2da3..9665afa1f3655aafe9ab1ce5e8bc529ff0483cd8 100644
--- a/app/code/Magento/Braintree/Test/Unit/Gateway/Command/CaptureStrategyCommandTest.php
+++ b/app/code/Magento/Braintree/Test/Unit/Gateway/Command/CaptureStrategyCommandTest.php
@@ -374,7 +374,7 @@ class CaptureStrategyCommandTest extends \PHPUnit_Framework_TestCase
             ->willReturnSelf();
 
         $searchCriteria = new SearchCriteria();
-        $this->searchCriteriaBuilder->expects(static::once())
+        $this->searchCriteriaBuilder->expects(static::exactly(2))
             ->method('addFilters')
             ->willReturnSelf();
         $this->searchCriteriaBuilder->expects(static::once())
diff --git a/app/code/Magento/Braintree/Test/Unit/Gateway/Request/VaultCaptureDataBuilderTest.php b/app/code/Magento/Braintree/Test/Unit/Gateway/Request/VaultCaptureDataBuilderTest.php
index a5d89fb0e23e4fd6de8a22be2d7a21b6d631d7e0..165bc94aa68429b1ffe447975622a266817b55d9 100644
--- a/app/code/Magento/Braintree/Test/Unit/Gateway/Request/VaultCaptureDataBuilderTest.php
+++ b/app/code/Magento/Braintree/Test/Unit/Gateway/Request/VaultCaptureDataBuilderTest.php
@@ -80,7 +80,7 @@ class VaultCaptureDataBuilderTest extends \PHPUnit_Framework_TestCase
         $paymentExtension = $this->getMockBuilder(OrderPaymentExtension::class)
             ->setMethods(['getVaultPaymentToken'])
             ->disableOriginalConstructor()
-            ->getMock();
+            ->getMockForAbstractClass();
 
         $paymentToken = $this->getMockBuilder(PaymentToken::class)
             ->disableOriginalConstructor()
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php
index 764040e9cfeb866d1461cc876eaf9d8cdc8170e3..e4ad1959214236b77bb600b996013d91389d4ee1 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php
@@ -132,7 +132,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribut
                         $attributesData[$attributeCode] = $value;
                     } elseif ($attribute->getFrontendInput() == 'multiselect') {
                         // Check if 'Change' checkbox has been checked by admin for this attribute
-                        $isChanged = (bool)$this->getRequest()->getPost($attributeCode . '_checkbox');
+                        $isChanged = (bool)$this->getRequest()->getPost('toggle_' . $attributeCode);
                         if (!$isChanged) {
                             unset($attributesData[$attributeCode]);
                             continue;
diff --git a/app/code/Magento/Catalog/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/ProductCategoryFilter.php b/app/code/Magento/Catalog/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/ProductCategoryFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..91c3d894354f0145323b3595d8212962ba6501ee
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/ProductCategoryFilter.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class ProductCategoryFilter implements CustomFilterInterface
+{
+    /**
+     * Apply category_id Filter to Product Collection
+     *
+     * @param Filter $filter
+     * @param AbstractDb $collection
+     * @return bool Whether the filter is applied
+     */
+    public function apply(Filter $filter, AbstractDb $collection)
+    {
+        $conditionType = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
+        $categoryFilter = [$conditionType => [$filter->getValue()]];
+
+        /** @var Collection $collection */
+        $collection->addCategoriesFilter($categoryFilter);
+
+        return true;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/CategoryList.php b/app/code/Magento/Catalog/Model/CategoryList.php
index b739c5bf46354ee290c481dfecf6534c832d5c11..7e701123e99a99d36d52771687a9e572935d9eeb 100644
--- a/app/code/Magento/Catalog/Model/CategoryList.php
+++ b/app/code/Magento/Catalog/Model/CategoryList.php
@@ -12,10 +12,8 @@ use Magento\Catalog\Api\Data\CategorySearchResultsInterfaceFactory;
 use Magento\Catalog\Model\ResourceModel\Category\Collection;
 use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory;
 use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
-use Magento\Framework\Api\Search\FilterGroup;
 use Magento\Framework\Api\SearchCriteriaInterface;
-use Magento\Framework\Api\SortOrder;
-use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 
 class CategoryList implements CategoryListInterface
 {
@@ -39,22 +37,30 @@ class CategoryList implements CategoryListInterface
      */
     private $categoryRepository;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param CollectionFactory $categoryCollectionFactory
      * @param JoinProcessorInterface $extensionAttributesJoinProcessor
      * @param CategorySearchResultsInterfaceFactory $categorySearchResultsFactory
      * @param CategoryRepositoryInterface $categoryRepository
+     * @param CollectionProcessorInterface $collectionProcessor
      */
     public function __construct(
         CollectionFactory $categoryCollectionFactory,
         JoinProcessorInterface $extensionAttributesJoinProcessor,
         CategorySearchResultsInterfaceFactory $categorySearchResultsFactory,
-        CategoryRepositoryInterface $categoryRepository
+        CategoryRepositoryInterface $categoryRepository,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->categoryCollectionFactory = $categoryCollectionFactory;
         $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
         $this->categorySearchResultsFactory = $categorySearchResultsFactory;
         $this->categoryRepository = $categoryRepository;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -66,23 +72,7 @@ class CategoryList implements CategoryListInterface
         $collection = $this->categoryCollectionFactory->create();
         $this->extensionAttributesJoinProcessor->process($collection);
 
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
-
-        /** @var SortOrder $sortOrder */
-        $sortOrders = $searchCriteria->getSortOrders();
-        if ($sortOrders) {
-            foreach ($sortOrders as $sortOrder) {
-                $collection->addOrder(
-                    $sortOrder->getField(),
-                    ($sortOrder->getDirection() === SortOrder::SORT_ASC) ? SortOrder::SORT_ASC : SortOrder::SORT_DESC
-                );
-            }
-        }
-
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
+        $this->collectionProcessor->process($searchCriteria, $collection);
 
         $items = [];
         foreach ($collection->getAllIds() as $id) {
@@ -98,22 +88,18 @@ class CategoryList implements CategoryListInterface
     }
 
     /**
-     * Add filter group to collection
+     * Retrieve collection processor
      *
-     * @param FilterGroup $filterGroup
-     * @param Collection $collection
-     * @return void
+     * @deprecated
+     * @return CollectionProcessorInterface
      */
-    private function addFilterGroupToCollection(FilterGroup $filterGroup, Collection $collection)
+    private function getCollectionProcessor()
     {
-        $filters = $filterGroup->getFilters();
-        if ($filters) {
-            $fields = [];
-            foreach ($filters as $filter) {
-                $conditionType = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-                $fields[] = ['attribute' => $filter->getField(), $conditionType => $filter->getValue()];
-            }
-            $collection->addFieldToFilter($fields);
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor'
+            );
         }
+        return $this->collectionProcessor;
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php
index b1fbe6aed9387455f6794d284171b7558a22afb2..603e566f14fa10c5ef39ce3ac1da20f200b791a3 100644
--- a/app/code/Magento/Catalog/Model/Product.php
+++ b/app/code/Magento/Catalog/Model/Product.php
@@ -1468,7 +1468,10 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
         if (!$this->hasData('media_gallery_images') && is_array($this->getMediaGallery('images'))) {
             $images = $this->_collectionFactory->create();
             foreach ($this->getMediaGallery('images') as $image) {
-                if ((isset($image['disabled']) && $image['disabled']) || empty($image['value_id'])) {
+                if ((isset($image['disabled']) && $image['disabled'])
+                    || empty($image['value_id'])
+                    || $images->getItemById($image['value_id']) != null
+                ) {
                     continue;
                 }
                 $image['url'] = $this->getMediaConfig()->getMediaUrl($image['file']);
diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index 696f5e40443ca12a5786bb9ee56153ae8e350c61..9ceaa8bc9d0498ea6db05e4574991fc2c466c6e3 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -13,7 +13,7 @@ use Magento\Framework\Api\Data\ImageContentInterface;
 use Magento\Framework\Api\Data\ImageContentInterfaceFactory;
 use Magento\Framework\Api\ImageContentValidatorInterface;
 use Magento\Framework\Api\ImageProcessorInterface;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\DB\Adapter\ConnectionException;
 use Magento\Framework\DB\Adapter\DeadlockException;
 use Magento\Framework\DB\Adapter\LockWaitException;
@@ -135,6 +135,11 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      */
     protected $mediaGalleryProcessor;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * ProductRepository constructor.
      * @param ProductFactory $productFactory
@@ -157,6 +162,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      * @param MimeTypeExtensionMap $mimeTypeExtensionMap
      * @param ImageProcessorInterface $imageProcessor
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
@@ -180,7 +186,8 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         ImageContentInterfaceFactory $contentFactory,
         MimeTypeExtensionMap $mimeTypeExtensionMap,
         ImageProcessorInterface $imageProcessor,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->productFactory = $productFactory;
         $this->collectionFactory = $collectionFactory;
@@ -199,6 +206,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         $this->contentFactory = $contentFactory;
         $this->imageProcessor = $imageProcessor;
         $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -621,20 +629,8 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         $collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
         $collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
 
-        //Add filters from root filter group to the collection
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
-        /** @var SortOrder $sortOrder */
-        foreach ((array)$searchCriteria->getSortOrders() as $sortOrder) {
-            $field = $sortOrder->getField();
-            $collection->addOrder(
-                $field,
-                ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-            );
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
+        $this->collectionProcessor->process($searchCriteria, $collection);
+
         $collection->load();
 
         $searchResult = $this->searchResultsFactory->create();
@@ -647,6 +643,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
     /**
      * Helper function that adds a FilterGroup to the collection.
      *
+     * @deprecated
      * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
      * @param Collection $collection
      * @return void
@@ -698,4 +695,20 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         }
         return $this->mediaGalleryProcessor;
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Catalog\Model\Api\SearchCriteria\ProductCollectionProcessor'
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/ProductCategoryFilterTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/ProductCategoryFilterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..86555f628a2f8b3842f92dd954a3412b5f1409e4
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/ProductCategoryFilterTest.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\ProductCategoryFilter;
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Framework\Api\Filter;
+
+class ProductCategoryFilterTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var ProductCategoryFilter */
+    private $model;
+
+    protected function setUp()
+    {
+        $this->model = new ProductCategoryFilter();
+    }
+
+    public function testApply()
+    {
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterMock */
+        $filterMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
+        $collectionMock = $this->getMockBuilder(Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $filterMock->expects($this->exactly(2))
+            ->method('getConditionType')
+            ->willReturn('condition');
+        $filterMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn('value');
+
+        $collectionMock->expects($this->once())
+            ->method('addCategoriesFilter')
+            ->with(['condition' => ['value']]);
+
+        $this->assertTrue($this->model->apply($filterMock, $collectionMock));
+    }
+
+    public function testApplyWithoutCondition()
+    {
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterMock */
+        $filterMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
+        $collectionMock = $this->getMockBuilder(Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $filterMock->expects($this->once())
+            ->method('getConditionType')
+            ->willReturn(null);
+        $filterMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn('value');
+
+        $collectionMock->expects($this->once())
+            ->method('addCategoriesFilter')
+            ->with(['eq' => ['value']]);
+
+        $this->assertTrue($this->model->apply($filterMock, $collectionMock));
+    }
+}
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/CategoryListTest.php b/app/code/Magento/Catalog/Test/Unit/Model/CategoryListTest.php
index 4f72f43485bc77082bdc8401235df57bf2307515..5703f6fe2dfde75c6fa4e9b8cdf5a72a9f0e7599 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/CategoryListTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/CategoryListTest.php
@@ -11,10 +11,8 @@ use Magento\Catalog\Model\Category;
 use Magento\Catalog\Model\CategoryList;
 use Magento\Catalog\Model\ResourceModel\Category\Collection;
 use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
-use Magento\Framework\Api\Filter;
-use Magento\Framework\Api\Search\FilterGroup;
 use Magento\Framework\Api\SearchCriteriaInterface;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 use Magento\Catalog\Api\Data\CategorySearchResultsInterfaceFactory;
@@ -49,6 +47,11 @@ class CategoryListTest extends \PHPUnit_Framework_TestCase
      */
     private $categoryRepository;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessorMock;
+
     protected function setUp()
     {
         $this->categoryCollectionFactory = $this->getMockBuilder(CollectionFactory::class)
@@ -61,6 +64,8 @@ class CategoryListTest extends \PHPUnit_Framework_TestCase
             ->setMethods(['create'])
             ->getMock();
         $this->categoryRepository = $this->getMock(CategoryRepositoryInterface::class);
+        $this->collectionProcessorMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
 
         $this->model = (new ObjectManager($this))->getObject(
             CategoryList::class,
@@ -69,17 +74,13 @@ class CategoryListTest extends \PHPUnit_Framework_TestCase
                 'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessor,
                 'categorySearchResultsFactory' => $this->categorySearchResultsFactory,
                 'categoryRepository' => $this->categoryRepository,
+                'collectionProcessor' => $this->collectionProcessorMock,
             ]
         );
     }
 
     public function testGetList()
     {
-        $fieldName = 'field_1';
-        $value = 'value_1';
-        $conditionType = 'eq';
-        $currentPage = 2;
-        $pageSize = 1;
         $totalCount = 2;
         $categoryIdFirst = 1;
         $categoryIdSecond = 2;
@@ -87,35 +88,17 @@ class CategoryListTest extends \PHPUnit_Framework_TestCase
         $categoryFirst = $this->getMockBuilder(Category::class)->disableOriginalConstructor()->getMock();
         $categorySecond = $this->getMockBuilder(Category::class)->disableOriginalConstructor()->getMock();
 
-        $filter = $this->getMockBuilder(Filter::class)->disableOriginalConstructor()->getMock();
-        $filter->expects($this->atLeastOnce())->method('getConditionType')->willReturn($conditionType);
-        $filter->expects($this->atLeastOnce())->method('getField')->willReturn($fieldName);
-        $filter->expects($this->once())->method('getValue')->willReturn($value);
-
-        $filterGroup = $this->getMockBuilder(FilterGroup::class)->disableOriginalConstructor()->getMock();
-        $filterGroup->expects($this->once())->method('getFilters')->willReturn([$filter]);
-
-        $sortOrder = $this->getMockBuilder(SortOrder::class)->disableOriginalConstructor()->getMock();
-        $sortOrder->expects($this->once())->method('getField')->willReturn($fieldName);
-        $sortOrder->expects($this->once())->method('getDirection')->willReturn(SortOrder::SORT_ASC);
-
         /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteria */
         $searchCriteria = $this->getMock(SearchCriteriaInterface::class);
-        $searchCriteria->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroup]);
-        $searchCriteria->expects($this->once())->method('getCurrentPage')->willReturn($currentPage);
-        $searchCriteria->expects($this->once())->method('getPageSize')->willReturn($pageSize);
-        $searchCriteria->expects($this->once())->method('getSortOrders')->willReturn([$sortOrder]);
 
         $collection = $this->getMockBuilder(Collection::class)->disableOriginalConstructor()->getMock();
-        $collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->with([['attribute' => $fieldName, $conditionType => $value]]);
-        $collection->expects($this->once())->method('addOrder')->with($fieldName, SortOrder::SORT_ASC);
-        $collection->expects($this->once())->method('setCurPage')->with($currentPage);
-        $collection->expects($this->once())->method('setPageSize')->with($pageSize);
         $collection->expects($this->once())->method('getSize')->willReturn($totalCount);
         $collection->expects($this->once())->method('getAllIds')->willReturn([$categoryIdFirst, $categoryIdSecond]);
 
+        $this->collectionProcessorMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteria, $collection);
+
         $searchResult = $this->getMock(CategorySearchResultsInterface::class);
         $searchResult->expects($this->once())->method('setSearchCriteria')->with($searchCriteria);
         $searchResult->expects($this->once())->method('setItems')->with([$categoryFirst, $categorySecond]);
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
index 13f792b78e47afd3c5457b714345a0d00ee1a051..5042ac1b745cf07a7134687c2598694b773ff804 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
@@ -9,12 +9,11 @@
 
 namespace Magento\Catalog\Test\Unit\Model;
 
-use Magento\Catalog\Model\Layer\Filter\Dynamic\AlgorithmFactory;
+use Magento\Catalog\Api\Data\ProductAttributeInterface;
 use Magento\Framework\Api\Data\ImageContentInterface;
-use Magento\Framework\Api\SortOrder;
 use Magento\Framework\DB\Adapter\ConnectionException;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
-use Magento\Store\Model\ScopeInterface;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 
 /**
  * Class ProductRepositoryTest
@@ -142,12 +141,16 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $mediaGalleryProcessor;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessorMock;
+
     /**
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
     protected function setUp()
     {
-        $this->markTestSkipped('11111111111111111111111');
         $this->productFactoryMock = $this->getMock(
             \Magento\Catalog\Model\ProductFactory::class,
             ['create'],
@@ -291,6 +294,9 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
 
+        $this->collectionProcessorMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
+
         $this->model = $this->objectManager->getObject(
             \Magento\Catalog\Model\ProductRepository::class,
             [
@@ -310,7 +316,8 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
                 'linkTypeProvider' => $this->linkTypeProviderMock,
                 'imageProcessor' => $this->imageProcessorMock,
                 'storeManager' => $this->storeManagerMock,
-                'mediaGalleryProcessor' => $this->mediaGalleryProcessor
+                'mediaGalleryProcessor' => $this->mediaGalleryProcessor,
+                'collectionProcessor' => $this->collectionProcessorMock
             ]
         );
     }
@@ -372,7 +379,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->productFactoryMock->expects($this->once())->method('create')
             ->will($this->returnValue($this->productMock));
         $this->productMock->expects($this->once())->method('load')->with('product_id');
-        $this->productMock->expects($this->once())->method('getWebsiteIds');
         $this->productMock->expects($this->once())->method('getId')->willReturn(null);
         $this->model->getById('product_id');
     }
@@ -384,7 +390,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnValue($this->productMock));
         $this->productMock->expects($this->once())->method('setData')->with('_edit_mode', true);
         $this->productMock->expects($this->once())->method('load')->with($productId);
-        $this->productMock->expects($this->once())->method('getWebsiteIds');
         $this->productMock->expects($this->once())->method('getId')->willReturn($productId);
         $this->assertEquals($this->productMock, $this->model->getById($productId, true));
     }
@@ -430,7 +435,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->productFactoryMock->expects($this->exactly(2))->method('create')
             ->will($this->returnValue($this->productMock));
         $this->productMock->expects($this->exactly(2))->method('load');
-        $this->productMock->expects($this->exactly(2))->method('getWebsiteIds');
         $this->productMock->expects($this->exactly(2))->method('getId')->willReturn($identifier);
         $this->assertEquals($this->productMock, $this->model->getById($identifier, $editMode, $storeId));
         //second invocation should just return from cache
@@ -454,7 +458,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->productFactoryMock->expects($this->exactly(2))->method('create')
             ->will($this->returnValue($this->productMock));
         $this->productMock->expects($this->exactly(2))->method('load');
-        $this->productMock->expects($this->exactly(2))->method('getWebsiteIds');
         $this->productMock->expects($this->exactly(2))->method('getId')->willReturn($sku);
         $this->resourceModelMock->expects($this->exactly(2))->method('getIdBySku')
             ->with($sku)->willReturn($id);
@@ -473,7 +476,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnValue($this->productMock));
         $this->productMock->expects($this->once())->method('setData')->with('store_id', $storeId);
         $this->productMock->expects($this->once())->method('load')->with($productId);
-        $this->productMock->expects($this->once())->method('getWebsiteIds');
         $this->productMock->expects($this->once())->method('getId')->willReturn($productId);
         $this->assertEquals($this->productMock, $this->model->getById($productId, false, $storeId));
     }
@@ -485,7 +487,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->productFactoryMock->expects($this->once())->method('create')
             ->will($this->returnValue($this->productMock));
         $this->productMock->expects($this->once())->method('load')->with($productId);
-        $this->productMock->expects($this->once())->method('getWebsiteIds');
         $this->productMock->expects($this->once())->method('getId')->willReturn($productId);
         $this->productMock->expects($this->once())->method('getSku')->willReturn($productSku);
         $this->assertEquals($this->productMock, $this->model->getById($productId));
@@ -666,10 +667,7 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->assertTrue($this->model->deleteById($sku));
     }
 
-    /**
-     * @dataProvider fieldName
-     */
-    public function testGetList($fieldName)
+    public function testGetList()
     {
         $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class, [], [], '', false);
         $attributeCode = 'attribute_code';
@@ -681,15 +679,10 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
         $extendedSearchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteria::class, [], [], '', false);
-        $productAttributeSearchResultsMock = $this->getMockForAbstractClass(
-            \Magento\Catalog\Api\Data\ProductAttributeInterface::class,
-            [],
-            '',
-            false,
-            false,
-            false,
-            ['getItems']
-        );
+        $productAttributeSearchResultsMock = $this->getMockBuilder(ProductAttributeInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getItems'])
+            ->getMockForAbstractClass();
         $productAttributeMock = $this->getMock(
             \Magento\Catalog\Api\Data\ProductAttributeInterface::class,
             [],
@@ -697,9 +690,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $filterGroupMock = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filterGroupFilterMock = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
-        $sortOrderMock = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
         $itemsMock = $this->getMock(\Magento\Framework\DataObject::class, [], [], '', false);
 
         $this->collectionFactoryMock->expects($this->once())->method('create')->willReturn($collectionMock);
@@ -715,21 +705,9 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
             ['status', 'catalog_product/status', 'entity_id', null, 'inner'],
             ['visibility', 'catalog_product/visibility', 'entity_id', null, 'inner']
         );
-        $searchCriteriaMock->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroupMock]);
-        $filterGroupMock->expects($this->once())->method('getFilters')->willReturn([$filterGroupFilterMock]);
-        $filterGroupFilterMock->expects($this->exactly(2))->method('getConditionType')->willReturn('eq');
-        $filterGroupFilterMock->expects($this->atLeastOnce())->method('getField')->willReturn($fieldName);
-        $filterGroupFilterMock->expects($this->once())->method('getValue')->willReturn('value');
-        $this->expectAddToFilter($fieldName, $collectionMock);
-        $searchCriteriaMock->expects($this->once())->method('getSortOrders')->willReturn([$sortOrderMock]);
-        $sortOrderMock->expects($this->atLeastOnce())->method('getField')->willReturn($fieldName);
-        $sortOrderMock->expects($this->once())->method('getDirection')
-            ->willReturn(SortOrder::SORT_ASC);
-        $collectionMock->expects($this->once())->method('addOrder')->with($fieldName, 'ASC');
-        $searchCriteriaMock->expects($this->once())->method('getCurrentPage')->willReturn(4);
-        $collectionMock->expects($this->once())->method('setCurPage')->with(4);
-        $searchCriteriaMock->expects($this->once())->method('getPageSize')->willReturn(42);
-        $collectionMock->expects($this->once())->method('setPageSize')->with(42);
+        $this->collectionProcessorMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
         $collectionMock->expects($this->once())->method('load');
         $collectionMock->expects($this->once())->method('getItems')->willReturn([$itemsMock]);
         $collectionMock->expects($this->once())->method('getSize')->willReturn(128);
@@ -1314,31 +1292,4 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->model->save($this->productMock);
         $this->assertEquals($expectedResult, $this->initializedProductMock->getMediaGallery('images'));
     }
-
-    /**
-     * @param $fieldName
-     * @param $collectionMock
-     * @return void
-     */
-    public function expectAddToFilter($fieldName, $collectionMock)
-    {
-        if ($fieldName == 'category_id') {
-            $collectionMock->expects($this->once())->method('addCategoriesFilter')
-                ->with(['eq' => ['value']]);
-        } else {
-            $collectionMock->expects($this->once())->method('addFieldToFilter')
-                ->with([['attribute' => $fieldName, 'eq' => 'value']]);
-        }
-    }
-
-    /**
-     * @return array
-     */
-    public function fieldName()
-    {
-        return [
-            ['category_id'],
-            ['field']
-        ];
-    }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php
index 10bd9ddfd572aefd03204f6ae3eb1cc568a789b3..d4950d9df6de7b71d3f86e0e81ad4aa01d71fd6a 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php
@@ -185,6 +185,16 @@ class ProductTest extends \PHPUnit_Framework_TestCase
      */
     private $extensionAttributesFactory;
 
+    /**
+     * @var \Magento\Framework\Filesystem
+     */
+    private $filesystemMock;
+
+    /**
+     * @var \Magento\Framework\Data\CollectionFactory
+     */
+    private $collectionFactoryMock;
+
     /**
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
@@ -374,6 +384,13 @@ class ProductTest extends \PHPUnit_Framework_TestCase
         $this->extensionAttributesFactory = $this->getMockBuilder(ExtensionAttributesFactory::class)
             ->disableOriginalConstructor()
             ->getMock();
+        $this->filesystemMock = $this->getMockBuilder(\Magento\Framework\Filesystem::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->collectionFactoryMock = $this->getMockBuilder(\Magento\Framework\Data\CollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
         $this->mediaConfig = $this->getMock(\Magento\Catalog\Model\Product\Media\Config::class, [], [], '', false);
         $this->objectManagerHelper = new ObjectManagerHelper($this);
 
@@ -402,6 +419,8 @@ class ProductTest extends \PHPUnit_Framework_TestCase
                 'mediaGalleryEntryConverterPool' => $this->mediaGalleryEntryConverterPoolMock,
                 'linkRepository' => $this->productLinkRepositoryMock,
                 'catalogProductMediaConfig' => $this->mediaConfig,
+                '_filesystem' => $this->filesystemMock,
+                '_collectionFactory' => $this->collectionFactoryMock,
                 'data' => ['id' => 1]
             ]
         );
@@ -1230,6 +1249,71 @@ class ProductTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($expectedResult, $this->model->getMediaGallery());
     }
 
+    public function testGetMediaGalleryImagesMerging()
+    {
+        $mediaEntries = [
+            'images' => [
+                [
+                    'value_id' => 1,
+                    'file' => 'imageFile.jpg',
+                    'media_type' => 'image',
+                ],
+                [
+                    'value_id' => 1,
+                    'file' => 'imageFile.jpg',
+                ],
+                [
+                    'value_id' => 2,
+                    'file' => 'smallImageFile.jpg',
+                    'media_type' => 'image',
+                ],
+            ]
+        ];
+        $expectedImageDataObject = new \Magento\Framework\DataObject([
+            'value_id' => 1,
+            'file' => 'imageFile.jpg',
+            'media_type' => 'image',
+            'url' => 'http://magento.dev/pub/imageFile.jpg',
+            'id' => 1,
+            'path' => '/var/www/html/pub/imageFile.jpg',
+        ]);
+        $expectedSmallImageDataObject = new \Magento\Framework\DataObject([
+            'value_id' => 2,
+            'file' => 'smallImageFile.jpg',
+            'media_type' => 'image',
+            'url' => 'http://magento.dev/pub/smallImageFile.jpg',
+            'id' => 2,
+            'path' => '/var/www/html/pub/smallImageFile.jpg',
+        ]);
+
+        $directoryMock = $this->getMockBuilder(\Magento\Framework\Filesystem\Directory\ReadInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->filesystemMock->expects($this->once())->method('getDirectoryRead')->willReturn($directoryMock);
+        $this->model->setData('media_gallery', $mediaEntries);
+        $imagesCollectionMock = $this->getMockBuilder(\Magento\Framework\Data\Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->collectionFactoryMock->expects($this->once())->method('create')->willReturn($imagesCollectionMock);
+        $imagesCollectionMock->expects($this->at(2))->method('getItemById')->with(1)->willReturn($expectedImageDataObject);
+        $this->mediaConfig->expects($this->at(0))
+            ->method('getMediaUrl')
+            ->willReturn('http://magento.dev/pub/imageFile.jpg');
+        $directoryMock->expects($this->at(0))
+            ->method('getAbsolutePath')
+            ->willReturn('/var/www/html/pub/imageFile.jpg');
+        $this->mediaConfig->expects($this->at(2))
+            ->method('getMediaUrl')
+            ->willReturn('http://magento.dev/pub/smallImageFile.jpg');
+        $directoryMock->expects($this->at(1))
+            ->method('getAbsolutePath')
+            ->willReturn('/var/www/html/pub/smallImageFile.jpg');
+        $imagesCollectionMock->expects($this->at(1))->method('addItem')->with($expectedImageDataObject);
+        $imagesCollectionMock->expects($this->at(4))->method('addItem')->with($expectedSmallImageDataObject);
+
+        $this->model->getMediaGalleryImages();
+    }
+
     public function testGetCustomAttributes()
     {
         $priceCode = 'price';
diff --git a/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/EavTest.php b/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/EavTest.php
index 10722de41c1d2abfd788e9c492fd06d29c5c3273..2deb4800bd023b7290a65f2a7375a11a8214e75b 100755
--- a/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/EavTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/EavTest.php
@@ -9,6 +9,7 @@ use Magento\Catalog\Model\Product\Type;
 use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Eav;
 use Magento\Eav\Model\Config;
 use Magento\Framework\App\RequestInterface;
+use Magento\Framework\EntityManager\EventManager;
 use Magento\Store\Model\StoreManagerInterface;
 use Magento\Store\Api\Data\StoreInterface;
 use Magento\Ui\DataProvider\EavValidationRules;
@@ -27,11 +28,15 @@ use Magento\Framework\Api\SortOrderBuilder;
 use Magento\Catalog\Api\ProductAttributeRepositoryInterface;
 use Magento\Framework\Api\SearchResultsInterface;
 use Magento\Catalog\Api\Data\ProductAttributeInterface;
+use Magento\Framework\Api\AttributeInterface;
 use Magento\Eav\Api\Data\AttributeGroupInterface;
 use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
 use Magento\Framework\Currency;
 use Magento\Framework\Locale\Currency as CurrencyLocale;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Framework\Stdlib\ArrayManager;
+use Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory as EavAttributeFactory;
+use Magento\Framework\Event\ManagerInterface;
 
 /**
  * Class EavTest
@@ -157,6 +162,26 @@ class EavTest extends AbstractModifierTest
      */
     protected $currencyLocaleMock;
 
+    /**
+     * @var ProductAttributeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productAttributeMock;
+
+    /**
+     * @var ArrayManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $arrayManagerMock;
+
+    /**
+     * @var EavAttributeFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $eavAttributeFactoryMock;
+
+    /**
+     * @var ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $eventManagerMock;
+
     /**
      * @var ObjectManager
      */
@@ -167,6 +192,9 @@ class EavTest extends AbstractModifierTest
      */
     protected $eav;
 
+    /**
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     */
     protected function setUp()
     {
         parent::setUp();
@@ -228,10 +256,24 @@ class EavTest extends AbstractModifierTest
         $this->searchResultsMock = $this->getMockBuilder(SearchResultsInterface::class)
             ->getMockForAbstractClass();
         $this->eavAttributeMock = $this->getMockBuilder(Attribute::class)
-            ->setMethods(['getAttributeGroupCode', 'getApplyTo', 'getFrontendInput', 'getAttributeCode'])
+            ->setMethods(['load', 'getAttributeGroupCode', 'getApplyTo', 'getFrontendInput', 'getAttributeCode'])
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->productAttributeMock = $this->getMockBuilder(ProductAttributeInterface::class)
+            ->getMock();
+        $this->arrayManagerMock = $this->getMockBuilder(ArrayManager::class)
+            ->getMock();
+        $this->eavAttributeFactoryMock = $this->getMockBuilder(EavAttributeFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->eventManagerMock = $this->getMockBuilder(ManagerInterface::class)
             ->disableOriginalConstructor()
             ->getMock();
 
+        $this->eavAttributeFactoryMock->expects($this->any())
+            ->method('create')
+            ->willReturn($this->eavAttributeMock);
         $this->groupCollectionFactoryMock->expects($this->any())
             ->method('create')
             ->willReturn($this->groupCollectionMock);
@@ -277,6 +319,9 @@ class EavTest extends AbstractModifierTest
             ->disableOriginalConstructor()
             ->setMethods(['getCurrency'])
             ->getMock();
+        $this->eavAttributeMock->expects($this->any())
+            ->method('load')
+            ->willReturnSelf();
         
         $this->eav =$this->getModel();
         $this->objectManager->setBackwardCompatibleProperty(
@@ -304,6 +349,9 @@ class EavTest extends AbstractModifierTest
             'attributeGroupRepository' => $this->attributeGroupRepositoryMock,
             'sortOrderBuilder' => $this->sortOrderBuilderMock,
             'attributeRepository' => $this->attributeRepositoryMock,
+            'arrayManager' => $this->arrayManagerMock,
+            'eavAttributeFactory' => $this->eavAttributeFactoryMock,
+            '_eventManager' => $this->eventManagerMock
         ]);
     }
 
@@ -399,4 +447,162 @@ class EavTest extends AbstractModifierTest
 
         $this->assertEquals($sourceData, $this->eav->modifyData([]));
     }
+
+    /**
+     * @param int $productId
+     * @param bool $productRequired
+     * @param string $attrValue
+     * @param array $expected
+     * @covers \Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Eav::isProductExists
+     * @covers \Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Eav::setupAttributeMeta
+     * @dataProvider setupAttributeMetaDataProvider
+     */
+    public function testSetupAttributeMetaDefaultAttribute($productId, $productRequired, $attrValue, $expected)
+    {
+        $configPath =  'arguments/data/config';
+        $groupCode = 'product-details';
+        $sortOrder = '0';
+
+        $this->productMock->expects($this->any())
+            ->method('getId')
+            ->willReturn($productId);
+
+        $this->productAttributeMock->expects($this->any())
+            ->method('getIsRequired')
+            ->willReturn($productRequired);
+
+        $this->productAttributeMock->expects($this->any())
+            ->method('getDefaultValue')
+            ->willReturn('required_value');
+
+        $this->productAttributeMock->expects($this->any())
+            ->method('getAttributeCode')
+            ->willReturn('code');
+
+        $this->productAttributeMock->expects($this->any())
+            ->method('getValue')
+            ->willReturn('value');
+
+        $attributeMock = $this->getMockBuilder(AttributeInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $attributeMock->expects($this->any())
+            ->method('getValue')
+            ->willReturn($attrValue);
+
+        $this->productMock->expects($this->any())
+            ->method('getCustomAttribute')
+            ->willReturn($attributeMock);
+
+        $this->arrayManagerMock->expects($this->any())
+            ->method('set')
+            ->with(
+                $configPath,
+                [],
+                $expected
+            )
+            ->willReturn($expected);
+
+        $this->arrayManagerMock->expects($this->any())
+            ->method('merge')
+            ->willReturn($expected);
+
+        $this->arrayManagerMock->expects($this->any())
+            ->method('get')
+            ->willReturn([]);
+
+        $this->arrayManagerMock->expects($this->any())
+            ->method('exists');
+
+        $this->assertEquals(
+            $expected,
+            $this->eav->setupAttributeMeta($this->productAttributeMock, $groupCode, $sortOrder)
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function setupAttributeMetaDataProvider()
+    {
+        return [
+            'default_null_prod_not_new_and_required' => [
+                'productId' => 1,
+                'productRequired' => true,
+                'attrValue' => 'val',
+                'expected' => [
+                    'dataType' => null,
+                    'formElement' => null,
+                    'visible' => null,
+                    'required' => true,
+                    'notice' => null,
+                    'default' => null,
+                    'label' => null,
+                    'code' => 'code',
+                    'source' => 'product-details',
+                    'scopeLabel' => '',
+                    'globalScope' => false,
+                    'sortOrder' => 0
+                    ],
+                ],
+            'default_null_prod_not_new_and_not_required' => [
+                'productId' => 1,
+                'productRequired' => false,
+                'attrValue' => 'val',
+                'expected' => [
+                    'dataType' => null,
+                    'formElement' => null,
+                    'visible' => null,
+                    'required' => false,
+                    'notice' => null,
+                    'default' => null,
+                    'label' => null,
+                    'code' => 'code',
+                    'source' => 'product-details',
+                    'scopeLabel' => '',
+                    'globalScope' => false,
+                    'sortOrder' => 0
+                    ],
+                ],
+            'default_null_prod_new_and_not_required' => [
+                'productId' => null,
+                'productRequired' => false,
+                'attrValue' => null,
+                'expected' => [
+                    'dataType' => null,
+                    'formElement' => null,
+                    'visible' => null,
+                    'required' => false,
+                    'notice' => null,
+                    'default' => 'required_value',
+                    'label' => null,
+                    'code' => 'code',
+                    'source' => 'product-details',
+                    'scopeLabel' => '',
+                    'globalScope' => false,
+                    'sortOrder' => 0
+                ],
+            ],
+            'default_null_prod_new_and_required' => [
+                'productId' => null,
+                'productRequired' => false,
+                'attrValue' => null,
+                'expected' => [
+                    'dataType' => null,
+                    'formElement' => null,
+                    'visible' => null,
+                    'required' => false,
+                    'notice' => null,
+                    'default' => 'required_value',
+                    'label' => null,
+                    'code' => 'code',
+                    'source' => 'product-details',
+                    'scopeLabel' => '',
+                    'globalScope' => false,
+                    'sortOrder' => 0
+                ],
+            ]
+        ];
+    }
 }
diff --git a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Eav.php b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Eav.php
index edab28873b5b79bc2112a1b7de8e1c22956168c1..1419c17e11b298d1fcdc554a3131d7b8c9b8ffe8 100755
--- a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Eav.php
+++ b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Eav.php
@@ -522,6 +522,16 @@ class Eav extends AbstractModifier
         return $this->prevSetAttributes;
     }
 
+    /**
+     * Check is product already new or we trying to create one
+     *
+     * @return bool
+     */
+    private function isProductExists()
+    {
+        return (bool) $this->locator->getProduct()->getId();
+    }
+
     /**
      * Initial meta setup
      *
@@ -531,6 +541,7 @@ class Eav extends AbstractModifier
      * @return array
      * @throws \Magento\Framework\Exception\LocalizedException
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
      * @api
      */
     public function setupAttributeMeta(ProductAttributeInterface $attribute, $groupCode, $sortOrder)
@@ -543,7 +554,7 @@ class Eav extends AbstractModifier
             'visible' => $attribute->getIsVisible(),
             'required' => $attribute->getIsRequired(),
             'notice' => $attribute->getNote(),
-            'default' => $attribute->getDefaultValue(),
+            'default' => (!$this->isProductExists()) ? $attribute->getDefaultValue() : null,
             'label' => $attribute->getDefaultFrontendLabel(),
             'code' => $attribute->getAttributeCode(),
             'source' => $groupCode,
diff --git a/app/code/Magento/Catalog/etc/di.xml b/app/code/Magento/Catalog/etc/di.xml
index a198802a0dc25791fe23f05263bc3590772d2d88..36f072d3b0a15b358463a2715e5e214c30b51b24 100644
--- a/app/code/Magento/Catalog/etc/di.xml
+++ b/app/code/Magento/Catalog/etc/di.xml
@@ -805,4 +805,30 @@
             </argument>
         </arguments>
     </type>
+    <virtualType name="Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\ProductFilterProcessor" type="Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
+        <arguments>
+            <argument name="customFilters" xsi:type="array">
+                <item name="category_id" xsi:type="object">Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\ProductCategoryFilter</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Catalog\Model\Api\SearchCriteria\ProductCollectionProcessor" type="Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="filters" xsi:type="object">Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\ProductFilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Catalog\Model\ProductRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Catalog\Model\Api\SearchCriteria\ProductCollectionProcessor</argument>
+        </arguments>
+    </type>
+    <type name="\Magento\Catalog\Model\CategoryList">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Catalog/view/adminhtml/web/template/form/element/action-delete.html b/app/code/Magento/Catalog/view/adminhtml/web/template/form/element/action-delete.html
index 9f223325939fb97b418f05c0f20fb8ff364e8a93..13445314101b22ea1761def9d18ffaf87845047c 100644
--- a/app/code/Magento/Catalog/view/adminhtml/web/template/form/element/action-delete.html
+++ b/app/code/Magento/Catalog/view/adminhtml/web/template/form/element/action-delete.html
@@ -12,5 +12,5 @@
                 title: $parent.deleteButtonLabel
             }
         ">
-    <span data-bind="text: $parent.deleteButtonLabel"></span>
+    <span translate="$parent.deleteButtonLabel"></span>
 </button>
\ No newline at end of file
diff --git a/app/code/Magento/Cms/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/BlockStoreFilter.php b/app/code/Magento/Cms/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/BlockStoreFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf2a6b2a5a5c8f253450696a20d8aa3be8fb97a3
--- /dev/null
+++ b/app/code/Magento/Cms/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/BlockStoreFilter.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class BlockStoreFilter implements CustomFilterInterface
+{
+    /**
+     * Apply custom store filter to collection
+     *
+     * @param Filter $filter
+     * @param AbstractDb $collection
+     * @return bool
+     */
+    public function apply(Filter $filter, AbstractDb $collection)
+    {
+        /** @var \Magento\Cms\Model\ResourceModel\Block\Collection $collection */
+        $collection->addStoreFilter($filter->getValue(), false);
+
+        return true;
+    }
+}
diff --git a/app/code/Magento/Cms/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/PageStoreFilter.php b/app/code/Magento/Cms/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/PageStoreFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..20ad94e6975e0b41c56845dc640cff52a2c58361
--- /dev/null
+++ b/app/code/Magento/Cms/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/PageStoreFilter.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class PageStoreFilter implements CustomFilterInterface
+{
+    /**
+     * Apply custom store filter to collection
+     *
+     * @param Filter $filter
+     * @param AbstractDb $collection
+     * @return bool
+     */
+    public function apply(Filter $filter, AbstractDb $collection)
+    {
+        /** @var \Magento\Cms\Model\ResourceModel\Page\Collection $collection */
+        $collection->addStoreFilter($filter->getValue(), false);
+
+        return true;
+    }
+}
diff --git a/app/code/Magento/Cms/Model/BlockRepository.php b/app/code/Magento/Cms/Model/BlockRepository.php
index dd9e1eec77696aab3a7b66d5a2c588b9e37ed82b..5719316dc3674dc8e1d6f21fe3c1c91e658aa28a 100644
--- a/app/code/Magento/Cms/Model/BlockRepository.php
+++ b/app/code/Magento/Cms/Model/BlockRepository.php
@@ -8,7 +8,7 @@ namespace Magento\Cms\Model;
 use Magento\Cms\Api\Data;
 use Magento\Cms\Api\BlockRepositoryInterface;
 use Magento\Framework\Api\DataObjectHelper;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Exception\CouldNotDeleteException;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\NoSuchEntityException;
@@ -63,6 +63,11 @@ class BlockRepository implements BlockRepositoryInterface
      */
     private $storeManager;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param ResourceBlock $resource
      * @param BlockFactory $blockFactory
@@ -72,6 +77,7 @@ class BlockRepository implements BlockRepositoryInterface
      * @param DataObjectHelper $dataObjectHelper
      * @param DataObjectProcessor $dataObjectProcessor
      * @param StoreManagerInterface $storeManager
+     * @param CollectionProcessorInterface $collectionProcessor
      */
     public function __construct(
         ResourceBlock $resource,
@@ -81,7 +87,8 @@ class BlockRepository implements BlockRepositoryInterface
         Data\BlockSearchResultsInterfaceFactory $searchResultsFactory,
         DataObjectHelper $dataObjectHelper,
         DataObjectProcessor $dataObjectProcessor,
-        StoreManagerInterface $storeManager
+        StoreManagerInterface $storeManager,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->resource = $resource;
         $this->blockFactory = $blockFactory;
@@ -91,6 +98,7 @@ class BlockRepository implements BlockRepositoryInterface
         $this->dataBlockFactory = $dataBlockFactory;
         $this->dataObjectProcessor = $dataObjectProcessor;
         $this->storeManager = $storeManager;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -139,27 +147,11 @@ class BlockRepository implements BlockRepositoryInterface
      */
     public function getList(\Magento\Framework\Api\SearchCriteriaInterface $criteria)
     {
-        $searchResults = $this->searchResultsFactory->create();
-        $searchResults->setSearchCriteria($criteria);
-
         /** @var \Magento\Cms\Model\ResourceModel\Block\Collection $collection */
         $collection = $this->blockCollectionFactory->create();
-        foreach ($criteria->getFilterGroups() as $filterGroup) {
-            $this->addFilterGroupToCollection($filterGroup, $collection);
-        }
 
-        $searchResults->setTotalCount($collection->getSize());
-        $sortOrders = $criteria->getSortOrders();
-        if ($sortOrders) {
-            foreach ($sortOrders as $sortOrder) {
-                $collection->addOrder(
-                    $sortOrder->getField(),
-                    ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-                );
-            }
-        }
-        $collection->setCurPage($criteria->getCurrentPage());
-        $collection->setPageSize($criteria->getPageSize());
+        $this->collectionProcessor->process($criteria, $collection);
+
         $blocks = [];
         /** @var Block $blockModel */
         foreach ($collection as $blockModel) {
@@ -174,7 +166,12 @@ class BlockRepository implements BlockRepositoryInterface
                 \Magento\Cms\Api\Data\BlockInterface::class
             );
         }
+
+        /** @var Data\BlockSearchResultsInterface $searchResults */
+        $searchResults = $this->searchResultsFactory->create();
+        $searchResults->setSearchCriteria($criteria);
         $searchResults->setItems($blocks);
+        $searchResults->setTotalCount($collection->getSize());
         return $searchResults;
     }
 
@@ -209,31 +206,18 @@ class BlockRepository implements BlockRepositoryInterface
     }
 
     /**
-     * Helper function that adds a FilterGroup to the collection.
+     * Retrieve collection processor
      *
-     * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
-     * @param \Magento\Cms\Model\ResourceModel\Block\Collection $collection
-     * @return void
-     * @throws \Magento\Framework\Exception\InputException
-     */
-    private function addFilterGroupToCollection(
-        \Magento\Framework\Api\Search\FilterGroup $filterGroup,
-        \Magento\Cms\Model\ResourceModel\Block\Collection $collection
-    ) {
-        $fields = [];
-        $conditions = [];
-        foreach ($filterGroup->getFilters() as $filter) {
-            if ($filter->getField() === 'store_id') {
-                $collection->addStoreFilter($filter->getValue(), false);
-                continue;
-            }
-            $condition = $filter->getConditionType() ?: 'eq';
-            $fields[] = $filter->getField();
-            $conditions[] = [$condition => $filter->getValue()];
-        }
-
-        if ($fields) {
-            $collection->addFieldToFilter($fields, $conditions);
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Cms\Model\Api\SearchCriteria\BlockCollectionProcessor'
+            );
         }
+        return $this->collectionProcessor;
     }
 }
diff --git a/app/code/Magento/Cms/Model/PageRepository.php b/app/code/Magento/Cms/Model/PageRepository.php
index cce61f343a8e15de710befaaf9c9d4363221d5b0..9ab3b03d4ae2449d6d9b9807092840538b420a52 100644
--- a/app/code/Magento/Cms/Model/PageRepository.php
+++ b/app/code/Magento/Cms/Model/PageRepository.php
@@ -8,7 +8,7 @@ namespace Magento\Cms\Model;
 use Magento\Cms\Api\Data;
 use Magento\Cms\Api\PageRepositoryInterface;
 use Magento\Framework\Api\DataObjectHelper;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Exception\CouldNotDeleteException;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\NoSuchEntityException;
@@ -63,6 +63,11 @@ class PageRepository implements PageRepositoryInterface
      */
     private $storeManager;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param ResourcePage $resource
      * @param PageFactory $pageFactory
@@ -72,6 +77,7 @@ class PageRepository implements PageRepositoryInterface
      * @param DataObjectHelper $dataObjectHelper
      * @param DataObjectProcessor $dataObjectProcessor
      * @param StoreManagerInterface $storeManager
+     * @param CollectionProcessorInterface $collectionProcessor
      */
     public function __construct(
         ResourcePage $resource,
@@ -81,7 +87,8 @@ class PageRepository implements PageRepositoryInterface
         Data\PageSearchResultsInterfaceFactory $searchResultsFactory,
         DataObjectHelper $dataObjectHelper,
         DataObjectProcessor $dataObjectProcessor,
-        StoreManagerInterface $storeManager
+        StoreManagerInterface $storeManager,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->resource = $resource;
         $this->pageFactory = $pageFactory;
@@ -91,6 +98,7 @@ class PageRepository implements PageRepositoryInterface
         $this->dataPageFactory = $dataPageFactory;
         $this->dataObjectProcessor = $dataObjectProcessor;
         $this->storeManager = $storeManager;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -144,28 +152,11 @@ class PageRepository implements PageRepositoryInterface
      */
     public function getList(\Magento\Framework\Api\SearchCriteriaInterface $criteria)
     {
-        $searchResults = $this->searchResultsFactory->create();
-        $searchResults->setSearchCriteria($criteria);
-
         /** @var \Magento\Cms\Model\ResourceModel\Page\Collection $collection */
         $collection = $this->pageCollectionFactory->create();
-        foreach ($criteria->getFilterGroups() as $filterGroup) {
-            $this->addFilterGroupToCollection($filterGroup, $collection);
-        }
 
-        $searchResults->setTotalCount($collection->getSize());
-        $sortOrders = $criteria->getSortOrders();
-        if ($sortOrders) {
-            /** @var SortOrder $sortOrder */
-            foreach ($sortOrders as $sortOrder) {
-                $collection->addOrder(
-                    $sortOrder->getField(),
-                    ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-                );
-            }
-        }
-        $collection->setCurPage($criteria->getCurrentPage());
-        $collection->setPageSize($criteria->getPageSize());
+        $this->collectionProcessor->process($criteria, $collection);
+
         $pages = [];
         /** @var Page $pageModel */
         foreach ($collection as $pageModel) {
@@ -180,7 +171,12 @@ class PageRepository implements PageRepositoryInterface
                 \Magento\Cms\Api\Data\PageInterface::class
             );
         }
+
+        /** @var Data\PageSearchResultsInterface $searchResults */
+        $searchResults = $this->searchResultsFactory->create();
+        $searchResults->setSearchCriteria($criteria);
         $searchResults->setItems($pages);
+        $searchResults->setTotalCount($collection->getSize());
         return $searchResults;
     }
 
@@ -218,31 +214,18 @@ class PageRepository implements PageRepositoryInterface
     }
 
     /**
-     * Helper function that adds a FilterGroup to the collection.
+     * Retrieve collection processor
      *
-     * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
-     * @param \Magento\Cms\Model\ResourceModel\Page\Collection $collection
-     * @return void
-     * @throws \Magento\Framework\Exception\InputException
-     */
-    private function addFilterGroupToCollection(
-        \Magento\Framework\Api\Search\FilterGroup $filterGroup,
-        \Magento\Cms\Model\ResourceModel\Page\Collection $collection
-    ) {
-        $fields = [];
-        $conditions = [];
-        foreach ($filterGroup->getFilters() as $filter) {
-            if ($filter->getField() === 'store_id') {
-                $collection->addStoreFilter($filter->getValue(), false);
-                continue;
-            }
-            $condition = $filter->getConditionType() ?: 'eq';
-            $fields[] = $filter->getField();
-            $conditions[] = [$condition => $filter->getValue()];
-        }
-
-        if ($fields) {
-            $collection->addFieldToFilter($fields, $conditions);
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Cms\Model\Api\SearchCriteria\PageCollectionProcessor'
+            );
         }
+        return $this->collectionProcessor;
     }
 }
diff --git a/app/code/Magento/Cms/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/BlockStoreFilterTest.php b/app/code/Magento/Cms/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/BlockStoreFilterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8f96abdcbab5c3aad76da8616a2dce14964f221e
--- /dev/null
+++ b/app/code/Magento/Cms/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/BlockStoreFilterTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\BlockStoreFilter;
+
+class BlockStoreFilterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var BlockStoreFilter
+     */
+    private $filter;
+
+    protected function setUp()
+    {
+        $this->filter = new BlockStoreFilter();
+    }
+
+    public function testApply()
+    {
+        $filterValue = 'filter_value';
+
+        $filterMock = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($filterValue);
+
+        $collectionMock = $this->getMockBuilder(\Magento\Cms\Model\ResourceModel\Block\Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $collectionMock->expects($this->once())
+            ->method('addStoreFilter')
+            ->with($filterValue, false)
+            ->willReturnSelf();
+
+        $this->assertTrue($this->filter->apply($filterMock, $collectionMock));
+    }
+}
diff --git a/app/code/Magento/Cms/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/PageStoreFilterTest.php b/app/code/Magento/Cms/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/PageStoreFilterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d4a6ff4efa52ce82c470c6bf1e48db5a42e9784
--- /dev/null
+++ b/app/code/Magento/Cms/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/PageStoreFilterTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\PageStoreFilter;
+
+class PageStoreFilterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var PageStoreFilter
+     */
+    private $filter;
+
+    protected function setUp()
+    {
+        $this->filter = new PageStoreFilter();
+    }
+
+    public function testApply()
+    {
+        $filterValue = 'filter_value';
+
+        $filterMock = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($filterValue);
+
+        $collectionMock = $this->getMockBuilder(\Magento\Cms\Model\ResourceModel\Page\Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $collectionMock->expects($this->once())
+            ->method('addStoreFilter')
+            ->with($filterValue, false)
+            ->willReturnSelf();
+
+        $this->assertTrue($this->filter->apply($filterMock, $collectionMock));
+    }
+}
diff --git a/app/code/Magento/Cms/Test/Unit/Model/BlockRepositoryTest.php b/app/code/Magento/Cms/Test/Unit/Model/BlockRepositoryTest.php
index c6f7eb7592775c3aec8f257ebe4a395e8d1605df..3144d38a96c80465eaf7fbdb1bda21f923f889e9 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/BlockRepositoryTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/BlockRepositoryTest.php
@@ -6,7 +6,7 @@
 namespace Magento\Cms\Test\Unit\Model;
 
 use Magento\Cms\Model\BlockRepository;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 
 /**
  * Test for Magento\Cms\Model\BlockRepository
@@ -60,6 +60,11 @@ class BlockRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     private $storeManager;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * Initialize repository
      */
@@ -131,6 +136,9 @@ class BlockRepositoryTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
+        $this->collectionProcessor = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMockForAbstractClass();
+
         $this->repository = new BlockRepository(
             $this->blockResource,
             $blockFactory,
@@ -139,7 +147,8 @@ class BlockRepositoryTest extends \PHPUnit_Framework_TestCase
             $blockSearchResultFactory,
             $this->dataHelper,
             $this->dataObjectProcessor,
-            $this->storeManager
+            $this->storeManager,
+            $this->collectionProcessor
         );
     }
 
@@ -229,54 +238,42 @@ class BlockRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetList()
     {
-        $field = 'name';
-        $value = 'magento';
-        $condition = 'eq';
         $total = 10;
-        $currentPage = 3;
-        $pageSize = 2;
-        $sortField = 'id';
-
-        $criteria = $this->getMockBuilder(\Magento\Framework\Api\SearchCriteriaInterface::class)->getMock();
-        $filterGroup = $this->getMockBuilder(\Magento\Framework\Api\Search\FilterGroup::class)->getMock();
-        $filter = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)->getMock();
-        $storeFilter = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)->getMock();
-        $sortOrder = $this->getMockBuilder(\Magento\Framework\Api\SortOrder::class)->getMock();
-
-        $criteria->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroup]);
-        $criteria->expects($this->once())->method('getSortOrders')->willReturn([$sortOrder]);
-        $criteria->expects($this->once())->method('getCurrentPage')->willReturn($currentPage);
-        $criteria->expects($this->once())->method('getPageSize')->willReturn($pageSize);
-        $filterGroup->expects($this->once())->method('getFilters')->willReturn([$storeFilter, $filter]);
-        $filter->expects($this->once())->method('getConditionType')->willReturn($condition);
-        $filter->expects($this->any())->method('getField')->willReturn($field);
-        $filter->expects($this->once())->method('getValue')->willReturn($value);
-        $storeFilter->expects($this->any())->method('getField')->willReturn('store_id');
-        $storeFilter->expects($this->once())->method('getValue')->willReturn(1);
-        $sortOrder->expects($this->once())->method('getField')->willReturn($sortField);
-        $sortOrder->expects($this->once())->method('getDirection')->willReturn(SortOrder::SORT_DESC);
 
         /** @var \Magento\Framework\Api\SearchCriteriaInterface $criteria */
+        $criteria = $this->getMockBuilder(\Magento\Framework\Api\SearchCriteriaInterface::class)->getMock();
 
         $this->collection->addItem($this->block);
+        $this->collection->expects($this->once())
+            ->method('getSize')
+            ->willReturn($total);
+
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($criteria, $this->collection)
+            ->willReturnSelf();
+
         $this->blockSearchResult->expects($this->once())
             ->method('setSearchCriteria')
             ->with($criteria)
             ->willReturnSelf();
-        $this->collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->with([$field], [[$condition => $value]])
+        $this->blockSearchResult->expects($this->once())
+            ->method('setTotalCount')
+            ->with($total)
+            ->willReturnSelf();
+        $this->blockSearchResult->expects($this->once())
+            ->method('setItems')
+            ->with(['someData'])
             ->willReturnSelf();
-        $this->blockSearchResult->expects($this->once())->method('setTotalCount')->with($total)->willReturnSelf();
-        $this->collection->expects($this->once())->method('getSize')->willReturn($total);
-        $this->collection->expects($this->once())->method('setCurPage')->with($currentPage)->willReturnSelf();
-        $this->collection->expects($this->once())->method('setPageSize')->with($pageSize)->willReturnSelf();
-        $this->collection->expects($this->once())->method('addOrder')->with($sortField, 'DESC')->willReturnSelf();
-        $this->block->expects($this->once())->method('getData')->willReturn(['data']);
-        $this->blockSearchResult->expects($this->once())->method('setItems')->with(['someData'])->willReturnSelf();
+
+        $this->block->expects($this->once())
+            ->method('getData')
+            ->willReturn(['data']);
+
         $this->dataHelper->expects($this->once())
             ->method('populateWithArray')
             ->with($this->blockData, ['data'], \Magento\Cms\Api\Data\BlockInterface::class);
+
         $this->dataObjectProcessor->expects($this->once())
             ->method('buildOutputDataArray')
             ->with($this->blockData, \Magento\Cms\Api\Data\BlockInterface::class)
diff --git a/app/code/Magento/Cms/Test/Unit/Model/PageRepositoryTest.php b/app/code/Magento/Cms/Test/Unit/Model/PageRepositoryTest.php
index 5a16a8c972d0ef65da17ad6dbeabf53f3954b1dc..d11126881ba225083ee2d2d6029e79f7f785fa9f 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/PageRepositoryTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/PageRepositoryTest.php
@@ -6,7 +6,7 @@
 namespace Magento\Cms\Test\Unit\Model;
 
 use Magento\Cms\Model\PageRepository;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 
 /**
  * Test for Magento\Cms\Model\PageRepository
@@ -60,6 +60,11 @@ class PageRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     private $storeManager;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * Initialize repository
      */
@@ -103,7 +108,7 @@ class PageRepositoryTest extends \PHPUnit_Framework_TestCase
             ->getMock();
         $this->collection = $this->getMockBuilder(\Magento\Cms\Model\ResourceModel\Page\Collection::class)
             ->disableOriginalConstructor()
-            ->setMethods(['addFieldToFilter', 'getSize', 'setCurPage', 'setPageSize', 'load', 'addOrder'])
+            ->setMethods(['getSize', 'setCurPage', 'setPageSize', 'load', 'addOrder'])
             ->getMock();
 
         $pageFactory->expects($this->any())
@@ -129,6 +134,9 @@ class PageRepositoryTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
+        $this->collectionProcessor = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMockForAbstractClass();
+
         $this->repository = new PageRepository(
             $this->pageResource,
             $pageFactory,
@@ -137,7 +145,8 @@ class PageRepositoryTest extends \PHPUnit_Framework_TestCase
             $pageSearchResultFactory,
             $this->dataHelper,
             $this->dataObjectProcessor,
-            $this->storeManager
+            $this->storeManager,
+            $this->collectionProcessor
         );
     }
 
@@ -227,51 +236,42 @@ class PageRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetList()
     {
-        $field = 'name';
-        $value = 'magento';
-        $condition = 'eq';
         $total = 10;
-        $currentPage = 3;
-        $pageSize = 2;
-        $sortField = 'id';
-
-        $criteria = $this->getMockBuilder(\Magento\Framework\Api\SearchCriteriaInterface::class)->getMock();
-        $filterGroup = $this->getMockBuilder(\Magento\Framework\Api\Search\FilterGroup::class)->getMock();
-        $filter = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)->getMock();
-        $storeFilter = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)->getMock();
-        $sortOrder = $this->getMockBuilder(\Magento\Framework\Api\SortOrder::class)->getMock();
-
-        $criteria->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroup]);
-        $criteria->expects($this->once())->method('getSortOrders')->willReturn([$sortOrder]);
-        $criteria->expects($this->once())->method('getCurrentPage')->willReturn($currentPage);
-        $criteria->expects($this->once())->method('getPageSize')->willReturn($pageSize);
-        $filterGroup->expects($this->once())->method('getFilters')->willReturn([$storeFilter, $filter]);
-        $filter->expects($this->once())->method('getConditionType')->willReturn($condition);
-        $filter->expects($this->any())->method('getField')->willReturn($field);
-        $filter->expects($this->once())->method('getValue')->willReturn($value);
-        $storeFilter->expects($this->any())->method('getField')->willReturn('store_id');
-        $storeFilter->expects($this->once())->method('getValue')->willReturn(1);
-        $sortOrder->expects($this->once())->method('getField')->willReturn($sortField);
-        $sortOrder->expects($this->once())->method('getDirection')->willReturn(SortOrder::SORT_DESC);
 
         /** @var \Magento\Framework\Api\SearchCriteriaInterface $criteria */
+        $criteria = $this->getMockBuilder(\Magento\Framework\Api\SearchCriteriaInterface::class)->getMock();
 
         $this->collection->addItem($this->page);
-        $this->pageSearchResult->expects($this->once())->method('setSearchCriteria')->with($criteria)->willReturnSelf();
         $this->collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->with([$field], [[$condition => $value]])
+            ->method('getSize')
+            ->willReturn($total);
+
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($criteria, $this->collection)
             ->willReturnSelf();
-        $this->pageSearchResult->expects($this->once())->method('setTotalCount')->with($total)->willReturnSelf();
-        $this->collection->expects($this->once())->method('getSize')->willReturn($total);
-        $this->collection->expects($this->once())->method('setCurPage')->with($currentPage)->willReturnSelf();
-        $this->collection->expects($this->once())->method('setPageSize')->with($pageSize)->willReturnSelf();
-        $this->collection->expects($this->once())->method('addOrder')->with($sortField, 'DESC')->willReturnSelf();
-        $this->page->expects($this->once())->method('getData')->willReturn(['data']);
-        $this->pageSearchResult->expects($this->once())->method('setItems')->with(['someData'])->willReturnSelf();
+
+        $this->pageSearchResult->expects($this->once())
+            ->method('setSearchCriteria')
+            ->with($criteria)
+            ->willReturnSelf();
+        $this->pageSearchResult->expects($this->once())
+            ->method('setTotalCount')
+            ->with($total)
+            ->willReturnSelf();
+        $this->pageSearchResult->expects($this->once())
+            ->method('setItems')
+            ->with(['someData'])
+            ->willReturnSelf();
+
+        $this->page->expects($this->once())
+            ->method('getData')
+            ->willReturn(['data']);
+
         $this->dataHelper->expects($this->once())
             ->method('populateWithArray')
             ->with($this->pageData, ['data'], \Magento\Cms\Api\Data\PageInterface::class);
+
         $this->dataObjectProcessor->expects($this->once())
             ->method('buildOutputDataArray')
             ->with($this->pageData, \Magento\Cms\Api\Data\PageInterface::class)
diff --git a/app/code/Magento/Cms/etc/di.xml b/app/code/Magento/Cms/etc/di.xml
index a287d89398cda336323d04d427526104823c0b8b..cae674b4a0d3bb5cea6c1e5c530ae5376e54b258 100644
--- a/app/code/Magento/Cms/etc/di.xml
+++ b/app/code/Magento/Cms/etc/di.xml
@@ -146,4 +146,46 @@
             </argument>
         </arguments>
     </type>
+    <virtualType name="Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\PageFilterProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
+        <arguments>
+            <argument name="customFilters" xsi:type="array">
+                <item name="store_id" xsi:type="object">Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\PageStoreFilter</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Cms\Model\Api\SearchCriteria\PageCollectionProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="filters" xsi:type="object">Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\PageFilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Cms\Model\PageRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Cms\Model\Api\SearchCriteria\PageCollectionProcessor</argument>
+        </arguments>
+    </type>
+    <virtualType name="Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\BlockFilterProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
+        <arguments>
+            <argument name="customFilters" xsi:type="array">
+                <item name="store_id" xsi:type="object">Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\BlockStoreFilter</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Cms\Model\Api\SearchCriteria\BlockCollectionProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="filters" xsi:type="object">Magento\Cms\Model\Api\SearchCriteria\CollectionProcessor\BlockFilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Cms\Model\BlockRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Cms\Model\Api\SearchCriteria\BlockCollectionProcessor</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php b/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
index 2c30425f337a22d5a6583c80fd3ae5f72d1d6747..67d4ea32369ba8a37fef329d2aec809037fcac75 100644
--- a/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
+++ b/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
@@ -11,8 +11,8 @@ use Magento\Customer\Model\Address as CustomerAddressModel;
 use Magento\Customer\Model\Customer as CustomerModel;
 use Magento\Customer\Model\ResourceModel\Address\Collection;
 use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Api\SearchCriteriaInterface;
-use Magento\Framework\Api\SortOrder;
 use Magento\Framework\Exception\InputException;
 
 /**
@@ -62,6 +62,11 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf
      */
     protected $extensionAttributesJoinProcessor;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param \Magento\Customer\Model\AddressFactory $addressFactory
      * @param \Magento\Customer\Model\AddressRegistry $addressRegistry
@@ -71,6 +76,7 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf
      * @param \Magento\Customer\Api\Data\AddressSearchResultsInterfaceFactory $addressSearchResultsFactory
      * @param \Magento\Customer\Model\ResourceModel\Address\CollectionFactory $addressCollectionFactory
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      */
     public function __construct(
         \Magento\Customer\Model\AddressFactory $addressFactory,
@@ -80,7 +86,8 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf
         \Magento\Directory\Helper\Data $directoryData,
         \Magento\Customer\Api\Data\AddressSearchResultsInterfaceFactory $addressSearchResultsFactory,
         \Magento\Customer\Model\ResourceModel\Address\CollectionFactory $addressCollectionFactory,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->addressFactory = $addressFactory;
         $this->addressRegistry = $addressRegistry;
@@ -90,6 +97,7 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf
         $this->addressSearchResultsFactory = $addressSearchResultsFactory;
         $this->addressCollectionFactory = $addressCollectionFactory;
         $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -164,29 +172,14 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf
      */
     public function getList(SearchCriteriaInterface $searchCriteria)
     {
-        $searchResults = $this->addressSearchResultsFactory->create();
-
         /** @var Collection $collection */
         $collection = $this->addressCollectionFactory->create();
         $this->extensionAttributesJoinProcessor->process(
             $collection,
             \Magento\Customer\Api\Data\AddressInterface::class
         );
-        // Add filters from root filter group to the collection
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
-        $searchResults->setTotalCount($collection->getSize());
-        /** @var SortOrder $sortOrder */
-        foreach ((array)$searchCriteria->getSortOrders() as $sortOrder) {
-            $field = $sortOrder->getField();
-            $collection->addOrder(
-                $field,
-                ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-            );
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
+
+        $this->collectionProcessor->process($searchCriteria, $collection);
 
         /** @var \Magento\Customer\Api\Data\AddressInterface[] $addresses */
         $addresses = [];
@@ -194,14 +187,19 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf
         foreach ($collection->getItems() as $address) {
             $addresses[] = $this->getById($address->getId());
         }
+
+        /** @var \Magento\Customer\Api\Data\AddressSearchResultsInterface $searchResults */
+        $searchResults = $this->addressSearchResultsFactory->create();
         $searchResults->setItems($addresses);
         $searchResults->setSearchCriteria($searchCriteria);
+        $searchResults->setTotalCount($collection->getSize());
         return $searchResults;
     }
 
     /**
      * Helper function that adds a FilterGroup to the collection.
      *
+     * @deprecated
      * @param FilterGroup $filterGroup
      * @param Collection $collection
      * @return void
@@ -320,4 +318,20 @@ class AddressRepository implements \Magento\Customer\Api\AddressRepositoryInterf
         }
         return $exception;
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor'
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php b/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php
index fa05ad3d4824e98b5ce9d575db92ed68ef16e0f6..16896063709ba7b7e56fa407bccb667682f092dd 100644
--- a/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php
+++ b/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php
@@ -9,8 +9,8 @@ namespace Magento\Customer\Model\ResourceModel;
 use Magento\Customer\Api\CustomerMetadataInterface;
 use Magento\Framework\Api\DataObjectHelper;
 use Magento\Framework\Api\ImageProcessorInterface;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Api\SearchCriteriaInterface;
-use Magento\Framework\Api\SortOrder;
 
 /**
  * Customer repository.
@@ -83,6 +83,11 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte
      */
     protected $extensionAttributesJoinProcessor;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param \Magento\Customer\Model\CustomerFactory $customerFactory
      * @param \Magento\Customer\Model\Data\CustomerSecureFactory $customerSecureFactory
@@ -97,6 +102,7 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte
      * @param DataObjectHelper $dataObjectHelper
      * @param ImageProcessorInterface $imageProcessor
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -112,7 +118,8 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte
         \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter,
         DataObjectHelper $dataObjectHelper,
         ImageProcessorInterface $imageProcessor,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->customerFactory = $customerFactory;
         $this->customerSecureFactory = $customerSecureFactory;
@@ -127,6 +134,7 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte
         $this->dataObjectHelper = $dataObjectHelper;
         $this->imageProcessor = $imageProcessor;
         $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -289,23 +297,11 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte
             ->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
             ->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left')
             ->joinAttribute('company', 'customer_address/company', 'default_billing', null, 'left');
-        //Add filters from root filter group to the collection
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
+
+        $this->collectionProcessor->process($searchCriteria, $collection);
+
         $searchResults->setTotalCount($collection->getSize());
-        $sortOrders = $searchCriteria->getSortOrders();
-        if ($sortOrders) {
-            /** @var SortOrder $sortOrder */
-            foreach ($searchCriteria->getSortOrders() as $sortOrder) {
-                $collection->addOrder(
-                    $sortOrder->getField(),
-                    ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-                );
-            }
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
+
         $customers = [];
         /** @var \Magento\Customer\Model\Customer $customerModel */
         foreach ($collection as $customerModel) {
@@ -337,6 +333,7 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte
     /**
      * Helper function that adds a FilterGroup to the collection.
      *
+     * @deprecated
      * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
      * @param \Magento\Customer\Model\ResourceModel\Customer\Collection $collection
      * @return void
@@ -355,4 +352,20 @@ class CustomerRepository implements \Magento\Customer\Api\CustomerRepositoryInte
             $collection->addFieldToFilter($fields);
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor'
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Customer/Model/ResourceModel/GroupRepository.php b/app/code/Magento/Customer/Model/ResourceModel/GroupRepository.php
index 5768eb9a3a32a227f560671b67cde90d06174a86..044616f141cb14c5cea0ce4f4501bbd34590162f 100644
--- a/app/code/Magento/Customer/Model/ResourceModel/GroupRepository.php
+++ b/app/code/Magento/Customer/Model/ResourceModel/GroupRepository.php
@@ -10,7 +10,7 @@ use Magento\Customer\Api\Data\GroupInterface;
 use Magento\Customer\Model\ResourceModel\Group\Collection;
 use Magento\Framework\Api\Search\FilterGroup;
 use Magento\Framework\Api\SearchCriteriaInterface;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Exception\InputException;
 use Magento\Framework\Exception\State\InvalidTransitionException;
 use Magento\Tax\Api\Data\TaxClassInterface;
@@ -70,6 +70,11 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface
      */
     protected $extensionAttributesJoinProcessor;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param \Magento\Customer\Model\GroupRegistry $groupRegistry
      * @param \Magento\Customer\Model\GroupFactory $groupFactory
@@ -79,6 +84,7 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface
      * @param \Magento\Customer\Api\Data\GroupSearchResultsInterfaceFactory $searchResultsFactory
      * @param \Magento\Tax\Api\TaxClassRepositoryInterface $taxClassRepositoryInterface
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      */
     public function __construct(
         \Magento\Customer\Model\GroupRegistry $groupRegistry,
@@ -88,7 +94,8 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface
         \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor,
         \Magento\Customer\Api\Data\GroupSearchResultsInterfaceFactory $searchResultsFactory,
         \Magento\Tax\Api\TaxClassRepositoryInterface $taxClassRepositoryInterface,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->groupRegistry = $groupRegistry;
         $this->groupFactory = $groupFactory;
@@ -98,6 +105,7 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface
         $this->searchResultsFactory = $searchResultsFactory;
         $this->taxClassRepository = $taxClassRepositoryInterface;
         $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -179,29 +187,7 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface
         $this->extensionAttributesJoinProcessor->process($collection, $groupInterfaceName);
         $collection->addTaxClass();
 
-        //Add filters from root filter group to the collection
-        /** @var FilterGroup $group */
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
-        $sortOrders = $searchCriteria->getSortOrders();
-        /** @var SortOrder $sortOrder */
-        if ($sortOrders) {
-            foreach ($searchCriteria->getSortOrders() as $sortOrder) {
-                $field = $this->translateField($sortOrder->getField());
-                $collection->addOrder(
-                    $field,
-                    ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-                );
-            }
-        } else {
-            // set a default sorting order since this method is used constantly in many
-            // different blocks
-            $field = $this->translateField('id');
-            $collection->addOrder($field, 'ASC');
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
+        $this->collectionProcessor->process($searchCriteria, $collection);
 
         /** @var \Magento\Customer\Api\Data\GroupInterface[] $groups */
         $groups = [];
@@ -229,6 +215,7 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface
     /**
      * Helper function that adds a FilterGroup to the collection.
      *
+     * @deprecated
      * @param FilterGroup $filterGroup
      * @param Collection $collection
      * @return void
@@ -251,6 +238,7 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface
     /**
      * Translates a field name to a DB column name for use in collection queries.
      *
+     * @deprecated
      * @param string $field a field name that should be translated to a DB column name.
      * @return string
      */
@@ -345,4 +333,20 @@ class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface
             throw InputException::invalidFieldValue('taxClassId', $group->getTaxClassId());
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Customer\Model\Api\SearchCriteria\GroupCollectionProcessor'
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
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 a6ab66c6e25dc723842885388b53643c6c39f45f..b72a5f6a417d4ab77d2c025e1f43b6e58f72ccc2 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/AddressRepositoryTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/AddressRepositoryTest.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\Customer\Test\Unit\Model\ResourceModel;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
@@ -65,6 +67,11 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $repository;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     protected function setUp()
     {
         $this->addressFactory = $this->getMock(
@@ -130,6 +137,9 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
 
+        $this->collectionProcessor = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMockForAbstractClass();
+
         $this->repository = new \Magento\Customer\Model\ResourceModel\AddressRepository(
             $this->addressFactory,
             $this->addressRegistry,
@@ -138,7 +148,8 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
             $this->directoryData,
             $this->addressSearchResultsFactory,
             $this->addressCollectionFactory,
-            $this->extensionAttributesJoinProcessor
+            $this->extensionAttributesJoinProcessor,
+            $this->collectionProcessor
         );
     }
 
@@ -490,8 +501,6 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
 
     public function testGetList()
     {
-        $filterGroup = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filter = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
         $collection = $this->getMock(
             \Magento\Customer\Model\ResourceModel\Address\Collection::class,
             [],
@@ -516,43 +525,16 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->extensionAttributesJoinProcessor->expects($this->once())
             ->method('process')
             ->with($collection, \Magento\Customer\Api\Data\AddressInterface::class);
-        $searchCriteria->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroup]);
-        $filterGroup->expects($this->once())->method('getFilters')->willReturn([$filter]);
-        $filter->expects($this->once())->method('getConditionType')->willReturn(false);
-        $filter->expects($this->once())->method('getField')->willReturn('Field');
-        $filter->expects($this->atLeastOnce())->method('getValue')->willReturn('Value');
-        $collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->with([['attribute' => 'Field', 'eq' => 'Value']], [['eq' => 'Value']]);
+
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteria, $collection)
+            ->willReturnSelf();
+
         $collection->expects($this->once())->method('getSize')->willReturn(23);
         $searchResults->expects($this->once())
             ->method('setTotalCount')
             ->with(23);
-        $sortOrder = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
-        $searchCriteria->expects($this->once())
-            ->method('getSortOrders')
-            ->willReturn([$sortOrder]);
-        $sortOrder->expects($this->once())
-            ->method('getField')
-            ->willReturn('Field');
-        $sortOrder->expects($this->once())
-            ->method('getDirection')
-            ->willReturn(\Magento\Framework\Api\SortOrder::SORT_ASC);
-        $collection->expects($this->once())
-            ->method('addOrder')
-            ->with('Field', 'ASC');
-        $searchCriteria->expects($this->once())
-            ->method('getCurrentPage')
-            ->willReturn(1);
-        $collection->expects($this->once())
-            ->method('setCurPage')
-            ->with(1);
-        $searchCriteria->expects($this->once())
-            ->method('getPageSize')
-            ->willReturn(10);
-        $collection->expects($this->once())
-            ->method('setPageSize')
-            ->with(10);
         $collection->expects($this->once())
             ->method('getItems')
             ->willReturn([$this->address]);
diff --git a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/CustomerRepositoryTest.php b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/CustomerRepositoryTest.php
index 9de5939181c9490233e7eb9691b5d2e35cbc1b3c..426548ce83c1ef2f6112c0c101e048a614da5676 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/CustomerRepositoryTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/CustomerRepositoryTest.php
@@ -7,9 +7,11 @@
 namespace Magento\Customer\Test\Unit\Model\ResourceModel;
 
 use Magento\Customer\Api\CustomerMetadataInterface;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * @SuppressWarnings(PHPMD.TooManyFields)
  */
 class CustomerRepositoryTest extends \PHPUnit_Framework_TestCase
 {
@@ -83,6 +85,11 @@ class CustomerRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $customer;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessorMock;
+
     /**
      * @var \Magento\Customer\Model\ResourceModel\CustomerRepository
      */
@@ -167,6 +174,8 @@ class CustomerRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
+        $this->collectionProcessorMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
 
         $this->model = new \Magento\Customer\Model\ResourceModel\CustomerRepository(
             $this->customerFactory,
@@ -181,7 +190,8 @@ class CustomerRepositoryTest extends \PHPUnit_Framework_TestCase
             $this->extensibleDataObjectConverter,
             $this->dataObjectHelper,
             $this->imageProcessor,
-            $this->extensionAttributesJoinProcessor
+            $this->extensionAttributesJoinProcessor,
+            $this->collectionProcessorMock
         );
     }
 
@@ -665,9 +675,6 @@ class CustomerRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetList()
     {
-        $sortOrder = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
-        $filterGroup = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filter = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
         $collection = $this->getMock(
             \Magento\Customer\Model\ResourceModel\Customer\Collection::class,
             [],
@@ -763,48 +770,9 @@ class CustomerRepositoryTest extends \PHPUnit_Framework_TestCase
             ->method('joinAttribute')
             ->with('company', 'customer_address/company', 'default_billing', null, 'left')
             ->willReturnSelf();
-        $searchCriteria->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn([$filterGroup]);
-        $collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->with([['attribute' => 'Field', 'eq' => 'Value']]);
-        $filterGroup->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$filter]);
-        $filter->expects($this->once())
-            ->method('getConditionType')
-            ->willReturn(false);
-        $filter->expects($this->once())
-            ->method('getField')
-            ->willReturn('Field');
-        $filter->expects($this->atLeastOnce())
-            ->method('getValue')
-            ->willReturn('Value');
-        $collection->expects($this->once())
-            ->method('addOrder')
-            ->with('Field', 'ASC');
-        $searchCriteria->expects($this->atLeastOnce())
-            ->method('getSortOrders')
-            ->willReturn([$sortOrder]);
-        $sortOrder->expects($this->once())
-            ->method('getField')
-            ->willReturn('Field');
-        $sortOrder->expects($this->once())
-            ->method('getDirection')
-            ->willReturn(\Magento\Framework\Api\SortOrder::SORT_ASC);
-        $searchCriteria->expects($this->once())
-            ->method('getCurrentPage')
-            ->willReturn(1);
-        $collection->expects($this->once())
-            ->method('setCurPage')
-            ->with(1);
-        $searchCriteria->expects($this->once())
-            ->method('getPageSize')
-            ->willReturn(10);
-        $collection->expects($this->once())
-            ->method('setPageSize')
-            ->with(10);
+        $this->collectionProcessorMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteria, $collection);
         $collection->expects($this->once())
             ->method('getSize')
             ->willReturn(23);
diff --git a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupRepositoryTest.php b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupRepositoryTest.php
index 9cfeea5801eedc14aede5e6c5538f86708b56a15..1524db8ab9725d1bb71af0b23fec21a10a4a06af 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupRepositoryTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupRepositoryTest.php
@@ -6,6 +6,8 @@
 
 namespace Magento\Customer\Test\Unit\Model\ResourceModel;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
@@ -66,12 +68,68 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $extensionAttributesJoinProcessor;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessorMock;
+
     /**
      * @var \Magento\Customer\Model\ResourceModel\GroupRepository
      */
     protected $model;
     
     protected function setUp()
+    {
+        $this->setupGroupObjects();
+        $this->dataObjectProcessor = $this->getMock(
+            \Magento\Framework\Reflection\DataObjectProcessor::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->searchResultsFactory = $this->getMock(
+            \Magento\Customer\Api\Data\GroupSearchResultsInterfaceFactory::class,
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->searchResults = $this->getMockForAbstractClass(
+            \Magento\Customer\Api\Data\GroupSearchResultsInterface::class,
+            [],
+            '',
+            false
+        );
+        $this->taxClassRepository = $this->getMockForAbstractClass(
+            \Magento\Tax\Api\TaxClassRepositoryInterface::class,
+            [],
+            '',
+            false
+        );
+        $this->extensionAttributesJoinProcessor = $this->getMockForAbstractClass(
+            \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface::class,
+            [],
+            '',
+            false
+        );
+        $this->collectionProcessorMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
+
+        $this->model = new \Magento\Customer\Model\ResourceModel\GroupRepository(
+            $this->groupRegistry,
+            $this->groupFactory,
+            $this->groupDataFactory,
+            $this->groupResourceModel,
+            $this->dataObjectProcessor,
+            $this->searchResultsFactory,
+            $this->taxClassRepository,
+            $this->extensionAttributesJoinProcessor,
+            $this->collectionProcessorMock
+        );
+    }
+
+    private function setupGroupObjects()
     {
         $this->groupRegistry = $this->getMock(
             \Magento\Customer\Model\GroupRegistry::class,
@@ -127,48 +185,6 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $this->dataObjectProcessor = $this->getMock(
-            \Magento\Framework\Reflection\DataObjectProcessor::class,
-            [],
-            [],
-            '',
-            false
-        );
-        $this->searchResultsFactory = $this->getMock(
-            \Magento\Customer\Api\Data\GroupSearchResultsInterfaceFactory::class,
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->searchResults = $this->getMockForAbstractClass(
-            \Magento\Customer\Api\Data\GroupSearchResultsInterface::class,
-            [],
-            '',
-            false
-        );
-        $this->taxClassRepository = $this->getMockForAbstractClass(
-            \Magento\Tax\Api\TaxClassRepositoryInterface::class,
-            [],
-            '',
-            false
-        );
-        $this->extensionAttributesJoinProcessor = $this->getMockForAbstractClass(
-            \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface::class,
-            [],
-            '',
-            false
-        );
-        $this->model = new \Magento\Customer\Model\ResourceModel\GroupRepository(
-            $this->groupRegistry,
-            $this->groupFactory,
-            $this->groupDataFactory,
-            $this->groupResourceModel,
-            $this->dataObjectProcessor,
-            $this->searchResultsFactory,
-            $this->taxClassRepository,
-            $this->extensionAttributesJoinProcessor
-        );
     }
 
     public function testSave()
@@ -351,10 +367,7 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
         $groupId = 86;
 
         $groupExtension = $this->getMock(\Magento\Customer\Api\Data\GroupExtensionInterface::class, [], [], '', false);
-        $filterGroup = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filter = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
         $collection = $this->getMock(\Magento\Customer\Model\ResourceModel\Group\Collection::class, [], [], '', false);
-        $sortOrder = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
         $searchCriteria = $this->getMockForAbstractClass(
             \Magento\Framework\Api\SearchCriteriaInterface::class,
             [],
@@ -385,48 +398,9 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
             ->with($collection, \Magento\Customer\Api\Data\GroupInterface::class);
         $collection->expects($this->once())
             ->method('addTaxClass');
-        $searchCriteria->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn([$filterGroup]);
-        $filterGroup->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$filter]);
-        $filter->expects($this->once())
-            ->method('getConditionType')
-            ->willReturn(false);
-        $filter->expects($this->once())
-            ->method('getField')
-            ->willReturn('Field');
-        $filter->expects($this->atLeastOnce())
-            ->method('getValue')
-            ->willReturn('Value');
-        $collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->with(['Field'], [['eq' => 'Value']]);
-        $searchCriteria->expects($this->atLeastOnce())
-            ->method('getSortOrders')
-            ->willReturn([$sortOrder]);
-        $sortOrder->expects($this->once())
-            ->method('getField')
-            ->willReturn('Field');
-        $collection->expects($this->once())
-            ->method('addOrder')
-            ->with('Field', 'ASC');
-        $sortOrder->expects($this->once())
-            ->method('getDirection')
-            ->willReturn(\Magento\Framework\Api\SortOrder::SORT_ASC);
-        $searchCriteria->expects($this->once())
-            ->method('getCurrentPage')
-            ->willReturn(1);
-        $collection->expects($this->once())
-            ->method('setCurPage')
-            ->with(1);
-        $searchCriteria->expects($this->once())
-            ->method('getPageSize')
-            ->willReturn(10);
-        $collection->expects($this->once())
-            ->method('setPageSize')
-            ->with(10);
+        $this->collectionProcessorMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteria, $collection);
         $collection->expects($this->once())
             ->method('getIterator')
             ->willReturn(new \ArrayIterator([$this->groupModel]));
@@ -489,142 +463,6 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->assertSame($searchResults, $this->model->getList($searchCriteria));
     }
 
-    /**
-     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
-     */
-    public function testGetListWithoutSortOrder()
-    {
-        $groupId = 86;
-
-        $groupExtension = $this->getMock(\Magento\Customer\Api\Data\GroupExtensionInterface::class, [], [], '', false);
-        $filterGroup = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filter = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
-        $collection = $this->getMock(\Magento\Customer\Model\ResourceModel\Group\Collection::class, [], [], '', false);
-        $searchCriteria = $this->getMockForAbstractClass(
-            \Magento\Framework\Api\SearchCriteriaInterface::class,
-            [],
-            '',
-            false
-        );
-        $searchResults = $this->getMockForAbstractClass(
-            \Magento\Customer\Api\Data\AddressSearchResultsInterface::class,
-            [],
-            '',
-            false
-        );
-        $this->searchResultsFactory->expects($this->once())
-            ->method('create')
-            ->willReturn($searchResults);
-        $searchResults->expects($this->once())
-            ->method('setSearchCriteria')
-            ->with($searchCriteria);
-
-        $this->groupFactory->expects($this->once())
-            ->method('create')
-            ->willReturn($this->groupModel);
-        $this->groupModel->expects($this->once())
-            ->method('getCollection')
-            ->willReturn($collection);
-        $this->extensionAttributesJoinProcessor->expects($this->once())
-            ->method('process')
-            ->with($collection, \Magento\Customer\Api\Data\GroupInterface::class);
-        $collection->expects($this->once())
-            ->method('addTaxClass');
-        $searchCriteria->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn([$filterGroup]);
-        $filterGroup->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$filter]);
-        $filter->expects($this->once())
-            ->method('getConditionType')
-            ->willReturn(false);
-        $filter->expects($this->once())
-            ->method('getField')
-            ->willReturn('Field');
-        $filter->expects($this->atLeastOnce())
-            ->method('getValue')
-            ->willReturn('Value');
-        $collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->with(['Field'], [['eq' => 'Value']]);
-
-        $searchCriteria->expects($this->once())
-            ->method('getCurrentPage')
-            ->willReturn(1);
-        $collection->expects($this->once())
-            ->method('setCurPage')
-            ->with(1);
-        $searchCriteria->expects($this->once())
-            ->method('getPageSize')
-            ->willReturn(10);
-        $collection->expects($this->once())
-            ->method('setPageSize')
-            ->with(10);
-        $collection->expects($this->once())
-            ->method('getIterator')
-            ->willReturn(new \ArrayIterator([$this->groupModel]));
-
-        $this->groupDataFactory->expects($this->once())
-            ->method('create')
-            ->willReturn($this->group);
-
-        $this->group->expects($this->once())
-            ->method('setId')
-            ->with($groupId)
-            ->willReturnSelf();
-        $this->group->expects($this->once())
-            ->method('setCode')
-            ->with('Code')
-            ->willReturnSelf();
-        $this->group->expects($this->once())
-            ->method('setTaxClassId')
-            ->with(234)
-            ->willReturnSelf();
-        $this->group->expects($this->once())
-            ->method('setTaxClassName')
-            ->with('Tax class name')
-            ->willReturnSelf();
-
-        $this->groupModel->expects($this->atLeastOnce())
-            ->method('getId')
-            ->willReturn($groupId);
-        $this->groupModel->expects($this->atLeastOnce())
-            ->method('getCode')
-            ->willReturn('Code');
-        $this->groupModel->expects($this->atLeastOnce())
-            ->method('getTaxClassId')
-            ->willReturn(234);
-        $this->groupModel->expects($this->atLeastOnce())
-            ->method('getTaxClassName')
-            ->willReturn('Tax class name');
-        $this->groupModel->expects($this->once())
-            ->method('getData')
-            ->willReturn([]);
-        $this->extensionAttributesJoinProcessor->expects($this->once())
-            ->method('extractExtensionAttributes')
-            ->with(\Magento\Customer\Api\Data\GroupInterface::class, [])
-            ->willReturn(['extension_attributes' => $groupExtension]);
-        $this->group->expects($this->once())
-            ->method('setExtensionAttributes')
-            ->with($groupExtension);
-        $collection->expects($this->once())
-            ->method('getSize')
-            ->willReturn(9);
-        $searchResults->expects($this->once())
-            ->method('setTotalCount')
-            ->with(9);
-        $searchResults->expects($this->once())
-            ->method('setItems')
-            ->with([$this->group])
-            ->willReturnSelf();
-        $collection->expects($this->once())
-            ->method('addOrder')
-            ->with('customer_group_id', 'ASC');
-
-        $this->assertSame($searchResults, $this->model->getList($searchCriteria));
-    }
-
     public function testDeleteById()
     {
         $groupId = 6;
diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml
index bb6577470ba54d8ca95c0c5a1a80a17564d822ee..d8f320161ab060b9cce690848fb00a402f030bb4 100644
--- a/app/code/Magento/Customer/etc/di.xml
+++ b/app/code/Magento/Customer/etc/di.xml
@@ -315,4 +315,49 @@
             <argument name="cache" xsi:type="object">Magento\Customer\Model\Cache\Type\Notification</argument>
         </arguments>
     </type>
+    <type name="Magento\Customer\Model\ResourceModel\CustomerRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor</argument>
+        </arguments>
+    </type>
+    <virtualType name="Magento\Customer\Model\Api\SearchCriteria\CollectionProcessor\GroupFilterProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
+        <arguments>
+            <argument name="fieldMapping" xsi:type="array">
+                <item name="code" xsi:type="string">customer_group_code</item>
+                <item name="id" xsi:type="string">customer_group_id</item>
+                <item name="tax_class_name" xsi:type="string">class_name</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Customer\Model\Api\SearchCriteria\CollectionProcessor\GroupSortingProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor">
+        <arguments>
+            <argument name="fieldMapping" xsi:type="array">
+                <item name="code" xsi:type="string">customer_group_code</item>
+                <item name="id" xsi:type="string">customer_group_id</item>
+                <item name="tax_class_name" xsi:type="string">class_name</item>
+            </argument>
+            <argument name="defaultOrders" xsi:type="array">
+                <item name="id" xsi:type="string">ASC</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Customer\Model\Api\SearchCriteria\GroupCollectionProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="filters" xsi:type="object">Magento\Customer\Model\Api\SearchCriteria\CollectionProcessor\GroupFilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Customer\Model\Api\SearchCriteria\CollectionProcessor\GroupSortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Customer\Model\ResourceModel\GroupRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Customer\Model\Api\SearchCriteria\GroupCollectionProcessor</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Customer\Model\ResourceModel\AddressRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..63c71bd1bb1bac0517bad1733c5fb12e836a942f
--- /dev/null
+++ b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor;
+
+use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class FilterProcessor implements CollectionProcessorInterface
+{
+    /**
+     * @var CustomFilterInterface[]
+     */
+    private $customFilters;
+
+    /**
+     * @var array
+     */
+    private $fieldMapping;
+
+    /**
+     * @param CustomFilterInterface[] $customFilters
+     * @param array $fieldMapping
+     */
+    public function __construct(
+        array $customFilters = [],
+        array $fieldMapping = []
+    ) {
+        $this->customFilters = $customFilters;
+        $this->fieldMapping = $fieldMapping;
+    }
+
+    /**
+     * Apply Search Criteria Filters to collection
+     *
+     * @param SearchCriteriaInterface $searchCriteria
+     * @param AbstractDb $collection
+     * @return void
+     */
+    public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $collection)
+    {
+        foreach ($searchCriteria->getFilterGroups() as $group) {
+            $this->addFilterGroupToCollection($group, $collection);
+        }
+    }
+
+    /**
+     * Add FilterGroup to the collection
+     *
+     * @param FilterGroup $filterGroup
+     * @param AbstractDb $collection
+     * @return void
+     */
+    private function addFilterGroupToCollection(
+        FilterGroup $filterGroup,
+        AbstractDb $collection
+    ) {
+        $fields = [];
+        foreach ($filterGroup->getFilters() as $filter) {
+            $isApplied = false;
+            $customFilter = $this->getCustomFilterForField($filter->getField());
+            if ($customFilter) {
+                $isApplied = $customFilter->apply($filter, $collection);
+            }
+
+            if (!$isApplied) {
+                $field = $this->getFieldMapping($filter->getField());
+                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
+                $fields[] = ['attribute' => $field, $condition => $filter->getValue()];
+            }
+        }
+
+        if ($fields) {
+            $collection->addFieldToFilter($fields);
+        }
+    }
+
+    /**
+     * Return custom filters for field if exists
+     *
+     * @param string $field
+     * @return CustomFilterInterface|null
+     * @throws \InvalidArgumentException
+     */
+    private function getCustomFilterForField($field)
+    {
+        $filter = null;
+        if (isset($this->customFilters[$field])) {
+            $filter = $this->customFilters[$field];
+            if (!($this->customFilters[$field] instanceof CustomFilterInterface)) {
+                throw new \InvalidArgumentException(
+                    sprintf(
+                        'Filter for %s must implement %s interface.',
+                        $field,
+                        CustomFilterInterface::class
+                    )
+                );
+            }
+        }
+        return $filter;
+    }
+
+    /**
+     * Return mapped field name
+     *
+     * @param string $field
+     * @return string
+     */
+    private function getFieldMapping($field)
+    {
+        return isset($this->fieldMapping[$field]) ? $this->fieldMapping[$field] : $field;
+    }
+}
diff --git a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupAttributeSetIdFilter.php b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupAttributeSetIdFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9e2e154ca54c09d5cd6278f66a2e4428f551062
--- /dev/null
+++ b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupAttributeSetIdFilter.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class AttributeGroupAttributeSetIdFilter implements CustomFilterInterface
+{
+    /**
+     * Apply attribute set ID filter to collection
+     *
+     * @param Filter $filter
+     * @param AbstractDb $collection
+     * @return bool
+     */
+    public function apply(Filter $filter, AbstractDb $collection)
+    {
+        /** @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\Collection $collection */
+        $collection->setAttributeSetFilter($filter->getValue());
+
+        return true;
+    }
+}
diff --git a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupCodeFilter.php b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupCodeFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7972fc88f9f5cda0a14e263e506727260c8ce78
--- /dev/null
+++ b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupCodeFilter.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class AttributeGroupCodeFilter implements CustomFilterInterface
+{
+    /**
+     * Apply attribute group code filter to collection
+     *
+     * @param Filter $filter
+     * @param AbstractDb $collection
+     * @return bool
+     */
+    public function apply(Filter $filter, AbstractDb $collection)
+    {
+        $collection->addFilter('attribute_group_code', $filter->getValue());
+
+        return true;
+    }
+}
diff --git a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeSetEntityTypeCodeFilter.php b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeSetEntityTypeCodeFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac5a267ef311eb21826bc1974481a686b3173c64
--- /dev/null
+++ b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeSetEntityTypeCodeFilter.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Eav\Model\Config;
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class AttributeSetEntityTypeCodeFilter implements CustomFilterInterface
+{
+    /**
+     * @var Config
+     */
+    private $eavConfig;
+
+    /**
+     * @param Config $eavConfig
+     */
+    public function __construct(
+        Config $eavConfig
+    ) {
+        $this->eavConfig = $eavConfig;
+    }
+
+    /**
+     * Apply entity type code filter to collection
+     *
+     * @param Filter $filter
+     * @param AbstractDb $collection
+     * @return bool
+     */
+    public function apply(Filter $filter, AbstractDb $collection)
+    {
+        $entityType = $this->eavConfig->getEntityType($filter->getValue());
+
+        /** @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\Collection $collection */
+        $collection->setEntityTypeFilter($entityType->getId());
+
+        return true;
+    }
+}
diff --git a/app/code/Magento/Eav/Model/Attribute/GroupRepository.php b/app/code/Magento/Eav/Model/Attribute/GroupRepository.php
index db99854c719237eb8fc4ab45b8f41cb0809f93f7..20315edfbe830e7bd57dd5348629a980a59cf486 100644
--- a/app/code/Magento/Eav/Model/Attribute/GroupRepository.php
+++ b/app/code/Magento/Eav/Model/Attribute/GroupRepository.php
@@ -1,15 +1,18 @@
 <?php
 /**
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Eav\Model\Attribute;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Exception\InputException;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Framework\Exception\StateException;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class GroupRepository implements \Magento\Eav\Api\AttributeGroupRepositoryInterface
 {
     /**
@@ -42,6 +45,11 @@ class GroupRepository implements \Magento\Eav\Api\AttributeGroupRepositoryInterf
      */
     protected $joinProcessor;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Group $groupResource
      * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory $groupListFactory
@@ -49,6 +57,7 @@ class GroupRepository implements \Magento\Eav\Api\AttributeGroupRepositoryInterf
      * @param \Magento\Eav\Api\AttributeSetRepositoryInterface $setRepository
      * @param \Magento\Eav\Api\Data\AttributeGroupSearchResultsInterfaceFactory $searchResultsFactory
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      * @codeCoverageIgnore
      */
     public function __construct(
@@ -57,7 +66,8 @@ class GroupRepository implements \Magento\Eav\Api\AttributeGroupRepositoryInterf
         \Magento\Eav\Model\Entity\Attribute\GroupFactory $groupFactory,
         \Magento\Eav\Api\AttributeSetRepositoryInterface $setRepository,
         \Magento\Eav\Api\Data\AttributeGroupSearchResultsInterfaceFactory $searchResultsFactory,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->groupResource = $groupResource;
         $this->groupListFactory = $groupListFactory;
@@ -65,6 +75,7 @@ class GroupRepository implements \Magento\Eav\Api\AttributeGroupRepositoryInterf
         $this->setRepository = $setRepository;
         $this->searchResultsFactory = $searchResultsFactory;
         $this->joinProcessor = $joinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -116,15 +127,13 @@ class GroupRepository implements \Magento\Eav\Api\AttributeGroupRepositoryInterf
             throw NoSuchEntityException::singleField('attributeSetId', $attributeSetId);
         }
 
+        /** @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\Collection $collection */
         $collection = $this->groupListFactory->create();
         $this->joinProcessor->process($collection);
-        $collection->setAttributeSetFilter($attributeSetId);
-        $collection->setSortOrder();
 
-        if ($attributeGroupCode = $this->retrieveAttributeGroupCodeFromSearchCriteria($searchCriteria)) {
-            $collection->addFilter('attribute_group_code', $attributeGroupCode);
-        }
+        $this->collectionProcessor->process($searchCriteria, $collection);
 
+        /** @var \Magento\Eav\Api\Data\AttributeGroupSearchResultsInterface $searchResult */
         $searchResult = $this->searchResultsFactory->create();
         $searchResult->setSearchCriteria($searchCriteria);
         $searchResult->setItems($collection->getItems());
@@ -194,21 +203,18 @@ class GroupRepository implements \Magento\Eav\Api\AttributeGroupRepositoryInterf
     }
 
     /**
-     * Retrieve attribute group code
+     * Retrieve collection processor
      *
-     * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
-     * @return null|string
+     * @deprecated
+     * @return CollectionProcessorInterface
      */
-    private function retrieveAttributeGroupCodeFromSearchCriteria(
-        \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
-    ) {
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            foreach ($group->getFilters() as $filter) {
-                if ($filter->getField() === 'attribute_group_code') {
-                    return $filter->getValue();
-                }
-            }
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Eav\Model\Api\SearchCriteria\AttributeGroupCollectionProcessor'
+            );
         }
-        return null;
+        return $this->collectionProcessor;
     }
 }
diff --git a/app/code/Magento/Eav/Model/AttributeRepository.php b/app/code/Magento/Eav/Model/AttributeRepository.php
index 53b90c939ae166f9cd41840b0dfb7292eb56a20e..1b3e1cb76d13c5b18f0501e7d985e45b8427c9b5 100644
--- a/app/code/Magento/Eav/Model/AttributeRepository.php
+++ b/app/code/Magento/Eav/Model/AttributeRepository.php
@@ -1,13 +1,12 @@
 <?php
 /**
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Eav\Model;
 
-use Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Exception\InputException;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Framework\Exception\StateException;
@@ -47,6 +46,11 @@ class AttributeRepository implements \Magento\Eav\Api\AttributeRepositoryInterfa
      */
     protected $joinProcessor;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param Config $eavConfig
      * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute $eavResource
@@ -54,6 +58,7 @@ class AttributeRepository implements \Magento\Eav\Api\AttributeRepositoryInterfa
      * @param \Magento\Eav\Api\Data\AttributeSearchResultsInterfaceFactory $searchResultsFactory
      * @param Entity\AttributeFactory $attributeFactory
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      * @codeCoverageIgnore
      */
     public function __construct(
@@ -62,7 +67,8 @@ class AttributeRepository implements \Magento\Eav\Api\AttributeRepositoryInterfa
         \Magento\Eav\Model\ResourceModel\Entity\Attribute\CollectionFactory $attributeCollectionFactory,
         \Magento\Eav\Api\Data\AttributeSearchResultsInterfaceFactory $searchResultsFactory,
         \Magento\Eav\Model\Entity\AttributeFactory $attributeFactory,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->eavConfig = $eavConfig;
         $this->eavResource = $eavResource;
@@ -70,6 +76,7 @@ class AttributeRepository implements \Magento\Eav\Api\AttributeRepositoryInterfa
         $this->searchResultsFactory = $searchResultsFactory;
         $this->attributeFactory = $attributeFactory;
         $this->joinProcessor = $joinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -118,34 +125,23 @@ class AttributeRepository implements \Magento\Eav\Api\AttributeRepositoryInterfa
                 []
             );
         }
-        //Add filters from root filter group to the collection
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $attributeCollection);
-        }
-        /** @var SortOrder $sortOrder */
-        foreach ((array)$searchCriteria->getSortOrders() as $sortOrder) {
-            $attributeCollection->addOrder(
-                $sortOrder->getField(),
-                ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-            );
-        }
 
-        $totalCount = $attributeCollection->getSize();
+        $this->collectionProcessor->process($searchCriteria, $attributeCollection);
 
         // Group attributes by id to prevent duplicates with different attribute sets
         $attributeCollection->addAttributeGrouping();
-        $attributeCollection->setCurPage($searchCriteria->getCurrentPage());
-        $attributeCollection->setPageSize($searchCriteria->getPageSize());
 
         $attributes = [];
         /** @var \Magento\Eav\Api\Data\AttributeInterface $attribute */
         foreach ($attributeCollection as $attribute) {
             $attributes[] = $this->get($entityTypeCode, $attribute->getAttributeCode());
         }
+
+        /** @var \Magento\Eav\Api\Data\AttributeSearchResultsInterface $searchResults */
         $searchResults = $this->searchResultsFactory->create();
         $searchResults->setSearchCriteria($searchCriteria);
         $searchResults->setItems($attributes);
-        $searchResults->setTotalCount($totalCount);
+        $searchResults->setTotalCount($attributeCollection->getSize());
         return $searchResults;
     }
 
@@ -195,28 +191,18 @@ class AttributeRepository implements \Magento\Eav\Api\AttributeRepositoryInterfa
     }
 
     /**
-     * Helper function that adds a FilterGroup to the collection.
+     * Retrieve collection processor
      *
-     * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
-     * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection $collection
-     * @return void
-     * @throws \Magento\Framework\Exception\InputException
+     * @deprecated
+     * @return CollectionProcessorInterface
      */
-    private function addFilterGroupToCollection(
-        \Magento\Framework\Api\Search\FilterGroup $filterGroup,
-        Collection $collection
-    ) {
-        foreach ($filterGroup->getFilters() as $filter) {
-            $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-            $field = $filter->getField();
-            // Prevent ambiguity during filtration
-            if ($field == \Magento\Eav\Api\Data\AttributeInterface::ATTRIBUTE_ID) {
-                $field = 'main_table.' . $field;
-            }
-            $collection->addFieldToFilter(
-                $field,
-                [$condition => $filter->getValue()]
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                CollectionProcessor::class
             );
         }
+        return $this->collectionProcessor;
     }
 }
diff --git a/app/code/Magento/Eav/Model/AttributeSetRepository.php b/app/code/Magento/Eav/Model/AttributeSetRepository.php
index 622bd0e49bc1f101947ff049a3959f9ab26b7204..f1c713738403939793d9437836d2075f7878aa89 100644
--- a/app/code/Magento/Eav/Model/AttributeSetRepository.php
+++ b/app/code/Magento/Eav/Model/AttributeSetRepository.php
@@ -12,6 +12,7 @@ use Magento\Eav\Model\Entity\Attribute\Set as AttributeSet;
 use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;
 use Magento\Eav\Model\ResourceModel\Entity\Attribute\Set as AttributeSetResource;
 use Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Exception\CouldNotDeleteException;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\NoSuchEntityException;
@@ -51,6 +52,11 @@ class AttributeSetRepository implements AttributeSetRepositoryInterface
      */
     protected $joinProcessor;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param AttributeSetResource $attributeSetResource
      * @param AttributeSetFactory $attributeSetFactory
@@ -58,6 +64,7 @@ class AttributeSetRepository implements AttributeSetRepositoryInterface
      * @param Config $eavConfig
      * @param \Magento\Eav\Api\Data\AttributeSetSearchResultsInterfaceFactory $searchResultFactory
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      * @codeCoverageIgnore
      */
     public function __construct(
@@ -66,7 +73,8 @@ class AttributeSetRepository implements AttributeSetRepositoryInterface
         CollectionFactory $collectionFactory,
         EavConfig $eavConfig,
         \Magento\Eav\Api\Data\AttributeSetSearchResultsInterfaceFactory $searchResultFactory,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->attributeSetResource = $attributeSetResource;
         $this->attributeSetFactory = $attributeSetFactory;
@@ -74,6 +82,7 @@ class AttributeSetRepository implements AttributeSetRepositoryInterface
         $this->eavConfig = $eavConfig;
         $this->searchResultsFactory = $searchResultFactory;
         $this->joinProcessor = $joinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -98,16 +107,9 @@ class AttributeSetRepository implements AttributeSetRepositoryInterface
         $collection = $this->collectionFactory->create();
         $this->joinProcessor->process($collection);
 
-        /** The only possible/meaningful search criteria for attribute set is entity type code */
-        $entityTypeCode = $this->getEntityTypeCode($searchCriteria);
-
-        if ($entityTypeCode !== null) {
-            $collection->setEntityTypeFilter($this->eavConfig->getEntityType($entityTypeCode)->getId());
-        }
-
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
+        $this->collectionProcessor->process($searchCriteria, $collection);
 
+        /** @var \Magento\Eav\Api\Data\AttributeSetSearchResultsInterface $searchResults */
         $searchResults = $this->searchResultsFactory->create();
         $searchResults->setSearchCriteria($searchCriteria);
         $searchResults->setItems($collection->getItems());
@@ -118,6 +120,7 @@ class AttributeSetRepository implements AttributeSetRepositoryInterface
     /**
      * Retrieve entity type code from search criteria
      *
+     * @deprecated
      * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
      * @return null|string
      */
@@ -170,4 +173,20 @@ class AttributeSetRepository implements AttributeSetRepositoryInterface
     {
         return $this->delete($this->get($attributeSetId));
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Eav\Model\Api\SearchCriteria\AttributeSetCollectionProcessor'
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupAttributeSetIdFilterTest.php b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupAttributeSetIdFilterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f3611b7636909b148fb6b8bd06e0d1760e2952c
--- /dev/null
+++ b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupAttributeSetIdFilterTest.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\AttributeGroupAttributeSetIdFilter;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\Collection;
+use Magento\Framework\Api\Filter;
+
+class AttributeGroupAttributeSetIdFilterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var AttributeGroupAttributeSetIdFilter
+     */
+    private $filter;
+
+    protected function setUp()
+    {
+        $this->filter = new AttributeGroupAttributeSetIdFilter();
+    }
+
+    public function testApply()
+    {
+        $filterValue = 'filter_value';
+
+        $filterMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($filterValue);
+
+        $collectionMock = $this->getMockBuilder(Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $collectionMock->expects($this->once())
+            ->method('setAttributeSetFilter')
+            ->with($filterValue)
+            ->willReturnSelf();
+
+        $this->assertTrue($this->filter->apply($filterMock, $collectionMock));
+    }
+}
diff --git a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupCodeFilterTest.php b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupCodeFilterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..00937023c34c113bbf79809187aababf1f5c44ce
--- /dev/null
+++ b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeGroupCodeFilterTest.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\AttributeGroupCodeFilter;
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class AttributeGroupCodeFilterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var AttributeGroupCodeFilter
+     */
+    private $filter;
+
+    protected function setUp()
+    {
+        $this->filter = new AttributeGroupCodeFilter();
+    }
+
+    public function testApply()
+    {
+        $filterValue = 'filter_value';
+
+        $filterMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($filterValue);
+
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['addFilter'])
+            ->getMockForAbstractClass();
+        $collectionMock->expects($this->once())
+            ->method('addFilter')
+            ->with('attribute_group_code', $filterValue)
+            ->willReturnSelf();
+
+        $this->assertTrue($this->filter->apply($filterMock, $collectionMock));
+    }
+}
diff --git a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeSetEntityTypeCodeFilterTest.php b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeSetEntityTypeCodeFilterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7bc9706b324c211e7c98e12980da62be9fde275a
--- /dev/null
+++ b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor/AttributeSetEntityTypeCodeFilterTest.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\AttributeSetEntityTypeCodeFilter;
+use Magento\Eav\Model\Config;
+use Magento\Eav\Model\Entity\Type;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\Collection;
+use Magento\Framework\Api\Filter;
+
+class AttributeSetEntityTypeCodeFilterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var AttributeSetEntityTypeCodeFilter
+     */
+    private $filter;
+
+    /**
+     * @var Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $eavConfig;
+
+    protected function setUp()
+    {
+        $this->eavConfig = $this->getMockBuilder(Config::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->filter = new AttributeSetEntityTypeCodeFilter($this->eavConfig);
+    }
+
+    public function testApply()
+    {
+        $filterValue = 'filter_value';
+        $entityTypeId = 1;
+
+        $entityTypeMock = $this->getMockBuilder(Type::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $entityTypeMock->expects($this->once())
+            ->method('getId')
+            ->willReturn($entityTypeId);
+
+        $this->eavConfig->expects($this->once())
+            ->method('getEntityType')
+            ->with($filterValue)
+            ->willReturn($entityTypeMock);
+
+        $filterMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($filterValue);
+
+        $collectionMock = $this->getMockBuilder(Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $collectionMock->expects($this->once())
+            ->method('setEntityTypeFilter')
+            ->with($entityTypeId)
+            ->willReturnSelf();
+
+        $this->assertTrue($this->filter->apply($filterMock, $collectionMock));
+    }
+}
diff --git a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..06f618ab470d5f50b0c9f8cb9469e6bb27e21659
--- /dev/null
+++ b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php
@@ -0,0 +1,200 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor;
+
+use Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class FilterProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Return model
+     *
+     * @param CustomFilterInterface[] $customFilters
+     * @param array $fieldMapping
+     * @return FilterProcessor
+     */
+    private function getModel(array $customFilters, array $fieldMapping)
+    {
+        return new FilterProcessor($customFilters, $fieldMapping);
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     */
+    public function testProcess()
+    {
+        /** @var CustomFilterInterface|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */
+        $customFilterMock = $this->getMockBuilder(CustomFilterInterface::class)
+            ->getMock();
+
+        $customFilterField = 'customFilterField';
+        $customFilters = [$customFilterField => $customFilterMock];
+
+        $otherFilterField = 'otherFilterField';
+        $otherFilterFieldMapped = 'otherFilterFieldMapped';
+        $fieldMapping = [$otherFilterField => $otherFilterFieldMapped];
+        $otherFilterFieldValue = 'otherFilterFieldValue';
+        $otherFilterFieldCondition = 'gt';
+
+        $thirdField = 'thirdField';
+        $thirdFieldValue = 'thirdFieldValue';
+        $thirdFieldCondition = '';
+
+        $resultOne = [
+            [
+                'attribute' => $otherFilterFieldMapped,
+                $otherFilterFieldCondition => $otherFilterFieldValue,
+            ],
+        ];
+        $resultTwo = [
+            [
+                'attribute' => $thirdField,
+                'eq' => $thirdFieldValue,
+            ],
+        ];
+
+        $model = $this->getModel($customFilters, $fieldMapping);
+
+        /** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupOneMock */
+        $filterGroupOneMock = $this->getMockBuilder(FilterGroup::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupTwoMock */
+        $filterGroupTwoMock = $this->getMockBuilder(FilterGroup::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterOneMock */
+        $filterOneMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterOneMock->expects($this->once())
+            ->method('getField')
+            ->willReturn($customFilterField);
+
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterTwoMock */
+        $filterTwoMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterTwoMock->expects($this->exactly(2))
+            ->method('getField')
+            ->willReturn($otherFilterField);
+        $filterTwoMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($otherFilterFieldValue);
+        $filterTwoMock->expects($this->exactly(2))
+            ->method('getConditionType')
+            ->willReturn($otherFilterFieldCondition);
+
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterThreeMock */
+        $filterThreeMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterThreeMock->expects($this->exactly(2))
+            ->method('getField')
+            ->willReturn($thirdField);
+        $filterThreeMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($thirdFieldValue);
+        $filterThreeMock->expects($this->once())
+            ->method('getConditionType')
+            ->willReturn($thirdFieldCondition);
+
+        $filterGroupOneMock->expects($this->once())
+            ->method('getFilters')
+            ->willReturn([$filterOneMock, $filterTwoMock]);
+
+        $filterGroupTwoMock->expects($this->once())
+            ->method('getFilters')
+            ->willReturn([$filterThreeMock]);
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        $searchCriteriaMock->expects($this->once())
+            ->method('getFilterGroups')
+            ->willReturn([$filterGroupOneMock, $filterGroupTwoMock]);
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $customFilterMock->expects($this->once())
+            ->method('apply')
+            ->with($filterOneMock, $collectionMock)
+            ->willReturn(true);
+
+        $collectionMock->expects($this->exactly(2))
+            ->method('addFieldToFilter')
+            ->withConsecutive(
+                [$resultOne],
+                [$resultTwo]
+            )->willReturnSelf();
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testProcessWithException()
+    {
+        /** @var \stdClass|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */
+        $customFilterMock = $this->getMockBuilder(\stdClass::class)
+            ->getMock();
+
+        $customFilterField = 'customFilterField';
+        $customFilters = [$customFilterField => $customFilterMock];
+
+        $model = $this->getModel($customFilters, []);
+
+        /** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupOneMock */
+        $filterGroupOneMock = $this->getMockBuilder(FilterGroup::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterOneMock */
+        $filterOneMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterOneMock->expects($this->once())
+            ->method('getField')
+            ->willReturn($customFilterField);
+
+        $filterGroupOneMock->expects($this->once())
+            ->method('getFilters')
+            ->willReturn([$filterOneMock]);
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        $searchCriteriaMock->expects($this->once())
+            ->method('getFilterGroups')
+            ->willReturn([$filterGroupOneMock]);
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $customFilterMock->expects($this->never())
+            ->method('apply');
+
+        $collectionMock->expects($this->never())
+            ->method('addFieldToFilter');
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+}
diff --git a/app/code/Magento/Eav/Test/Unit/Model/Attribute/GroupRepositoryTest.php b/app/code/Magento/Eav/Test/Unit/Model/Attribute/GroupRepositoryTest.php
index 4a30ba9e1f1848db264b2aa9fe2045b408f46900..2d9eb22cfd976a545138908ac502aebabb0020c0 100644
--- a/app/code/Magento/Eav/Test/Unit/Model/Attribute/GroupRepositoryTest.php
+++ b/app/code/Magento/Eav/Test/Unit/Model/Attribute/GroupRepositoryTest.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\Eav\Test\Unit\Model\Attribute;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
@@ -40,6 +42,11 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $groupListFactoryMock;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * SetUp method
      *
@@ -77,6 +84,9 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
 
+        $this->collectionProcessor = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMockForAbstractClass();
+
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->model = $objectManager->getObject(
             \Magento\Eav\Model\Attribute\GroupRepository::class,
@@ -85,7 +95,8 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
                 'groupListFactory' => $this->groupListFactoryMock,
                 'groupFactory' => $this->groupFactoryMock,
                 'setRepository' => $this->setRepositoryMock,
-                'searchResultsFactory' => $this->searchResultsFactoryMock
+                'searchResultsFactory' => $this->searchResultsFactoryMock,
+                'collectionProcessor' => $this->collectionProcessor
             ]
         );
     }
@@ -274,34 +285,50 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testGetList()
     {
         $attributeSetId = 'filter';
-        $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
-        $filterGroupMock = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filterInterfaceMock = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
-        $attributeSetMock = $this->getMock(\Magento\Eav\Api\Data\AttributeSetInterface::class);
-        $groupMock = $this->getMock(\Magento\Eav\Model\Entity\Attribute\Group::class, [], [], '', false);
+
+        $filterInterfaceMock = $this->getMockBuilder(\Magento\Framework\Api\Search\FilterGroup::class)
+            ->disableOriginalConstructor()
+            ->setMethods([
+                'getField',
+                'getValue',
+            ])
+            ->getMock();
+        $filterInterfaceMock->expects($this->once())
+            ->method('getField')
+            ->willReturn('attribute_set_id');
+        $filterInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($attributeSetId);
+
+        $filterGroupMock = $this->getMockBuilder(\Magento\Framework\Api\Search\FilterGroup::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterGroupMock->expects($this->once())
+            ->method('getFilters')
+            ->willReturn([$filterInterfaceMock]);
+
+        $searchCriteriaMock = $this->getMockBuilder(\Magento\Framework\Api\SearchCriteriaInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $searchCriteriaMock->expects($this->once())
+            ->method('getFilterGroups')
+            ->willReturn([$filterGroupMock]);
+
+        $groupMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute\Group::class)
+            ->disableOriginalConstructor()
+            ->getMock();
 
         $groupCollectionMock = $this->getMock(
             \Magento\Eav\Model\Entity\Collection\AbstractCollection::class,
-            ['setAttributeSetFilter', 'setSortOrder', 'getItems', 'getSize'],
+            ['getItems', 'getSize'],
             [],
             '',
             false
         );
         $groupCollectionMock->expects($this->once())->method('getItems')->willReturn([$groupMock]);
-        $searchCriteriaMock->expects($this->exactly(2))->method('getFilterGroups')->willReturn([$filterGroupMock]);
-
-        $filterGroupMock->expects($this->exactly(2))->method('getFilters')->willReturn([$filterInterfaceMock]);
-        $filterInterfaceMock->expects($this->exactly(2))->method('getField')->willReturn('attribute_set_id');
-        $filterInterfaceMock->expects($this->once())->method('getValue')->willReturn($attributeSetId);
 
-        $this->setRepositoryMock->expects($this->once())
-            ->method('get')
-            ->with($attributeSetId)
-            ->willReturn($attributeSetMock);
         $this->groupListFactoryMock->expects($this->once())->method('create')->willReturn($groupCollectionMock);
 
-        $groupCollectionMock->expects($this->once())->method('setAttributeSetFilter')->with($attributeSetId);
-        $groupCollectionMock->expects($this->once())->method('setSortOrder');
         $groupCollectionMock->expects($this->once())->method('getSize')->willReturn(1);
 
         $searchResultsMock = $this->getMock(
@@ -315,6 +342,12 @@ class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
         $searchResultsMock->expects($this->once())->method('setItems')->with([$groupMock]);
         $searchResultsMock->expects($this->once())->method('setTotalCount')->with(1);
         $this->searchResultsFactoryMock->expects($this->once())->method('create')->willReturn($searchResultsMock);
+
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $groupCollectionMock)
+            ->willReturnSelf();
+
         $this->assertEquals($searchResultsMock, $this->model->getList($searchCriteriaMock));
     }
 
diff --git a/app/code/Magento/Eav/Test/Unit/Model/AttributeRepositoryTest.php b/app/code/Magento/Eav/Test/Unit/Model/AttributeRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d90363e40bf58358532e1bc74afbbe74429ab225
--- /dev/null
+++ b/app/code/Magento/Eav/Test/Unit/Model/AttributeRepositoryTest.php
@@ -0,0 +1,269 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Test\Unit\Model;
+
+use Magento\Eav\Api\Data\AttributeSearchResultsInterfaceFactory;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute\CollectionFactory;
+use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class AttributeRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Eav\Model\Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $eavConfig;
+
+    /**
+     * @var \Magento\Eav\Model\ResourceModel\Entity\Attribute|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $eavResource;
+
+    /**
+     * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $attributeCollectionFactory;
+
+    /**
+     * @var AttributeSearchResultsInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $searchResultsFactory;
+
+    /**
+     * @var \Magento\Eav\Model\Entity\AttributeFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $attributeFactory;
+
+    /**
+     * @var JoinProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $joinProcessor;
+
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
+    /**
+     * @var \Magento\Eav\Model\AttributeRepository
+     */
+    private $model;
+
+    protected function setUp()
+    {
+        $this->eavConfig = $this->getMockBuilder(\Magento\Eav\Model\Config::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->eavResource = $this->getMockBuilder(\Magento\Eav\Model\ResourceModel\Entity\Attribute::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->attributeCollectionFactory = $this->getMockBuilder(CollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+
+        $this->searchResultsFactory = $this->getMockBuilder(AttributeSearchResultsInterfaceFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+
+        $this->attributeFactory = $this->getMockBuilder(\Magento\Eav\Model\Entity\AttributeFactory::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->joinProcessor = $this->getMockBuilder(JoinProcessorInterface::class)
+            ->getMockForAbstractClass();
+
+        $this->collectionProcessor = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMockForAbstractClass();
+
+        $this->model = new \Magento\Eav\Model\AttributeRepository(
+            $this->eavConfig,
+            $this->eavResource,
+            $this->attributeCollectionFactory,
+            $this->searchResultsFactory,
+            $this->attributeFactory,
+            $this->joinProcessor,
+            $this->collectionProcessor
+        );
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\InputException
+     * @expectedExceptionMessage entity_type_code is a required field.
+     */
+    public function testGetListInputException()
+    {
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMockForAbstractClass();
+
+        $this->model->getList(null, $searchCriteriaMock);
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     */
+    public function testGetList()
+    {
+        $entityTypeCode = 'entity_type_code';
+        $eavEntityTypeTable = 'eav_entity_type_table';
+        $eavEntityAttributeTable = 'eav_entity_attribute_table';
+        $additionalTable = 'additional_table';
+        $attributeCode = 'attribute_code';
+        $attributeId = 1;
+        $collectionSize = 1;
+
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMockForAbstractClass();
+
+        $attributeMock = $this->createAttributeMock($attributeCode, $attributeId);
+
+        $attributeCollectionMock = $this->getMockBuilder(Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $attributeCollectionMock->expects($this->once())
+            ->method('addFieldToFilter')
+            ->with('entity_type_code', ['eq' => $entityTypeCode])
+            ->willReturnSelf();
+        $attributeCollectionMock->expects($this->exactly(3))
+            ->method('getTable')
+            ->willReturnMap([
+                ['eav_entity_type', $eavEntityTypeTable],
+                ['eav_entity_attribute', $eavEntityAttributeTable],
+                [$additionalTable, $additionalTable],
+            ]);
+        $attributeCollectionMock->expects($this->exactly(2))
+            ->method('join')
+            ->willReturnMap([
+                [
+                    ['entity_type' => $eavEntityTypeTable],
+                    'main_table.entity_type_id = entity_type.entity_type_id',
+                    []
+                ],
+                [
+                    ['additional_table' => $additionalTable],
+                    'main_table.attribute_id = additional_table.attribute_id',
+                    []
+                ]
+            ]);
+        $attributeCollectionMock->expects($this->once())
+            ->method('joinLeft')
+            ->with(
+                ['eav_entity_attribute' => $eavEntityAttributeTable],
+                'main_table.attribute_id = eav_entity_attribute.attribute_id',
+                []
+            )
+            ->willReturnSelf();
+        $attributeCollectionMock->expects($this->once())
+            ->method('addAttributeGrouping')
+            ->willReturnSelf();
+        $attributeCollectionMock->expects($this->once())
+            ->method('getIterator')
+            ->willReturn(new \ArrayIterator([$attributeMock]));
+        $attributeCollectionMock->expects($this->once())
+            ->method('getSize')
+            ->willReturn($collectionSize);
+
+        $this->attributeCollectionFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($attributeCollectionMock);
+
+        $this->joinProcessor->expects($this->once())
+            ->method('process')
+            ->with($attributeCollectionMock)
+            ->willReturnSelf();
+
+        $entityTypeMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\Type::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getAdditionalAttributeTable'])
+            ->getMock();
+        $entityTypeMock->expects($this->once())
+            ->method('getAdditionalAttributeTable')
+            ->willReturn($additionalTable);
+
+        $this->eavConfig->expects($this->once())
+            ->method('getEntityType')
+            ->with($entityTypeCode)
+            ->willReturn($entityTypeMock);
+        $this->eavConfig->expects($this->once())
+            ->method('getAttribute')
+            ->with($entityTypeCode, $attributeCode)
+            ->willReturn($attributeMock);
+
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $attributeCollectionMock)
+            ->willReturnSelf();
+
+        $searchResultsMock = $this->createSearchResultsMock($searchCriteriaMock, $attributeMock, $collectionSize);
+
+        $this->searchResultsFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($searchResultsMock);
+
+        $this->assertEquals($searchResultsMock, $this->model->getList($entityTypeCode, $searchCriteriaMock));
+    }
+
+    /**
+     * @param \PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock
+     * @param \PHPUnit_Framework_MockObject_MockObject $attributeMock
+     * @param int $collectionSize
+     * @return \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function createSearchResultsMock($searchCriteriaMock, $attributeMock, $collectionSize)
+    {
+        /** @var \PHPUnit_Framework_MockObject_MockObject $searchResultsMock */
+        $searchResultsMock = $this->getMockBuilder(\Magento\Eav\Api\Data\AttributeSearchResultsInterface::class)
+            ->getMockForAbstractClass();
+
+        $searchResultsMock->expects($this->once())
+            ->method('setSearchCriteria')
+            ->with($searchCriteriaMock)
+            ->willReturnSelf();
+        $searchResultsMock->expects($this->once())
+            ->method('setItems')
+            ->with([$attributeMock])
+            ->willReturnSelf();
+        $searchResultsMock->expects($this->once())
+            ->method('setTotalCount')
+            ->with($collectionSize)
+            ->willReturnSelf();
+
+        return $searchResultsMock;
+    }
+
+    /**
+     * @param string $attributeCode
+     * @param int $attributeId
+     * @return \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function createAttributeMock($attributeCode, $attributeId)
+    {
+        /** @var \PHPUnit_Framework_MockObject_MockObject $attributeMock */
+        $attributeMock = $this->getMockBuilder(\Magento\Eav\Api\Data\AttributeInterface::class)
+            ->setMethods([
+                'getAttributeCode',
+                'getAttributeId',
+            ])
+            ->getMockForAbstractClass();
+
+        $attributeMock->expects($this->once())
+            ->method('getAttributeCode')
+            ->willReturn($attributeCode);
+        $attributeMock->expects($this->once())
+            ->method('getAttributeId')
+            ->willReturn($attributeId);
+
+        return $attributeMock;
+    }
+}
diff --git a/app/code/Magento/Eav/Test/Unit/Model/AttributeSetRepositoryTest.php b/app/code/Magento/Eav/Test/Unit/Model/AttributeSetRepositoryTest.php
index 244c620fac8997a34ca6d0fd49e2a5230de5b718..b2d209261612adc6c6cffd59b04c038602054cad 100644
--- a/app/code/Magento/Eav/Test/Unit/Model/AttributeSetRepositoryTest.php
+++ b/app/code/Magento/Eav/Test/Unit/Model/AttributeSetRepositoryTest.php
@@ -6,6 +6,7 @@
 namespace Magento\Eav\Test\Unit\Model;
 
 use Magento\Eav\Model\AttributeSetRepository;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 
 /**
  * @SuppressWarnings(PHPMD.LongVariable)
@@ -48,6 +49,11 @@ class AttributeSetRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     private $extensionAttributesJoinProcessorMock;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * @return void
      */
@@ -89,13 +95,18 @@ class AttributeSetRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
+
+        $this->collectionProcessor = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMockForAbstractClass();
+
         $this->model = new \Magento\Eav\Model\AttributeSetRepository(
             $this->resourceMock,
             $this->setFactoryMock,
             $this->collectionFactoryMock,
             $this->eavConfigMock,
             $this->resultFactoryMock,
-            $this->extensionAttributesJoinProcessorMock
+            $this->extensionAttributesJoinProcessorMock,
+            $this->collectionProcessor
         );
     }
 
@@ -207,58 +218,30 @@ class AttributeSetRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetList()
     {
-        $entityTypeCode = 'entity_type_code_value';
-        $entityTypeId = 41;
-
-        $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
-
-        $filterGroupMock = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $searchCriteriaMock->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroupMock]);
-
-        $filterMock = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
-        $filterGroupMock->expects($this->once())->method('getFilters')->willReturn([$filterMock]);
-
-        $filterMock->expects($this->once())->method('getField')->willReturn('entity_type_code');
-        $filterMock->expects($this->once())->method('getValue')->willReturn($entityTypeCode);
-
-        $collectionMock = $this->getMock(
-            \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\Collection::class,
-            ['setEntityTypeFilter', 'setCurPage', 'setPageSize', 'getItems', 'getSize'],
-            [],
-            '',
-            false
-        );
+        $attributeSetMock = $this->getMock(\Magento\Eav\Model\Entity\Attribute\Set::class, [], [], '', false);
 
-        $entityTypeMock = $this->getMock(\Magento\Eav\Model\Entity\Type::class, [], [], '', false);
-        $entityTypeMock->expects($this->once())->method('getId')->willReturn($entityTypeId);
-        $this->eavConfigMock->expects($this->once())
-            ->method('getEntityType')
-            ->with($entityTypeCode)
-            ->willReturn($entityTypeMock);
+        $collectionMock = $this->getMockBuilder(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\Collection::class)
+            ->disableOriginalConstructor()
+            ->setMethods([
+                'getItems',
+                'getSize',
+            ])
+            ->getMock();
 
-        $this->collectionFactoryMock->expects($this->once())->method('create')->willReturn($collectionMock);
         $collectionMock->expects($this->once())
-            ->method('setEntityTypeFilter')
-            ->with($entityTypeId)
-            ->willReturnSelf();
+            ->method('getItems')
+            ->willReturn([$attributeSetMock]);
+        $collectionMock->expects($this->once())
+            ->method('getSize')
+            ->willReturn(1);
 
-        $searchCriteriaMock->expects($this->once())->method('getCurrentPage')->willReturn(1);
-        $searchCriteriaMock->expects($this->once())->method('getPageSize')->willReturn(10);
+        $this->collectionFactoryMock->expects($this->once())->method('create')->willReturn($collectionMock);
 
-        $collectionMock->expects($this->once())->method('setCurPage')->with(1)->willReturnSelf();
-        $collectionMock->expects($this->once())->method('setPageSize')->with(10)->willReturnSelf();
+        $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
 
-        $attributeSetMock = $this->getMock(\Magento\Eav\Model\Entity\Attribute\Set::class, [], [], '', false);
-        $collectionMock->expects($this->once())->method('getItems')->willReturn([$attributeSetMock]);
-        $collectionMock->expects($this->once())->method('getSize')->willReturn(1);
+        $resultMock = $this->getMockBuilder(\Magento\Eav\Api\Data\AttributeSetSearchResultsInterface::class)
+            ->getMockForAbstractClass();
 
-        $resultMock = $this->getMock(
-            \Magento\Eav\Api\Data\AttributeSetSearchResultsInterface::class,
-            [],
-            [],
-            '',
-            false
-        );
         $resultMock->expects($this->once())
             ->method('setSearchCriteria')
             ->with($searchCriteriaMock)
@@ -267,9 +250,19 @@ class AttributeSetRepositoryTest extends \PHPUnit_Framework_TestCase
             ->method('setItems')
             ->with([$attributeSetMock])
             ->willReturnSelf();
-        $resultMock->expects($this->once())->method('setTotalCount')->with(1)->willReturnSelf();
+        $resultMock->expects($this->once())
+            ->method('setTotalCount')
+            ->with(1)
+            ->willReturnSelf();
 
-        $this->resultFactoryMock->expects($this->once())->method('create')->willReturn($resultMock);
+        $this->resultFactoryMock->expects($this->once())
+            ->method('create')
+            ->willReturn($resultMock);
+
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock)
+            ->willReturnSelf();
 
         $this->model->getList($searchCriteriaMock);
     }
@@ -279,36 +272,32 @@ class AttributeSetRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetListIfEntityTypeCodeIsNull()
     {
-        $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
-        $searchCriteriaMock->expects($this->once())->method('getFilterGroups')->willReturn([]);
+        $attributeSetMock = $this->getMock(\Magento\Eav\Model\Entity\Attribute\Set::class, [], [], '', false);
 
-        $collectionMock = $this->getMock(
-            \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\Collection::class,
-            ['setCurPage', 'setPageSize', 'getItems', 'getSize'],
-            [],
-            '',
-            false
-        );
+        $collectionMock = $this->getMockBuilder(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\Collection::class)
+            ->disableOriginalConstructor()
+            ->setMethods([
+                'getItems',
+                'getSize',
+            ])
+            ->getMock();
 
-        $this->collectionFactoryMock->expects($this->once())->method('create')->willReturn($collectionMock);
+        $collectionMock->expects($this->once())
+            ->method('getItems')
+            ->willReturn([$attributeSetMock]);
+        $collectionMock->expects($this->once())
+            ->method('getSize')
+            ->willReturn(1);
 
-        $searchCriteriaMock->expects($this->once())->method('getCurrentPage')->willReturn(1);
-        $searchCriteriaMock->expects($this->once())->method('getPageSize')->willReturn(10);
+        $this->collectionFactoryMock->expects($this->once())
+            ->method('create')
+            ->willReturn($collectionMock);
 
-        $collectionMock->expects($this->once())->method('setCurPage')->with(1)->willReturnSelf();
-        $collectionMock->expects($this->once())->method('setPageSize')->with(10)->willReturnSelf();
+        $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
 
-        $attributeSetMock = $this->getMock(\Magento\Eav\Model\Entity\Attribute\Set::class, [], [], '', false);
-        $collectionMock->expects($this->once())->method('getItems')->willReturn([$attributeSetMock]);
-        $collectionMock->expects($this->once())->method('getSize')->willReturn(1);
+        $resultMock = $this->getMockBuilder(\Magento\Eav\Api\Data\AttributeSetSearchResultsInterface::class)
+            ->getMockForAbstractClass();
 
-        $resultMock = $this->getMock(
-            \Magento\Eav\Api\Data\AttributeSetSearchResultsInterface::class,
-            [],
-            [],
-            '',
-            false
-        );
         $resultMock->expects($this->once())
             ->method('setSearchCriteria')
             ->with($searchCriteriaMock)
@@ -317,9 +306,19 @@ class AttributeSetRepositoryTest extends \PHPUnit_Framework_TestCase
             ->method('setItems')
             ->with([$attributeSetMock])
             ->willReturnSelf();
-        $resultMock->expects($this->once())->method('setTotalCount')->with(1)->willReturnSelf();
+        $resultMock->expects($this->once())
+            ->method('setTotalCount')
+            ->with(1)
+            ->willReturnSelf();
+
+        $this->resultFactoryMock->expects($this->once())
+            ->method('create')
+            ->willReturn($resultMock);
 
-        $this->resultFactoryMock->expects($this->once())->method('create')->willReturn($resultMock);
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock)
+            ->willReturnSelf();
 
         $this->model->getList($searchCriteriaMock);
     }
diff --git a/app/code/Magento/Eav/etc/di.xml b/app/code/Magento/Eav/etc/di.xml
index ae230ca193a98cfb35c9cfaf57546276ec53351c..49d6753bc48da61320c1a209b82bdfd18bf834ce 100644
--- a/app/code/Magento/Eav/etc/di.xml
+++ b/app/code/Magento/Eav/etc/di.xml
@@ -82,5 +82,75 @@
     <type name="Magento\Eav\Model\Entity\AbstractEntity">
         <plugin name="clean_cache" type="Magento\Framework\App\Cache\FlushCacheByTags" />
     </type>
+    <virtualType name="Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="filters" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Eav\Model\AttributeRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor</argument>
+        </arguments>
+    </type>
+    <virtualType name="Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\AttributeSetFilterProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
+        <arguments>
+            <argument name="customFilters" xsi:type="array">
+                <item name="entity_type_code" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\AttributeSetEntityTypeCodeFilter</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Eav\Model\Api\SearchCriteria\AttributeSetCollectionProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="filters" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\AttributeSetFilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Eav\Model\AttributeSetRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\AttributeSetCollectionProcessor</argument>
+        </arguments>
+    </type>
+    <virtualType name="Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\AttributeGroupFilterProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
+        <arguments>
+            <argument name="fieldMapping" xsi:type="array">
+                <item name="attribute_group_code" xsi:type="string">main_table.attribute_group_code</item>
+            </argument>
+            <argument name="customFilters" xsi:type="array">
+                <item name="attribute_set_id" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\AttributeGroupAttributeSetIdFilter</item>
+                <item name="attribute_group_code" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\AttributeGroupCodeFilter</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\AttributeGroupSortingProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor">
+        <arguments>
+            <argument name="fieldMapping" xsi:type="array">
+                <item name="attribute_group_code" xsi:type="string">main_table.attribute_group_code</item>
+            </argument>
+            <argument name="defaultOrders" xsi:type="array">
+                <item name="sort_order" xsi:type="string">ASC</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Eav\Model\Api\SearchCriteria\AttributeGroupCollectionProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="filters" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\AttributeGroupFilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\AttributeGroupSortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Eav\Model\Attribute\GroupRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Eav\Model\Api\SearchCriteria\AttributeGroupCollectionProcessor</argument>
+        </arguments>
+    </type>
 </config>
 
diff --git a/app/code/Magento/Newsletter/Model/Subscriber.php b/app/code/Magento/Newsletter/Model/Subscriber.php
index 36f3c0711038ff9a329cf663056008a01bae7986..6e614545b23d00dbcbee736beb7a2f687eb58d20 100644
--- a/app/code/Magento/Newsletter/Model/Subscriber.php
+++ b/app/code/Magento/Newsletter/Model/Subscriber.php
@@ -442,6 +442,7 @@ class Subscriber extends \Magento\Framework\Model\AbstractModel
         $this->setStatusChanged(true);
 
         try {
+            /* Save model before sending out email */
             $this->save();
             if ($isConfirmNeed === true
                 && $isOwnSubscribes === false
diff --git a/app/code/Magento/Quote/Model/QuoteRepository.php b/app/code/Magento/Quote/Model/QuoteRepository.php
index 427d3313b1734d4b11802a628c36c7abd5ac07f3..c73b7715d77e95aa470d5425fcd23d5a94786c7d 100644
--- a/app/code/Magento/Quote/Model/QuoteRepository.php
+++ b/app/code/Magento/Quote/Model/QuoteRepository.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Quote\Model;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Api\SortOrder;
 use Magento\Framework\Exception\NoSuchEntityException;
@@ -71,12 +72,16 @@ class QuoteRepository implements \Magento\Quote\Api\CartRepositoryInterface
      */
     private $loadHandler;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
      * @param QuoteFactory $quoteFactory
      * @param StoreManagerInterface $storeManager
      * @param \Magento\Quote\Model\ResourceModel\Quote\Collection $quoteCollection
      * @param \Magento\Quote\Api\Data\CartSearchResultsInterfaceFactory $searchResultsDataFactory
      * @param JoinProcessorInterface $extensionAttributesJoinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function __construct(
@@ -84,12 +89,14 @@ class QuoteRepository implements \Magento\Quote\Api\CartRepositoryInterface
         StoreManagerInterface $storeManager,
         \Magento\Quote\Model\ResourceModel\Quote\Collection $quoteCollection,
         \Magento\Quote\Api\Data\CartSearchResultsInterfaceFactory $searchResultsDataFactory,
-        JoinProcessorInterface $extensionAttributesJoinProcessor
+        JoinProcessorInterface $extensionAttributesJoinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->quoteFactory = $quoteFactory;
         $this->storeManager = $storeManager;
         $this->searchResultsDataFactory = $searchResultsDataFactory;
         $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -223,30 +230,14 @@ class QuoteRepository implements \Magento\Quote\Api\CartRepositoryInterface
         $searchData = $this->searchResultsDataFactory->create();
         $searchData->setSearchCriteria($searchCriteria);
 
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $this->quoteCollection);
-        }
-
-        $searchData->setTotalCount($this->quoteCollection->getSize());
-        $sortOrders = $searchCriteria->getSortOrders();
-        if ($sortOrders) {
-            /** @var SortOrder $sortOrder */
-            foreach ($sortOrders as $sortOrder) {
-                $this->quoteCollection->addOrder(
-                    $sortOrder->getField(),
-                    $sortOrder->getDirection() == SortOrder::SORT_ASC ? 'ASC' : 'DESC'
-                );
-            }
-        }
-        $this->quoteCollection->setCurPage($searchCriteria->getCurrentPage());
-        $this->quoteCollection->setPageSize($searchCriteria->getPageSize());
+        $this->collectionProcessor->process($searchCriteria, $this->quoteCollection);
         $this->extensionAttributesJoinProcessor->process($this->quoteCollection);
         foreach ($this->quoteCollection->getItems() as $quote) {
             /** @var CartInterface $quote */
             $this->getLoadHandler()->load($quote);
         }
         $searchData->setItems($this->quoteCollection->getItems());
-
+        $searchData->setTotalCount($this->quoteCollection->getSize());
         return $searchData;
     }
 
@@ -256,6 +247,7 @@ class QuoteRepository implements \Magento\Quote\Api\CartRepositoryInterface
      * @param FilterGroup $filterGroup The filter group.
      * @param QuoteCollection $collection The quote collection.
      * @return void
+     * @deprecated
      * @throws InputException The specified filter group or quote collection does not exist.
      */
     protected function addFilterGroupToCollection(FilterGroup $filterGroup, QuoteCollection $collection)
@@ -296,4 +288,20 @@ class QuoteRepository implements \Magento\Quote\Api\CartRepositoryInterface
         }
         return $this->loadHandler;
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessor::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php b/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php
index 462ce8381fd96f28253f0b21efb52243138ef91d..3bd838d9d4b75f0c8d0fe1ab7188883283e61b72 100644
--- a/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php
+++ b/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php
@@ -9,7 +9,9 @@ namespace Magento\Quote\Test\Unit\Model;
 
 use Magento\Framework\Api\SortOrder;
 use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
+use Magento\Quote\Api\Data\CartInterface;
 use Magento\Quote\Model\QuoteRepository\LoadHandler;
+use Magento\Quote\Model\ResourceModel\Quote\CollectionFactory;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -61,10 +63,21 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     private $loadHandlerMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject  */
+    private $objectManagerMock;
+
     protected function setUp()
     {
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
 
+        $this->objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
+        \Magento\Framework\App\ObjectManager::setInstance($this->objectManagerMock);
+
         $this->quoteFactoryMock = $this->getMock(\Magento\Quote\Model\QuoteFactory::class, ['create'], [], '', false);
         $this->storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class);
         $this->quoteMock = $this->getMock(
@@ -103,7 +116,13 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->model = $objectManager->getObject(
             \Magento\Quote\Model\QuoteRepository::class,
             [
@@ -111,7 +130,8 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase
                 'storeManager' => $this->storeManagerMock,
                 'searchResultsDataFactory' => $this->searchResultsDataFactory,
                 'quoteCollection' => $this->quoteCollectionMock,
-                'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessorMock
+                'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessorMock,
+                'collectionProcessor' => $this->collectionProcessor
             ]
         );
 
@@ -399,88 +419,53 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->model->delete($this->quoteMock);
     }
 
-    /**
-     * @param int $direction
-     * @param string $expectedDirection
-     * @dataProvider getListSuccessDataProvider
-     */
-    public function testGetListSuccess($direction, $expectedDirection)
+    public function testGetList()
     {
-        $this->markTestSkipped('MAGETWO-48531');
-        $searchResult = $this->getMock(\Magento\Quote\Api\Data\CartSearchResultsInterface::class, [], [], '', false);
-        $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteria::class, [], [], '', false);
-        $cartMock = $this->getMock(\Magento\Payment\Model\Cart::class, [], [], '', false);
-        $filterMock = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
         $pageSize = 10;
-
-        $this->searchResultsDataFactory
-            ->expects($this->once())
-            ->method('create')
-            ->will($this->returnValue($searchResult));
-
-        $searchResult
-            ->expects($this->once())
-            ->method('setSearchCriteria');
-
-        $filterGroupMock = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $searchCriteriaMock
-            ->expects($this->any())
-            ->method('getFilterGroups')
-            ->will($this->returnValue([$filterGroupMock]));
-
-        //addFilterGroupToCollection() checks
-        $filterGroupMock->expects($this->any())->method('getFilters')->will($this->returnValue([$filterMock]));
-        $filterMock->expects($this->once())->method('getField')->will($this->returnValue('store_id'));
-        $filterMock->expects($this->any())->method('getConditionType')->will($this->returnValue('eq'));
-        $filterMock->expects($this->once())->method('getValue')->will($this->returnValue('filter_value'));
-
-        //back in getList()
-        $this->quoteCollectionMock->expects($this->once())->method('getSize')->willReturn($pageSize);
-        $searchResult->expects($this->once())->method('setTotalCount')->with($pageSize);
-        $sortOrderMock = $this->getMockBuilder(\Magento\Framework\Api\SortOrder::class)
-            ->setMethods(['getField', 'getDirection'])
+        $collectionFactoryMock = $this->getMockBuilder(CollectionFactory::class)
+            ->setMethods(['create'])
             ->disableOriginalConstructor()
             ->getMock();
+        $collectionFactoryMock->expects($this->once())
+            ->method('create')
+            ->willReturn($this->quoteCollectionMock);
+        $cartMock = $this->getMock(CartInterface::class, [], [], '', false);
+        $this->loadHandlerMock->expects($this->once())
+            ->method('load')
+            ->with($cartMock);
+        $this->objectManagerMock->expects($this->atLeastOnce())
+            ->method('get')
+            ->willReturnOnConsecutiveCalls($collectionFactoryMock);
 
-        //foreach cycle
-        $searchCriteriaMock
+        $searchResult = $this->getMock(\Magento\Quote\Api\Data\CartSearchResultsInterface::class, [], [], '', false);
+        $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteria::class, [], [], '', false);
+        $this->searchResultsDataFactory
             ->expects($this->once())
-            ->method('getSortOrders')
-            ->will($this->returnValue([$sortOrderMock]));
-        $sortOrderMock->expects($this->once())->method('getField')->will($this->returnValue('id'));
-        $sortOrderMock->expects($this->once())->method('getDirection')->will($this->returnValue($direction));
-        $this->quoteCollectionMock->expects($this->once())->method('addOrder')->with('id', $expectedDirection);
+            ->method('create')
+            ->willReturn($searchResult);
 
-        $searchCriteriaMock->expects($this->once())->method('getCurrentPage')->will($this->returnValue(1));
-        $searchCriteriaMock->expects($this->once())->method('getPageSize')->will($this->returnValue(10));
-        $this->quoteCollectionMock->expects($this->once())->method('setCurPage')->with(1);
-        $this->quoteCollectionMock->expects($this->once())->method('setPageSize')->with(10);
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $this->quoteCollectionMock);
 
         $this->extensionAttributesJoinProcessorMock->expects($this->once())
             ->method('process')
             ->with(
                 $this->isInstanceOf(\Magento\Quote\Model\ResourceModel\Quote\Collection::class)
             );
-
-        $this->quoteCollectionMock->expects($this->once())->method('getItems')->willReturn([$cartMock]);
-        $searchResult->expects($this->once())->method('setItems')->with([$cartMock]);
-
-        $this->model = $this->getMock(
-            \Magento\Quote\Model\QuoteRepository::class,
-            ['getQuoteCollection'],
-            [
-                'quoteFactory' => $this->quoteFactoryMock,
-                'storeManager' => $this->storeManagerMock,
-                'quoteCollection' => $this->quoteCollectionMock,
-                'searchResultsDataFactory' => $this->searchResultsDataFactory,
-                'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessorMock
-            ]
-        );
-        $this->model->expects($this->once())->method('getQuoteCollection')->willReturn($this->quoteCollectionMock);
+        $this->quoteCollectionMock->expects($this->atLeastOnce())->method('getItems')->willReturn([$cartMock]);
+        $searchResult->expects($this->once())->method('setTotalCount')->with($pageSize);
+        $this->quoteCollectionMock->expects($this->once())
+            ->method('getSize')
+            ->willReturn($pageSize);
+        $searchResult->expects($this->once())
+            ->method('setItems')
+            ->with([$cartMock]);
         $this->assertEquals($searchResult, $this->model->getList($searchCriteriaMock));
     }
 
     /**
+     * @deprecated
      * @return array
      */
     public function getListSuccessDataProvider()
diff --git a/app/code/Magento/Sales/Model/Order/AddressRepository.php b/app/code/Magento/Sales/Model/Order/AddressRepository.php
index e075d4afdcd34945983b55047213cc825b9eb55b..c38d7bed1e7e10b721bbd9fab412bff563fe1c7a 100644
--- a/app/code/Magento/Sales/Model/Order/AddressRepository.php
+++ b/app/code/Magento/Sales/Model/Order/AddressRepository.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Sales\Model\Order;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Sales\Model\ResourceModel\Metadata;
 use Magento\Sales\Api\Data\OrderAddressSearchResultInterfaceFactory as SearchResultFactory;
 use Magento\Framework\Exception\CouldNotDeleteException;
@@ -34,16 +35,23 @@ class AddressRepository implements \Magento\Sales\Api\OrderAddressRepositoryInte
      */
     protected $registry = [];
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
+     * AddressRepository constructor.
      * @param Metadata $metadata
      * @param SearchResultFactory $searchResultFactory
+     * @param CollectionProcessorInterface|null $collectionProcessor
      */
     public function __construct(
         Metadata $metadata,
-        SearchResultFactory $searchResultFactory
+        SearchResultFactory $searchResultFactory,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->metadata = $metadata;
         $this->searchResultFactory = $searchResultFactory;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -81,19 +89,11 @@ class AddressRepository implements \Magento\Sales\Api\OrderAddressRepositoryInte
      */
     public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria)
     {
-        //@TODO: fix search logic
-        /** @var \Magento\Sales\Api\Data\OrderAddressSearchResultInterface $searchResult */
+        /** @var \Magento\Sales\Model\ResourceModel\Order\Address\Collection $searchResult */
         $searchResult = $this->searchResultFactory->create();
-
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            foreach ($filterGroup->getFilters() as $filter) {
-                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-                $searchResult->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
-            }
-        }
-        $searchResult->setCurPage($searchCriteria->getCurrentPage());
-        $searchResult->setPageSize($searchCriteria->getPageSize());
-
+        $this->collectionProcessor->process($searchCriteria, $searchResult);
+        $searchResult->setSearchCriteria($searchCriteria);
+        
         return $searchResult;
     }
 
@@ -158,4 +158,20 @@ class AddressRepository implements \Magento\Sales\Api\OrderAddressRepositoryInte
     {
         return $this->metadata->getNewInstance();
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Sales/Model/Order/CreditmemoRepository.php b/app/code/Magento/Sales/Model/Order/CreditmemoRepository.php
index fb13153330312bcac6dac5c426861ee01733d34c..3fc0a2a4da4d7d6af9cc455828414ee532fd7395 100644
--- a/app/code/Magento/Sales/Model/Order/CreditmemoRepository.php
+++ b/app/code/Magento/Sales/Model/Order/CreditmemoRepository.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Sales\Model\Order;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Sales\Model\ResourceModel\Order\Creditmemo as Resource;
 use Magento\Sales\Model\ResourceModel\Metadata;
 use Magento\Sales\Api\Data\CreditmemoSearchResultInterfaceFactory as SearchResultFactory;
@@ -37,16 +38,23 @@ class CreditmemoRepository implements \Magento\Sales\Api\CreditmemoRepositoryInt
      */
     protected $registry = [];
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
+     * CreditmemoRepository constructor.
      * @param Metadata $metadata
      * @param SearchResultFactory $searchResultFactory
+     * @param CollectionProcessorInterface|null $collectionProcessor
      */
     public function __construct(
         Metadata $metadata,
-        SearchResultFactory $searchResultFactory
+        SearchResultFactory $searchResultFactory,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->metadata = $metadata;
         $this->searchResultFactory = $searchResultFactory;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -91,17 +99,10 @@ class CreditmemoRepository implements \Magento\Sales\Api\CreditmemoRepositoryInt
      */
     public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria)
     {
-        /** @var \Magento\Sales\Api\Data\CreditmemoSearchResultInterface $searchResult */
+        /** @var \Magento\Sales\Model\ResourceModel\Order\Creditmemo\Collection $searchResult */
         $searchResult = $this->searchResultFactory->create();
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            foreach ($filterGroup->getFilters() as $filter) {
-                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-                $searchResult->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
-            }
-        }
+        $this->collectionProcessor->process($searchCriteria, $searchResult);
         $searchResult->setSearchCriteria($searchCriteria);
-        $searchResult->setCurPage($searchCriteria->getCurrentPage());
-        $searchResult->setPageSize($searchCriteria->getPageSize());
         return $searchResult;
     }
 
@@ -140,4 +141,20 @@ class CreditmemoRepository implements \Magento\Sales\Api\CreditmemoRepositoryInt
         }
         return $this->registry[$entity->getEntityId()];
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Sales/Model/Order/InvoiceRepository.php b/app/code/Magento/Sales/Model/Order/InvoiceRepository.php
index 38cd7bdc97f0f740fddb3dbff4df3802fcb61d34..0a22f7d6a0574b7c8eef1cfbf15987bf50297025 100644
--- a/app/code/Magento/Sales/Model/Order/InvoiceRepository.php
+++ b/app/code/Magento/Sales/Model/Order/InvoiceRepository.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Sales\Model\Order;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Sales\Api\InvoiceRepositoryInterface;
 use Magento\Sales\Model\ResourceModel\Metadata;
 use Magento\Framework\Exception\NoSuchEntityException;
@@ -33,18 +34,23 @@ class InvoiceRepository implements InvoiceRepositoryInterface
      */
     protected $searchResultFactory;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
-     * Repository constructor
-     *
+     * InvoiceRepository constructor.
      * @param Metadata $invoiceMetadata
      * @param SearchResultFactory $searchResultFactory
+     * @param CollectionProcessorInterface|null $collectionProcessor
      */
     public function __construct(
         Metadata $invoiceMetadata,
-        SearchResultFactory $searchResultFactory
+        SearchResultFactory $searchResultFactory,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->metadata = $invoiceMetadata;
         $this->searchResultFactory = $searchResultFactory;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -89,15 +95,8 @@ class InvoiceRepository implements InvoiceRepositoryInterface
     {
         /** @var \Magento\Sales\Model\ResourceModel\Order\Invoice\Collection $collection */
         $collection = $this->searchResultFactory->create();
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            foreach ($filterGroup->getFilters() as $filter) {
-                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-                $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
-            }
-        }
+        $this->collectionProcessor->process($searchCriteria, $collection);
         $collection->setSearchCriteria($searchCriteria);
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
         return $collection;
     }
 
@@ -138,4 +137,20 @@ class InvoiceRepository implements InvoiceRepositoryInterface
         $this->registry[$entity->getEntityId()] = $entity;
         return $this->registry[$entity->getEntityId()];
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Sales/Model/Order/ItemRepository.php b/app/code/Magento/Sales/Model/Order/ItemRepository.php
index 65c53c8d69a644fcfcc5627cd6facdc95bcb2012..8fdeca7eb7d032bd226bcc11f592fb64efbbd4a6 100644
--- a/app/code/Magento/Sales/Model/Order/ItemRepository.php
+++ b/app/code/Magento/Sales/Model/Order/ItemRepository.php
@@ -6,6 +6,7 @@
 namespace Magento\Sales\Model\Order;
 
 use Magento\Catalog\Api\Data\ProductOptionExtensionFactory;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Catalog\Model\ProductOptionFactory;
 use Magento\Catalog\Model\ProductOptionProcessorInterface;
 use Magento\Framework\Api\SearchCriteria;
@@ -60,13 +61,18 @@ class ItemRepository implements OrderItemRepositoryInterface
      */
     protected $registry = [];
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
+     * ItemRepository constructor.
      * @param DataObjectFactory $objectFactory
      * @param Metadata $metadata
      * @param OrderItemSearchResultInterfaceFactory $searchResultFactory
      * @param ProductOptionFactory $productOptionFactory
      * @param ProductOptionExtensionFactory $extensionFactory
      * @param array $processorPool
+     * @param CollectionProcessorInterface|null $collectionProcessor
      */
     public function __construct(
         DataObjectFactory $objectFactory,
@@ -74,7 +80,8 @@ class ItemRepository implements OrderItemRepositoryInterface
         OrderItemSearchResultInterfaceFactory $searchResultFactory,
         ProductOptionFactory $productOptionFactory,
         ProductOptionExtensionFactory $extensionFactory,
-        array $processorPool = []
+        array $processorPool = [],
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->objectFactory = $objectFactory;
         $this->metadata = $metadata;
@@ -82,6 +89,7 @@ class ItemRepository implements OrderItemRepositoryInterface
         $this->productOptionFactory = $productOptionFactory;
         $this->extensionFactory = $extensionFactory;
         $this->processorPool = $processorPool;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -118,17 +126,10 @@ class ItemRepository implements OrderItemRepositoryInterface
      */
     public function getList(SearchCriteria $searchCriteria)
     {
-        /** @var OrderItemSearchResultInterface $searchResult */
+        /** @var \Magento\Sales\Model\ResourceModel\Order\Item\Collection $searchResult */
         $searchResult = $this->searchResultFactory->create();
         $searchResult->setSearchCriteria($searchCriteria);
-
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            foreach ($filterGroup->getFilters() as $filter) {
-                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-                $searchResult->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
-            }
-        }
-
+        $this->collectionProcessor->process($searchCriteria, $searchResult);
         /** @var OrderItemInterface $orderItem */
         foreach ($searchResult->getItems() as $orderItem) {
             $this->addProductOption($orderItem);
@@ -268,4 +269,20 @@ class ItemRepository implements OrderItemRepositoryInterface
 
         return $request;
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Sales/Model/Order/Payment/Repository.php b/app/code/Magento/Sales/Model/Order/Payment/Repository.php
index c4a1cea24da6ded8fc6377c1647941a4aa94d314..0412562823746b2c02e0f2c757ef6fedf8a5feae 100644
--- a/app/code/Magento/Sales/Model/Order/Payment/Repository.php
+++ b/app/code/Magento/Sales/Model/Order/Payment/Repository.php
@@ -7,6 +7,7 @@
 namespace Magento\Sales\Model\Order\Payment;
 
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Sales\Api\OrderPaymentRepositoryInterface;
 use Magento\Sales\Model\ResourceModel\Metadata;
@@ -34,14 +35,22 @@ class Repository implements OrderPaymentRepositoryInterface
      */
     protected $searchResultFactory;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
      * @param Metadata $metaData
      * @param SearchResultFactory $searchResultFactory
+     * @param CollectionProcessorInterface $collectionProcessor
      */
-    public function __construct(Metadata $metaData, SearchResultFactory $searchResultFactory)
-    {
+    public function __construct(
+        Metadata $metaData,
+        SearchResultFactory $searchResultFactory,
+        CollectionProcessorInterface $collectionProcessor = null
+    ) {
         $this->metaData = $metaData;
         $this->searchResultFactory = $searchResultFactory;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -54,14 +63,8 @@ class Repository implements OrderPaymentRepositoryInterface
     {
         /** @var \Magento\Sales\Model\ResourceModel\Order\Payment\Collection $collection */
         $collection = $this->searchResultFactory->create();
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            foreach ($filterGroup->getFilters() as $filter) {
-                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-                $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
-            }
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
+        $collection->setSearchCriteria($searchCriteria);
+        $this->collectionProcessor->process($searchCriteria, $collection);
         return $collection;
     }
 
@@ -121,4 +124,20 @@ class Repository implements OrderPaymentRepositoryInterface
     {
         return $this->metaData->getNewInstance();
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Sales/Model/Order/Payment/Transaction/Repository.php b/app/code/Magento/Sales/Model/Order/Payment/Transaction/Repository.php
index 687260cb185ccbdc0f04eacfe843e94d0f0c70a4..c6dc2ceb9e81ca9cb8e4ed1240207eb2150bb21a 100644
--- a/app/code/Magento/Sales/Model/Order/Payment/Transaction/Repository.php
+++ b/app/code/Magento/Sales/Model/Order/Payment/Transaction/Repository.php
@@ -7,6 +7,7 @@
 namespace Magento\Sales\Model\Order\Payment\Transaction;
 
 use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Api\SearchCriteriaBuilder;
 use Magento\Framework\Api\SortOrderBuilder;
 use Magento\Framework\Data\Collection;
@@ -60,15 +61,18 @@ class Repository implements TransactionRepositoryInterface
      */
     private $entityStorage;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
-     * Repository constructor
-     *
+     * Repository constructor.
      * @param SearchResultFactory $searchResultFactory
      * @param FilterBuilder $filterBuilder
      * @param SearchCriteriaBuilder $searchCriteriaBuilder
      * @param SortOrderBuilder $sortOrderBuilder
      * @param Metadata $metaData
      * @param EntityStorageFactory $entityStorageFactory
+     * @param CollectionProcessorInterface|null $collectionProcessor
      */
     public function __construct(
         SearchResultFactory $searchResultFactory,
@@ -76,7 +80,8 @@ class Repository implements TransactionRepositoryInterface
         SearchCriteriaBuilder $searchCriteriaBuilder,
         SortOrderBuilder $sortOrderBuilder,
         Metadata $metaData,
-        EntityStorageFactory $entityStorageFactory
+        EntityStorageFactory $entityStorageFactory,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->searchResultFactory = $searchResultFactory;
         $this->filterBuilder = $filterBuilder;
@@ -84,6 +89,7 @@ class Repository implements TransactionRepositoryInterface
         $this->sortOrderBuilder = $sortOrderBuilder;
         $this->metaData = $metaData;
         $this->entityStorage = $entityStorageFactory->create();
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -118,11 +124,11 @@ class Repository implements TransactionRepositoryInterface
         $cacheStorage = 'txn_type';
         $entity = $this->entityStorage->getByIdentifyingFields($identityFieldsForCache, $cacheStorage);
         if (!$entity) {
-            $filters[] = $this->filterBuilder
+            $typeFilter = $this->filterBuilder
                 ->setField(TransactionInterface::TXN_TYPE)
                 ->setValue($transactionType)
                 ->create();
-            $filters[] = $this->filterBuilder
+            $idFilter = $this->filterBuilder
                 ->setField(TransactionInterface::PAYMENT_ID)
                 ->setValue($paymentId)
                 ->create();
@@ -137,7 +143,8 @@ class Repository implements TransactionRepositoryInterface
             $entity = current(
                 $this->getList(
                     $this->searchCriteriaBuilder
-                        ->addFilters($filters)
+                        ->addFilters([$typeFilter])
+                        ->addFilters([$idFilter])
                         ->addSortOrder($transactionIdSort)
                         ->addSortOrder($createdAtSort)
                         ->create()
@@ -187,15 +194,8 @@ class Repository implements TransactionRepositoryInterface
     {
         /** @var TransactionResource\Collection $collection */
         $collection = $this->searchResultFactory->create();
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            foreach ($filterGroup->getFilters() as $filter) {
-                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-                $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
-            }
-        }
         $collection->setSearchCriteria($searchCriteria);
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
+        $this->collectionProcessor->process($searchCriteria, $collection);
         $collection->addPaymentInformation(['method']);
         $collection->addOrderInformation(['increment_id']);
         return $collection;
@@ -230,4 +230,20 @@ class Repository implements TransactionRepositoryInterface
     {
         return $this->metaData->getNewInstance();
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Sales/Model/Order/ShipmentRepository.php b/app/code/Magento/Sales/Model/Order/ShipmentRepository.php
index d32a5f83f2d41878a47b0ead61622cece2ef53aa..2ddff08d90060d0c02195c4e4026f10dc69ee836 100644
--- a/app/code/Magento/Sales/Model/Order/ShipmentRepository.php
+++ b/app/code/Magento/Sales/Model/Order/ShipmentRepository.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Sales\Model\Order;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Sales\Model\ResourceModel\Metadata;
 use Magento\Sales\Api\Data\ShipmentSearchResultInterfaceFactory as SearchResultFactory;
 use Magento\Framework\Exception\CouldNotDeleteException;
@@ -34,16 +35,22 @@ class ShipmentRepository implements \Magento\Sales\Api\ShipmentRepositoryInterfa
      */
     protected $registry = [];
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
      * @param Metadata $metadata
      * @param SearchResultFactory $searchResultFactory
+     * @param CollectionProcessorInterface $collectionProcessor
      */
     public function __construct(
         Metadata $metadata,
-        SearchResultFactory $searchResultFactory
+        SearchResultFactory $searchResultFactory,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->metadata = $metadata;
         $this->searchResultFactory = $searchResultFactory;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -81,19 +88,10 @@ class ShipmentRepository implements \Magento\Sales\Api\ShipmentRepositoryInterfa
      */
     public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria)
     {
-        //@TODO: fix search logic
-        /** @var \Magento\Sales\Api\Data\ShipmentSearchResultInterface $searchResult */
+        /** @var \Magento\Sales\Model\ResourceModel\Order\Shipment\Collection $searchResult */
         $searchResult = $this->searchResultFactory->create();
-
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            foreach ($filterGroup->getFilters() as $filter) {
-                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-                $searchResult->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
-            }
-        }
+        $this->collectionProcessor->process($searchCriteria, $searchResult);
         $searchResult->setSearchCriteria($searchCriteria);
-        $searchResult->setCurPage($searchCriteria->getCurrentPage());
-        $searchResult->setPageSize($searchCriteria->getPageSize());
 
         return $searchResult;
     }
@@ -159,4 +157,20 @@ class ShipmentRepository implements \Magento\Sales\Api\ShipmentRepositoryInterfa
     {
         return $this->metadata->getNewInstance();
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Sales/Model/OrderRepository.php b/app/code/Magento/Sales/Model/OrderRepository.php
index b83ab5ff469fcd713f326fc62008e12bbe49259b..5c14b3fd4433e4404db3921a1fffe5b13935643f 100644
--- a/app/code/Magento/Sales/Model/OrderRepository.php
+++ b/app/code/Magento/Sales/Model/OrderRepository.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Sales\Model;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Sales\Model\ResourceModel\Order as Resource;
 use Magento\Sales\Model\ResourceModel\Metadata;
 use Magento\Sales\Model\Order\ShippingAssignmentBuilder;
@@ -43,6 +44,9 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
      */
     private $shippingAssignmentBuilder;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
      * OrderInterface[]
      *
@@ -52,16 +56,18 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
 
     /**
      * OrderRepository constructor.
-     *
      * @param Metadata $metadata
      * @param SearchResultFactory $searchResultFactory
+     * @param CollectionProcessorInterface|null $collectionProcessor
      */
     public function __construct(
         Metadata $metadata,
-        SearchResultFactory $searchResultFactory
+        SearchResultFactory $searchResultFactory,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->metadata = $metadata;
         $this->searchResultFactory = $searchResultFactory;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -99,26 +105,8 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
     {
         /** @var \Magento\Sales\Api\Data\OrderSearchResultInterface $searchResult */
         $searchResult = $this->searchResultFactory->create();
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            $this->addFilterGroupToCollection($filterGroup, $searchResult);
-        }
-
-        $sortOrders = $searchCriteria->getSortOrders();
-        if ($sortOrders === null) {
-            $sortOrders = [];
-        }
-        /** @var \Magento\Framework\Api\SortOrder $sortOrder */
-        foreach ($sortOrders as $sortOrder) {
-            $field = $sortOrder->getField();
-            $searchResult->addOrder(
-                $field,
-                ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-            );
-        }
-
+        $this->collectionProcessor->process($searchCriteria, $searchResult);
         $searchResult->setSearchCriteria($searchCriteria);
-        $searchResult->setCurPage($searchCriteria->getCurrentPage());
-        $searchResult->setPageSize($searchCriteria->getPageSize());
         foreach ($searchResult->getItems() as $order) {
             $this->setShippingAssignments($order);
         }
@@ -222,6 +210,7 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
      * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
      * @param \Magento\Sales\Api\Data\OrderSearchResultInterface $searchResult
      * @return void
+     * @deprecated
      * @throws \Magento\Framework\Exception\InputException
      */
     protected function addFilterGroupToCollection(
@@ -239,4 +228,20 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface
             $searchResult->addFieldToFilter($fields, $conditions);
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Sales/Model/ResourceModel/Order/Address/Collection.php b/app/code/Magento/Sales/Model/ResourceModel/Order/Address/Collection.php
index de54cfaff9a6554eed5edc348aa29b8a71e8262a..59f17925a0bdea0af5155dd44bcfbbe063eb2fd5 100644
--- a/app/code/Magento/Sales/Model/ResourceModel/Order/Address/Collection.php
+++ b/app/code/Magento/Sales/Model/ResourceModel/Order/Address/Collection.php
@@ -5,12 +5,15 @@
  */
 namespace Magento\Sales\Model\ResourceModel\Order\Address;
 
+use Magento\Sales\Api\Data\OrderAddressSearchResultInterface;
+use \Magento\Sales\Model\ResourceModel\Order\Collection\AbstractCollection;
+
 /**
  * Flat sales order payment collection
  *
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-class Collection extends \Magento\Sales\Model\ResourceModel\Order\Collection\AbstractCollection
+class Collection extends AbstractCollection implements OrderAddressSearchResultInterface
 {
     /**
      * Event prefix
diff --git a/app/code/Magento/Sales/Model/ResourceModel/Order/Invoice/Item.php b/app/code/Magento/Sales/Model/ResourceModel/Order/Invoice/Item.php
index 821819b9974ea884880f8a717db8160ea344c027..08002c2b19a39aa3c421812c5b56e57d1c6d7514 100644
--- a/app/code/Magento/Sales/Model/ResourceModel/Order/Invoice/Item.php
+++ b/app/code/Magento/Sales/Model/ResourceModel/Order/Invoice/Item.php
@@ -5,12 +5,15 @@
  */
 namespace Magento\Sales\Model\ResourceModel\Order\Invoice;
 
+use Magento\Sales\Model\ResourceModel\EntityAbstract as SalesResource;
+use Magento\Sales\Model\Spi\InvoiceItemResourceInterface;
+
 /**
  * Flat sales order invoice item resource
  *
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-class Item extends \Magento\Sales\Model\ResourceModel\EntityAbstract
+class Item extends SalesResource implements InvoiceItemResourceInterface
 {
     /**
      * Event prefix
diff --git a/app/code/Magento/Sales/Model/ResourceModel/Order/Item/Collection.php b/app/code/Magento/Sales/Model/ResourceModel/Order/Item/Collection.php
index 7559bae68ffa8e3524f4d1f3750603be8e2acfc3..d38c0dbc58b6b78b02d0126cf9e49e1f25977643 100644
--- a/app/code/Magento/Sales/Model/ResourceModel/Order/Item/Collection.php
+++ b/app/code/Magento/Sales/Model/ResourceModel/Order/Item/Collection.php
@@ -5,12 +5,14 @@
  */
 namespace Magento\Sales\Model\ResourceModel\Order\Item;
 
+use \Magento\Sales\Model\ResourceModel\Order\Collection\AbstractCollection;
+
 /**
  * Flat sales order payment collection
  *
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-class Collection extends \Magento\Sales\Model\ResourceModel\Order\Collection\AbstractCollection
+class Collection extends AbstractCollection implements \Magento\Sales\Api\Data\OrderItemSearchResultInterface
 {
     /**
      * Event prefix
diff --git a/app/code/Magento/Sales/Test/Unit/Model/InvoiceRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/InvoiceRepositoryTest.php
index 964974507d1905df1945e92b4bda2785ee415f4c..5c3d970d42f813908403dc6d5cabd05e7523ba4d 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/InvoiceRepositoryTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/InvoiceRepositoryTest.php
@@ -6,6 +6,8 @@
 
 namespace Magento\Sales\Test\Unit\Model;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+
 /**
  * Class InvoiceRepositoryTest
  */
@@ -26,6 +28,11 @@ class InvoiceRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $searchResultFactory;
 
+    /**
+     * @var CollectionProcessorInterface |\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessorMock;
+    
     protected function setUp()
     {
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -36,11 +43,14 @@ class InvoiceRepositoryTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->setMethods(['create'])
             ->getMock();
+        $this->collectionProcessorMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
         $this->invoice = $objectManager->getObject(
             \Magento\Sales\Model\Order\InvoiceRepository::class,
             [
                 'invoiceMetadata' => $this->invoiceMetadata,
-                'searchResultFactory' => $this->searchResultFactory
+                'searchResultFactory' => $this->searchResultFactory,
+                'collectionProcessor' => $this->collectionProcessorMock,
             ]
         );
         $this->type = $this->getMock(\Magento\Eav\Model\Entity\Type::class, ['fetchNewIncrementId'], [], '', false);
@@ -116,44 +126,15 @@ class InvoiceRepositoryTest extends \PHPUnit_Framework_TestCase
 
     public function testGetList()
     {
-        $filterGroup = $this->getMockBuilder(\Magento\Framework\Api\Search\FilterGroup::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $filterGroups = [$filterGroup];
-        $field = 'test_field';
-        $fieldValue = 'test_value';
-
-        $filter = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $filter->expects($this->any())
-            ->method('getConditionType')
-            ->willReturn(false);
-        $filter->expects($this->any())
-            ->method('getField')
-            ->willReturn($field);
-        $filter->expects($this->any())
-            ->method('getValue')
-            ->willReturn($fieldValue);
-
-        $filterGroup->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$filter]);
-
         $searchCriteria = $this->getMockBuilder(\Magento\Framework\Api\SearchCriteria::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $searchCriteria->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn($filterGroups);
-
         $collection = $this->getMockBuilder(\Magento\Sales\Model\ResourceModel\Order\Invoice\Collection::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->withAnyParameters();
-
+        $this->collectionProcessorMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteria, $collection);
         $this->searchResultFactory->expects($this->once())
             ->method('create')
             ->willReturn($collection);
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/AddressRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/AddressRepositoryTest.php
index d99100f3c8048d3f623efeee3237df44bdfb51df..d1aa65afd501e126cf85ad98e1a1ab1512e1829b 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/AddressRepositoryTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/AddressRepositoryTest.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Sales\Test\Unit\Model\Order;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 
 /**
@@ -33,6 +34,11 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $searchResultFactory;
 
+    /**
+     * @var CollectionProcessorInterface |\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessorMock;
+
     protected function setUp()
     {
         $objectManager = new ObjectManager($this);
@@ -53,11 +59,15 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
 
+        $this->collectionProcessorMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
+
         $this->subject = $objectManager->getObject(
             \Magento\Sales\Model\Order\AddressRepository::class,
             [
                 'metadata' => $this->metadata,
-                'searchResultFactory' => $this->searchResultFactory
+                'searchResultFactory' => $this->searchResultFactory,
+                'collectionProcessor' => $this->collectionProcessorMock,
             ]
         );
     }
@@ -136,56 +146,24 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
 
     public function testGetList()
     {
-        $filter = $this->getMock(
-            \Magento\Framework\Api\Filter::class,
-            ['getConditionType', 'getField', 'getValue'],
-            [],
-            '',
-            false
-        );
-        $filter->expects($this->any())
-            ->method('getConditionType')
-            ->willReturn(false);
-        $filter->expects($this->any())
-            ->method('getField')
-            ->willReturn('test_field');
-        $filter->expects($this->any())
-            ->method('getValue')
-            ->willReturn('test_value');
-
-        $filterGroup = $this->getMock(
-            \Magento\Framework\Api\Search\FilterGroup::class,
-            ['getFilters'],
-            [],
-            '',
-            false
-        );
-        $filterGroup->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$filter]);
-
         $searchCriteria = $this->getMock(
             \Magento\Framework\Api\SearchCriteria::class,
-            ['getFilterGroups'],
+            [],
             [],
             '',
             false
         );
-        $searchCriteria->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn([$filterGroup]);
-
         $collection = $this->getMock(
             \Magento\Sales\Model\ResourceModel\Order\Address\Collection::class,
-            ['addFieldToFilter'],
+            [],
             [],
             '',
             false
         );
-        $collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->withAnyParameters();
 
+        $this->collectionProcessorMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteria, $collection);
         $this->searchResultFactory->expects($this->once())
             ->method('create')
             ->willReturn($collection);
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/CreditmemoRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/CreditmemoRepositoryTest.php
index 3bbf663bd2d2649752c98cec75dc8495b00fe797..52dc60dc70d0bf666c14f775c3a36cf1d8684f68 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/CreditmemoRepositoryTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/CreditmemoRepositoryTest.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Sales\Test\Unit\Model\Order;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use \Magento\Sales\Model\Order\CreditmemoRepository;
 
 /**
@@ -29,6 +30,11 @@ class CreditmemoRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $searchResultFactoryMock;
 
+    /**
+     * @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessorMock;
+    
     protected function setUp()
     {
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -40,11 +46,14 @@ class CreditmemoRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
+        $this->collectionProcessorMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
         $this->creditmemo = $objectManager->getObject(
             \Magento\Sales\Model\Order\CreditmemoRepository::class,
             [
                 'metadata' => $this->metadataMock,
-                'searchResultFactory' => $this->searchResultFactoryMock
+                'searchResultFactory' => $this->searchResultFactoryMock,
+                'collectionProcessor' => $this->collectionProcessorMock,
             ]
         );
         $this->type = $this->getMock(\Magento\Eav\Model\Entity\Type::class, ['fetchNewIncrementId'], [], '', false);
@@ -120,44 +129,15 @@ class CreditmemoRepositoryTest extends \PHPUnit_Framework_TestCase
 
     public function testGetList()
     {
-        $filterGroup = $this->getMockBuilder(\Magento\Framework\Api\Search\FilterGroup::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $filterGroups = [$filterGroup];
-        $field = 'test_field';
-        $fieldValue = 'test_value';
-
-        $filter = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $filter->expects($this->any())
-            ->method('getConditionType')
-            ->willReturn(false);
-        $filter->expects($this->any())
-            ->method('getField')
-            ->willReturn($field);
-        $filter->expects($this->any())
-            ->method('getValue')
-            ->willReturn($fieldValue);
-
-        $filterGroup->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$filter]);
-
         $searchCriteria = $this->getMockBuilder(\Magento\Framework\Api\SearchCriteria::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $searchCriteria->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn($filterGroups);
-
         $collection = $this->getMockBuilder(\Magento\Sales\Model\ResourceModel\Order\Creditmemo\Collection::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->withAnyParameters();
-
+        $this->collectionProcessorMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteria, $collection);
         $this->searchResultFactoryMock->expects($this->once())
             ->method('create')
             ->willReturn($collection);
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/ItemRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/ItemRepositoryTest.php
index 76509010d70d38e94b8bed8c21e32fef26965430..48b99d5c55d634d23fa8c3eb4e4be7d8e3b4476b 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/ItemRepositoryTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/ItemRepositoryTest.php
@@ -42,6 +42,11 @@ class ItemRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $extensionFactory;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * @var array
      */
@@ -72,6 +77,14 @@ class ItemRepositoryTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
+
         $this->extensionFactory = $this->getMockBuilder(\Magento\Catalog\Api\Data\ProductOptionExtensionFactory::class)
             ->setMethods([
                 'create',
@@ -91,7 +104,9 @@ class ItemRepositoryTest extends \PHPUnit_Framework_TestCase
             $this->metadata,
             $this->searchResultFactory,
             $this->productOptionFactory,
-            $this->extensionFactory
+            $this->extensionFactory,
+            [],
+            $this->collectionProcessor
         );
 
         $model->get(null);
@@ -125,7 +140,9 @@ class ItemRepositoryTest extends \PHPUnit_Framework_TestCase
             $this->metadata,
             $this->searchResultFactory,
             $this->productOptionFactory,
-            $this->extensionFactory
+            $this->extensionFactory,
+            [],
+            $this->collectionProcessor
         );
 
         $model->get($orderItemId);
@@ -164,52 +181,17 @@ class ItemRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testGetList()
     {
         $productType = 'configurable';
-        $field = 'field';
-        $value = 'value';
-
         $this->productOptionData = ['option1' => 'value1'];
-
-        $filterMock = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $filterMock->expects($this->once())
-            ->method('getConditionType')
-            ->willReturn(null);
-        $filterMock->expects($this->once())
-            ->method('getField')
-            ->willReturn($field);
-        $filterMock->expects($this->once())
-            ->method('getValue')
-            ->willReturn($value);
-
-        $filterGroupMock = $this->getMockBuilder(\Magento\Framework\Api\Search\FilterGroup::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $filterGroupMock->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$filterMock]);
-
         $searchCriteriaMock = $this->getMockBuilder(\Magento\Framework\Api\SearchCriteria::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $searchCriteriaMock->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn([$filterGroupMock]);
-
         $this->getProductOptionExtensionMock();
         $productOption = $this->getProductOptionMock();
         $orderItemMock = $this->getOrderMock($productType, $productOption);
 
-        $searchResultMock = $this->getMockBuilder(\Magento\Sales\Api\Data\OrderItemSearchResultInterface::class)
-            ->setMethods([
-                'addFieldToFilter',
-                'getItems',
-            ])
-            ->getMockForAbstractClass();
-        $searchResultMock->expects($this->once())
-            ->method('addFieldToFilter')
-            ->with($field, ['eq' => $value])
-            ->willReturnSelf();
+        $searchResultMock = $this->getMockBuilder(\Magento\Sales\Model\ResourceModel\Order\Item\Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
         $searchResultMock->expects($this->once())
             ->method('getItems')
             ->willReturn([$orderItemMock]);
@@ -310,8 +292,9 @@ class ItemRepositoryTest extends \PHPUnit_Framework_TestCase
             $this->extensionFactory,
             [
                 $productType => $this->productOptionProcessorMock,
-                'custom_options' => $this->productOptionProcessorMock,
-            ]
+                'custom_options' => $this->productOptionProcessorMock
+            ],
+            $this->collectionProcessor
         );
         return $model;
     }
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/RepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/RepositoryTest.php
index ab2f42acfd51e99c6ac962bf262391f5c9c764ab..d5c893cbde9be40dd9f08d7ff4a39e89d26a1917 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/RepositoryTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/RepositoryTest.php
@@ -47,6 +47,11 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $paymentResource;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * @var \Magento\Sales\Model\Order\Payment\Repository
      */
@@ -104,11 +109,19 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->repository = $objectManager->getObject(
             \Magento\Sales\Model\Order\Payment\Repository::class,
             [
                 'searchResultFactory' => $this->searchResultFactory,
                 'metaData' => $this->metaData,
+                'collectionProcessor' => $this->collectionProcessor,
             ]
         );
     }
@@ -173,9 +186,10 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
 
     public function testGetList()
     {
-        $field = 'order_id';
-        $value = 45;
-        $this->getListMock($field, $value);
+        $this->searchResultFactory->expects($this->atLeastOnce())->method('create')->willReturn($this->collection);
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($this->searchCriteria, $this->collection);
         $this->assertSame($this->collection, $this->repository->getList($this->searchCriteria));
     }
 
@@ -195,25 +209,4 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
 
         return $payment;
     }
-
-    /**
-     * @param $field
-     * @param $value
-     */
-    protected function getListMock($field, $value)
-    {
-        $currentPage = 1;
-        $pageSize = 10;
-        $this->searchResultFactory->expects($this->atLeastOnce())->method('create')->willReturn($this->collection);
-        $this->searchCriteria->expects($this->once())->method('getFilterGroups')->willReturn([$this->filterGroup]);
-        $this->filterGroup->expects($this->once())->method('getFilters')->willReturn([$this->filter]);
-        $this->filter->expects($this->once())->method('getConditionType')->willReturn(null);
-        $this->filter->expects($this->once())->method('getField')->willReturn($field);
-        $this->filter->expects($this->once())->method('getValue')->willReturn($value);
-        $this->collection->expects($this->once())->method('addFieldToFilter')->with($field, ['eq' => $value]);
-        $this->searchCriteria->expects($this->once())->method('getCurrentPage')->willReturn($currentPage);
-        $this->searchCriteria->expects($this->once())->method('getPageSize')->willReturn($pageSize);
-        $this->collection->expects($this->once())->method('setCurPage')->with();
-        $this->collection->expects($this->once())->method('setPageSize')->with();
-    }
 }
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/Transaction/RepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/Transaction/RepositoryTest.php
index 6526b4e729b5f9a8e4c10cab09d4df1cd58f0f90..4445317f31d463a242e7a6c7ed517bb26ef39014 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/Transaction/RepositoryTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/Transaction/RepositoryTest.php
@@ -74,6 +74,11 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $repository;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * @return void
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
@@ -166,6 +171,13 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
         $entityStorageFactory->expects($this->once())->method('create')->willReturn($this->entityStorage);
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->repository = $objectManager->getObject(
             \Magento\Sales\Model\Order\Payment\Transaction\Repository::class,
             [
@@ -175,6 +187,7 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
                 'sortOrderBuilder' => $this->sortOrderBuilder,
                 'metaData' => $this->metaData,
                 'entityStorageFactory' => $entityStorageFactory,
+                'collectionProcessor' => $this->collectionProcessor
             ]
         );
     }
@@ -265,9 +278,10 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
 
     public function testGetList()
     {
-        $field = 'txn_id';
-        $value = '33-refund';
-        $this->getListMock($field, $value);
+        $this->initListMock();
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($this->searchCriteria, $this->collection);
         $this->assertSame($this->collection, $this->repository->getList($this->searchCriteria));
     }
 
@@ -376,9 +390,9 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             $transactionIdSort,
             $createdAtSort
         );
-        $this->searchCriteriaBuilder->expects($this->once())
+        $this->searchCriteriaBuilder->expects($this->exactly(2))
             ->method('addFilters')
-            ->with([$this->filter, $this->filter])
+            ->with([$this->filter])
             ->willReturnSelf();
         $this->searchCriteriaBuilder->expects($this->exactly(2))
             ->method('addSortOrder')
@@ -389,7 +403,7 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
         $this->searchCriteriaBuilder->expects($this->once())
             ->method('create')
             ->willReturn($this->searchCriteria);
-        $this->getListMock(\Magento\Sales\Api\Data\TransactionInterface::TXN_TYPE, $transactionType);
+        $this->initListMock();
         $transaction = $this->mockTransaction(1, true);
         $this->collection->expects($this->once())->method('getItems')->willReturn([$transaction]);
         $this->entityStorage->expects($this->once())
@@ -439,24 +453,11 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @param $field
-     * @param $value
+     * @return void
      */
-    protected function getListMock($field, $value)
+    protected function initListMock()
     {
-        $currentPage = 1;
-        $pageSize = 10;
         $this->searchResultFactory->method('create')->willReturn($this->collection);
-        $this->searchCriteria->expects($this->once())->method('getFilterGroups')->willReturn([$this->filterGroup]);
-        $this->filterGroup->expects($this->once())->method('getFilters')->willReturn([$this->filter]);
-        $this->filter->expects($this->once())->method('getConditionType')->willReturn(null);
-        $this->filter->expects($this->once())->method('getField')->willReturn($field);
-        $this->filter->expects($this->once())->method('getValue')->willReturn($value);
-        $this->collection->expects($this->once())->method('addFieldToFilter')->with($field, ['eq' => $value]);
-        $this->searchCriteria->expects($this->once())->method('getCurrentPage')->willReturn($currentPage);
-        $this->searchCriteria->expects($this->once())->method('getPageSize')->willReturn($pageSize);
-        $this->collection->expects($this->once())->method('setCurPage')->with();
-        $this->collection->expects($this->once())->method('setPageSize')->with();
         $this->collection->expects($this->once())->method('addPaymentInformation')->with(['method']);
         $this->collection->expects($this->once())->method('addOrderInformation')->with(['increment_id']);
     }
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/ShipmentRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/ShipmentRepositoryTest.php
index 3f213e899a6c93dbbede4e1a8deb1e84db77a500..4b87dcbd69ab4f96a551bc39057995dc26f27933 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/ShipmentRepositoryTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/ShipmentRepositoryTest.php
@@ -32,6 +32,11 @@ class ShipmentRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $searchResultFactory;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     protected function setUp()
     {
         $objectManager = new ObjectManager($this);
@@ -51,12 +56,19 @@ class ShipmentRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->subject = $objectManager->getObject(
             \Magento\Sales\Model\Order\ShipmentRepository::class,
             [
                 'metadata' => $this->metadata,
-                'searchResultFactory' => $this->searchResultFactory
+                'searchResultFactory' => $this->searchResultFactory,
+                'collectionProcessor' => $this->collectionProcessor
             ]
         );
     }
@@ -131,56 +143,24 @@ class ShipmentRepositoryTest extends \PHPUnit_Framework_TestCase
 
     public function testGetList()
     {
-        $filter = $this->getMock(
-            \Magento\Framework\Api\Filter::class,
-            ['getConditionType', 'getField', 'getValue'],
-            [],
-            '',
-            false
-        );
-        $filter->expects($this->any())
-            ->method('getConditionType')
-            ->willReturn(false);
-        $filter->expects($this->any())
-            ->method('getField')
-            ->willReturn('test_field');
-        $filter->expects($this->any())
-            ->method('getValue')
-            ->willReturn('test_value');
-
-        $filterGroup = $this->getMock(
-            \Magento\Framework\Api\Search\FilterGroup::class,
-            ['getFilters'],
-            [],
-            '',
-            false
-        );
-        $filterGroup->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$filter]);
-
         $searchCriteria = $this->getMock(
             \Magento\Framework\Api\SearchCriteria::class,
-            ['getFilterGroups'],
+            [],
             [],
             '',
             false
         );
-        $searchCriteria->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn([$filterGroup]);
 
         $collection = $this->getMock(
             \Magento\Sales\Model\ResourceModel\Order\Shipment\Collection::class,
-            ['addFieldToFilter'],
+            [],
             [],
             '',
             false
         );
-        $collection->expects($this->once())
-            ->method('addFieldToFilter')
-            ->withAnyParameters();
-
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteria, $collection);
         $this->searchResultFactory->expects($this->once())
             ->method('create')
             ->willReturn($collection);
diff --git a/app/code/Magento/Sales/Test/Unit/Model/OrderRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/OrderRepositoryTest.php
index 67d7fa8852a456bb34be18e38aa6679ebf50e422..5535ac85095c57e40420e47fa427e0205ebc6aff 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/OrderRepositoryTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/OrderRepositoryTest.php
@@ -39,6 +39,11 @@ class OrderRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $objectManager;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * Setup the test
      */
@@ -51,12 +56,19 @@ class OrderRepositoryTest extends \PHPUnit_Framework_TestCase
 
         $className = \Magento\Sales\Api\Data\OrderSearchResultInterfaceFactory::class;
         $this->searchResultFactory = $this->getMock($className, ['create'], [], '', false);
-
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->model = $this->objectManager->getObject(
             \Magento\Sales\Model\OrderRepository::class,
             [
                 'metadata' => $this->metadata,
                 'searchResultFactory' => $this->searchResultFactory,
+                'collectionProcessor' => $this->collectionProcessor
             ]
         );
     }
@@ -67,12 +79,8 @@ class OrderRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetList()
     {
-        $fieldName = 'field';
         $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteria::class, [], [], '', false);
         $collectionMock = $this->getMock(\Magento\Sales\Model\ResourceModel\Order\Collection::class, [], [], '', false);
-        $filterGroupMock = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filterGroupFilterMock = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
-        $sortOrderMock = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
         $itemsMock = $this->getMockBuilder(OrderInterface::class)->disableOriginalConstructor()->getMock();
 
         $extensionAttributes = $this->getMock(
@@ -89,29 +97,15 @@ class OrderRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
         $itemsMock->expects($this->once())->method('getExtensionAttributes')->willReturn($extensionAttributes);
         $extensionAttributes->expects($this->any())
             ->method('getShippingAssignments')
             ->willReturn($shippingAssignmentBuilder);
 
         $this->searchResultFactory->expects($this->once())->method('create')->willReturn($collectionMock);
-
-        $searchCriteriaMock->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroupMock]);
-        $filterGroupMock->expects($this->once())->method('getFilters')->willReturn([$filterGroupFilterMock]);
-        $filterGroupFilterMock->expects($this->exactly(2))->method('getConditionType')->willReturn('eq');
-        $filterGroupFilterMock->expects($this->atLeastOnce())->method('getField')->willReturn($fieldName);
-        $filterGroupFilterMock->expects($this->once())->method('getValue')->willReturn('value');
-        $sortOrderMock->expects($this->once())->method('getDirection');
-        $searchCriteriaMock->expects($this->once())->method('getSortOrders')->willReturn([$sortOrderMock]);
-        $sortOrderMock->expects($this->atLeastOnce())->method('getField')->willReturn($fieldName);
-        $collectionMock->expects($this->once())->method('addFieldToFilter')
-            ->willReturn(SortOrder::SORT_ASC);
-        $collectionMock->expects($this->once())->method('addOrder')->with($fieldName, 'DESC');
-        $searchCriteriaMock->expects($this->once())->method('getCurrentPage')->willReturn(4);
-        $collectionMock->expects($this->once())->method('setCurPage')->with(4);
-        $searchCriteriaMock->expects($this->once())->method('getPageSize')->willReturn(42);
-        $collectionMock->expects($this->once())->method('setPageSize')->with(42);
         $collectionMock->expects($this->once())->method('getItems')->willReturn([$itemsMock]);
 
         $this->assertEquals($collectionMock, $this->model->getList($searchCriteriaMock));
diff --git a/app/code/Magento/SalesRule/Model/CouponRepository.php b/app/code/Magento/SalesRule/Model/CouponRepository.php
index c9b2fdfb868872f11ac16e037b9ce983fa837754..ad9b43f90e1a21227b08f3ae82d8daf157876d74 100644
--- a/app/code/Magento/SalesRule/Model/CouponRepository.php
+++ b/app/code/Magento/SalesRule/Model/CouponRepository.php
@@ -7,6 +7,7 @@
 namespace Magento\SalesRule\Model;
 
 use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Api\SortOrder;
 use Magento\SalesRule\Model\ResourceModel\Coupon\Collection;
 
@@ -47,13 +48,18 @@ class CouponRepository implements \Magento\SalesRule\Api\CouponRepositoryInterfa
      */
     protected $extensionAttributesJoinProcessor;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
+     * CouponRepository constructor.
      * @param CouponFactory $couponFactory
      * @param RuleFactory $ruleFactory
      * @param \Magento\SalesRule\Api\Data\CouponSearchResultInterfaceFactory $searchResultFactory
-     * @param \Magento\SalesRule\Model\ResourceModel\Coupon\CollectionFactory $collectionFactory
+     * @param ResourceModel\Coupon\CollectionFactory $collectionFactory
      * @param Spi\CouponResourceInterface $resourceModel
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+     * @param CollectionProcessorInterface|null $collectionProcessor
      */
     public function __construct(
         \Magento\SalesRule\Model\CouponFactory $couponFactory,
@@ -61,7 +67,8 @@ class CouponRepository implements \Magento\SalesRule\Api\CouponRepositoryInterfa
         \Magento\SalesRule\Api\Data\CouponSearchResultInterfaceFactory $searchResultFactory,
         \Magento\SalesRule\Model\ResourceModel\Coupon\CollectionFactory $collectionFactory,
         \Magento\SalesRule\Model\Spi\CouponResourceInterface $resourceModel,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->couponFactory = $couponFactory;
         $this->ruleFactory = $ruleFactory;
@@ -69,6 +76,7 @@ class CouponRepository implements \Magento\SalesRule\Api\CouponRepositoryInterfa
         $this->collectionFactory = $collectionFactory;
         $this->resourceModel = $resourceModel;
         $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -154,27 +162,7 @@ class CouponRepository implements \Magento\SalesRule\Api\CouponRepositoryInterfa
         $couponInterfaceName = \Magento\SalesRule\Api\Data\CouponInterface::class;
         $this->extensionAttributesJoinProcessor->process($collection, $couponInterfaceName);
 
-        //Add filters from root filter group to the collection
-        /** @var FilterGroup $group */
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
-
-        $sortOrders = $searchCriteria->getSortOrders();
-        if ($sortOrders === null) {
-            $sortOrders = [];
-        }
-        /** @var \Magento\Framework\Api\SortOrder $sortOrder */
-        foreach ($sortOrders as $sortOrder) {
-            $field = $sortOrder->getField();
-            $collection->addOrder(
-                $field,
-                ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-            );
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
-
+        $this->collectionProcessor->process($searchCriteria, $collection);
         $coupons = [];
         /** @var \Magento\SalesRule\Model\Coupon $couponModel */
         foreach ($collection->getItems() as $couponModel) {
@@ -215,6 +203,7 @@ class CouponRepository implements \Magento\SalesRule\Api\CouponRepositoryInterfa
      *
      * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
      * @param Collection $collection
+     * @deprecated
      * @return void
      */
     protected function addFilterGroupToCollection(
@@ -232,4 +221,20 @@ class CouponRepository implements \Magento\SalesRule\Api\CouponRepositoryInterfa
             $collection->addFieldToFilter($fields, $conditions);
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/SalesRule/Model/RuleRepository.php b/app/code/Magento/SalesRule/Model/RuleRepository.php
index e26d7ad144ffd583f64744f3a837957936f5fb8d..2d875e9ede06d165472533c0acabe2ae698849d7 100644
--- a/app/code/Magento/SalesRule/Model/RuleRepository.php
+++ b/app/code/Magento/SalesRule/Model/RuleRepository.php
@@ -6,6 +6,7 @@
 namespace Magento\SalesRule\Model;
 
 use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Api\SearchCriteriaInterface;
 use Magento\Framework\Api\SortOrder;
 use Magento\SalesRule\Model\ResourceModel\Rule\Collection;
@@ -62,16 +63,22 @@ class RuleRepository implements \Magento\SalesRule\Api\RuleRepositoryInterface
      */
     protected $ruleCollectionFactory;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
-     * @param \Magento\SalesRule\Model\RuleFactory $ruleFactory
+     * RuleRepository constructor.
+     * @param RuleFactory $ruleFactory
      * @param \Magento\SalesRule\Api\Data\RuleInterfaceFactory $ruleDataFactory
      * @param \Magento\SalesRule\Api\Data\ConditionInterfaceFactory $conditionDataFactory
-     * @param \Magento\SalesRule\Model\Converter\ToDataModel $toDataModelConverter
-     * @param \Magento\SalesRule\Model\Converter\ToModel $toModelConverter
+     * @param Converter\ToDataModel $toDataModelConverter
+     * @param Converter\ToModel $toModelConverter
      * @param \Magento\SalesRule\Api\Data\RuleSearchResultInterfaceFactory $searchResultFactory
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
-     * @param \Magento\SalesRule\Model\ResourceModel\Rule\CollectionFactory $ruleCollectionFactory
+     * @param ResourceModel\Rule\CollectionFactory $ruleCollectionFactory
      * @param \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor
+     * @param CollectionProcessorInterface|null $collectionProcessor
+     * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
         \Magento\SalesRule\Model\RuleFactory $ruleFactory,
@@ -82,7 +89,8 @@ class RuleRepository implements \Magento\SalesRule\Api\RuleRepositoryInterface
         \Magento\SalesRule\Api\Data\RuleSearchResultInterfaceFactory $searchResultFactory,
         \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor,
         \Magento\SalesRule\Model\ResourceModel\Rule\CollectionFactory $ruleCollectionFactory,
-        \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor
+        \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->ruleFactory = $ruleFactory;
         $this->ruleDataFactory = $ruleDataFactory;
@@ -93,6 +101,7 @@ class RuleRepository implements \Magento\SalesRule\Api\RuleRepositoryInterface
         $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
         $this->ruleCollectionFactory = $ruleCollectionFactory;
         $this->dataObjectProcessor = $dataObjectProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -134,28 +143,7 @@ class RuleRepository implements \Magento\SalesRule\Api\RuleRepositoryInterface
         $ruleInterfaceName = \Magento\SalesRule\Api\Data\RuleInterface::class;
         $this->extensionAttributesJoinProcessor->process($collection, $ruleInterfaceName);
 
-        //Add filters from root filter group to the collection
-        /** @var FilterGroup $group */
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
-
-        $sortOrders = $searchCriteria->getSortOrders();
-        if ($sortOrders === null) {
-            $sortOrders = [];
-        }
-        /** @var \Magento\Framework\Api\SortOrder $sortOrder */
-        foreach ($sortOrders as $sortOrder) {
-            $field = $sortOrder->getField();
-            $collection->addOrder(
-                $field,
-                ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-            );
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
-        $collection->load();
-
+        $this->collectionProcessor->process($searchCriteria, $collection);
         $rules = [];
         /** @var \Magento\SalesRule\Model\Rule $ruleModel */
         foreach ($collection->getItems() as $ruleModel) {
@@ -195,6 +183,7 @@ class RuleRepository implements \Magento\SalesRule\Api\RuleRepositoryInterface
      *
      * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
      * @param Collection $collection
+     * @deprecated
      * @return void
      */
     protected function addFilterGroupToCollection(
@@ -212,4 +201,20 @@ class RuleRepository implements \Magento\SalesRule\Api\RuleRepositoryInterface
             $collection->addFieldToFilter($fields, $conditions);
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/CouponRepositoryTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/CouponRepositoryTest.php
index 1257b100b21cce799c8efb0ec2daf1e042029aad..19dfc5e21c86ef1d8eceb6276f84e968becf6f84 100644
--- a/app/code/Magento/SalesRule/Test/Unit/Model/CouponRepositoryTest.php
+++ b/app/code/Magento/SalesRule/Test/Unit/Model/CouponRepositoryTest.php
@@ -57,6 +57,11 @@ class CouponRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $objectManager;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     protected function setUp()
     {
         $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -92,6 +97,14 @@ class CouponRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
 
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
+
         $this->model = $this->objectManager->getObject(
             \Magento\SalesRule\Model\CouponRepository::class,
             [
@@ -100,7 +113,8 @@ class CouponRepositoryTest extends \PHPUnit_Framework_TestCase
                 'searchResultFactory' => $this->searchResultFactory,
                 'collectionFactory' => $this->collectionFactory,
                 'resourceModel' => $this->resource,
-                'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessorMock
+                'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessorMock,
+                'collectionProcessor' => $this->collectionProcessor,
             ]
         );
     }
@@ -219,9 +233,6 @@ class CouponRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testGetList()
     {
         $collectionSize = 1;
-        $currentPage = 42;
-        $pageSize = 4;
-
         /**
          * @var \Magento\Framework\Api\SearchCriteriaInterface $searchCriteriaMock
          */
@@ -233,35 +244,16 @@ class CouponRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $filterGroupMock = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filterMock = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
-        $sortOrderMock = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
-
         $this->extensionAttributesJoinProcessorMock->expects($this->once())
             ->method('process')
             ->with($collectionMock, \Magento\SalesRule\Api\Data\CouponInterface::class);
-
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
         $this->searchResultsMock->expects($this->once())->method('setSearchCriteria')->with($searchCriteriaMock);
         $this->collectionFactory->expects($this->once())->method('create')->willReturn($collectionMock);
-        $searchCriteriaMock->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroupMock]);
-        $filterGroupMock->expects($this->once())->method('getFilters')->willReturn([$filterMock]);
-        $filterMock->expects($this->exactly(2))->method('getConditionType')->willReturn('eq');
-        $filterMock->expects($this->once())->method('getField')->willReturn(
-            'coupon_id'
-        );
-        $filterMock->expects($this->once())->method('getValue')->willReturn('value');
-        $collectionMock->expects($this->once())->method('addFieldToFilter')
-            ->with([0 => 'coupon_id'], [0 => ['eq' => 'value']]);
         $collectionMock->expects($this->once())->method('getSize')->willReturn($collectionSize);
         $this->searchResultsMock->expects($this->once())->method('setTotalCount')->with($collectionSize);
-        $searchCriteriaMock->expects($this->once())->method('getSortOrders')->willReturn([$sortOrderMock]);
-        $sortOrderMock->expects($this->once())->method('getField')->willReturn('sort_order');
-        $sortOrderMock->expects($this->once())->method('getDirection')->willReturn(SortOrder::SORT_ASC);
-        $collectionMock->expects($this->once())->method('addOrder')->with('sort_order', 'ASC');
-        $searchCriteriaMock->expects($this->once())->method('getCurrentPage')->willReturn($currentPage);
-        $collectionMock->expects($this->once())->method('setCurPage')->with($currentPage);
-        $searchCriteriaMock->expects($this->once())->method('getPageSize')->willReturn($pageSize);
-        $collectionMock->expects($this->once())->method('setPageSize')->with($pageSize);
         $collectionMock->expects($this->once())->method('getItems')->willReturn([]);
         $this->searchResultsMock->expects($this->once())->method('setItems')->with([]);
         $this->searchResultFactory->expects($this->once())->method('create')->willReturn($this->searchResultsMock);
diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/RuleRepositoryTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/RuleRepositoryTest.php
index 7412f8b05f87dacfdd38414739f4797a4dda2af0..4b309442c5545d018da91aaf79c7819220b17924 100644
--- a/app/code/Magento/SalesRule/Test/Unit/Model/RuleRepositoryTest.php
+++ b/app/code/Magento/SalesRule/Test/Unit/Model/RuleRepositoryTest.php
@@ -54,6 +54,11 @@ class RuleRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $toModelConverter;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     protected function setUp()
     {
         $this->ruleFactory = $this->getMock(\Magento\SalesRule\Model\RuleFactory::class, ['create'], [], '', false);
@@ -77,6 +82,13 @@ class RuleRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->extensionAttributesJoinProcessorMock = $this->getMock($className, ['process'], [], '', false);
 
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->ruleRepository = $objectManager->getObject(
             \Magento\SalesRule\Model\RuleRepository::class,
             [
@@ -85,7 +97,8 @@ class RuleRepositoryTest extends \PHPUnit_Framework_TestCase
                 'toModelConverter' =>  $this->toModelConverter,
                 'searchResultFactory' => $this->searchResultFactory,
                 'extensionAttributesJoinProcessor' => $this->extensionAttributesJoinProcessorMock,
-                'ruleCollectionFactory' => $this->collectionFactory
+                'ruleCollectionFactory' => $this->collectionFactory,
+                'collectionProcessor' => $this->collectionProcessor
             ]
         );
     }
@@ -134,9 +147,6 @@ class RuleRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testGetList()
     {
         $collectionSize = 1;
-        $currentPage = 42;
-        $pageSize = 4;
-
         /**
          * @var \Magento\Framework\Api\SearchCriteriaInterface $searchCriteriaMock
          */
@@ -148,9 +158,6 @@ class RuleRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $filterGroupMock = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filterMock = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
-        $sortOrderMock = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
 
         $this->extensionAttributesJoinProcessorMock->expects($this->once())
             ->method('process')
@@ -158,25 +165,11 @@ class RuleRepositoryTest extends \PHPUnit_Framework_TestCase
 
         $this->searchResultsMock->expects($this->once())->method('setSearchCriteria')->with($searchCriteriaMock);
         $this->collectionFactory->expects($this->once())->method('create')->willReturn($collectionMock);
-        $searchCriteriaMock->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroupMock]);
-        $filterGroupMock->expects($this->once())->method('getFilters')->willReturn([$filterMock]);
-        $filterMock->expects($this->exactly(2))->method('getConditionType')->willReturn('eq');
-        $filterMock->expects($this->once())->method('getField')->willReturn(
-            'rule_id'
-        );
-        $filterMock->expects($this->once())->method('getValue')->willReturn('value');
-        $collectionMock->expects($this->once())->method('addFieldToFilter')
-            ->with([0 => 'rule_id'], [0 => ['eq' => 'value']]);
         $collectionMock->expects($this->once())->method('getSize')->willReturn($collectionSize);
         $this->searchResultsMock->expects($this->once())->method('setTotalCount')->with($collectionSize);
-        $searchCriteriaMock->expects($this->once())->method('getSortOrders')->willReturn([$sortOrderMock]);
-        $sortOrderMock->expects($this->once())->method('getField')->willReturn('sort_order');
-        $sortOrderMock->expects($this->once())->method('getDirection')->willReturn(SortOrder::SORT_ASC);
-        $collectionMock->expects($this->once())->method('addOrder')->with('sort_order', 'ASC');
-        $searchCriteriaMock->expects($this->once())->method('getCurrentPage')->willReturn($currentPage);
-        $collectionMock->expects($this->once())->method('setCurPage')->with($currentPage);
-        $searchCriteriaMock->expects($this->once())->method('getPageSize')->willReturn($pageSize);
-        $collectionMock->expects($this->once())->method('setPageSize')->with($pageSize);
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
         $collectionMock->expects($this->once())->method('getItems')->willReturn([]);
         $this->searchResultsMock->expects($this->once())->method('setItems')->with([]);
         $this->searchResultFactory->expects($this->once())->method('create')->willReturn($this->searchResultsMock);
diff --git a/app/code/Magento/Search/view/frontend/web/form-mini.js b/app/code/Magento/Search/view/frontend/web/form-mini.js
index 7c9bc4255fb21e13a3fd20e94ea62bfcda5006a8..9bb254a724768d4795ef2cc8579a9c37ee3d1be9 100644
--- a/app/code/Magento/Search/view/frontend/web/form-mini.js
+++ b/app/code/Magento/Search/view/frontend/web/form-mini.js
@@ -79,6 +79,9 @@ define([
             }.bind(this));
 
             this.element.on('blur', $.proxy(function () {
+                if (!this.searchLabel.hasClass('active')) {
+                    return;
+                }
 
                 setTimeout($.proxy(function () {
                     if (this.autoComplete.is(':hidden')) {
diff --git a/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/CalculationData.php b/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/CalculationData.php
new file mode 100644
index 0000000000000000000000000000000000000000..ccbc5876146ab7a96a95d2d9a03b99a58a434ee7
--- /dev/null
+++ b/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/CalculationData.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Tax\Model\Api\SearchCriteria\JoinProcessor;
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor\CustomJoinInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+/**
+ * Class CalculationData
+ * @package Magento\Tax\Model\Api\SearchCriteria\JoinProcessor
+ */
+class CalculationData implements CustomJoinInterface
+{
+    /** Alias of table, that will be joined */
+    const CALCULATION_DATA_ALIAS = "cd";
+
+    /**
+     * @param \Magento\Tax\Model\ResourceModel\Calculation\Rule\Collection $collection
+     * @return bool
+     */
+    public function apply(AbstractDb $collection)
+    {
+        $isNotApplied = !array_key_exists(
+            self::CALCULATION_DATA_ALIAS,
+            $collection->getSelect()->getPart(\Magento\Framework\Db\Select::FROM)
+        );
+        if ($isNotApplied) {
+            $collection->joinCalculationData(self::CALCULATION_DATA_ALIAS);
+            return true;
+        }
+
+        return false;
+    }
+}
diff --git a/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/CustomerTaxClass.php b/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/CustomerTaxClass.php
new file mode 100644
index 0000000000000000000000000000000000000000..d7ea765b81e1844f012c4f0befda2fda86c99623
--- /dev/null
+++ b/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/CustomerTaxClass.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Tax\Model\Api\SearchCriteria\JoinProcessor;
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor\CustomJoinInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+/**
+ * Class CustomerTaxClass
+ * @package Magento\Tax\Model\Api\SearchCriteria\JoinProcessor
+ */
+class CustomerTaxClass implements CustomJoinInterface
+{
+    /**
+     * @param \Magento\Tax\Model\ResourceModel\Calculation\Rule\Collection $collection
+     * @return true
+     */
+    public function apply(AbstractDb $collection)
+    {
+        $collection->joinCalculationData('ctc');
+        return true;
+    }
+}
diff --git a/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/ProductTaxClass.php b/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/ProductTaxClass.php
new file mode 100644
index 0000000000000000000000000000000000000000..4245013599e1a6310dc71fb949f9f70cc9d2d28c
--- /dev/null
+++ b/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/ProductTaxClass.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Tax\Model\Api\SearchCriteria\JoinProcessor;
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor\CustomJoinInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+/**
+ * Class ProductTaxClass
+ * @package Magento\Tax\Model\Api\SearchCriteria\JoinProcessor
+ */
+class ProductTaxClass implements CustomJoinInterface
+{
+    /**
+     * @param \Magento\Tax\Model\ResourceModel\Calculation\Rule\Collection $collection
+     * @return true
+     */
+    public function apply(AbstractDb $collection)
+    {
+        $collection->joinCalculationData('ptc');
+        return true;
+    }
+}
diff --git a/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/Rate.php b/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/Rate.php
new file mode 100644
index 0000000000000000000000000000000000000000..f77ad5fd86b6ff0d228a0a2cfd885eabddcd58f5
--- /dev/null
+++ b/app/code/Magento/Tax/Model/Api/SearchCriteria/JoinProcessor/Rate.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Tax\Model\Api\SearchCriteria\JoinProcessor;
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor\CustomJoinInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+/**
+ * Class Rate
+ * @package Magento\Tax\Model\Api\SearchCriteria\JoinProcessor
+ */
+class Rate implements CustomJoinInterface
+{
+    /**
+     * @param \Magento\Tax\Model\ResourceModel\Calculation\Rule\Collection $collection
+     * @return true
+     */
+    public function apply(AbstractDb $collection)
+    {
+        $collection->joinCalculationData('rate');
+        return true;
+    }
+}
diff --git a/app/code/Magento/Tax/Model/Calculation/RateRepository.php b/app/code/Magento/Tax/Model/Calculation/RateRepository.php
index b2d63d99dc88564c0c9316b7452080d94f1c6c18..7dede7589bc842a184bdc2def2481dc281b0388b 100644
--- a/app/code/Magento/Tax/Model/Calculation/RateRepository.php
+++ b/app/code/Magento/Tax/Model/Calculation/RateRepository.php
@@ -10,7 +10,7 @@ namespace Magento\Tax\Model\Calculation;
 use Magento\Directory\Model\CountryFactory;
 use Magento\Directory\Model\RegionFactory;
 use Magento\Framework\Api\Search\FilterGroup;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Exception\InputException;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Tax\Model\Calculation\Rate;
@@ -68,6 +68,9 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface
      */
     protected $joinProcessor;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
      * @param Converter $converter
      * @param RateRegistry $rateRegistry
@@ -77,6 +80,7 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface
      * @param RegionFactory $regionFactory
      * @param \Magento\Tax\Model\ResourceModel\Calculation\Rate $rateResource
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      */
     public function __construct(
         Converter $converter,
@@ -86,7 +90,8 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface
         CountryFactory $countryFactory,
         RegionFactory $regionFactory,
         \Magento\Tax\Model\ResourceModel\Calculation\Rate $rateResource,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->converter = $converter;
         $this->rateRegistry = $rateRegistry;
@@ -96,6 +101,7 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface
         $this->regionFactory = $regionFactory;
         $this->resourceModel = $rateResource;
         $this->joinProcessor = $joinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -155,24 +161,7 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface
         $this->joinProcessor->process($collection);
         $collection->joinRegionTable();
 
-        //Add filters from root filter group to the collection
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
-
-        $sortOrders = $searchCriteria->getSortOrders();
-        /** @var SortOrder $sortOrder */
-        if ($sortOrders) {
-            foreach ($sortOrders as $sortOrder) {
-                $collection->addOrder(
-                    $this->translateField($sortOrder->getField()),
-                    ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-                );
-            }
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
-
+        $this->collectionProcessor->process($searchCriteria, $collection);
         $taxRate = [];
 
         /** @var \Magento\Tax\Model\Calculation\Rate $taxRateModel */
@@ -192,6 +181,7 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface
      * @param FilterGroup $filterGroup
      * @param Collection $collection
      * @return void
+     * @deprecated 
      * @throws \Magento\Framework\Exception\InputException
      */
     protected function addFilterGroupToCollection(FilterGroup $filterGroup, Collection $collection)
@@ -211,6 +201,7 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface
     /**
      * Translates a field name to a DB column name for use in collection queries.
      *
+     * @deprecated 
      * @param string $field a field name that should be translated to a DB column name.
      * @return string
      */
@@ -308,4 +299,20 @@ class RateRepository implements \Magento\Tax\Api\TaxRateRepositoryInterface
             throw $exception;
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Tax\Model\Api\SearchCriteria\TaxRateCollectionProcessor'
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Tax/Model/TaxClass/Repository.php b/app/code/Magento/Tax/Model/TaxClass/Repository.php
index 30fade99f5018c6cd98b6fe923e7de44a692e86b..2eb8b1757f4bf90ec9c1b8ab2d4ee082e3a7b691 100644
--- a/app/code/Magento/Tax/Model/TaxClass/Repository.php
+++ b/app/code/Magento/Tax/Model/TaxClass/Repository.php
@@ -9,8 +9,8 @@ namespace Magento\Tax\Model\TaxClass;
 
 use Magento\Framework\Api\FilterBuilder;
 use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Api\SearchCriteriaBuilder;
-use Magento\Framework\Api\SortOrder;
 use Magento\Framework\Exception\CouldNotDeleteException;
 use Magento\Framework\Exception\InputException;
 use Magento\Framework\Exception\LocalizedException as ModelException;
@@ -66,6 +66,9 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface
      */
     protected $joinProcessor;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
      * @param SearchCriteriaBuilder $searchCriteriaBuilder
      * @param FilterBuilder $filterBuilder
@@ -74,6 +77,7 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface
      * @param ClassModelRegistry $classModelRegistry
      * @param \Magento\Tax\Model\ResourceModel\TaxClass $taxClassResource
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+     * @param CollectionProcessorInterface $collectionProcessor
      */
     public function __construct(
         SearchCriteriaBuilder $searchCriteriaBuilder,
@@ -82,7 +86,8 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface
         \Magento\Tax\Api\Data\TaxClassSearchResultsInterfaceFactory $searchResultsFactory,
         ClassModelRegistry $classModelRegistry,
         \Magento\Tax\Model\ResourceModel\TaxClass $taxClassResource,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->searchCriteriaBuilder = $searchCriteriaBuilder;
         $this->filterBuilder = $filterBuilder;
@@ -91,6 +96,7 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface
         $this->classModelRegistry = $classModelRegistry;
         $this->taxClassResource = $taxClassResource;
         $this->joinProcessor = $joinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -203,34 +209,18 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface
         /** @var TaxClassCollection $collection */
         $collection = $this->taxClassCollectionFactory->create();
         $this->joinProcessor->process($collection);
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
+        $this->collectionProcessor->process($searchCriteria, $collection);
         $searchResults->setTotalCount($collection->getSize());
-        $sortOrders = $searchCriteria->getSortOrders();
-        /** @var SortOrder $sortOrder */
-        if ($sortOrders) {
-            foreach ($searchCriteria->getSortOrders() as $sortOrder) {
-                $collection->addOrder(
-                    $sortOrder->getField(),
-                    ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-                );
-            }
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
         $searchResults->setItems($collection->getItems());
         return $searchResults;
     }
 
     /**
      * Helper function that adds a FilterGroup to the collection.
-     *
-     * TODO: This method duplicates functionality of search methods in other services and should be refactored.
-     *
      * @param FilterGroup $filterGroup
      * @param TaxClassCollection $collection
      * @return void
+     * @deprecated
      */
     protected function addFilterGroupToCollection(FilterGroup $filterGroup, TaxClassCollection $collection)
     {
@@ -245,4 +235,20 @@ class Repository implements \Magento\Tax\Api\TaxClassRepositoryInterface
             $collection->addFieldToFilter($fields, $conditions);
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessor::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Tax/Model/TaxRuleRepository.php b/app/code/Magento/Tax/Model/TaxRuleRepository.php
index b63a1aef1dd073597093dc0bf268be66ab0b9167..312fca035f0e4a97591081b83d14e367aa572ae8 100644
--- a/app/code/Magento/Tax/Model/TaxRuleRepository.php
+++ b/app/code/Magento/Tax/Model/TaxRuleRepository.php
@@ -7,7 +7,7 @@
 namespace Magento\Tax\Model;
 
 use Magento\Framework\Api\Search\FilterGroup;
-use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\NoSuchEntityException;
@@ -56,6 +56,11 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface
      */
     protected $joinProcessor;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param TaxRuleRegistry $taxRuleRegistry
      * @param TaxRuleSearchResultsInterfaceFactory $searchResultsFactory
@@ -63,6 +68,7 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface
      * @param CollectionFactory $collectionFactory
      * @param ResourceRule $resource
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+     * @param CollectionProcessorInterface | null $collectionProcessor
      */
     public function __construct(
         TaxRuleRegistry $taxRuleRegistry,
@@ -70,7 +76,8 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface
         RuleFactory $ruleFactory,
         CollectionFactory $collectionFactory,
         ResourceRule $resource,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->taxRuleRegistry = $taxRuleRegistry;
         $this->taxRuleSearchResultsFactory = $searchResultsFactory;
@@ -78,6 +85,7 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface
         $this->collectionFactory = $collectionFactory;
         $this->resource = $resource;
         $this->joinProcessor = $joinProcessor;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -137,37 +145,11 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface
     {
         $searchResults = $this->taxRuleSearchResultsFactory->create();
         $searchResults->setSearchCriteria($searchCriteria);
-
-        $fields = [];
         $collection = $this->collectionFactory->create();
         $this->joinProcessor->process($collection);
 
-        //Add filters from root filter group to the collection
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-            foreach ($group->getFilters() as $filter) {
-                $fields[] = $this->translateField($filter->getField());
-            }
-        }
-        if ($fields) {
-            if (in_array('cd.customer_tax_class_id', $fields) || in_array('cd.product_tax_class_id', $fields)) {
-                $collection->joinCalculationData('cd');
-            }
-        }
-
+        $this->collectionProcessor->process($searchCriteria, $collection);
         $searchResults->setTotalCount($collection->getSize());
-        $sortOrders = $searchCriteria->getSortOrders();
-        /** @var SortOrder $sortOrder */
-        if ($sortOrders) {
-            foreach ($sortOrders as $sortOrder) {
-                $collection->addOrder(
-                    $this->translateField($sortOrder->getField()),
-                    ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-                );
-            }
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
 
         $searchResults->setItems($collection->getItems());
         return $searchResults;
@@ -179,6 +161,7 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface
      * @param FilterGroup $filterGroup
      * @param Collection $collection
      * @return void
+     * @deprecated
      * @throws \Magento\Framework\Exception\InputException
      */
     protected function addFilterGroupToCollection(FilterGroup $filterGroup, Collection $collection)
@@ -213,6 +196,7 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface
      * Translates a field name to a DB column name for use in collection queries.
      *
      * @param string $field a field name that should be translated to a DB column name.
+     * @deprecated
      * @return string
      */
     protected function translateField($field)
@@ -232,4 +216,20 @@ class TaxRuleRepository implements TaxRuleRepositoryInterface
                 return $field;
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                'Magento\Tax\Model\Api\SearchCriteria\TaxRuleCollectionProcessor'
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php
index 949b5e187546e0b87de48a9f0ac11f68b631b5e5..4a5a60a52e5034ef5b088704e34b0843bd8b4a76 100644
--- a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php
+++ b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php
@@ -13,6 +13,8 @@ use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Exception\AlreadyExistsException;
 
 /**
+ * Class RateRepositoryTest
+ * @package Magento\Tax\Test\Unit\Model\Calculation
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class RateRepositoryTest extends \PHPUnit_Framework_TestCase
@@ -67,6 +69,11 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     private $joinProcessorMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     protected function setUp()
     {
         $this->rateConverterMock = $this->getMock(
@@ -132,6 +139,13 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->model = new RateRepository(
             $this->rateConverterMock,
             $this->rateRegistryMock,
@@ -140,7 +154,8 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase
             $this->countryFactoryMock,
             $this->regionFactoryMock,
             $this->rateResourceMock,
-            $this->joinProcessorMock
+            $this->joinProcessorMock,
+            $this->collectionProcessor
         );
     }
 
@@ -243,12 +258,7 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testGetList()
     {
         $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
-        $searchCriteriaMock->expects($this->any())->method('getFilterGroups')->will($this->returnValue([]));
-        $searchCriteriaMock->expects($this->any())->method('getSortOrders')->will($this->returnValue([]));
-        $currentPage = 1;
-        $pageSize = 100;
-        $searchCriteriaMock->expects($this->any())->method('getCurrentPage')->will($this->returnValue($currentPage));
-        $searchCriteriaMock->expects($this->any())->method('getPageSize')->will($this->returnValue($pageSize));
+        $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
         $rateMock = $this->getTaxRateMock([]);
 
         $objectManager = new ObjectManager($this);
@@ -258,8 +268,6 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase
             $items
         );
         $collectionMock->expects($this->once())->method('joinRegionTable');
-        $collectionMock->expects($this->once())->method('setCurPage')->with($currentPage);
-        $collectionMock->expects($this->once())->method('setPageSize')->with($pageSize);
         $collectionMock->expects($this->once())->method('getSize')->will($this->returnValue(count($items)));
 
         $this->rateFactoryMock->expects($this->once())->method('create')->will($this->returnValue($rateMock));
@@ -270,6 +278,9 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase
             ->willReturnSelf();
         $this->searchResultMock->expects($this->once())->method('setSearchCriteria')->with($searchCriteriaMock)
             ->willReturnSelf();
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
         $this->searchResultFactory->expects($this->once())->method('create')->willReturn($this->searchResultMock);
 
         $this->joinProcessorMock->expects($this->once())->method('process')->with($collectionMock);
@@ -365,16 +376,6 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testGetListWhenFilterGroupExists()
     {
         $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
-        $filterGroupMock = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $searchCriteriaMock
-            ->expects($this->any())
-            ->method('getFilterGroups')
-            ->will($this->returnValue([$filterGroupMock]));
-        $filterMock = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
-        $filterGroupMock->expects($this->once())->method('getFilters')->willReturn([$filterMock]);
-        $filterMock->expects($this->exactly(2))->method('getConditionType')->willReturn('like');
-        $filterMock->expects($this->once())->method('getField')->willReturn('region_name');
-        $filterMock->expects($this->once())->method('getValue')->willReturn('condition_value');
         $objectManager = new ObjectManager($this);
         $rateMock = $this->getTaxRateMock([]);
         $items = [$rateMock];
@@ -382,27 +383,11 @@ class RateRepositoryTest extends \PHPUnit_Framework_TestCase
             \Magento\Tax\Model\ResourceModel\Calculation\Rate\Collection::class,
             $items
         );
-        $collectionMock
-            ->expects($this->once())
-            ->method('addFieldToFilter')
-            ->with(['region_table.code'], [['like' => 'condition_value']]);
-        $sortOrderMock = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
-        $searchCriteriaMock
-            ->expects($this->any())
-            ->method('getSortOrders')
-            ->will($this->returnValue([$sortOrderMock]));
-        $sortOrderMock->expects($this->once())->method('getField')->willReturn('field_name');
-        $sortOrderMock->expects($this->once())->method('getDirection')->willReturn(SortOrder::SORT_ASC);
-        $collectionMock->expects($this->once())->method('addOrder')->with('main_table.field_name', 'ASC');
-        $currentPage = 1;
-        $pageSize = 100;
-        $searchCriteriaMock->expects($this->any())->method('getCurrentPage')->will($this->returnValue($currentPage));
-        $searchCriteriaMock->expects($this->any())->method('getPageSize')->will($this->returnValue($pageSize));
         $rateMock = $this->getTaxRateMock([]);
-
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
         $collectionMock->expects($this->once())->method('joinRegionTable');
-        $collectionMock->expects($this->once())->method('setCurPage')->with($currentPage);
-        $collectionMock->expects($this->once())->method('setPageSize')->with($pageSize);
         $collectionMock->expects($this->once())->method('getSize')->will($this->returnValue(count($items)));
 
         $this->rateFactoryMock->expects($this->once())->method('create')->will($this->returnValue($rateMock));
diff --git a/app/code/Magento/Tax/Test/Unit/Model/TaxClass/RepositoryTest.php b/app/code/Magento/Tax/Test/Unit/Model/TaxClass/RepositoryTest.php
index 4a41d04fe7ac3d38a9f517a304b41ff2bfba7283..11a4fd40b5662d68958bf2a82311f82d0768e2f7 100644
--- a/app/code/Magento/Tax/Test/Unit/Model/TaxClass/RepositoryTest.php
+++ b/app/code/Magento/Tax/Test/Unit/Model/TaxClass/RepositoryTest.php
@@ -55,6 +55,12 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $extensionAttributesJoinProcessorMock;
 
+    /**
+     * @var \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface |
+     *  \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * @return void
      */
@@ -107,7 +113,13 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->model = $this->objectManager->getObject(
             \Magento\Tax\Model\TaxClass\Repository::class,
             [
@@ -115,7 +127,8 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
                 'taxClassResource' => $this->taxClassResourceMock,
                 'searchResultsFactory' => $this->searchResultFactory,
                 'taxClassCollectionFactory' => $this->taxClassCollectionFactory,
-                'joinProcessor' => $this->extensionAttributesJoinProcessorMock
+                'joinProcessor' => $this->extensionAttributesJoinProcessorMock,
+                'collectionProcessor' => $this->collectionProcessor
             ]
         );
     }
@@ -206,34 +219,18 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
         $taxClassOne = $this->getMock(\Magento\Tax\Api\Data\TaxClassInterface::class);
         $taxClassTwo = $this->getMock(\Magento\Tax\Api\Data\TaxClassInterface::class);
         $searchCriteria = $this->getMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
-        $filterGroup = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filter = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
         $collection = $this->getMock(\Magento\Tax\Model\ResourceModel\TaxClass\Collection::class, [], [], '', false);
-        $sortOrder = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
 
         $this->extensionAttributesJoinProcessorMock->expects($this->once())
             ->method('process')
             ->with($collection);
-
-        $searchCriteria->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroup]);
-        $filterGroup->expects($this->once())->method('getFilters')->willReturn([$filter]);
-        $filter->expects($this->atLeastOnce())->method('getConditionType')->willReturn('eq');
-        $filter->expects($this->once())->method('getField')->willReturn('field');
-        $filter->expects($this->once())->method('getValue')->willReturn('value');
-        $collection->expects($this->once())->method('addFieldToFilter')->with(['field'], [['eq' => 'value']]);
-
-        $searchCriteria->expects($this->exactly(2))->method('getSortOrders')->willReturn([$sortOrder]);
-        $sortOrder->expects($this->once())->method('getField')->willReturn('field');
-        $sortOrder->expects($this->once())->method('getDirection')->willReturn(SortOrder::SORT_ASC);
-        $collection->expects($this->once())->method('addOrder')->with('field', 'ASC');
-        $searchCriteria->expects($this->once())->method('getPageSize')->willReturn(20);
-        $searchCriteria->expects($this->once())->method('getCurrentPage')->willReturn(0);
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteria, $collection);
 
         $collection->expects($this->any())->method('getSize')->willReturn(2);
         $collection->expects($this->any())->method('setItems')->with([$taxClassOne, $taxClassTwo]);
         $collection->expects($this->any())->method('getItems')->willReturn([$taxClassOne, $taxClassTwo]);
-        $collection->expects($this->once())->method('setCurPage')->with(0);
-        $collection->expects($this->once())->method('setPageSize')->with(20);
 
         $this->searchResultMock->expects($this->once())->method('setSearchCriteria')->with($searchCriteria);
         $this->searchResultMock->expects($this->once())->method('setTotalCount')->with(2);
diff --git a/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php b/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php
index 773b12a382cdb2a069f5e01257733fcf055c3bf8..a0f53d82923e324d2956ebd9a23a954a8ab50364 100644
--- a/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php
+++ b/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php
@@ -9,6 +9,8 @@ use Magento\Framework\Api\SortOrder;
 use \Magento\Tax\Model\TaxRuleRepository;
 
 /**
+ * Class TaxRuleRepositoryTest
+ * @package Magento\Tax\Test\Unit\Model
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class TaxRuleRepositoryTest extends \PHPUnit_Framework_TestCase
@@ -58,9 +60,17 @@ class TaxRuleRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $objectManager;
 
+    /**
+     * @var \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface |
+     * \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     protected function setUp()
     {
         $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->taxRuleRegistry =
+            $this->getMock(\Magento\Tax\Model\Calculation\TaxRuleRegistry::class, [], [], '', false);
         $this->taxRuleRegistry = $this->getMock(
             \Magento\Tax\Model\Calculation\TaxRuleRegistry::class,
             [],
@@ -98,14 +108,21 @@ class TaxRuleRepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->model = new TaxRuleRepository(
             $this->taxRuleRegistry,
             $this->searchResultFactory,
             $this->ruleFactory,
             $this->collectionFactory,
             $this->resource,
-            $this->extensionAttributesJoinProcessorMock
+            $this->extensionAttributesJoinProcessorMock,
+            $this->collectionProcessor
         );
     }
 
@@ -189,44 +206,19 @@ class TaxRuleRepositoryTest extends \PHPUnit_Framework_TestCase
 
     public function testGetList()
     {
-        $collectionSize = 1;
-        $currentPage = 42;
-        $pageSize = 4;
-
         $searchCriteriaMock = $this->getMock(\Magento\Framework\Api\SearchCriteria::class, [], [], '', false);
         $collectionMock =
             $this->getMock(\Magento\Tax\Model\ResourceModel\Calculation\Rule\Collection::class, [], [], '', false);
-        $filterGroupMock = $this->getMock(\Magento\Framework\Api\Search\FilterGroup::class, [], [], '', false);
-        $filterMock = $this->getMock(\Magento\Framework\Api\Filter::class, [], [], '', false);
-        $sortOrderMock = $this->getMock(\Magento\Framework\Api\SortOrder::class, [], [], '', false);
+            $this->getMock(\Magento\Tax\Model\ResourceModel\Calculation\Rule\Collection::class, [], [], '', false);
 
         $this->extensionAttributesJoinProcessorMock->expects($this->once())
             ->method('process')
             ->with($collectionMock);
-
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
         $this->searchResultsMock->expects($this->once())->method('setSearchCriteria')->with($searchCriteriaMock);
         $this->collectionFactory->expects($this->once())->method('create')->willReturn($collectionMock);
-        $searchCriteriaMock->expects($this->once())->method('getFilterGroups')->willReturn([$filterGroupMock]);
-        $filterGroupMock->expects($this->exactly(2))->method('getFilters')->willReturn([$filterMock]);
-        $filterMock->expects($this->exactly(2))->method('getConditionType')->willReturn('eq');
-        $filterMock->expects($this->exactly(2))->method('getField')->willReturnOnConsecutiveCalls(
-            'rate.tax_calculation_rate_id',
-            'cd.customer_tax_class_id'
-        );
-        $filterMock->expects($this->once())->method('getValue')->willReturn('value');
-        $collectionMock->expects($this->exactly(2))->method('joinCalculationData')->withConsecutive(['rate'], ['cd']);
-        $collectionMock->expects($this->once())->method('addFieldToFilter')
-            ->with([0 => 'rate.tax_calculation_rate_id'], [0 => ['eq' => 'value']]);
-        $collectionMock->expects($this->once())->method('getSize')->willReturn($collectionSize);
-        $this->searchResultsMock->expects($this->once())->method('setTotalCount')->with($collectionSize);
-        $searchCriteriaMock->expects($this->once())->method('getSortOrders')->willReturn([$sortOrderMock]);
-        $sortOrderMock->expects($this->once())->method('getField')->willReturn('sort_order');
-        $sortOrderMock->expects($this->once())->method('getDirection')->willReturn(SortOrder::SORT_ASC);
-        $collectionMock->expects($this->once())->method('addOrder')->with('position', 'ASC');
-        $searchCriteriaMock->expects($this->once())->method('getCurrentPage')->willReturn($currentPage);
-        $collectionMock->expects($this->once())->method('setCurPage')->with($currentPage);
-        $searchCriteriaMock->expects($this->once())->method('getPageSize')->willReturn($pageSize);
-        $collectionMock->expects($this->once())->method('setPageSize')->with($pageSize);
         $collectionMock->expects($this->once())->method('getItems')->willReturn([]);
         $this->searchResultsMock->expects($this->once())->method('setItems')->with([]);
         $this->searchResultFactory->expects($this->once())->method('create')->willReturn($this->searchResultsMock);
diff --git a/app/code/Magento/Tax/etc/di.xml b/app/code/Magento/Tax/etc/di.xml
index 09f969423f71575f0f9537b2da494103217722fd..811272040314956c37204a9ce20c17191ee194ab 100644
--- a/app/code/Magento/Tax/etc/di.xml
+++ b/app/code/Magento/Tax/etc/di.xml
@@ -85,4 +85,87 @@
             <argument name="connectionName" xsi:type="string">sales</argument>
         </arguments>
     </type>
+    <type name="Magento\Tax\Model\TaxRuleRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\TaxRuleCollectionProcessor</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Tax\Model\Calculation\RateRepository">
+        <arguments>
+            <argument name="collectionProcessor" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\TaxRateCollectionProcessor</argument>
+        </arguments>
+    </type>
+    <virtualType name="Magento\Tax\Model\Api\SearchCriteria\TaxRateCollectionProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="filters" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\CollectionProcessor\TaxRateFilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Tax\Model\Api\SearchCriteria\CollectionProcessor\TaxRateFilterProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
+        <arguments>
+            <argument name="fieldMapping" xsi:type="array">
+                <item name="tax_calculation_rate_id" xsi:type="string">main_table.tax_calculation_rate_id</item>
+                <item name="tax_country_id" xsi:type="string">main_table.tax_country_id</item>
+                <item name="tax_region_id" xsi:type="string">main_table.tax_region_id</item>
+                <item name="code" xsi:type="string">main_table.code</item>
+                <item name="rate" xsi:type="string">main_table.rate</item>
+                <item name="zip_is_range" xsi:type="string">main_table.zip_is_range</item>
+                <item name="zip_from" xsi:type="string">main_table.zip_from</item>
+                <item name="zip_to" xsi:type="string">main_table.zip_to</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Tax\Model\Api\SearchCriteria\CollectionProcessor\TaxRuleJoinProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor">
+        <arguments>
+            <argument name="customJoins" xsi:type="array">
+                <item name="rate.tax_calculation_rate_id" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\JoinProcessor\Rate</item>
+                <item name="ctc.customer_tax_class_id" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\JoinProcessor\CustomerTaxClass</item>
+                <item name="ptc.product_tax_class_id" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\JoinProcessor\ProductTaxClass</item>
+                <item name="cd.customer_tax_class_id" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\JoinProcessor\CalculationData</item>
+                <item name="cd.product_tax_class_id" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\JoinProcessor\CalculationData</item>
+            </argument>
+            <argument name="fieldMapping" xsi:type="array">
+                <item name="id" xsi:type="string">tax_calculation_rule_id</item>
+                <item name="tax_rate_ids" xsi:type="string">tax_calculation_rate_id</item>
+                <item name="customer_tax_class_ids" xsi:type="string">cd.customer_tax_class_id</item>
+                <item name="product_tax_class_ids" xsi:type="string">cd.product_tax_class_id</item>
+                <item name="tax_calculation_rate_id" xsi:type="string">rate.tax_calculation_rate_id</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Tax\Model\Api\SearchCriteria\CollectionProcessor\TaxRuleSortingProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor">
+        <arguments>
+            <argument name="fieldMapping" xsi:type="array">
+                <item name="id" xsi:type="string">tax_calculation_rule_id</item>
+                <item name="tax_rate_ids" xsi:type="string">tax_calculation_rate_id</item>
+                <item name="customer_tax_class_ids" xsi:type="string">cd.customer_tax_class_id</item>
+                <item name="product_tax_class_ids" xsi:type="string">cd.product_tax_class_id</item>
+                <item name="tax_calculation_rate_id" xsi:type="string">rate.tax_calculation_rate_id</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Tax\Model\Api\SearchCriteria\CollectionProcessor\TaxRuleFilterProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
+        <arguments>
+            <argument name="fieldMapping" xsi:type="array">
+                <item name="id" xsi:type="string">tax_calculation_rule_id</item>
+                <item name="tax_rate_ids" xsi:type="string">tax_calculation_rate_id</item>
+                <item name="customer_tax_class_ids" xsi:type="string">cd.customer_tax_class_id</item>
+                <item name="product_tax_class_ids" xsi:type="string">cd.product_tax_class_id</item>
+                <item name="tax_calculation_rate_id" xsi:type="string">rate.tax_calculation_rate_id</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\Tax\Model\Api\SearchCriteria\TaxRuleCollectionProcessor" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="joins" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\CollectionProcessor\TaxRuleJoinProcessor</item>
+                <item name="filters" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\CollectionProcessor\TaxRuleFilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Tax\Model\Api\SearchCriteria\CollectionProcessor\TaxRuleSortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
 </config>
diff --git a/app/code/Magento/Ui/Model/BookmarkManagement.php b/app/code/Magento/Ui/Model/BookmarkManagement.php
index bcfc137d9305720e5e27a045f73dc7b6201e7e10..83f1155d2cb25223aed081ce3cec872c6ab9f478 100644
--- a/app/code/Magento/Ui/Model/BookmarkManagement.php
+++ b/app/code/Magento/Ui/Model/BookmarkManagement.php
@@ -51,20 +51,19 @@ class BookmarkManagement implements \Magento\Ui\Api\BookmarkManagementInterface
      */
     public function loadByNamespace($namespace)
     {
-        $this->searchCriteriaBuilder->addFilters(
-            [
-                $this->filterBuilder
-                    ->setField('user_id')
-                    ->setConditionType('eq')
-                    ->setValue($this->userContext->getUserId())
-                    ->create(),
-                $this->filterBuilder
-                    ->setField('namespace')
-                    ->setConditionType('eq')
-                    ->setValue($namespace)
-                    ->create(),
-            ]
-        );
+        $userIdFilter = $this->filterBuilder
+            ->setField('user_id')
+            ->setConditionType('eq')
+            ->setValue($this->userContext->getUserId())
+            ->create();
+        $namespaceFilter = $this->filterBuilder
+            ->setField('namespace')
+            ->setConditionType('eq')
+            ->setValue($namespace)
+            ->create();
+
+        $this->searchCriteriaBuilder->addFilters([$userIdFilter]);
+        $this->searchCriteriaBuilder->addFilters([$namespaceFilter]);
 
         $searchCriteria = $this->searchCriteriaBuilder->create();
         $searchResults = $this->bookmarkRepository->getList($searchCriteria);
@@ -77,25 +76,25 @@ class BookmarkManagement implements \Magento\Ui\Api\BookmarkManagementInterface
      */
     public function getByIdentifierNamespace($identifier, $namespace)
     {
-        $this->searchCriteriaBuilder->addFilters(
-            [
-                $this->filterBuilder
-                    ->setField('user_id')
-                    ->setConditionType('eq')
-                    ->setValue($this->userContext->getUserId())
-                    ->create(),
-                $this->filterBuilder
-                    ->setField('identifier')
-                    ->setConditionType('eq')
-                    ->setValue($identifier)
-                    ->create(),
-                $this->filterBuilder
-                    ->setField('namespace')
-                    ->setConditionType('eq')
-                    ->setValue($namespace)
-                    ->create(),
-            ]
-        );
+        $userIdFilter = $this->filterBuilder
+            ->setField('user_id')
+            ->setConditionType('eq')
+            ->setValue($this->userContext->getUserId())
+            ->create();
+        $identifierFilter = $this->filterBuilder
+            ->setField('identifier')
+            ->setConditionType('eq')
+            ->setValue($identifier)
+            ->create();
+        $namespaceFilter = $this->filterBuilder
+            ->setField('namespace')
+            ->setConditionType('eq')
+            ->setValue($namespace)
+            ->create();
+
+        $this->searchCriteriaBuilder->addFilters([$userIdFilter]);
+        $this->searchCriteriaBuilder->addFilters([$identifierFilter]);
+        $this->searchCriteriaBuilder->addFilters([$namespaceFilter]);
 
         $searchCriteria = $this->searchCriteriaBuilder->create();
         $searchResults = $this->bookmarkRepository->getList($searchCriteria);
diff --git a/app/code/Magento/Ui/Model/ResourceModel/BookmarkRepository.php b/app/code/Magento/Ui/Model/ResourceModel/BookmarkRepository.php
index 150983825f6e0dd861569079bede1ec7a4aa61fa..76c2e3cab000ed6e82551c9de6ecaffd6fe89d94 100644
--- a/app/code/Magento/Ui/Model/ResourceModel/BookmarkRepository.php
+++ b/app/code/Magento/Ui/Model/ResourceModel/BookmarkRepository.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Ui\Model\ResourceModel;
 
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Api\SearchCriteriaInterface;
 use Magento\Framework\Api\SortOrder;
 use Magento\Ui\Api\BookmarkRepositoryInterface;
@@ -37,20 +38,28 @@ class BookmarkRepository implements BookmarkRepositoryInterface
      */
     protected $searchResultsFactory;
 
+    /**
+     * @var CollectionProcessorInterface
+     */
+    private $collectionProcessor;
+
     /**
      * @param \Magento\Ui\Api\Data\BookmarkInterfaceFactory $bookmarkFactory
      * @param Bookmark $bookmarkResourceModel
      * @param \Magento\Ui\Api\Data\BookmarkSearchResultsInterfaceFactory $searchResultsFactory
+     * @param CollectionProcessorInterface | null $collectionProcessor
      */
     public function __construct(
         \Magento\Ui\Api\Data\BookmarkInterfaceFactory $bookmarkFactory,
         \Magento\Ui\Model\ResourceModel\Bookmark $bookmarkResourceModel,
-        \Magento\Ui\Api\Data\BookmarkSearchResultsInterfaceFactory $searchResultsFactory
+        \Magento\Ui\Api\Data\BookmarkSearchResultsInterfaceFactory $searchResultsFactory,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
 
         $this->bookmarkResourceModel = $bookmarkResourceModel;
         $this->bookmarkFactory = $bookmarkFactory;
         $this->searchResultsFactory = $searchResultsFactory;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -101,24 +110,8 @@ class BookmarkRepository implements BookmarkRepositoryInterface
 
         /** @var \Magento\Ui\Model\ResourceModel\Bookmark\Collection $collection */
         $collection = $this->bookmarkFactory->create()->getCollection();
-        // Add filters from root filter group to the collection
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
+        $this->collectionProcessor->process($searchCriteria, $collection);
         $searchResults->setTotalCount($collection->getSize());
-        $sortOrders = $searchCriteria->getSortOrders();
-        if ($sortOrders) {
-            /** @var SortOrder $sortOrder */
-            foreach ($sortOrders as $sortOrder) {
-                $field = $sortOrder->getField();
-                $collection->addOrder(
-                    $field,
-                    ($sortOrder->getDirection() == SortOrder::SORT_ASC) ? 'ASC' : 'DESC'
-                );
-            }
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
 
         $bookmarks = [];
         /** @var BookmarkInterface $bookmark */
@@ -166,6 +159,7 @@ class BookmarkRepository implements BookmarkRepositoryInterface
      * @param FilterGroup $filterGroup
      * @param Collection $collection
      * @return void
+     * @deprecated
      * @throws \Magento\Framework\Exception\InputException
      */
     protected function addFilterGroupToCollection(FilterGroup $filterGroup, Collection $collection)
@@ -175,4 +169,20 @@ class BookmarkRepository implements BookmarkRepositoryInterface
             $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Ui/Test/Unit/Model/BookmarkManagementTest.php b/app/code/Magento/Ui/Test/Unit/Model/BookmarkManagementTest.php
index 4f2eb225ba0deae73c7933a7889a7be5e5766a9a..10a665a0be397f74bc5aa4ef398c789793d84437 100644
--- a/app/code/Magento/Ui/Test/Unit/Model/BookmarkManagementTest.php
+++ b/app/code/Magento/Ui/Test/Unit/Model/BookmarkManagementTest.php
@@ -89,9 +89,9 @@ class BookmarkManagementTest extends \PHPUnit_Framework_TestCase
         $this->filterBuilder->expects($this->at(1))
             ->method('create')
             ->willReturn($fieldNamespace);
-        $this->searchCriteriaBuilder->expects($this->once())
+        $this->searchCriteriaBuilder->expects($this->exactly(2))
             ->method('addFilters')
-            ->with([$fieldUserId, $fieldNamespace]);
+            ->withConsecutive([[$fieldUserId]], [[$fieldNamespace]]);
         $this->searchCriteriaBuilder->expects($this->once())
             ->method('create')
             ->willReturn($searchCriteria);
@@ -147,9 +147,9 @@ class BookmarkManagementTest extends \PHPUnit_Framework_TestCase
         $this->filterBuilder->expects($this->at(2))
             ->method('create')
             ->willReturn($fieldNamespace);
-        $this->searchCriteriaBuilder->expects($this->once())
+        $this->searchCriteriaBuilder->expects($this->exactly(3))
             ->method('addFilters')
-            ->with([$fieldUserId, $fieldIdentifier, $fieldNamespace]);
+            ->withConsecutive([[$fieldUserId]], [[$fieldIdentifier]], [[$fieldNamespace]]);
         $this->searchCriteriaBuilder->expects($this->once())
             ->method('create')
             ->willReturn($searchCriteria);
diff --git a/app/code/Magento/Ui/Test/Unit/Model/ResourceModel/BookmarkRepositoryTest.php b/app/code/Magento/Ui/Test/Unit/Model/ResourceModel/BookmarkRepositoryTest.php
index 8a3d43354e8767cadd34ba7ae1bd482f3e03fd33..9feb02072c1582f51fbee626a481a201151ebae2 100644
--- a/app/code/Magento/Ui/Test/Unit/Model/ResourceModel/BookmarkRepositoryTest.php
+++ b/app/code/Magento/Ui/Test/Unit/Model/ResourceModel/BookmarkRepositoryTest.php
@@ -36,6 +36,11 @@ class BookmarkRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $searchResultsMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * Set up
      */
@@ -64,11 +69,18 @@ class BookmarkRepositoryTest extends \PHPUnit_Framework_TestCase
             \Magento\Ui\Api\Data\BookmarkSearchResultsInterfaceFactory::class
         )->disableOriginalConstructor()->setMethods(['create'])->getMock();
         $searchResultsFactoryMock->expects($this->any())->method('create')->willReturn($this->searchResultsMock);
-
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->bookmarkRepository = new BookmarkRepository(
             $bookmarkFactoryMock,
             $this->bookmarkResourceMock,
-            $searchResultsFactoryMock
+            $searchResultsFactoryMock,
+            $this->collectionProcessor
         );
     }
 
@@ -143,10 +155,7 @@ class BookmarkRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testGetList()
     {
         $bookmarkId = 1;
-        $fieldNameAsc = 'first_field';
-        $fieldValueAsc = 'first_value';
-        $fieldNameDesc = 'second_field';
-        $fieldValueDesc = 'second_value';
+
         $this->bookmarkMock->expects($this->any())
             ->method('getId')
             ->willReturn($bookmarkId);
@@ -154,77 +163,17 @@ class BookmarkRepositoryTest extends \PHPUnit_Framework_TestCase
             ->method('load')
             ->with($this->bookmarkMock, $bookmarkId)
             ->willReturn($this->bookmarkMock);
-        $filterGroup = $this->getMockBuilder(\Magento\Framework\Api\Search\FilterGroup::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $sortOrderAsc = $this->getMockBuilder(\Magento\Framework\Api\SortOrder::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $sortOrderAsc->expects($this->once())
-            ->method('getField')
-            ->willReturn($fieldNameAsc);
-        $sortOrderAsc->expects($this->once())
-            ->method('getDirection')
-            ->willReturn(SortOrder::SORT_ASC);
-        $sortOrderDesc = $this->getMockBuilder(\Magento\Framework\Api\SortOrder::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $sortOrderDesc->expects($this->once())
-            ->method('getField')
-            ->willReturn($fieldNameDesc);
-        $sortOrderDesc->expects($this->once())
-            ->method('getDirection')
-            ->willReturn(SortOrder::SORT_DESC);
-        $fieldAsc = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $fieldAsc->expects($this->once())
-            ->method('getField')
-            ->willReturn($fieldNameAsc);
-        $fieldAsc->expects($this->once())
-            ->method('getValue')
-            ->willReturn($fieldValueAsc);
-        $fieldAsc->expects($this->any())
-            ->method('getConditionType')
-            ->willReturn(false);
-        $fieldDesc = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $fieldDesc->expects($this->once())
-            ->method('getField')
-            ->willReturn($fieldNameDesc);
-        $fieldDesc->expects($this->once())
-            ->method('getValue')
-            ->willReturn($fieldValueDesc);
-        $fieldDesc->expects($this->any())
-            ->method('getConditionType')
-            ->willReturn('eq');
-        $filterGroup->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$fieldAsc, $fieldDesc]);
         $collection = $this->getMockBuilder(\Magento\Ui\Model\ResourceModel\Bookmark\Collection::class)
             ->disableOriginalConstructor()
             ->getMock();
         $collection->expects($this->once())
             ->method('getItems')
             ->willReturn([$this->bookmarkMock]);
-        $collection->expects($this->any())
-            ->method('addOrder')
-            ->willReturnMap([[$fieldNameAsc, SortOrder::SORT_ASC], [$fieldNameDesc, SortOrder::SORT_DESC]]);
-        $collection->expects($this->any())
-            ->method('addFieldToFilter')
-            ->willReturnMap([[$fieldNameAsc, [$fieldValueAsc => 'eq']], [$fieldNameDesc, [$fieldValueDesc => 'eq']]]);
         $this->bookmarkMock->expects($this->once())
             ->method('getCollection')
             ->willReturn($collection);
         $searchCriteria = $this->getMockBuilder(\Magento\Framework\Api\SearchCriteriaInterface::class)
             ->getMockForAbstractClass();
-        $searchCriteria->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn([$filterGroup]);
-        $searchCriteria->expects($this->once())
-            ->method('getSortOrders')
-            ->willReturn([$sortOrderAsc, $sortOrderDesc]);
         $this->assertEquals($this->searchResultsMock, $this->bookmarkRepository->getList($searchCriteria));
     }
 
diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/select.js b/app/code/Magento/Ui/view/base/web/js/form/element/select.js
index ebcbd96789588b30abd833bf3a9684181c9a83a9..1887639c8d0313fe466aadb89b3cdaf7adc6bd81 100644
--- a/app/code/Magento/Ui/view/base/web/js/form/element/select.js
+++ b/app/code/Magento/Ui/view/base/web/js/form/element/select.js
@@ -44,9 +44,9 @@ define([
                 if (_.isUndefined(caption)) {
                     caption = node.label;
                 }
-            } else {
-                return node;
             }
+
+            return node;
         });
 
         return {
@@ -194,7 +194,7 @@ define([
         },
 
         /**
-         * Matches specfied value with existing options
+         * Matches specified value with existing options
          * or, if value is not specified, returns value of the first option.
          *
          * @returns {*}
@@ -286,6 +286,11 @@ define([
             return preview;
         },
 
+        /**
+         *
+         * @param {Number} value
+         * @returns {Object} Chainable
+         */
         getOption: function (value) {
             return this.indexedOptions[value];
         },
@@ -301,6 +306,19 @@ define([
             this.value(value);
 
             return this;
+        },
+
+        /**
+         * Initializes observable properties of instance
+         *
+         * @returns {Object} Chainable.
+         */
+        setInitialValue: function () {
+            if (_.isUndefined(this.value()) && !this.default) {
+                this.clear();
+            }
+
+            return this._super();
         }
     });
 });
diff --git a/app/code/Magento/Ui/view/base/web/js/grid/filters/filters.js b/app/code/Magento/Ui/view/base/web/js/grid/filters/filters.js
index 0ce86c5fad84fa63aaabf2023fe8b87e462e39ab..24e502549ac0b61871a7a75828ab417b4f98202d 100644
--- a/app/code/Magento/Ui/view/base/web/js/grid/filters/filters.js
+++ b/app/code/Magento/Ui/view/base/web/js/grid/filters/filters.js
@@ -31,7 +31,11 @@ define([
      * @returns {Object}
      */
     function removeEmpty(data) {
-        return utils.mapRecursive(data, utils.removeEmptyValues.bind(utils));
+        var result = utils.mapRecursive(data, utils.removeEmptyValues.bind(utils));
+
+        return utils.mapRecursive(result, function (value) {
+            return _.isString(value) ? value.trim() : value;
+        });
     }
 
     return Collection.extend({
diff --git a/app/code/Magento/Ui/view/base/web/js/grid/search/search.js b/app/code/Magento/Ui/view/base/web/js/grid/search/search.js
index 5760866ec337675c5985800d1e3499548e5ff5e1..16b850e7641d65560039b0c09f8986f6d232699b 100644
--- a/app/code/Magento/Ui/view/base/web/js/grid/search/search.js
+++ b/app/code/Magento/Ui/view/base/web/js/grid/search/search.js
@@ -105,7 +105,7 @@ define([
         apply: function (value) {
             value = value || this.inputValue;
 
-            this.value = this.inputValue = value;
+            this.value = this.inputValue = value.trim();
 
             return this;
         },
diff --git a/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/tooltip.js b/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/tooltip.js
index 819058ff7a8ddac22d2fce028e408c963333e218..6040b1efa7a85707ddc36d66f031447d42bc95c5 100644
--- a/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/tooltip.js
+++ b/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/tooltip.js
@@ -599,6 +599,8 @@ define([
             }
 
             tooltip.setContent.apply(null, arguments);
+
+            return false;
         },
 
         /**
diff --git a/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/cells/action-delete.html b/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/cells/action-delete.html
index a8a77d593fe9858ac6d49c7ddbb80cc3bb50b6a7..854705a75d5ce0bff3e409bcf7768131a17e7095 100644
--- a/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/cells/action-delete.html
+++ b/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/cells/action-delete.html
@@ -12,5 +12,5 @@
                 title: $parent.deleteButtonLabel
             }
         ">
-    <span data-bind="text: $parent.deleteButtonLabel"></span>
+    <span translate="$parent.deleteButtonLabel"></span>
 </button>
\ No newline at end of file
diff --git a/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/collapsible.html b/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/collapsible.html
index 64f78bd64fc0e84d41d852ee5e535875d4323ca0..aa4e21c9c2ef9e5e8353976f1a93fc6ea12049a6 100644
--- a/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/collapsible.html
+++ b/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/collapsible.html
@@ -6,7 +6,7 @@
 -->
 <div class="admin__field" css="element.setClasses(element)">
     <label if="element.label" class="admin__field-label" attr="for: element.uid">
-        <span text="element.label"/>
+        <span translate="element.label"/>
     </label>
 
     <div class="admin__field-control" data-role="grid-wrapper">
@@ -22,7 +22,7 @@
 
             <thead if="element.columnsHeader">
             <tr data-bind="foreach: {data: labels, as: 'label'}">
-                <th text="label.config.label"
+                <th translate="label.config.label"
                     css="item.columnsHeaderClasses">
                 </th>
             </tr>
@@ -39,7 +39,7 @@
                                 <render args="name: $parents[1].dndConfig.template, data: $parents[1].dnd"
                                         if="$parents[1].dndConfig.enabled" />
 
-                                <span text="$parent.getLabel(elem)" />
+                                <span translate="$parent.getLabel(elem)" />
                             </div>
 
                             <button class="action-delete"
@@ -48,7 +48,7 @@
                                     click="function(){
                                             $parents[1].deleteRecord($parent.index, $parent.recordId)
                                         }">
-                                <span text="'Delete'"/>
+                                <span translate="'Delete'"/>
                             </button>
                         </div>
 
@@ -66,7 +66,7 @@
             <button attr="{disabled: disabled}"
                     type="button"
                     click="addChild.bind($data, false, false)">
-                <span text="addButtonLabel"/>
+                <span translate="addButtonLabel"/>
             </button>
         </div>
     </div>
diff --git a/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/default.html b/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/default.html
index 57b7fdaad17ef9e9a818cb7bf8e08a17d1b71c4c..6e1588d7296855ed29e107515b1a02c1802ccb76 100644
--- a/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/default.html
+++ b/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/default.html
@@ -6,7 +6,7 @@
 -->
 <div class="admin__field" visible="visible" disable="disabled" css="element.setClasses(element)">
     <label if="element.label" class="admin__field-label" attr="for: element.uid">
-        <span text="element.label"/>
+        <span translate="element.label"/>
     </label>
 
     <div class="admin__field-control" data-role="grid-wrapper" attr="'data-index': index">
@@ -24,7 +24,7 @@
                     <tr>
                         <th if="dndConfig.enabled"/>
                         <th repeat="foreach: labels, item: '$label'"
-                            text="$label().label"
+                            translate="$label().label"
                             css="setClasses($label())"
                             visible="$label().visible"
                             disable="$label().disabled"
@@ -56,7 +56,7 @@
                                     attr="{disabled: disabled, 'data-action': 'add_new_row'}"
                                     type="button"
                                     click="processingAddChild.bind($data, false, false, false)">
-                                <span text="addButtonLabel"/>
+                                <span translate="addButtonLabel"/>
                             </button>
 
                             <div class="admin__control-table-pagination" visible="!!$data.recordData().length && (pages() > 1)">
diff --git a/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/grid.html b/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/grid.html
index 13f1bed36d2975ce5a9f842f8cc57fa6cb6740b6..3a5b8ad4631c49ec8c3042a0d8f8af3443ce594a 100644
--- a/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/grid.html
+++ b/app/code/Magento/Ui/view/base/web/templates/dynamic-rows/templates/grid.html
@@ -11,7 +11,7 @@
      css="element.setClasses(element)"
      attr="'data-index': index">
     <label if="element.label" class="admin__field-label" attr="for: element.uid">
-        <span text="element.label"/>
+        <span translate="element.label"/>
     </label>
 
     <div class="admin__field-control" data-role="grid-wrapper">
@@ -40,7 +40,7 @@
 
                     <th repeat="foreach: labels, item: '$label'"
                         class="data-grid-th"
-                        text="$label().label"
+                        translate="$label().label"
                         visible="$label().visible"
                         disable="$label().disabled"
                         css="$label().columnsHeaderClasses">
@@ -73,7 +73,7 @@
             <button attr="{disabled: disabled}"
                     type="button"
                     click="addChild.bind($data, false, false)">
-                <span text="addButtonLabel"/>
+                <span translate="addButtonLabel"/>
             </button>
         </div>
         <render args="fallbackResetTpl" if="$data.showFallbackReset && $data.isDifferedFromDefault"/>
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 7415b4e6c330e8e8b1c21a3299b0c01fc34b6fd4..63c34c1a433129ddf427ecd8104743083a81e98b 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
@@ -6,7 +6,7 @@
 -->
 <div class="admin__field" visible="visible" css="$data.additionalClasses">
     <label class="admin__field-label" if="$data.label" attr="for: uid">
-        <span text="label" attr="'data-config-scope': $data.scopeLabel"/>
+        <span translate="label" attr="'data-config-scope': $data.scopeLabel"/>
     </label>
 
     <div class="admin__field-control" css="'_with-tooltip': $data.tooltip">
diff --git a/app/code/Magento/Ui/view/base/web/templates/form/field.html b/app/code/Magento/Ui/view/base/web/templates/form/field.html
index 60f902a42d9968ba7dc9051372e43114e58c116f..adc9814a91d0ee3cbe5a1c955b532d385536fd8f 100644
--- a/app/code/Magento/Ui/view/base/web/templates/form/field.html
+++ b/app/code/Magento/Ui/view/base/web/templates/form/field.html
@@ -9,7 +9,7 @@
      css="$data.additionalClasses"
      attr="'data-index': index">
     <label class="admin__field-label" if="$data.label" visible="$data.labelVisible" attr="for: uid">
-        <span text="label" attr="'data-config-scope': $data.scopeLabel"/>
+        <span translate="label" attr="'data-config-scope': $data.scopeLabel"/>
     </label>
     <div class="admin__field-control"
          css="'_with-tooltip': $data.tooltip, '_with-reset': $data.showFallbackReset && $data.isDifferedFromDefault">
@@ -33,7 +33,7 @@
         <label class="admin__field-error" if="error" attr="for: uid" text="error"/>
 
         <div class="admin__field-note" if="$data.notice" attr="id: noticeId">
-            <span text="notice"/>
+            <span translate="notice"/>
         </div>
         
         <div class="admin__additional-info" if="$data.additionalInfo" html="$data.additionalInfo"></div>
diff --git a/app/code/Magento/Ui/view/base/web/templates/form/fieldset.html b/app/code/Magento/Ui/view/base/web/templates/form/fieldset.html
index 058d1ff5c85ddf60879a22d8e84ac239cc48518d..b45e5385d037ac9b4cecca6888a7318e6ec8e384 100644
--- a/app/code/Magento/Ui/view/base/web/templates/form/fieldset.html
+++ b/app/code/Magento/Ui/view/base/web/templates/form/fieldset.html
@@ -19,7 +19,7 @@
                       '_changed': changed,
                       '_loading': loading,
                       '_error': error">
-            <span text="label"/>
+            <span translate="label"/>
             <span class="admin__page-nav-item-messages" if="collapsible">
                 <span class="admin__page-nav-item-message _changed">
                     <span class="admin__page-nav-item-message-icon"></span>
diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html b/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html
index ce9015051537169b6357374f9d8f7ad566b624fd..b045149dda5fcd3a7fb09e2fdf168492e8b6cc96 100644
--- a/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html
+++ b/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html
@@ -10,5 +10,5 @@
         _draggable: draggable,
         _ascend: sorting === 'asc',
         _descend: sorting === 'desc'">
-    <span class="data-grid-cell-content" text="label"/>
+    <span class="data-grid-cell-content" translate="label"/>
 </th>
diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/controls/columns.html b/app/code/Magento/Ui/view/base/web/templates/grid/controls/columns.html
index 113806471bc9b60b46e64a976362b41a8c0bdc17..56a69b6bc3cc3339d059fce0803a0965946f9524 100644
--- a/app/code/Magento/Ui/view/base/web/templates/grid/controls/columns.html
+++ b/app/code/Magento/Ui/view/base/web/templates/grid/controls/columns.html
@@ -17,7 +17,7 @@
                     ko-checked="$col().visible"
                     attr="id: ++ko.uid"/>
                 <label class="admin__field-label"
-                       text="$col().label"
+                       translate="$col().label"
                        attr="for: ko.uid, title: $col().label"/>
             </div>
         </div>
diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/filters/elements/group.html b/app/code/Magento/Ui/view/base/web/templates/grid/filters/elements/group.html
index d768bd8033cc129b1438e769ecf4f34aa3315e8a..7d89f3dbecf50c136933c18665ad4a44079e50c6 100644
--- a/app/code/Magento/Ui/view/base/web/templates/grid/filters/elements/group.html
+++ b/app/code/Magento/Ui/view/base/web/templates/grid/filters/elements/group.html
@@ -5,6 +5,6 @@
  */
 -->
 <legend class="admin__form-field-legend">
-    <span text="label"/>
+    <span translate="label"/>
 </legend>
 <div class="admin__form-field" outereach="elems" render=""/>
diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/filters/elements/ui-select.html b/app/code/Magento/Ui/view/base/web/templates/grid/filters/elements/ui-select.html
index 326a9d7ee4a4cbea38c40766f5a7456d8fdd893e..a913d27c8aa5aeba6968ab6283dc4717e65e3a9d 100644
--- a/app/code/Magento/Ui/view/base/web/templates/grid/filters/elements/ui-select.html
+++ b/app/code/Magento/Ui/view/base/web/templates/grid/filters/elements/ui-select.html
@@ -10,7 +10,7 @@
         class="admin__form-field-label"
         data-bind="attr: {for: uid}
 ">
-    <span data-bind="text: label"></span>
+    <span translate="label"></span>
 </label>
 <!-- /ko -->
 <div
@@ -60,7 +60,7 @@
         <div class="admin__action-multiselect-text"
              data-bind="
                 visible: !hasData(),
-                text: selectedPlaceholders.defaultPlaceholder
+                i18n: selectedPlaceholders.defaultPlaceholder
         ">
         </div>
         <!-- ko foreach: { data: getSelected(), as: 'option'}  -->
@@ -74,11 +74,7 @@
                         tabindex="-1"
                         data-bind="click: $parent.removeSelected.bind($parent, value)
                 ">
-                    <span
-                            class="action-close-text"
-                            data-bind="text: 'Close'
-                    ">
-                    </span>
+                    <span class="action-close-text" translate="'Close'"></span>
                 </button>
             </span>
         <!-- /ko -->
@@ -177,7 +173,7 @@
                     data-action="close-advanced-select"
                     type="button"
                     data-bind="click: outerClick">
-                <span data-bind="text: closeBtnLabel"></span>
+                <span translate="closeBtnLabel"></span>
             </button>
         </div>
         <!-- /ko -->
diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/filters/field.html b/app/code/Magento/Ui/view/base/web/templates/grid/filters/field.html
index 1d5290bc6cc2c6f858305ce11dcbeb9a545e1a6c..6fa5df5497e362ac7b1c4aeb2cb490fa84bd5001 100644
--- a/app/code/Magento/Ui/view/base/web/templates/grid/filters/field.html
+++ b/app/code/Magento/Ui/view/base/web/templates/grid/filters/field.html
@@ -5,6 +5,6 @@
  */
 -->
 <label class="admin__form-field-label" attr="for: uid">
-    <span text="label"/>
+    <span translate="label"/>
 </label>
 <div class="admin__form-field-control" render="elementTmpl"/>
diff --git a/app/code/Magento/Ui/view/base/web/templates/group/group.html b/app/code/Magento/Ui/view/base/web/templates/group/group.html
index de4b9cc332e9bbd337745976942e188fed853cc1..ed1c9efd2b0af800bb1046afb897ec3b45621e43 100644
--- a/app/code/Magento/Ui/view/base/web/templates/group/group.html
+++ b/app/code/Magento/Ui/view/base/web/templates/group/group.html
@@ -9,7 +9,7 @@
           css="_required: required"
           attr="'data-index': index">
     <legend class="admin__field-label" if="showLabel">
-        <span text="label" attr="'data-config-scope': $data.scopeLabel"/>
+        <span translate="label" attr="'data-config-scope': $data.scopeLabel"/>
     </legend>
 
     <div class="admin__field-control" css="$data.additionalClasses">
diff --git a/app/code/Magento/Ui/view/frontend/web/templates/form/element/helper/tooltip.html b/app/code/Magento/Ui/view/frontend/web/templates/form/element/helper/tooltip.html
index 8cb1cf0eae7a758ca90c4fb8d6079a916b7a0c15..393989112c971a1cabbdd55125494e3476ab31d4 100644
--- a/app/code/Magento/Ui/view/frontend/web/templates/form/element/helper/tooltip.html
+++ b/app/code/Magento/Ui/view/frontend/web/templates/form/element/helper/tooltip.html
@@ -21,7 +21,6 @@
      <!-- /ko -->
 
     <div class="field-tooltip-content"
-         data-target="dropdown">
-        <!-- ko text: tooltip.description --><!-- /ko -->
+         data-target="dropdown" translate="tooltip.description">
     </div>
 </div>
diff --git a/app/code/Magento/Ui/view/frontend/web/templates/form/field.html b/app/code/Magento/Ui/view/frontend/web/templates/form/field.html
index 38d868a0f6187dc980fe54073f3cf19ac7da8940..f3be62f116b8358e9424934951dc9c40a4a2d22a 100644
--- a/app/code/Magento/Ui/view/frontend/web/templates/form/field.html
+++ b/app/code/Magento/Ui/view/frontend/web/templates/form/field.html
@@ -8,7 +8,7 @@
 
     <label class="label" data-bind="attr: { for: element.uid }">
         <!-- ko if: element.label -->
-        <span data-bind="text: element.label"></span>
+        <span translate="element.label"></span>
         <!-- /ko -->
     </label>
 
diff --git a/app/code/Magento/Ui/view/frontend/web/templates/group/group.html b/app/code/Magento/Ui/view/frontend/web/templates/group/group.html
index 214fc6190ec95be4e52df147d9528a0d6ff89b72..8475a3e137becb20c2beecf5f6f2721e867da2af 100644
--- a/app/code/Magento/Ui/view/frontend/web/templates/group/group.html
+++ b/app/code/Magento/Ui/view/frontend/web/templates/group/group.html
@@ -6,7 +6,7 @@
 -->
 <fieldset class="field" data-bind="css: additionalClasses">
     <legend class="label">
-        <span data-bind="text: element.label"></span>
+        <span translate="element.label"></span>
     </legend>
     <div class="control">
         <!-- ko foreach: { data: elems, as: 'element' } -->
diff --git a/app/code/Magento/Vault/Model/PaymentTokenManagement.php b/app/code/Magento/Vault/Model/PaymentTokenManagement.php
index 510dc4cea3162c3823d6ff980f59b3f7407c1db2..f4a445b35fb34c8e6ae44b066db94cef0414f7ce 100644
--- a/app/code/Magento/Vault/Model/PaymentTokenManagement.php
+++ b/app/code/Magento/Vault/Model/PaymentTokenManagement.php
@@ -128,26 +128,37 @@ class PaymentTokenManagement implements PaymentTokenManagementInterface
      */
     public function getVisibleAvailableTokens($customerId)
     {
-        $filters[] = $this->filterBuilder->setField(PaymentTokenInterface::CUSTOMER_ID)
-            ->setValue($customerId)
-            ->create();
-        $filters[] = $this->filterBuilder->setField(PaymentTokenInterface::IS_VISIBLE)
-            ->setValue(1)
-            ->create();
-        $filters[] = $this->filterBuilder->setField(PaymentTokenInterface::IS_ACTIVE)
-            ->setValue(1)
-            ->create();
-        $filters[] = $this->filterBuilder->setField(PaymentTokenInterface::EXPIRES_AT)
-            ->setConditionType('gt')
-            ->setValue(
-                $this->dateTimeFactory->create(
-                    'now',
-                    new \DateTimeZone('UTC')
-                )->format('Y-m-d 00:00:00')
-            )
-            ->create();
-        $searchCriteria = $this->searchCriteriaBuilder->addFilters($filters)
-            ->create();
+        $customerFilter = [
+            $this->filterBuilder->setField(PaymentTokenInterface::CUSTOMER_ID)
+                ->setValue($customerId)
+                ->create()
+            ];
+        $visibleFilter = [
+            $this->filterBuilder->setField(PaymentTokenInterface::IS_VISIBLE)
+                ->setValue(1)
+                ->create()
+            ];
+        $isActiveFilter = [
+            $this->filterBuilder->setField(PaymentTokenInterface::IS_ACTIVE)
+                ->setValue(1)
+                ->create()
+            ];
+        $expiresAtFilter = [
+            $this->filterBuilder->setField(PaymentTokenInterface::EXPIRES_AT)
+                ->setConditionType('gt')
+                ->setValue(
+                    $this->dateTimeFactory->create(
+                        'now',
+                        new \DateTimeZone('UTC')
+                    )->format('Y-m-d 00:00:00')
+                )
+                ->create()
+            ];
+        $this->searchCriteriaBuilder->addFilters($customerFilter);
+        $this->searchCriteriaBuilder->addFilters($visibleFilter);
+        $this->searchCriteriaBuilder->addFilters($isActiveFilter);
+        // add filters to different filter groups in order to filter by AND expression
+        $searchCriteria = $this->searchCriteriaBuilder->addFilters($expiresAtFilter)->create();
 
         return $this->paymentTokenRepository->getList($searchCriteria)->getItems();
     }
diff --git a/app/code/Magento/Vault/Model/PaymentTokenRepository.php b/app/code/Magento/Vault/Model/PaymentTokenRepository.php
index 38bc9608147aa0c6f5a553d5f6e235a4f318501b..0cc17c3011efcadfc65b6f2d84902641d8def0ef 100644
--- a/app/code/Magento/Vault/Model/PaymentTokenRepository.php
+++ b/app/code/Magento/Vault/Model/PaymentTokenRepository.php
@@ -7,6 +7,7 @@ namespace Magento\Vault\Model;
 
 use Magento\Framework\Api\FilterBuilder;
 use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\Api\SearchCriteriaBuilder;
 use Magento\Vault\Api\Data;
 use Magento\Vault\Api\Data\PaymentTokenSearchResultsInterfaceFactory;
@@ -51,6 +52,9 @@ class PaymentTokenRepository implements PaymentTokenRepositoryInterface
      */
     protected $collectionFactory;
 
+    /** @var  CollectionProcessorInterface */
+    private $collectionProcessor;
+
     /**
      * @param \Magento\Vault\Model\ResourceModel\PaymentToken $resourceModel
      * @param PaymentTokenFactory $paymentTokenFactory
@@ -58,6 +62,7 @@ class PaymentTokenRepository implements PaymentTokenRepositoryInterface
      * @param SearchCriteriaBuilder $searchCriteriaBuilder
      * @param PaymentTokenSearchResultsInterfaceFactory $searchResultsFactory
      * @param CollectionFactory $collectionFactory
+     * @param CollectionProcessorInterface | null $collectionProcessor
      */
     public function __construct(
         PaymentTokenResourceModel $resourceModel,
@@ -65,7 +70,8 @@ class PaymentTokenRepository implements PaymentTokenRepositoryInterface
         FilterBuilder $filterBuilder,
         SearchCriteriaBuilder $searchCriteriaBuilder,
         PaymentTokenSearchResultsInterfaceFactory $searchResultsFactory,
-        CollectionFactory $collectionFactory
+        CollectionFactory $collectionFactory,
+        CollectionProcessorInterface $collectionProcessor = null
     ) {
         $this->resourceModel = $resourceModel;
         $this->paymentTokenFactory = $paymentTokenFactory;
@@ -73,6 +79,7 @@ class PaymentTokenRepository implements PaymentTokenRepositoryInterface
         $this->searchCriteriaBuilder = $searchCriteriaBuilder;
         $this->searchResultsFactory = $searchResultsFactory;
         $this->collectionFactory = $collectionFactory;
+        $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
     }
 
     /**
@@ -85,11 +92,7 @@ class PaymentTokenRepository implements PaymentTokenRepositoryInterface
     {
         /** @var \Magento\Vault\Model\ResourceModel\PaymentToken\Collection $collection */
         $collection = $this->collectionFactory->create();
-        /** @var FilterGroup $group */
-        foreach ($searchCriteria->getFilterGroups() as $group) {
-            $this->addFilterGroupToCollection($group, $collection);
-        }
-
+        $this->collectionProcessor->process($searchCriteria, $collection);
         /** @var \Magento\Vault\Api\Data\PaymentTokenSearchResultsInterface $searchResults */
         $searchResults = $this->searchResultsFactory->create();
         $searchResults->setSearchCriteria($searchCriteria);
@@ -150,6 +153,7 @@ class PaymentTokenRepository implements PaymentTokenRepositoryInterface
      * @param FilterGroup $filterGroup
      * @param Collection $collection
      * @return void
+     * @deprecated
      * @throws \Magento\Framework\Exception\InputException
      */
     protected function addFilterGroupToCollection(FilterGroup $filterGroup, Collection $collection)
@@ -159,4 +163,20 @@ class PaymentTokenRepository implements PaymentTokenRepositoryInterface
             $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
         }
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/app/code/Magento/Vault/Model/Ui/Adminhtml/TokensConfigProvider.php b/app/code/Magento/Vault/Model/Ui/Adminhtml/TokensConfigProvider.php
index c4f31a771c70668d6dabae591de8019df9061755..98e7728f732fe51bcea79e555c5333a9cbd86684 100644
--- a/app/code/Magento/Vault/Model/Ui/Adminhtml/TokensConfigProvider.php
+++ b/app/code/Magento/Vault/Model/Ui/Adminhtml/TokensConfigProvider.php
@@ -130,38 +130,57 @@ final class TokensConfigProvider
         }
 
         if ($customerId) {
-            $filters[] = $this->filterBuilder->setField(PaymentTokenInterface::CUSTOMER_ID)
-                ->setValue($customerId)
-                ->create();
+            $this->searchCriteriaBuilder->addFilters(
+                [
+                    $this->filterBuilder->setField(PaymentTokenInterface::CUSTOMER_ID)
+                    ->setValue($customerId)
+                    ->create(),
+                ]
+            );
         } else {
             try {
-                $filters[] = $this->filterBuilder->setField(PaymentTokenInterface::ENTITY_ID)
-                    ->setValue($this->getPaymentTokenEntityId())
-                    ->create();
+                $this->searchCriteriaBuilder->addFilters(
+                    [
+                        $this->filterBuilder->setField(PaymentTokenInterface::ENTITY_ID)
+                            ->setValue($this->getPaymentTokenEntityId())
+                            ->create(),
+                    ]
+                );
             } catch (InputException $e) {
                 return $result;
             } catch (NoSuchEntityException $e) {
                 return $result;
             }
         }
-        $filters[] = $this->filterBuilder->setField(PaymentTokenInterface::PAYMENT_METHOD_CODE)
-            ->setValue($vaultProviderCode)
-            ->create();
-        $filters[] = $this->filterBuilder->setField(PaymentTokenInterface::IS_ACTIVE)
-            ->setValue(1)
-            ->create();
-        $filters[] = $this->filterBuilder->setField(PaymentTokenInterface::EXPIRES_AT)
-            ->setConditionType('gt')
-            ->setValue(
-                $this->dateTimeFactory->create(
-                    'now',
-                    new \DateTimeZone('UTC')
-                )->format('Y-m-d 00:00:00')
-            )
-            ->create();
+        $this->searchCriteriaBuilder->addFilters(
+            [
+                $this->filterBuilder->setField(PaymentTokenInterface::PAYMENT_METHOD_CODE)
+                    ->setValue($vaultProviderCode)
+                    ->create(),
+                ]
+        );
+        $this->searchCriteriaBuilder->addFilters(
+            [
+                $this->filterBuilder->setField(PaymentTokenInterface::IS_ACTIVE)
+                    ->setValue(1)
+                    ->create(),
+                ]
+        );
+        $this->searchCriteriaBuilder->addFilters(
+            [
+                $this->filterBuilder->setField(PaymentTokenInterface::EXPIRES_AT)
+                    ->setConditionType('gt')
+                    ->setValue(
+                        $this->dateTimeFactory->create(
+                            'now',
+                            new \DateTimeZone('UTC')
+                        )->format('Y-m-d 00:00:00')
+                    )
+                    ->create(),
+                ]
+        );
 
-        $searchCriteria = $this->searchCriteriaBuilder->addFilters($filters)
-            ->create();
+        $searchCriteria = $this->searchCriteriaBuilder->create();
 
         foreach ($this->paymentTokenRepository->getList($searchCriteria)->getItems() as $token) {
             $result[] = $componentProvider->getComponentForToken($token);
@@ -186,7 +205,7 @@ final class TokensConfigProvider
 
     /**
      * Get active vault payment by code
-     * @param $vaultPaymentCode
+     * @param string $vaultPaymentCode
      * @return VaultPaymentInterface|null
      */
     private function getVaultPayment($vaultPaymentCode)
diff --git a/app/code/Magento/Vault/Test/Unit/Model/PaymentTokenManagementTest.php b/app/code/Magento/Vault/Test/Unit/Model/PaymentTokenManagementTest.php
index 4672ebac40c297fc0968e58127933016c3b56d9e..8784522a80f7aaa74dd2607941a6fbee9efc2238 100644
--- a/app/code/Magento/Vault/Test/Unit/Model/PaymentTokenManagementTest.php
+++ b/app/code/Magento/Vault/Test/Unit/Model/PaymentTokenManagementTest.php
@@ -486,9 +486,9 @@ class PaymentTokenManagementTest extends \PHPUnit_Framework_TestCase
             ->with('Y-m-d 00:00:00')
             ->willReturn('2015-01-01 00:00:00');
 
-        $this->searchCriteriaBuilder->expects(self::once())
+        $this->searchCriteriaBuilder->expects(self::exactly(4))
             ->method('addFilters')
-            ->with([$customerFilter, $visibilityFilter, $isActiveFilter, $expiresAtFilter])
+            ->withConsecutive($customerFilter, $visibilityFilter, $isActiveFilter, $expiresAtFilter)
             ->willReturnSelf();
 
         $this->searchCriteriaBuilder->expects(self::once())
diff --git a/app/code/Magento/Vault/Test/Unit/Model/PaymentTokenRepositoryTest.php b/app/code/Magento/Vault/Test/Unit/Model/PaymentTokenRepositoryTest.php
index 6ee6108f062d810fcfd5487e4c1aa362cf779875..dd0644dc46d106b436248cefb5fda353be87b1d6 100644
--- a/app/code/Magento/Vault/Test/Unit/Model/PaymentTokenRepositoryTest.php
+++ b/app/code/Magento/Vault/Test/Unit/Model/PaymentTokenRepositoryTest.php
@@ -18,9 +18,15 @@ use Magento\Vault\Model\ResourceModel\PaymentToken\CollectionFactory;
 use PHPUnit_Framework_MockObject_MockObject as MockObject;
 use Magento\Vault\Model\ResourceModel\PaymentToken as PaymentTokenResourceModel;
 
+/**
+ * Class PaymentTokenRepositoryTest
+ * @package Magento\Vault\Test\Unit\Model
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class PaymentTokenRepositoryTest extends \PHPUnit_Framework_TestCase
 {
     const PUBLIC_HASH = 'hash';
+
     /**
      * @var \Magento\Vault\Model\PaymentTokenRepository|MockObject resourceModelMock
      */
@@ -76,6 +82,11 @@ class PaymentTokenRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $collectionMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionProcessor;
+
     /**
      * @return void
      */
@@ -123,7 +134,13 @@ class PaymentTokenRepositoryTest extends \PHPUnit_Framework_TestCase
             ->setMethods(['create'])
             ->disableOriginalConstructor()
             ->getMock();
-
+        $this->collectionProcessor = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
         $this->repositoryModel = $this->getMockBuilder(PaymentTokenRepository::class)
             ->setConstructorArgs([
                 'resourceModel' => $this->resourceModelMock,
@@ -131,7 +148,8 @@ class PaymentTokenRepositoryTest extends \PHPUnit_Framework_TestCase
                 'filterBuilder' => $this->filterBuilderMock,
                 'searchCriteriaBuilder' => $this->searchCriteriaBuilderMock,
                 'searchResultsFactory' => $this->searchResultsFactoryMock,
-                'collectionFactory' => $this->collectionFactoryMock
+                'collectionFactory' => $this->collectionFactoryMock,
+                'collectionProcessor' => $this->collectionProcessor
             ])
             ->setMethods(null)
             ->getMock();
@@ -148,18 +166,15 @@ class PaymentTokenRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->collectionFactoryMock->expects($this->once())
             ->method('create')
             ->willReturn($this->collectionMock);
-
-        $this->searchCriteriaMock->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn([]);
-
+        
         $this->searchResultsFactoryMock->expects($this->once())
             ->method('create')
             ->willReturn($this->searchResults);
-
+        $this->collectionProcessor->expects($this->once())
+            ->method('process')
+            ->with($this->searchCriteriaMock, $this->collectionMock);
         $list = $this->repositoryModel->getList($this->searchCriteriaMock);
         $this->assertSame($this->searchResults, $list);
-
         $this->assertSame(
             $this->paymentTokenMock,
             $list->getItems()[0]
diff --git a/app/code/Magento/Vault/Test/Unit/Model/Ui/Adminhtml/TokensConfigProviderTest.php b/app/code/Magento/Vault/Test/Unit/Model/Ui/Adminhtml/TokensConfigProviderTest.php
index ab825de32c91e8e8e190bbbe99c2f7e2e7168a96..38948b004eebc358ce82eddf8bf2af88e1685c8c 100644
--- a/app/code/Magento/Vault/Test/Unit/Model/Ui/Adminhtml/TokensConfigProviderTest.php
+++ b/app/code/Magento/Vault/Test/Unit/Model/Ui/Adminhtml/TokensConfigProviderTest.php
@@ -572,10 +572,16 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase
             ->with('gt')
             ->willReturnSelf();
 
-        $this->searchCriteriaBuilder->expects(self::once())
+        $this->searchCriteriaBuilder->expects(self::exactly(4))
             ->method('addFilters')
-            ->with([$customerFilter, $codeFilter, $expiresAtFilter, $isActiveFilter])
-            ->willReturnSelf();
+            ->willReturnMap(
+                [
+                    [$customerFilter, $this->searchCriteriaBuilder],
+                    [$codeFilter, $this->searchCriteriaBuilder],
+                    [$expiresAtFilter, $this->searchCriteriaBuilder],
+                    [$isActiveFilter, $this->searchCriteriaBuilder],
+                ]
+            );
 
         $this->searchCriteriaBuilder->expects(self::once())
             ->method('create')
diff --git a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/_setup.less b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/_setup.less
index 6392ef60be9e6079a717d6735acf7de6d9e80081..23154cdb878757a88d8b6eceeb057e0e68f7cb0f 100644
--- a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/_setup.less
+++ b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/_setup.less
@@ -98,7 +98,7 @@
 //  Updater pages
 //@import '../../../updater/styles/less/pages/_common.less';
 //@import '../../../updater/styles/less/pages/_home.less';
-//@import '../../../updater/styles/less/pages/_component-manager.less';
+//@import '../../../updater/styles/less/pages/_extension-manager.less';
 //@import '../../../updater/styles/less/pages/_login.less';
 
 //
diff --git a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_readiness-check.less b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_readiness-check.less
index 6adc7eddae40b492dd80595f89d7468d305992bf..a52fb94cbbd2207d3737eea005b8c37b6020751f 100644
--- a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_readiness-check.less
+++ b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_readiness-check.less
@@ -66,6 +66,64 @@
     margin-top: .3rem;
 }
 
+.extensions-information {
+    margin-bottom: 5rem;
+
+    h3 {
+        font-size: @base__font-size;
+        margin-bottom: 1.3rem;
+    }
+
+    .message {
+        margin-bottom: @indent__m;
+
+        &:before {
+            margin-top: 0;
+            top: 1.8rem;
+        }
+    }
+
+    .extensions-container {
+        padding: 0 @indent__base;
+    }
+
+    .list {
+        margin-bottom: @indent__s;
+
+        select {
+            cursor: pointer;
+
+            &:disabled {
+                background: @color-gray80;
+                cursor: default;
+            }
+        }
+
+        .extension-delete {
+            &:extend(.abs-action-delete all);
+            font-size: 1.7rem;
+            padding-top: 0;
+        }
+    }
+}
+
+.delete-modal-wrap {
+    padding: 0 4% @indent__xl;
+
+    h3 {
+        .lib-font-size(34);
+        display: inline-block;
+        font-weight: @font-weight__light;
+        margin: 0 0 @indent__base;
+        padding: .9rem 0 0;
+        vertical-align: top;
+    }
+
+    .actions {
+        padding: @indent__l 0 0;
+    }
+}
+
 //
 //  Mobile
 //  _____________________________________________
diff --git a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_data-grid.less b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_data-grid.less
index d8d63f09bd1a1161576b82abb37c044ca04aae79..9e2e7037b0e0ecc7bc8619b50eee5193bea874dd 100644
--- a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_data-grid.less
+++ b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_data-grid.less
@@ -112,6 +112,26 @@
             }
         }
     }
+
+    &._tooltip {
+        background: transparent;
+        margin: 0px 0px 8px 5px;
+
+        a {
+            width: 21px;
+
+            &:hover {
+                text-decoration: none;
+            }
+
+            &:before {
+                color: @color-tertiary;
+                content: @icon-help__content;
+                font-family: @icons__font-family;
+                font-size: @component-indicator__size;
+            }
+        }
+    }
 }
 
 .col-manager-item-name {
diff --git a/app/etc/di.xml b/app/etc/di.xml
index 8d7c4f4b71486cf2b2fb47ddcb0a7a3b070438cd..28f0d024c3ae234583e19b31800c10c950a5b42d 100755
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -1209,4 +1209,14 @@
             </argument>
         </arguments>
     </type>
+    <preference for="Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface" type="Magento\Framework\Api\SearchCriteria\CollectionProcessor" />
+    <type name="Magento\Framework\Api\SearchCriteria\CollectionProcessor">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="filters" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor</item>
+                <item name="sorting" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor</item>
+                <item name="pagination" xsi:type="object">Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryListTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryListTest.php
index e7d53148d8454bea5dceb33949eb6443f8c84a85..872ab5e6f7c19537c05e8ad701116494c213dac5 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryListTest.php
@@ -28,6 +28,20 @@ class CategoryListTest extends WebapiAbstract
                                 'value' => 'Category 1',
                                 'condition_type' => 'eq',
                             ],
+                            [
+                                'field' => 'name',
+                                'value' => 'Category 1.1',
+                                'condition_type' => 'eq',
+                            ],
+                        ],
+                    ],
+                    [
+                        'filters' => [
+                            [
+                                'field' => 'level',
+                                'value' => 2,
+                                'condition_type' => 'eq',
+                            ],
                         ],
                     ],
                 ],
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
index ae6a0361abd0eefc798db2539d6ae30c56b5377c..f30c1bffa007546866cfd5c23ea24a3eefed42b7 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
@@ -6,15 +6,20 @@
 namespace Magento\Catalog\Api;
 
 use Magento\Catalog\Api\Data\ProductInterface;
-use Magento\Catalog\Helper\Product;
 use Magento\Store\Model\Store;
 use Magento\CatalogInventory\Api\Data\StockItemInterface;
 use Magento\Store\Model\Website;
+use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\TestCase\WebapiAbstract;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
 use Magento\Framework\Webapi\Exception as HTTPExceptionCodes;
 
 /**
  * @magentoAppIsolation enabled
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class ProductRepositoryInterfaceTest extends WebapiAbstract
 {
@@ -299,7 +304,7 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract
         $this->setExpectedException('Exception', 'Requested product doesn\'t exist');
 
         // Delete all with 'all' store code
-        $this->deleteProduct($sku, 'all');
+        $this->deleteProduct($sku);
         $this->getProduct($sku);
     }
 
@@ -681,6 +686,72 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract
         $this->assertEquals('simple', $response['items'][0]['sku']);
     }
 
+    /**
+     * @magentoApiDataFixture Magento/Catalog/_files/products_for_search.php
+     */
+    public function testGetListWithMultipleFilterGroupsAndSortingAndPagination()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(ProductInterface::NAME)
+            ->setValue('search product 2')
+            ->create();
+        $filter2 = $filterBuilder->setField(ProductInterface::NAME)
+            ->setValue('search product 3')
+            ->create();
+        $filter3 = $filterBuilder->setField(ProductInterface::NAME)
+            ->setValue('search product 4')
+            ->create();
+        $filter4 = $filterBuilder->setField(ProductInterface::NAME)
+            ->setValue('search product 5')
+            ->create();
+        $filter5 = $filterBuilder->setField(ProductInterface::PRICE)
+            ->setValue(35)
+            ->setConditionType('lt')
+            ->create();
+        $filter6 = $filterBuilder->setField('category_id')
+            ->setValue(333)
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField('meta_title')->setDirection(SortOrder::SORT_DESC)->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3, $filter4]);
+        $searchCriteriaBuilder->addFilters([$filter5]);
+        $searchCriteriaBuilder->addFilters([$filter6]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchData = $searchCriteriaBuilder->create()->__toArray();
+        $requestData = ['searchCriteria' => $searchData];
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($requestData),
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
+            ],
+            'soap' => [
+                'service' => self::SERVICE_NAME,
+                'serviceVersion' => self::SERVICE_VERSION,
+                'operation' => self::SERVICE_NAME . 'GetList',
+            ],
+        ];
+
+        $searchResult = $this->_webApiCall($serviceInfo, $requestData);
+
+        $this->assertEquals(3, $searchResult['total_count']);
+        $this->assertEquals(1, count($searchResult['items']));
+        $this->assertEquals('search_product_4', $searchResult['items'][0][ProductInterface::SKU]);
+    }
+
     /**
      * @param $customAttributes
      * @return array
diff --git a/dev/tests/api-functional/testsuite/Magento/Cms/Api/BlockRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Cms/Api/BlockRepositoryTest.php
index 5dadcf92feef33e990dfec5ef824f430e3a90bfe..dafb3746d8d631b4b1da70efd3ee8e3696218206 100644
--- a/dev/tests/api-functional/testsuite/Magento/Cms/Api/BlockRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Cms/Api/BlockRepositoryTest.php
@@ -6,6 +6,10 @@
 namespace Magento\Cms\Api;
 
 use Magento\Cms\Api\Data\BlockInterface;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\TestCase\WebapiAbstract;
 
@@ -216,24 +220,45 @@ class BlockRepositoryTest extends WebapiAbstract
     {
         $cmsBlocks = $this->prepareCmsBlocks();
 
-        $filterBuilder = Bootstrap::getObjectManager()->create(\Magento\Framework\Api\FilterBuilder::class);
-        /** @var \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder */
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
         $searchCriteriaBuilder = Bootstrap::getObjectManager()
-            ->create(\Magento\Framework\Api\SearchCriteriaBuilder::class);
-        $filterIdentifier = $filterBuilder
+            ->create(SearchCriteriaBuilder::class);
+
+        $filter1 = $filterBuilder
             ->setField(BlockInterface::IDENTIFIER)
             ->setValue($cmsBlocks['first']->getIdentifier())
             ->create();
-        $searchCriteriaBuilder->addFilters([$filterIdentifier]);
-        $filterTitle = $filterBuilder
+        $filter2 = $filterBuilder
+            ->setField(BlockInterface::IDENTIFIER)
+            ->setValue($cmsBlocks['third']->getIdentifier())
+            ->create();
+        $filter3 = $filterBuilder
             ->setField(BlockInterface::TITLE)
             ->setValue($cmsBlocks['second']->getTitle())
             ->create();
-        $filterStatus = $filterBuilder
+        $filter4 = $filterBuilder
             ->setField(BlockInterface::IS_ACTIVE)
-            ->setValue($cmsBlocks['first']->isActive())
+            ->setValue(true)
             ->create();
-        $searchCriteriaBuilder->addFilters([$filterTitle, $filterStatus]);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $searchCriteriaBuilder->addFilters([$filter3, $filter4]);
+
+        /** @var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(BlockInterface::IDENTIFIER)
+            ->setDirection(SortOrder::SORT_ASC)
+            ->create();
+
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(1);
+        $searchCriteriaBuilder->setCurrentPage(2);
 
         $searchData = $searchCriteriaBuilder->create()->__toArray();
         $requestData = ['searchCriteria' => $searchData];
@@ -250,10 +275,11 @@ class BlockRepositoryTest extends WebapiAbstract
         ];
 
         $searchResult = $this->_webApiCall($serviceInfo, $requestData);
-        $this->assertEquals(1, $searchResult['total_count']);
+        $this->assertEquals(2, $searchResult['total_count']);
+        $this->assertEquals(1, count($searchResult['items']));
         $this->assertEquals(
             $searchResult['items'][0][BlockInterface::IDENTIFIER],
-            $cmsBlocks['first']->getIdentifier()
+            $cmsBlocks['third']->getIdentifier()
         );
     }
 
@@ -263,13 +289,19 @@ class BlockRepositoryTest extends WebapiAbstract
     private function prepareCmsBlocks()
     {
         $result = [];
+
         $blocksData['first'][BlockInterface::TITLE] = 'Block title 1';
         $blocksData['first'][BlockInterface::IDENTIFIER] = 'block-title-1' . uniqid();
         $blocksData['first'][BlockInterface::IS_ACTIVE] = true;
+
         $blocksData['second'][BlockInterface::TITLE] = 'Block title 2';
         $blocksData['second'][BlockInterface::IDENTIFIER] = 'block-title-2' . uniqid();
         $blocksData['second'][BlockInterface::IS_ACTIVE] = false;
 
+        $blocksData['third'][BlockInterface::TITLE] = 'Block title 3';
+        $blocksData['third'][BlockInterface::IDENTIFIER] = 'block-title-3' . uniqid();
+        $blocksData['third'][BlockInterface::IS_ACTIVE] = true;
+
         foreach ($blocksData as $key => $blockData) {
             /** @var  \Magento\Cms\Api\Data\BlockInterface $blockDataObject */
             $blockDataObject = $this->blockFactory->create();
diff --git a/dev/tests/api-functional/testsuite/Magento/Cms/Api/PageRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Cms/Api/PageRepositoryTest.php
index 26c7a907b507a52dcbd2c3df04fb63b25888b9ef..98c1b91c265ea2b72a72f5efd3f1ffbece611eea 100644
--- a/dev/tests/api-functional/testsuite/Magento/Cms/Api/PageRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Cms/Api/PageRepositoryTest.php
@@ -6,6 +6,10 @@
 namespace Magento\Cms\Api;
 
 use Magento\Cms\Api\Data\PageInterface;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\TestCase\WebapiAbstract;
 
@@ -215,24 +219,47 @@ class PageRepositoryTest extends WebapiAbstract
     {
         $cmsPages = $this->prepareCmsPages();
 
-        $filterBuilder = Bootstrap::getObjectManager()->create(\Magento\Framework\Api\FilterBuilder::class);
-        /** @var \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder */
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
         $searchCriteriaBuilder = Bootstrap::getObjectManager()
-            ->create(\Magento\Framework\Api\SearchCriteriaBuilder::class);
-        $filterIdentifier = $filterBuilder
+            ->create(SearchCriteriaBuilder::class);
+
+        $filter1 = $filterBuilder
             ->setField(PageInterface::IDENTIFIER)
             ->setValue($cmsPages['first']->getIdentifier())
             ->create();
-        $searchCriteriaBuilder->addFilters([$filterIdentifier]);
-        $filterTitle = $filterBuilder
+        $filter2 = $filterBuilder
+            ->setField(PageInterface::IDENTIFIER)
+            ->setValue($cmsPages['third']->getIdentifier())
+            ->create();
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+
+        $filter3 = $filterBuilder
             ->setField(PageInterface::TITLE)
             ->setValue($cmsPages['second']->getTitle())
             ->create();
-        $filterStatus = $filterBuilder
+        $filter4 = $filterBuilder
             ->setField(PageInterface::IS_ACTIVE)
-            ->setValue($cmsPages['first']->isActive())
+            ->setValue(true)
+            ->create();
+
+        $searchCriteriaBuilder->addFilters([$filter3, $filter4]);
+
+        /** @var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(PageInterface::IDENTIFIER)
+            ->setDirection(SortOrder::SORT_ASC)
             ->create();
-        $searchCriteriaBuilder->addFilters([$filterTitle, $filterStatus]);
+
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(1);
+        $searchCriteriaBuilder->setCurrentPage(2);
 
         $searchData = $searchCriteriaBuilder->create()->__toArray();
         $requestData = ['searchCriteria' => $searchData];
@@ -249,8 +276,12 @@ class PageRepositoryTest extends WebapiAbstract
         ];
 
         $searchResult = $this->_webApiCall($serviceInfo, $requestData);
-        $this->assertEquals(1, $searchResult['total_count']);
-        $this->assertEquals($searchResult['items'][0][PageInterface::IDENTIFIER], $cmsPages['first']->getIdentifier());
+        $this->assertEquals(2, $searchResult['total_count']);
+        $this->assertEquals(1, count($searchResult['items']));
+        $this->assertEquals(
+            $searchResult['items'][0][PageInterface::IDENTIFIER],
+            $cmsPages['third']->getIdentifier()
+        );
     }
 
     /**
@@ -259,13 +290,19 @@ class PageRepositoryTest extends WebapiAbstract
     private function prepareCmsPages()
     {
         $result = [];
+
         $pagesData['first'][PageInterface::TITLE] = 'Page title 1';
         $pagesData['first'][PageInterface::IDENTIFIER] = 'page-title-1' . uniqid();
         $pagesData['first'][PageInterface::IS_ACTIVE] = true;
+
         $pagesData['second'][PageInterface::TITLE] = 'Page title 2';
         $pagesData['second'][PageInterface::IDENTIFIER] = 'page-title-2' . uniqid();
         $pagesData['second'][PageInterface::IS_ACTIVE] = false;
 
+        $pagesData['third'][PageInterface::TITLE] = 'Page title 3';
+        $pagesData['third'][PageInterface::IDENTIFIER] = 'page-title-3' . uniqid();
+        $pagesData['third'][PageInterface::IS_ACTIVE] = true;
+
         foreach ($pagesData as $key => $pageData) {
             /** @var  \Magento\Cms\Api\Data\PageInterface $pageDataObject */
             $pageDataObject = $this->pageFactory->create();
diff --git a/dev/tests/api-functional/testsuite/Magento/Customer/Api/GroupRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Customer/Api/GroupRepositoryTest.php
index ff23f0db249095236783496302e9d31f66139994..43b63dc97f26f5339e0682a06db472f002384856 100644
--- a/dev/tests/api-functional/testsuite/Magento/Customer/Api/GroupRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Customer/Api/GroupRepositoryTest.php
@@ -6,15 +6,22 @@
 
 namespace Magento\Customer\Api;
 
+use Magento\Customer\Api\Data\GroupInterface;
 use Magento\Customer\Model\Data\Group as CustomerGroup;
 use Magento\Customer\Model\GroupRegistry;
 use Magento\Customer\Model\ResourceModel\GroupRepository;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\TestCase\WebapiAbstract;
 
 /**
  * Class GroupRepositoryTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class GroupRepositoryTest extends WebapiAbstract
 {
@@ -923,7 +930,7 @@ class GroupRepositoryTest extends WebapiAbstract
     public function testSearchGroups($filterField, $filterValue, $expectedResult)
     {
         $filterBuilder = Bootstrap::getObjectManager()->create(\Magento\Framework\Api\FilterBuilder::class);
-        /** @var \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder */
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
         $searchCriteriaBuilder =  Bootstrap::getObjectManager()
             ->create(\Magento\Framework\Api\SearchCriteriaBuilder::class);
         $filter = $filterBuilder
@@ -958,6 +965,59 @@ class GroupRepositoryTest extends WebapiAbstract
         }
     }
 
+    public function testSearchGroupsWithMultipleFilterGroupsAndSorting()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(GroupInterface::CODE)
+            ->setValue('General')
+            ->create();
+        $filter2 = $filterBuilder->setField(GroupInterface::CODE)
+            ->setValue('Retailer')
+            ->create();
+        $filter3 = $filterBuilder->setField(GroupInterface::CODE)
+            ->setValue('Wholesale')
+            ->create();
+        $filter4 = $filterBuilder->setField(GroupInterface::ID)
+            ->setValue(1)
+            ->setConditionType('gt')
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(GroupInterface::CODE)->setDirection(SortOrder::SORT_ASC)->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3]);
+        $searchCriteriaBuilder->addFilters([$filter4]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchData = $searchCriteriaBuilder->create()->__toArray();
+        $requestData = ['searchCriteria' => $searchData];
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => self::RESOURCE_PATH . "/search" . '?' . http_build_query($requestData),
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
+            ],
+            'soap' => [
+                'service' => self::SERVICE_NAME,
+                'serviceVersion' => self::SERVICE_VERSION,
+                'operation' => 'customerGroupRepositoryV1GetList',
+            ],
+        ];
+
+        $searchResult = $this->_webApiCall($serviceInfo, $requestData);
+
+        $this->assertEquals(2, $searchResult['total_count']);
+        $this->assertEquals(3, $searchResult['items'][0][GroupInterface::ID]);
+        $this->assertEquals(2, $searchResult['items'][1][GroupInterface::ID]);
+    }
+
     /**
      * Test search customer group using GET
      *
@@ -971,7 +1031,7 @@ class GroupRepositoryTest extends WebapiAbstract
     {
         $this->_markTestAsRestOnly('SOAP is covered in ');
         $filterBuilder = Bootstrap::getObjectManager()->create(\Magento\Framework\Api\FilterBuilder::class);
-        /** @var \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder */
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
         $searchCriteriaBuilder =  Bootstrap::getObjectManager()
             ->create(\Magento\Framework\Api\SearchCriteriaBuilder::class);
         $filter = $filterBuilder
diff --git a/dev/tests/api-functional/testsuite/Magento/Eav/Api/AttributeSetRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Eav/Api/AttributeSetRepositoryTest.php
index 4de337a1f5747aa7b00bbec8d2d7c80de3abfd29..69f3b0d5f810cf2b9fce228120de26efc64238b7 100644
--- a/dev/tests/api-functional/testsuite/Magento/Eav/Api/AttributeSetRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Eav/Api/AttributeSetRepositoryTest.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\Eav\Api;
 
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\TestCase\WebapiAbstract;
 
 class AttributeSetRepositoryTest extends WebapiAbstract
@@ -139,7 +144,7 @@ class AttributeSetRepositoryTest extends WebapiAbstract
      */
     public function testDeleteByIdDefaultAttributeSet()
     {
-        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $objectManager = Bootstrap::getObjectManager();
         /** @var \Magento\Eav\Model\Config */
         $eavConfig = $objectManager->create(\Magento\Eav\Model\Config::class);
 
@@ -191,31 +196,54 @@ class AttributeSetRepositoryTest extends WebapiAbstract
     }
 
     /**
-     * @magentoApiDataFixture Magento/Eav/_files/empty_attribute_set.php
+     * @magentoApiDataFixture Magento/Eav/_files/attribute_set_for_search.php
      */
     public function testGetList()
     {
-        $searchCriteria = [
-            'searchCriteria' => [
-                'filter_groups' => [
-                    [
-                        'filters' => [
-                            [
-                                'field' => 'entity_type_code',
-                                'value' => 'catalog_product',
-                                'condition_type' => 'eq',
-                            ],
-                        ],
-                    ],
-                ],
-                'current_page' => 1,
-                'page_size' => 2,
-            ],
-        ];
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder = Bootstrap::getObjectManager()
+            ->create(SearchCriteriaBuilder::class);
+
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder
+            ->setField('entity_type_code')
+            ->setValue('catalog_product')
+            ->create();
+        $filter2 = $filterBuilder
+            ->setField('sort_order')
+            ->setValue(200)
+            ->setConditionType('gteq')
+            ->create();
+        $filter3 = $filterBuilder
+            ->setField('sort_order')
+            ->setValue(300)
+            ->setConditionType('lteq')
+            ->create();
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $searchCriteriaBuilder->addFilters([$filter3]);
+
+        /** @var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField('sort_order')
+            ->setDirection(SortOrder::SORT_ASC)
+            ->create();
+
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(1);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchData = $searchCriteriaBuilder->create()->__toArray();
+        $requestData = ['searchCriteria' => $searchData];
 
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/eav/attribute-sets/list' . '?' . http_build_query($searchCriteria),
+                'resourcePath' => '/V1/eav/attribute-sets/list' . '?' . http_build_query($requestData),
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
             ],
             'soap' => [
@@ -225,18 +253,14 @@ class AttributeSetRepositoryTest extends WebapiAbstract
             ],
         ];
 
-        $response = $this->_webApiCall($serviceInfo, $searchCriteria);
-
-        $this->assertArrayHasKey('search_criteria', $response);
-        $this->assertArrayHasKey('total_count', $response);
-        $this->assertArrayHasKey('items', $response);
-
-        $this->assertEquals($searchCriteria['searchCriteria'], $response['search_criteria']);
-        $this->assertTrue($response['total_count'] > 0);
-        $this->assertTrue(count($response['items']) > 0);
+        $searchResult = $this->_webApiCall($serviceInfo, $requestData);
 
-        $this->assertNotNull($response['items'][0]['attribute_set_id']);
-        $this->assertNotNull($response['items'][0]['attribute_set_name']);
+        $this->assertEquals(2, $searchResult['total_count']);
+        $this->assertEquals(1, count($searchResult['items']));
+        $this->assertEquals(
+            $searchResult['items'][0]['attribute_set_name'],
+            'attribute_set_3_for_search'
+        );
     }
 
     /**
@@ -248,7 +272,7 @@ class AttributeSetRepositoryTest extends WebapiAbstract
      */
     protected function getAttributeSetByName($attributeSetName)
     {
-        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $objectManager = Bootstrap::getObjectManager();
         /** @var \Magento\Eav\Model\Entity\Attribute\Set $attributeSet */
         $attributeSet = $objectManager->create(\Magento\Eav\Model\Entity\Attribute\Set::class)
             ->load($attributeSetName, 'attribute_set_name');
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoListTest.php
index fdf72821de07d125c2184a4d0075c54f7cd04333..6c2a6567db8b46a687d8251bec8b1dc7e2b8e67b 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoListTest.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Sales\Service\V1;
 
+use Magento\Framework\Api\SortOrderBuilder;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\TestCase\WebapiAbstract;
 
@@ -44,10 +45,14 @@ class CreditmemoListTest extends WebapiAbstract
     /**
      * Test creditmemo list service
      *
-     * @magentoApiDataFixture Magento/Sales/_files/creditmemo_with_list.php
+     * @magentoApiDataFixture Magento/Sales/_files/creditmemo_list.php
      */
     public function testCreditmemoList()
     {
+        /** @var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = $this->objectManager->get(
+            SortOrderBuilder::class
+        );
         /** @var $searchCriteriaBuilder  \Magento\Framework\Api\SearchCriteriaBuilder */
         $searchCriteriaBuilder = $this->objectManager->create(
             \Magento\Framework\Api\SearchCriteriaBuilder::class
@@ -57,16 +62,29 @@ class CreditmemoListTest extends WebapiAbstract
         $filterBuilder = $this->objectManager->create(
             \Magento\Framework\Api\FilterBuilder::class
         );
+        $stateFilter = $filterBuilder
+            ->setField('state')
+            ->setValue((string)\Magento\Sales\Model\Order\Creditmemo::STATE_OPEN)
+            ->setConditionType('eq')
+            ->create();
+        $incrementFilter = $filterBuilder
+            ->setField('increment_id')
+            ->setValue('456')
+            ->setConditionType('eq')
+            ->create();
+        $zeroStatusFilter = $filterBuilder
+            ->setField('creditmemo_status')
+            ->setValue('0')
+            ->setConditionType('eq')
+            ->create();
+        $sortOrder = $sortOrderBuilder
+            ->setField('grand_total')
+            ->setDirection('ASC')
+            ->create();
+        $searchCriteriaBuilder->addFilters([$stateFilter]);
+        $searchCriteriaBuilder->addFilters([$incrementFilter, $zeroStatusFilter]);
+        $searchCriteriaBuilder->addSortOrder($sortOrder);
 
-        $searchCriteriaBuilder->addFilters(
-            [
-                $filterBuilder
-                    ->setField('state')
-                    ->setValue((string)\Magento\Sales\Model\Order\Creditmemo::STATE_OPEN)
-                    ->setConditionType('eq')
-                    ->create(),
-            ]
-        );
         $searchData = $searchCriteriaBuilder->create()->__toArray();
 
         $requestData = ['searchCriteria' => $searchData];
@@ -85,8 +103,10 @@ class CreditmemoListTest extends WebapiAbstract
         $result = $this->_webApiCall($serviceInfo, $requestData);
         // TODO Test fails, due to the inability of the framework API to handle data collection
         $this->assertArrayHasKey('items', $result);
-        $this->assertCount(1, $result['items']);
+        $this->assertCount(2, $result['items']);
         $this->assertArrayHasKey('search_criteria', $result);
+        $this->assertEquals('789', $result['items'][0]['increment_id']);
+        $this->assertEquals('456', $result['items'][1]['increment_id']);
         $this->assertEquals($searchData, $result['search_criteria']);
     }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceListTest.php
index 3624029740f89211cb4d78e2440e35f79e25fa68..f9e6006ebe273279bd77238a6cc500e0898815cd 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceListTest.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Sales\Service\V1;
 
+use Magento\Framework\Api\SortOrderBuilder;
 use Magento\TestFramework\TestCase\WebapiAbstract;
 
 /**
@@ -29,10 +30,14 @@ class InvoiceListTest extends WebapiAbstract
     }
 
     /**
-     * @magentoApiDataFixture Magento/Sales/_files/invoice.php
+     * @magentoApiDataFixture Magento/Sales/_files/invoice_list.php
      */
     public function testInvoiceList()
     {
+        /** @var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = $this->objectManager->get(
+            SortOrderBuilder::class
+        );
         /** @var $searchCriteriaBuilder  \Magento\Framework\Api\SearchCriteriaBuilder */
         $searchCriteriaBuilder = $this->objectManager->create(
             \Magento\Framework\Api\SearchCriteriaBuilder::class
@@ -43,15 +48,29 @@ class InvoiceListTest extends WebapiAbstract
             \Magento\Framework\Api\FilterBuilder::class
         );
 
-        $searchCriteriaBuilder->addFilters(
-            [
-                $filterBuilder
-                    ->setField('state')
-                    ->setValue((string)\Magento\Sales\Model\Order\Invoice::STATE_PAID)
-                    ->setConditionType('eq')
-                    ->create(),
-            ]
-        );
+        $stateFilter = $filterBuilder
+            ->setField('state')
+            ->setValue((string)\Magento\Sales\Model\Order\Creditmemo::STATE_OPEN)
+            ->setConditionType('eq')
+            ->create();
+        $incrementFilter = $filterBuilder
+            ->setField('increment_id')
+            ->setValue('456')
+            ->setConditionType('eq')
+            ->create();
+        $zeroStatusFilter = $filterBuilder
+            ->setField('can_void_flag')
+            ->setValue('0')
+            ->setConditionType('eq')
+            ->create();
+        $sortOrder = $sortOrderBuilder
+            ->setField('grand_total')
+            ->setDirection('ASC')
+            ->create();
+
+        $searchCriteriaBuilder->addFilters([$stateFilter]);
+        $searchCriteriaBuilder->addFilters([$incrementFilter, $zeroStatusFilter]);
+        $searchCriteriaBuilder->addSortOrder($sortOrder);
         $searchData = $searchCriteriaBuilder->create()->__toArray();
 
         $requestData = ['searchCriteria' => $searchData];
@@ -70,8 +89,10 @@ class InvoiceListTest extends WebapiAbstract
         $result = $this->_webApiCall($serviceInfo, $requestData);
         // TODO Test fails, due to the inability of the framework API to handle data collection
         $this->assertArrayHasKey('items', $result);
-        $this->assertCount(1, $result['items']);
+        $this->assertCount(2, $result['items']);
         $this->assertArrayHasKey('search_criteria', $result);
+        $this->assertEquals('789', $result['items'][0]['increment_id']);
+        $this->assertEquals('456', $result['items'][1]['increment_id']);
         $this->assertEquals($searchData, $result['search_criteria']);
     }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderItemGetListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderItemGetListTest.php
index 25af17f6bb1ab442a47311b32bb61716623820d3..08b7ecfa97958df9c960f234aaf90007b0fef102 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderItemGetListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderItemGetListTest.php
@@ -27,26 +27,40 @@ class OrderItemGetListTest extends WebapiAbstract
     }
 
     /**
-     * @magentoApiDataFixture Magento/Sales/_files/order.php
+     * @magentoApiDataFixture Magento/Sales/_files/order_item_list.php
      */
     public function testGetList()
     {
+        $expectedRowTotals = [112, 102, 92];
+        /** @var \Magento\Framework\Api\SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = $this->objectManager->get(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
         /** @var \Magento\Sales\Model\Order $order */
         $order = $this->objectManager->create(\Magento\Sales\Model\Order::class);
         $order->loadByIncrementId(self::ORDER_INCREMENT_ID);
-
         /** @var $searchCriteriaBuilder  \Magento\Framework\Api\SearchCriteriaBuilder */
         $searchCriteriaBuilder = $this->objectManager->create(\Magento\Framework\Api\SearchCriteriaBuilder::class);
         /** @var $filterBuilder  \Magento\Framework\Api\FilterBuilder */
         $filterBuilder = $this->objectManager->create(\Magento\Framework\Api\FilterBuilder::class);
 
-        $searchCriteriaBuilder->addFilters(
-            [
-                $filterBuilder->setField('order_id')
-                    ->setValue($order->getId())
-                    ->create(),
-            ]
-        );
+        $filter2 = $filterBuilder->setField('product_type')
+            ->setValue('configurable')
+            ->create();
+        $filter3 = $filterBuilder->setField('base_price')
+            ->setValue(110)
+            ->setConditionType('gteq')
+            ->create();
+        $filter4 = $filterBuilder->setField('product_type')
+            ->setValue('simple')
+            ->setConditionType('neq')
+            ->create();
+        $sortOrder = $sortOrderBuilder->setField('row_total')
+            ->setDirection('DESC')
+            ->create();
+        $searchCriteriaBuilder->addFilters([$filter4]);
+        $searchCriteriaBuilder->addFilters([$filter2, $filter3]);
+        $searchCriteriaBuilder->addSortOrder($sortOrder);
 
         $requestData = ['searchCriteria' => $searchCriteriaBuilder->create()->__toArray()];
 
@@ -66,9 +80,15 @@ class OrderItemGetListTest extends WebapiAbstract
 
         $this->assertTrue(is_array($response));
         $this->assertArrayHasKey('items', $response);
-        $this->assertCount(1, $response['items']);
+        $this->assertCount(3, $response['items']);
         $this->assertTrue(is_array($response['items'][0]));
-        $this->assertOrderItem(current($order->getItems()), $response['items'][0]);
+        $rowTotals = [];
+
+        foreach ($response['items'] as $item) {
+            $rowTotals[] = $item['row_total'];
+        }
+
+        $this->assertEquals($expectedRowTotals, $rowTotals);
     }
 
     /**
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderListTest.php
index 13a7de4201914269b992623a93ad4c89f99f7afd..85cc726ef695aa25373e433776538aaff06a422d 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderListTest.php
@@ -30,10 +30,14 @@ class OrderListTest extends WebapiAbstract
     }
 
     /**
-     * @magentoApiDataFixture Magento/Sales/_files/order.php
+     * @magentoApiDataFixture Magento/Sales/_files/order_list.php
      */
     public function testOrderList()
     {
+        /** @var \Magento\Framework\Api\SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = $this->objectManager->get(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
         /** @var $searchCriteriaBuilder  \Magento\Framework\Api\SearchCriteriaBuilder */
         $searchCriteriaBuilder = $this->objectManager->create(
             \Magento\Framework\Api\SearchCriteriaBuilder::class
@@ -43,16 +47,27 @@ class OrderListTest extends WebapiAbstract
         $filterBuilder = $this->objectManager->create(
             \Magento\Framework\Api\FilterBuilder::class
         );
-
-        $searchCriteriaBuilder->addFilters(
-            [
-                $filterBuilder
-                    ->setField('status')
-                    ->setValue('processing')
-                    ->setConditionType('eq')
-                    ->create(),
-            ]
-        );
+        $filter1 = $filterBuilder
+            ->setField('status')
+            ->setValue('processing')
+            ->setConditionType('eq')
+            ->create();
+        $filter2 = $filterBuilder
+            ->setField('state')
+            ->setValue(\Magento\Sales\Model\Order::STATE_NEW)
+            ->setConditionType('eq')
+            ->create();
+        $filter3 = $filterBuilder
+            ->setField('increment_id')
+            ->setValue('100000001')
+            ->setConditionType('eq')
+            ->create();
+        $sortOrder = $sortOrderBuilder->setField('grand_total')
+            ->setDirection('DESC')
+            ->create();
+        $searchCriteriaBuilder->addFilters([$filter1]);
+        $searchCriteriaBuilder->addFilters([$filter2, $filter3]);
+        $searchCriteriaBuilder->addSortOrder($sortOrder);
         $searchData = $searchCriteriaBuilder->create()->__toArray();
 
         $requestData = ['searchCriteria' => $searchData];
@@ -70,8 +85,10 @@ class OrderListTest extends WebapiAbstract
 
         $result = $this->_webApiCall($serviceInfo, $requestData);
         $this->assertArrayHasKey('items', $result);
-        $this->assertCount(1, $result['items']);
+        $this->assertCount(2, $result['items']);
         $this->assertArrayHasKey('search_criteria', $result);
         $this->assertEquals($searchData, $result['search_criteria']);
+        $this->assertEquals('100000002', $result['items'][0]['increment_id']);
+        $this->assertEquals('100000001', $result['items'][1]['increment_id']);
     }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentListTest.php
index 3dd721b3b88d1cc89f9bac1d0e5e6f729312455e..3d00dd7948523a5f6984430ba3ae971c7ae84f2e 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentListTest.php
@@ -29,10 +29,14 @@ class ShipmentListTest extends WebapiAbstract
     }
 
     /**
-     * @magentoApiDataFixture Magento/Sales/_files/shipment.php
+     * @magentoApiDataFixture Magento/Sales/_files/shipment_list.php
      */
     public function testShipmentList()
     {
+        /** @var \Magento\Framework\Api\SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = $this->objectManager->get(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
         /** @var $searchCriteriaBuilder  \Magento\Framework\Api\SearchCriteriaBuilder */
         $searchCriteriaBuilder = $this->objectManager->create(
             \Magento\Framework\Api\SearchCriteriaBuilder::class
@@ -42,16 +46,28 @@ class ShipmentListTest extends WebapiAbstract
         $filterBuilder = $this->objectManager->create(
             \Magento\Framework\Api\FilterBuilder::class
         );
+        $filter1 = $filterBuilder
+            ->setField('shipment_status')
+            ->setValue(1)
+            ->setConditionType('eq')
+            ->create();
+        $filter2 = $filterBuilder
+            ->setField('store_id')
+            ->setValue(1)
+            ->setConditionType('eq')
+            ->create();
+        $filter3 = $filterBuilder
+            ->setField('shipping_address_id')
+            ->setValue(3)
+            ->setConditionType('eq')
+            ->create();
+        $sortOrder = $sortOrderBuilder->setField('increment_id')
+            ->setDirection('ASC')
+            ->create();
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $searchCriteriaBuilder->addFilters([$filter3]);
+        $searchCriteriaBuilder->addSortOrder($sortOrder);
 
-        $searchCriteriaBuilder->addFilters(
-            [
-                $filterBuilder
-                    ->setField('shipment_status')
-                    ->setValue((string)\Magento\Sales\Model\Order\Shipment::STATUS_NEW)
-                    ->setConditionType('eq')
-                    ->create()
-            ]
-        );
         $searchData = $searchCriteriaBuilder->create()->__toArray();
 
         $requestData = ['searchCriteria' => $searchData];
@@ -70,8 +86,10 @@ class ShipmentListTest extends WebapiAbstract
         $result = $this->_webApiCall($serviceInfo, $requestData);
         // TODO Test fails, due to the inability of the framework API to handle data collection
         $this->assertArrayHasKey('items', $result);
-        $this->assertCount(1, $result['items']);
+        $this->assertCount(2, $result['items']);
         $this->assertArrayHasKey('search_criteria', $result);
         $this->assertEquals($searchData, $result['search_criteria']);
+        $this->assertEquals('100000002', $result['items'][0]['increment_id']);
+        $this->assertEquals('100000003', $result['items'][1]['increment_id']);
     }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/TransactionTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/TransactionTest.php
index d546bdd01ad5dc0ac95014f851a5d30b9f482e29..3a2aab87946708c0b5a4a84cdf759fedda69834a 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/TransactionTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/TransactionTest.php
@@ -88,9 +88,9 @@ class TransactionTest extends WebapiAbstract
 
     /**
      * Tests list of order transactions
-     * @dataProvider filtersDataProvider
+     * @magentoApiDataFixture Magento/Sales/_files/transactions_list.php
      */
-    public function testTransactionList($filters)
+    public function testTransactionList()
     {
         /** @var Order $order */
         $order = $this->objectManager->create(\Magento\Sales\Model\Order::class);
@@ -114,8 +114,38 @@ class TransactionTest extends WebapiAbstract
         $searchCriteriaBuilder = $this->objectManager->create(
             \Magento\Framework\Api\SearchCriteriaBuilder::class
         );
+        /** @var $filterBuilder  \Magento\Framework\Api\FilterBuilder */
+        $filterBuilder = $this->objectManager->create(
+            \Magento\Framework\Api\FilterBuilder::class
+        );
+        /** @var \Magento\Framework\Api\SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = $this->objectManager->create(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
+        $filter1 = $filterBuilder->setField('txn_id')
+            ->setValue('%trx_auth%')
+            ->setConditionType('like')
+            ->create();
+        $filter2 = $filterBuilder->setField('txn_id')
+            ->setValue('trx_capture')
+            ->setConditionType('eq')
+            ->create();
+        $filter3 = $filterBuilder->setField('parent_txn_id')
+            ->setValue(null)
+            ->setConditionType('null')
+            ->create();
+        $filter4 = $filterBuilder->setField('is_closed')
+            ->setValue(0)
+            ->setConditionType('eq')
+            ->create();
+        $sortOrder = $sortOrderBuilder->setField('parent_id')
+            ->setDirection('ASC')
+            ->create();
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $searchCriteriaBuilder->addFilters([$filter3, $filter4]);
+        $searchCriteriaBuilder->addSortOrder($sortOrder);
 
-        $searchCriteriaBuilder->addFilters($filters);
         $searchData = $searchCriteriaBuilder->create()->__toArray();
 
         $requestData = ['searchCriteria' => $searchData];
@@ -132,14 +162,12 @@ class TransactionTest extends WebapiAbstract
             ],
         ];
         $result = $this->_webApiCall($serviceInfo, $requestData);
-
         $this->assertArrayHasKey('items', $result);
 
         $transactionData = $this->getPreparedTransactionData($transaction);
         $childTransactionData = $this->getPreparedTransactionData($childTransaction);
         $transactionData['child_transactions'][] = $childTransactionData;
         $expectedData = [$transactionData, $childTransactionData];
-
         $this->assertEquals($expectedData, $result['items']);
         $this->assertArrayHasKey('search_criteria', $result);
         $this->assertEquals($searchData, $result['search_criteria']);
@@ -168,7 +196,7 @@ class TransactionTest extends WebapiAbstract
                 'order_id' => (int)$transaction->getOrderId(),
                 'payment_id' => (int)$transaction->getPaymentId(),
                 'txn_id' => $transaction->getTxnId(),
-                'parent_txn_id' => ($transaction->getParentTxnId() ? (string)$transaction->getParentTxnId() : ''),
+                'parent_txn_id' => ($transaction->getParentTxnId() ? (string)$transaction->getParentTxnId() : null),
                 'txn_type' => $transaction->getTxnType(),
                 'is_closed' => (int)$transaction->getIsClosed(),
                 'additional_information' => ['data'],
@@ -181,6 +209,7 @@ class TransactionTest extends WebapiAbstract
     }
 
     /**
+     * @deprecated
      * @return array
      */
     public function filtersDataProvider()
diff --git a/dev/tests/api-functional/testsuite/Magento/SalesRule/Api/CouponRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/SalesRule/Api/CouponRepositoryTest.php
index 8e4fc715a2de156a89318d3aa96ec947e5a5f0a9..8b4452d44a09bd5c17e26fc631e0ed5d26bed517 100644
--- a/dev/tests/api-functional/testsuite/Magento/SalesRule/Api/CouponRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/SalesRule/Api/CouponRepositoryTest.php
@@ -15,6 +15,16 @@ class CouponRepositoryTest extends WebapiAbstract
     const RESOURCE_PATH = '/V1/coupons';
     const SERVICE_VERSION = "V1";
 
+    /**
+     * @var \Magento\Framework\ObjectManagerInterface
+     */
+    private $objectManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+    }
+
     protected function getCouponData()
     {
         $data = [
@@ -88,6 +98,66 @@ class CouponRepositoryTest extends WebapiAbstract
         return $result;
     }
 
+    /**
+     * @magentoApiDataFixture Magento/SalesRule/_files/coupons_advanced.php
+     */
+    public function testGetListWithMultipleFiltersAndSorting()
+    {
+        /** @var $searchCriteriaBuilder  \Magento\Framework\Api\SearchCriteriaBuilder */
+        $searchCriteriaBuilder = $this->objectManager->create(
+            \Magento\Framework\Api\SearchCriteriaBuilder::class
+        );
+        /** @var $filterBuilder  \Magento\Framework\Api\FilterBuilder */
+        $filterBuilder = $this->objectManager->create(
+            \Magento\Framework\Api\FilterBuilder::class
+        );
+        /** @var \Magento\Framework\Api\SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = $this->objectManager->create(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
+
+        $filter1 = $filterBuilder->setField('type')
+            ->setValue(1)
+            ->setConditionType('eq')
+            ->create();
+        $filter2 = $filterBuilder->setField('code')
+            ->setValue('coupon_code_auto')
+            ->setConditionType('eq')
+            ->create();
+        $filter3 = $filterBuilder->setField('is_primary')
+            ->setValue(1)
+            ->setConditionType('eq')
+            ->create();
+        $sortOrder = $sortOrderBuilder->setField('code')
+            ->setDirection('DESC')
+            ->create();
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $searchCriteriaBuilder->addFilters([$filter3]);
+        $searchCriteriaBuilder->addSortOrder($sortOrder);
+        $searchData = $searchCriteriaBuilder->create()->__toArray();
+        $requestData = ['searchCriteria' => $searchData];
+
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData),
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
+            ],
+            'soap' => [
+                'service' => self::SERVICE_NAME,
+                'serviceVersion' => self::SERVICE_VERSION,
+                'operation' => self::SERVICE_NAME . 'GetList',
+            ],
+        ];
+
+        $result = $this->_webApiCall($serviceInfo, $requestData);
+        $this->assertArrayHasKey('items', $result);
+        $this->assertArrayHasKey('search_criteria', $result);
+        $this->assertCount(2, $result['items']);
+        $this->assertEquals('autogenerated_3_2', $result['items'][0]['code']);
+        $this->assertEquals('autogenerated_2_1', $result['items'][1]['code']);
+        $this->assertEquals($searchData, $result['search_criteria']);
+    }
+
     public function verifyGetList($couponId)
     {
         $searchCriteria = [
diff --git a/dev/tests/api-functional/testsuite/Magento/SalesRule/Api/RuleRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/SalesRule/Api/RuleRepositoryTest.php
index 6dd9d7319a79c4e52fc235f7d575ffa7e1f5791b..c3299748e0c2185e66ab045f70801b783d0b1b9f 100644
--- a/dev/tests/api-functional/testsuite/Magento/SalesRule/Api/RuleRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/SalesRule/Api/RuleRepositoryTest.php
@@ -15,6 +15,16 @@ class RuleRepositoryTest extends WebapiAbstract
     const RESOURCE_PATH = '/V1/salesRules';
     const SERVICE_VERSION = "V1";
 
+    /**
+     * @var \Magento\Framework\ObjectManagerInterface
+     */
+    private $objectManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+    }
+
     protected function getSalesRuleData()
     {
         $data = [
@@ -161,6 +171,68 @@ class RuleRepositoryTest extends WebapiAbstract
         return $response['items'][0];
     }
 
+    /**
+     * @magentoApiDataFixture Magento/SalesRule/_files/rules_advanced.php
+     */
+    public function testGetListWithMultipleFiltersAndSorting()
+    {
+        /** @var $searchCriteriaBuilder  \Magento\Framework\Api\SearchCriteriaBuilder */
+        $searchCriteriaBuilder = $this->objectManager->create(
+            \Magento\Framework\Api\SearchCriteriaBuilder::class
+        );
+        /** @var $filterBuilder  \Magento\Framework\Api\FilterBuilder */
+        $filterBuilder = $this->objectManager->create(
+            \Magento\Framework\Api\FilterBuilder::class
+        );
+        /** @var \Magento\Framework\Api\SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = $this->objectManager->create(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
+
+        $filter1 = $filterBuilder->setField('is_rss')
+            ->setValue(1)
+            ->setConditionType('eq')
+            ->create();
+        $filter2 = $filterBuilder->setField('name')
+            ->setValue('#4')
+            ->setConditionType('eq')
+            ->create();
+        $filter3 = $filterBuilder->setField('uses_per_coupon')
+            ->setValue(1)
+            ->setConditionType('gt')
+            ->create();
+        $sortOrder = $sortOrderBuilder->setField('name')
+            ->setDirection('ASC')
+            ->create();
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $searchCriteriaBuilder->addFilters([$filter3]);
+        $searchCriteriaBuilder->addSortOrder($sortOrder);
+        $searchData = $searchCriteriaBuilder->create()->__toArray();
+
+        $requestData = ['searchCriteria' => $searchData];
+
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => self::RESOURCE_PATH . '/search?' . http_build_query($requestData),
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
+            ],
+            'soap' => [
+                'service' => self::SERVICE_NAME,
+                'serviceVersion' => self::SERVICE_VERSION,
+                'operation' => self::SERVICE_NAME . 'GetList',
+            ],
+        ];
+
+        $result = $this->_webApiCall($serviceInfo, $requestData);
+        $this->assertArrayHasKey('items', $result);
+        $this->assertArrayHasKey('search_criteria', $result);
+        $this->assertCount(2, $result['items']);
+        $this->assertEquals('#1', $result['items'][0]['name']);
+        $this->assertEquals('#2', $result['items'][1]['name']);
+        $this->assertEquals($searchData, $result['search_criteria']);
+    }
+
     /**
      * Create Sales rule
      *
diff --git a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxClassRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxClassRepositoryTest.php
index 8035900a22d58d186a0e893101da27bc7b229d84..0c17ed539564bb72dd3374ed1bee9fa5a29047e8 100644
--- a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxClassRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxClassRepositoryTest.php
@@ -10,6 +10,7 @@ namespace Magento\Tax\Api;
 
 use Magento\Framework\Api\FilterBuilder;
 use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrderBuilder;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Tax\Api\Data\TaxClassInterfaceFactory;
 use Magento\Tax\Model\ClassModel;
@@ -19,6 +20,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract;
 
 /**
  * Tests for tax class service.
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class TaxClassRepositoryTest extends WebapiAbstract
 {
@@ -32,6 +34,9 @@ class TaxClassRepositoryTest extends WebapiAbstract
     /** @var FilterBuilder */
     private $filterBuilder;
 
+    /** @var  SortOrderBuilder */
+    private $sortOrderBuilder;
+
     /** @var TaxClassInterfaceFactory */
     private $taxClassFactory;
 
@@ -64,6 +69,9 @@ class TaxClassRepositoryTest extends WebapiAbstract
             \Magento\Tax\Model\TaxClass\Repository::class,
             ['classModelRegistry' => $this->taxClassRegistry]
         );
+        $this->sortOrderBuilder = Bootstrap::getObjectManager()->create(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
     }
 
     /**
@@ -268,6 +276,8 @@ class TaxClassRepositoryTest extends WebapiAbstract
         $filter4 = $this->filterBuilder->setField(ClassModel::KEY_TYPE)
             ->setValue($customerTaxClass[ClassModel::KEY_TYPE])
             ->create();
+        $sortOrder = $this->sortOrderBuilder->setField("class_type")
+            ->setDirection("ASC")->create();
 
         /**
          * (class_name == 'Retail Customer' || class_name == 'Taxable Goods)
@@ -275,6 +285,7 @@ class TaxClassRepositoryTest extends WebapiAbstract
          */
         $this->searchCriteriaBuilder->addFilters([$filter1, $filter2]);
         $this->searchCriteriaBuilder->addFilters([$filter3, $filter4]);
+        $this->searchCriteriaBuilder->addSortOrder($sortOrder);
         $searchCriteria = $this->searchCriteriaBuilder->setCurrentPage(1)->setPageSize(10)->create();
         $searchData = $searchCriteria->__toArray();
         $requestData = ['searchCriteria' => $searchData];
@@ -291,15 +302,15 @@ class TaxClassRepositoryTest extends WebapiAbstract
         ];
         $searchResults = $this->_webApiCall($serviceInfo, $requestData);
         $this->assertEquals(2, $searchResults['total_count']);
+
         $this->assertEquals(
-            $productTaxClass[ClassModel::KEY_NAME],
+            $customerTaxClass[ClassModel::KEY_NAME],
             $searchResults['items'][0][ClassModel::KEY_NAME]
         );
         $this->assertEquals(
-            $customerTaxClass[ClassModel::KEY_NAME],
+            $productTaxClass[ClassModel::KEY_NAME],
             $searchResults['items'][1][ClassModel::KEY_NAME]
         );
-
         /** class_name == 'Retail Customer' && ( class_type == 'CUSTOMER' || class_type == 'PRODUCT') */
         $this->searchCriteriaBuilder->addFilters([$filter2]);
         $this->searchCriteriaBuilder->addFilters([$filter3, $filter4]);
diff --git a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRateRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRateRepositoryTest.php
index 4115db42dd880f638250b2860bfbddb6b76543c1..54598a603fd7cf843f4aae9e7ba96b35fb84f5d6 100644
--- a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRateRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRateRepositoryTest.php
@@ -479,16 +479,26 @@ class TaxRateRepositoryTest extends WebapiAbstract
         $this->_markTestAsRestOnly();
         $rates = $this->setupTaxRatesForSearch();
 
+        $filterBR = $this->filterBuilder->setField(Rate::KEY_COUNTRY_ID)
+            ->setValue('BR')
+            ->create();
+        $filterUS = $this->filterBuilder->setField(Rate::KEY_COUNTRY_ID)
+            ->setValue('US')
+            ->create();
         // Find rates which country id 'CZ'
-        $filter = $this->filterBuilder->setField(Rate::KEY_COUNTRY_ID)
+        $filterCZ = $this->filterBuilder->setField(Rate::KEY_COUNTRY_ID)
             ->setValue('CZ')
             ->create();
         $sortOrder = $this->sortOrderBuilder
             ->setField(Rate::KEY_POSTCODE)
             ->setDirection(SortOrder::SORT_DESC)
             ->create();
+        $filterRate = $this->filterBuilder->setField(Rate::KEY_PERCENTAGE_RATE)
+            ->setValue('2.2000')
+            ->create();
+        $this->searchCriteriaBuilder->addFilters([$filterBR, $filterUS, $filterCZ]);
         // Order them by descending postcode (not the default order)
-        $this->searchCriteriaBuilder->addFilters([$filter])
+        $this->searchCriteriaBuilder->addFilters([$filterCZ, $filterRate])
             ->addSortOrder($sortOrder);
         $searchData = $this->searchCriteriaBuilder->create()->__toArray();
         $requestData = ['searchCriteria' => $searchData];
diff --git a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRuleRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRuleRepositoryInterfaceTest.php
index dad1f3c493ef047d43891fc2586e8c5e52cc65f1..7df25a2edba22be819f9d69de20ae56e917cda77 100644
--- a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRuleRepositoryInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRuleRepositoryInterfaceTest.php
@@ -8,10 +8,16 @@ namespace Magento\Tax\Api;
 
 use Magento\Framework\Api\FilterBuilder;
 use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrderBuilder;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\TestCase\WebapiAbstract;
 use Magento\Webapi\Model\Rest\Config as HttpConstants;
 
+/**
+ * Class TaxRuleRepositoryInterfaceTest
+ * @package Magento\Tax\Api
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class TaxRuleRepositoryInterfaceTest extends WebapiAbstract
 {
     const SERVICE_NAME = "taxTaxRuleRepositoryV1";
@@ -33,6 +39,15 @@ class TaxRuleRepositoryInterfaceTest extends WebapiAbstract
     /** @var SearchCriteriaBuilder */
     private $searchCriteriaBuilder;
 
+    /** @var  \Magento\Tax\Api\Data\TaxClassInterface | \Magento\Tax\Model\ClassModel */
+    private $taxClass;
+
+    /** @var  \Magento\Tax\Api\Data\TaxRateInterface | \Magento\Tax\Model\Calculation\Rate */
+    private $taxRate;
+
+    /** @var  SortOrderBuilder */
+    private $sortOrderBuilder;
+
     /**
      * Execute per test initialization.
      */
@@ -52,6 +67,16 @@ class TaxRuleRepositoryInterfaceTest extends WebapiAbstract
         $this->filterBuilder = $objectManager->create(
             \Magento\Framework\Api\FilterBuilder::class
         );
+        $this->sortOrderBuilder = $objectManager->create(
+            SortOrderBuilder::class
+        );
+        $this->taxClass = $objectManager->create(
+            \Magento\Tax\Api\Data\TaxClassInterface::class
+        );
+
+        $this->taxRate = $objectManager->create(
+            \Magento\Tax\Api\Data\TaxRateInterface::class
+        );
 
         /** Initialize tax classes, tax rates and tax rules defined in fixture Magento/Tax/_files/tax_classes.php */
         $this->getFixtureTaxRates();
@@ -311,21 +336,32 @@ class TaxRuleRepositoryInterfaceTest extends WebapiAbstract
     /**
      * @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
      */
-    public function testSearchTaxRulesCodeLike()
+    public function testSearchTaxRulesCodeWithJoins()
     {
-        // Find rules whose code starts with 'Test Rule'
-        $filter = $this->filterBuilder
-            ->setField('code')
-            ->setValue('Test Rule%')
-            ->setConditionType('like')
-            ->create();
+        $customerTaxClass =  clone $this->taxClass->load('CustomerTaxClass2', 'class_name');
+        $productTaxClass = clone $this->taxClass->load('Taxable Goods', 'class_name');
+        $taxRate = $this->taxRate->load('*', 'code');
 
-        $sortFilter = $this->filterBuilder
-            ->setField('position')
-            ->setValue(0)
+        $filter2 = $this->filterBuilder
+            ->setField('customer_tax_class_ids')
+            ->setValue($customerTaxClass->getClassId())
+            ->create();
+        $filter3 = $this->filterBuilder
+            ->setField('product_tax_class_ids')
+            ->setValue($productTaxClass->getClassId())
+            ->create();
+        $filter4 = $this->filterBuilder
+            ->setField('tax_calculation_rate_id')
+            ->setValue($taxRate->getId())
+            ->create();
+        $sortOrder = $this->sortOrderBuilder
+            ->setField('code')
+            ->setDirection('DESC')
             ->create();
 
-        $this->searchCriteriaBuilder->addFilters([$filter, $sortFilter]);
+        $this->searchCriteriaBuilder->addFilters([$filter2, $filter3]);
+        $this->searchCriteriaBuilder->addFilters([$filter4]);
+        $this->searchCriteriaBuilder->addSortOrder($sortOrder);
 
         $fixtureRule = $this->getFixtureTaxRules()[1];
 
@@ -350,24 +386,24 @@ class TaxRuleRepositoryInterfaceTest extends WebapiAbstract
 
         $expectedRuleData = [
             [
-                'id' => $fixtureRule->getId(),
-                'code' => 'Test Rule',
+                'id' => $this->getFixtureTaxRules()[0]->getId(),
+                'code' => 'Test Rule Duplicate',
                 'priority' => 0,
                 'position' => 0,
                 'calculate_subtotal' => 0,
                 'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
                 'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
-                'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates())),
+                'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates()))
             ],
             [
-                'id' => $this->getFixtureTaxRules()[0]->getId(),
-                'code' => 'Test Rule Duplicate',
+                'id' => $fixtureRule->getId(),
+                'code' => 'Test Rule',
                 'priority' => 0,
                 'position' => 0,
                 'calculate_subtotal' => 0,
                 'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
                 'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
-                'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates()))
+                'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates())),
             ],
         ];
         $this->assertEquals($expectedRuleData, $searchResults['items']);
diff --git a/dev/tests/api-functional/testsuite/Magento/Webapi/JoinDirectivesTest.php b/dev/tests/api-functional/testsuite/Magento/Webapi/JoinDirectivesTest.php
index 26bfc7af7726653b73d4bcd67aa6ef1ca7fdf000..f951316b606f1e94e8633685543a724da2e27e5e 100644
--- a/dev/tests/api-functional/testsuite/Magento/Webapi/JoinDirectivesTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Webapi/JoinDirectivesTest.php
@@ -44,6 +44,8 @@ class JoinDirectivesTest extends \Magento\TestFramework\TestCase\WebapiAbstract
     }
 
     /**
+     * Rollback rules
+     * @magentoApiDataFixture Magento/SalesRule/_files/rules_rollback.php
      * @magentoApiDataFixture Magento/Sales/_files/quote.php
      */
     public function testGetList()
diff --git a/dev/tests/functional/tests/app/Magento/Config/Test/Block/System/Config/AdminForm.php b/dev/tests/functional/tests/app/Magento/Config/Test/Block/System/Config/AdminForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..38bb261cb790e295919aea49f344e1dfbeba1cab
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Config/Test/Block/System/Config/AdminForm.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Block\System\Config;
+
+use Magento\Mtf\Block\Form;
+use Magento\Mtf\Client\Locator;
+
+/**
+ * Admin Security form in admin configurations.
+ *
+ * Locate Admin account sharing settings, see if its visible
+ */
+class AdminForm extends Form
+{
+    private $adminAccountSharingField = '#admin_security_admin_account_sharing';
+
+    public function adminAccountSharingAvailability()
+    {
+        return $this->_rootElement->find($this->adminAccountSharingField, Locator::SELECTOR_CSS)->isVisible();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Config/Test/Constraint/AssertAdminAccountSharing.php b/dev/tests/functional/tests/app/Magento/Config/Test/Constraint/AssertAdminAccountSharing.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae01915bef395d5e1db6916f0adde804f0829bdf
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Config/Test/Constraint/AssertAdminAccountSharing.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Config\Test\Constraint;
+
+use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\Config\Test\Page\Adminhtml\AdminAccountSharing;
+
+/**
+ * Assert Admin account sharing is available in Stores>Configuration>advanced>admin grid.
+ */
+class AssertAdminAccountSharing extends AbstractConstraint
+{
+    /**
+     * Assert Admin account sharing is available in Stores>Configuration>advanced>admin grid.
+     * @param AdminAccountSharing $adminAccountSharing
+     */
+    public function processAssert(AdminAccountSharing $adminAccountSharing)
+    {
+        \PHPUnit_Framework_Assert::assertTrue(
+            $adminAccountSharing->getAdminForm()->adminAccountSharingAvailability(),
+            'Admin Account Sharing Option is not available'
+        );
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Admin Account Sharing option is available and present in Stores>Configuration>Advanced>Admin Grid.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Config/Test/Page/Adminhtml/AdminAccountSharing.xml b/dev/tests/functional/tests/app/Magento/Config/Test/Page/Adminhtml/AdminAccountSharing.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0369a7746d5282d5b570657b8aded49ca716b211
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Config/Test/Page/Adminhtml/AdminAccountSharing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd">
+    <page name="AdminAccountSharing" area="Adminhtml" mca="admin/system_config/edit/section/admin/" module="Magento_Config">
+           <block name="adminForm" class="Magento\Config\Test\Block\System\Config\AdminForm" locator="[id='page:main-container']" strategy="css selector" />
+       </page>
+   </config>
diff --git a/dev/tests/functional/tests/app/Magento/Config/Test/TestCase/VerifyAdminAccountSharingEntityTest.php b/dev/tests/functional/tests/app/Magento/Config/Test/TestCase/VerifyAdminAccountSharingEntityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..30928810490d770c5ea8309748b07aeabf45314a
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Config/Test/TestCase/VerifyAdminAccountSharingEntityTest.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Config\Test\TestCase;
+
+use Magento\Mtf\TestCase\Injectable;
+use Magento\Config\Test\Page\Adminhtml\AdminAccountSharing;
+
+/**
+ * Steps:
+ * 1. Log in to Admin.
+ * 2. Go to Stores>Configuration>Advanced>admin>Security.
+ * 3. * 7. Verify admin Acoount Sharing option availability.
+ *
+ * @group Config_(PS)
+ * @ZephyrId MAGETWO-47822
+ */
+class VerifyAdminAccountSharingEntityTest extends Injectable
+{
+    /* tags */
+    const MVP = 'yes';
+    const DOMAIN = 'PS';
+    const TEST_TYPE = 'extended_acceptance_test';
+    /* end tags */
+
+    /**
+     * Admin account settings page.
+     *
+     * @var adminAccountSharing
+     */
+    private $adminAccountSharing;
+
+    /**
+     * @param AdminAccountSharing $adminAccountSharing
+     */
+    public function __inject(
+        AdminAccountSharing $adminAccountSharing
+    ) {
+        $this->adminAccountSharing = $adminAccountSharing;
+    }
+
+    /**
+     * Create Verify Admin Account Sharing test.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->adminAccountSharing->open();
+        sleep(10);
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Config/Test/TestCase/VerifyAdminAccountSharingEntityTest.xml b/dev/tests/functional/tests/app/Magento/Config/Test/TestCase/VerifyAdminAccountSharingEntityTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..46b043e6fb5a6a89e5fbe4b5789d85398a4d7e13
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Config/Test/TestCase/VerifyAdminAccountSharingEntityTest.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/variations.xsd">
+    <testCase name="Magento\Config\Test\TestCase\VerifyAdminAccountSharingEntityTest" summary="Verify admin account sharing option availability" ticketId="MAGETWO-47822">
+        <variation name="VerifyAdminAccountSharingEntityTestVariation1" summary="Verify Admin Account Sharing is available by default">
+            <constraint name="Magento\Config\Test\Constraint\AssertAdminAccountSharing" />
+        </variation>
+      </testCase>
+  </config>
diff --git a/dev/tests/functional/tests/app/Magento/Email/Test/Block/Adminhtml/Template/Edit/TemplateForm.php b/dev/tests/functional/tests/app/Magento/Email/Test/Block/Adminhtml/Template/Edit/TemplateForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..8cd455b6bed8db02270d03fd42ad235cf74e5f9f
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Email/Test/Block/Adminhtml/Template/Edit/TemplateForm.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Email\Test\Block\Adminhtml\Template\Edit;
+
+use Magento\Mtf\Block\Form;
+use Magento\Mtf\Client\Locator;
+
+/**
+ * Click Load button in Email template form.
+ * this class needs to be created because we need a customized click on the 'Load' button, its not a standard click
+ */
+class TemplateForm extends Form
+{
+    private $loadButton = '#load';
+
+    /**
+     * @return void
+     */
+    public function clickLoadTemplate()
+    {
+        $element = $this->_rootElement->find($this->loadButton, Locator::SELECTOR_CSS); // locate the Load button
+        $element->click(); // click the load button
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Email/Test/Block/Adminhtml/Template/Edit/TemplateForm.xml b/dev/tests/functional/tests/app/Magento/Email/Test/Block/Adminhtml/Template/Edit/TemplateForm.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b8bd0ee922a061a124005838dc6381e758c4c002
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Email/Test/Block/Adminhtml/Template/Edit/TemplateForm.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<mapping strict="1">
+    <fields>
+        <template_select>
+            <selector>#template_select</selector>
+            <input>select</input>
+        </template_select>
+        <template_code/>
+    </fields>
+</mapping>
\ No newline at end of file
diff --git a/dev/tests/functional/tests/app/Magento/Email/Test/Constraint/AssertEmailTemplateSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Email/Test/Constraint/AssertEmailTemplateSuccessSaveMessage.php
new file mode 100644
index 0000000000000000000000000000000000000000..4fbba15df27e7663c851a40f958c14a9deb7e4c0
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Email/Test/Constraint/AssertEmailTemplateSuccessSaveMessage.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Email\Test\Constraint;
+
+use Magento\Email\Test\Page\Adminhtml\EmailTemplateIndex;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Assertion to check Success Save Message for Email Template.
+ */
+class AssertEmailTemplateSuccessSaveMessage extends AbstractConstraint
+{
+    const SUCCESS_MESSAGE = 'You saved the email template.';
+
+    /**
+     * @param EmailTemplateIndex $emailTemplateIndex
+     */
+    public function processAssert(EmailTemplateIndex $emailTemplateIndex)
+    {
+        $actualMessage = $emailTemplateIndex->getMessagesBlock()->getSuccessMessage();
+        \PHPUnit_Framework_Assert::assertEquals(
+            self::SUCCESS_MESSAGE,
+            $actualMessage,
+            'Wrong success message is displayed.'
+            . "\nExpected: " . self::SUCCESS_MESSAGE
+            . "\nActual: " . $actualMessage
+        );
+    }
+
+    /**
+     * Text success save message is displayed
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Assert that success message is displayed.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Email/Test/Fixture/EmailTemplate.xml b/dev/tests/functional/tests/app/Magento/Email/Test/Fixture/EmailTemplate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..92870a5ebab3b8412a3c191e58a7793a2fc169fd
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Email/Test/Fixture/EmailTemplate.xml
@@ -0,0 +1,30 @@
+<?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="EmailTemplate"
+             module="Magento_Email"
+             type="flat"
+             collection="Magento\Email\Model\ResourceModel\Template\Collection"
+             repository_class="Magento\Email\Test\Repository\EmailTemplate"
+             handler_interface="Magento\Email\Test\Handler\EmailTemplate\EmailTemplateInterface"
+             class="Magento\Email\Test\Fixture\EmailTemplate"
+             entity_type="email_template">
+        <field name="template_select" is_required="1"/>
+        <field name="template_code" is_required="0"/>
+        <field name="template_text" is_required="0"/>
+        <field name="template_styles" is_required="0"/>
+        <field name="template_type" is_required="0"/>
+        <field name="template_subject" is_required="0"/>
+        <field name="template_sender_name" is_required="0"/>
+        <field name="template_sender_email" is_required="0"/>
+        <field name="added_at" is_required="0"/>
+        <field name="modified_at" is_required="0"/>
+        <field name="orig_template_code" is_required="0"/>
+        <field name="orig_template_variables" is_required="0"/>
+    </fixture>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Email/Test/Page/Adminhtml/EmailTemplateIndex.xml b/dev/tests/functional/tests/app/Magento/Email/Test/Page/Adminhtml/EmailTemplateIndex.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dbb64d68dcd9ecca556a7926533496fe287d9498
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Email/Test/Page/Adminhtml/EmailTemplateIndex.xml
@@ -0,0 +1,13 @@
+<?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="EmailTemplateIndex" area="Adminhtml" mca="admin/email_template/" module="Magento_Email">
+        <block name="pageActionsBlock" class="Magento\Backend\Test\Block\GridPageActions" locator=".page-main-actions" strategy="css selector"/>
+        <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages .messages" strategy="css selector"/>
+    </page>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Email/Test/Page/Adminhtml/EmailTemplateNew.xml b/dev/tests/functional/tests/app/Magento/Email/Test/Page/Adminhtml/EmailTemplateNew.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9c0b1a626e139fc7dc37d73d3c94890254f43430
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Email/Test/Page/Adminhtml/EmailTemplateNew.xml
@@ -0,0 +1,13 @@
+<?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="EmailTemplateNew" area="Adminhtml" mca="admin/email_template/new/" module="Magento_Email">
+        <block name="templateForm" class="Magento\Email\Test\Block\Adminhtml\Template\Edit\TemplateForm" locator="[id='page:main-container']" strategy="css selector" />
+        <block name="formPageActions" class="Magento\Backend\Test\Block\FormPageActions" locator=".page-main-actions" strategy="css selector" />
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/functional/tests/app/Magento/Email/Test/TestCase/CreateEmailTemplateEntityTest.php b/dev/tests/functional/tests/app/Magento/Email/Test/TestCase/CreateEmailTemplateEntityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..dc86b6479757e00564877fa3f52c7e5c6c3ef4f5
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Email/Test/TestCase/CreateEmailTemplateEntityTest.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Email\Test\TestCase;
+
+use Magento\Mtf\TestCase\Injectable;
+use Magento\Email\Test\Page\Adminhtml\EmailTemplateIndex;
+use Magento\Email\Test\Page\Adminhtml\EmailTemplateNew;
+use Magento\Email\Test\Fixture\EmailTemplate;
+
+/**
+ * Steps:
+ * 1. Log in to Admin.
+ * 2. Open the Email Templates page.
+ * 3. Click the "Add New Template" button.
+ * 4. Select Email Template.
+ * 5. Click the "Load Template" button.
+ * 6. Enter Email Template name.
+ * 7. Click the "Save" button.
+ * 8. Verify the email template saved successfully.
+ * @group Email_(PS)
+ * @ZephyrId MAGETWO-17155
+ */
+
+class CreateEmailTemplateEntityTest extends Injectable
+{
+    /* tags */
+    const MVP = 'yes';
+    const DOMAIN = 'PS';
+    const TEST_TYPE = 'extended_acceptance_test';
+    /* end tags */
+
+    /**
+     * Email Template Index page.
+     *
+     * @var EmailTemplateIndex
+     */
+    private $emailTemplateIndex;
+
+    /**
+     * New EmailTemplate page.
+     *
+     * @var EmailTemplateNew
+     */
+    private $emailTemplateNew;
+
+    /**
+     * Inject Email template pages.
+     *
+     * @param EmailTemplateIndex $emailTemplateIndex
+     * @param EmailTemplateNew $emailTemplateNew
+     * @return void
+     */
+    public function __inject(
+        EmailTemplateIndex $emailTemplateIndex,
+        EmailTemplateNew $emailTemplateNew
+    ) {
+        $this->emailTemplateIndex = $emailTemplateIndex;
+        $this->emailTemplateNew = $emailTemplateNew;
+    }
+
+    /**
+     * @param EmailTemplate $emailTemplate
+     */
+
+    public function test(EmailTemplate $emailTemplate)
+    {
+        $this->emailTemplateIndex->open();
+        $this->emailTemplateIndex->getPageActionsBlock()->addNew();
+        $this->emailTemplateNew->getTemplateForm()->fill($emailTemplate);
+        $this->emailTemplateNew->getTemplateForm()->clickLoadTemplate();
+        $this->emailTemplateNew->getFormPageActions()->save();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Email/Test/TestCase/CreateEmailTemplateEntityTest.xml b/dev/tests/functional/tests/app/Magento/Email/Test/TestCase/CreateEmailTemplateEntityTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..57b95ad4243004363cf7e703296c6b320793b564
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Email/Test/TestCase/CreateEmailTemplateEntityTest.xml
@@ -0,0 +1,16 @@
+<?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\Email\Test\TestCase\CreateEmailTemplateEntityTest" summary="Create new email template" ticketId="MAGETWO-17155">
+        <variation name="CreateEmailTemplateEntityTestVariation1" summary="Create Change Email template">
+            <data name="EmailTemplate/data/template_select" xsi:type="string">Change Email</data>
+            <data name="EmailTemplate/data/template_code" xsi:type="string">Test code_%isolation%</data>
+            <constraint name="Magento\Email\Test\Constraint\AssertEmailTemplateSuccessSaveMessage" />
+        </variation>
+    </testCase>
+</config>
\ No newline at end of file
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/AbstractGrid.php b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/AbstractGrid.php
index a71d23be952efc8f5d5ead051ea3afd8b0a0ecf4..24403ce94c52c6af6fc2bb8c193e9826de62daf5 100644
--- a/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/AbstractGrid.php
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/AbstractGrid.php
@@ -36,6 +36,13 @@ abstract class AbstractGrid extends Block
      */
     protected $extensionName = "//*[contains(text(), '%s')]";
 
+    /**
+     * Checkbox for select extension.
+     *
+     * @var string
+     */
+    protected $extensionCheckbox = "//tr[td/*[contains(text(), '%s')]]//*[contains(@ng-checked, 'selectedExtension')]";
+
     /**
      * Find Extension on the grid by name.
      *
@@ -85,4 +92,42 @@ abstract class AbstractGrid extends Block
 
         return false;
     }
+
+    /**
+     * Select several extensions to install on grid.
+     *
+     * @param Extension[] $extensions
+     * @return Extension[]
+     */
+    public function selectSeveralExtensions(array $extensions)
+    {
+        while (true) {
+            foreach ($extensions as $key => $extension) {
+                if ($this->isExtensionOnGrid($extension->getExtensionName())) {
+                    $this->selectExtension($extension->getExtensionName());
+                    unset($extensions[$key]);
+                }
+            }
+
+            if (empty($extensions) || !$this->clickNextPageButton()) {
+                break;
+            }
+        }
+
+        return $extensions;
+    }
+
+    /**
+     * Select extension on grid, check checkbox.
+     *
+     * @param string $extensionName
+     * @return void
+     */
+    protected function selectExtension($extensionName)
+    {
+        $this->_rootElement->find(
+            sprintf($this->extensionCheckbox, $extensionName),
+            Locator::SELECTOR_XPATH
+        )->click();
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/Grid.php b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/Grid.php
index bfa6ed4ca9a6e5b2273e0606c5df3ebd41cd52c0..49d0de9cebaf1780a9ee4489d3366d9b830d07f9 100644
--- a/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/Grid.php
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/Grid.php
@@ -21,6 +21,13 @@ class Grid extends AbstractGrid
      */
     protected $installButton = "//button[contains(@class, 'goInstall')]";
 
+    /**
+     * 'Review Updates' button that opens grid with extensions for update.
+     *
+     * @var string
+     */
+    protected $updateButton = "//button[contains(@class, 'goUpdate')]";
+
     /**
      * Select action of extension on the grid.
      *
@@ -80,6 +87,16 @@ class Grid extends AbstractGrid
         $this->_rootElement->find($this->installButton, Locator::SELECTOR_XPATH)->click();
     }
 
+    /**
+     * Click 'Review Updates' button.
+     *
+     * @return void
+     */
+    public function clickUpdateButton()
+    {
+        $this->_rootElement->find($this->updateButton, Locator::SELECTOR_XPATH)->click();
+    }
+
     /**
      * Click to uninstall button.
      *
@@ -119,7 +136,7 @@ class Grid extends AbstractGrid
      * @param Extension $extension
      * @return void
      */
-    public function clickUpdateButton(Extension $extension)
+    public function clickUpdateActionButton(Extension $extension)
     {
         $this->clickSelectActionButton($extension);
         $button = $this->_rootElement->find(
@@ -137,6 +154,8 @@ class Grid extends AbstractGrid
      */
     public function findExtensionOnGrid(Extension $extension)
     {
+        sleep(3);
+
         $this->_rootElement->waitUntil(
             function () {
                 $message = $this->_rootElement->find($this->notFoundMessage)->isVisible();
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/InstallGrid.php b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/InstallGrid.php
index 710e14a166982e5bcd9192e4cd7c1d49ba911fde..3a23f74de259eb60d50fdb76fd781f6a05c267b3 100644
--- a/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/InstallGrid.php
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/InstallGrid.php
@@ -16,7 +16,7 @@ class InstallGrid extends AbstractGrid
 {
     /**
      * "Install" button of extension.
-     * 
+     *
      * @var string
      */
     protected $extensionInstall = "//tr[td/*[contains(text(), '%s')]]//*[contains(@class, 'action-wrap')]//button";
@@ -28,13 +28,6 @@ class InstallGrid extends AbstractGrid
      */
     protected $extensionSelectVersion = "//tr[td/*[contains(text(), '%s')]]//*[contains(@id, 'selectedVersion')]";
 
-    /**
-     * Checkbox for select extension.
-     *
-     * @var string
-     */
-    protected $extensionCheckbox = "//tr[td/*[contains(text(), '%s')]]//*[contains(@ng-checked, 'selectedExtension')]";
-
     /**
      * "Install All" button.
      *
@@ -75,42 +68,4 @@ class InstallGrid extends AbstractGrid
     {
         $this->_rootElement->find($this->installAllButton, Locator::SELECTOR_CSS)->click();
     }
-
-    /**
-     * Select several extensions to install on grid.
-     *
-     * @param Extension[] $extensions
-     * @return Extension[]
-     */
-    public function selectSeveralExtensions(array $extensions)
-    {
-        while (true) {
-            foreach ($extensions as $key => $extension) {
-                if ($this->isExtensionOnGrid($extension->getExtensionName())) {
-                    $this->selectExtension($extension->getExtensionName());
-                    unset($extensions[$key]);
-                }
-            }
-
-            if (empty($extensions) || !$this->clickNextPageButton()) {
-                break;
-            }
-        }
-
-        return $extensions;
-    }
-
-    /**
-     * Select extension on grid, check checkbox.
-     *
-     * @param string $extensionName
-     * @return void
-     */
-    protected function selectExtension($extensionName)
-    {
-        $this->_rootElement->find(
-            sprintf($this->extensionCheckbox, $extensionName),
-            Locator::SELECTOR_XPATH
-        )->click();
-    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/UpdateGrid.php b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/UpdateGrid.php
new file mode 100644
index 0000000000000000000000000000000000000000..035c1722a393d032dc6a6d89485798138a2086e1
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Extension/UpdateGrid.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Setup\Test\Block\Extension;
+
+use Magento\Mtf\Client\Locator;
+use Magento\Setup\Test\Fixture\Extension;
+
+/**
+ * Class UpdateGrid
+ *
+ * Grid with extension updates.
+ */
+class UpdateGrid extends AbstractGrid
+{
+    /**
+     * 'Update All' button.
+     *
+     * @var string
+     */
+    protected $updateAllButton = "[ng-click*='updateAll']";
+
+    /**
+     * Grid that contains the list of extensions.
+     *
+     * @var string
+     */
+    protected $dataGrid = '#updateExtensionGrid';
+
+    /**
+     * Click to update all button.
+     *
+     * @return void
+     */
+    public function clickUpdateAllButton()
+    {
+        $this->_rootElement->find($this->updateAllButton, Locator::SELECTOR_CSS)->click();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Readiness.php b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Readiness.php
index 9be5c9479ded979f422bb7ea27890c5a8f82db45..27b9a81ad37dbb4e9687ffeae6b94d5b564cb3cf 100644
--- a/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Readiness.php
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/Block/Readiness.php
@@ -8,6 +8,7 @@ namespace Magento\Setup\Test\Block;
 
 use Magento\Mtf\Block\Block;
 use Magento\Mtf\Client\Locator;
+use Magento\Setup\Test\Fixture\Extension;
 
 /**
  * Readiness block.
@@ -28,6 +29,34 @@ class Readiness extends Block
      */
     protected $next = "[ng-click*='next']";
 
+    /**
+     * 'Try Again' button.
+     *
+     * @var string
+     */
+    protected $tryAgain = "[ng-click*='forceReload']";
+
+    /**
+     * Trash Bin icon.
+     *
+     * @var string
+     */
+    protected $removeExtension = '//li[contains(text(), \'%s\')]//button';
+
+    /**
+     * Remove button on modal.
+     *
+     * @var string
+     */
+    protected $removeExtensionButtonOnModal = "[ng-click*='removeExtension']";
+
+    /**
+     * Remove popup modal.
+     *
+     * @var string
+     */
+    protected $popupRemoveModal = '.modal-popup';
+
     /**
      * 'Completed!' message.
      * [ng-switch-when="true"]
@@ -98,6 +127,41 @@ class Readiness extends Block
         $this->_rootElement->find($this->next, Locator::SELECTOR_CSS)->click();
     }
 
+    /**
+     * Click on 'Try Again' button.
+     *
+     * @return void
+     */
+    public function clickTryAgain()
+    {
+        $this->_rootElement->find($this->tryAgain, Locator::SELECTOR_CSS)->click();
+        $this->waitForElementVisible($this->completedMessage, Locator::SELECTOR_CSS);
+    }
+
+    /**
+     * Click Trash Bin icon.
+     *
+     * @param Extension $extension
+     * @return void
+     */
+    public function clickRemoveExtension(Extension $extension)
+    {
+        $removeExtension = sprintf($this->removeExtension, $extension->getExtensionName());
+
+        $this->_rootElement->find($removeExtension, Locator::SELECTOR_XPATH)->click();
+    }
+
+    /**
+     * Click Remove button on modal.
+     *
+     * @return void
+     */
+    public function clickRemoveExtensionOnModal()
+    {
+        $this->_rootElement->find($this->removeExtensionButtonOnModal, Locator::SELECTOR_CSS)->click();
+        $this->waitForElementNotVisible($this->popupRemoveModal, Locator::SELECTOR_CSS);
+    }
+
     /**
      * Get Updater application check result.
      *
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/Constraint/Extension/AssertSelectSeveralExtensions.php b/dev/tests/functional/tests/app/Magento/Setup/Test/Constraint/Extension/AssertSelectSeveralExtensions.php
index 094ae1509899cd0750eab72c5c7194d1ab762f1c..c186f9bf20c00ace14645af8610b19460b914d42 100644
--- a/dev/tests/functional/tests/app/Magento/Setup/Test/Constraint/Extension/AssertSelectSeveralExtensions.php
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/Constraint/Extension/AssertSelectSeveralExtensions.php
@@ -7,7 +7,7 @@
 namespace Magento\Setup\Test\Constraint\Extension;
 
 use Magento\Mtf\Constraint\AbstractConstraint;
-use Magento\Setup\Test\Block\Extension\InstallGrid;
+use Magento\Setup\Test\Block\Extension\AbstractGrid;
 use Magento\Setup\Test\Fixture\Extension;
 
 /**
@@ -18,11 +18,11 @@ class AssertSelectSeveralExtensions extends AbstractConstraint
     /**
      * Assert that extensions were selected on the grid.
      *
-     * @param InstallGrid $grid
+     * @param AbstractGrid $grid
      * @param Extension[] $extensions
      * @return void
      */
-    public function processAssert(InstallGrid $grid, array $extensions)
+    public function processAssert(AbstractGrid $grid, array $extensions)
     {
         $extensions = $grid->selectSeveralExtensions($extensions);
         \PHPUnit_Framework_Assert::assertEmpty(
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/Page/Adminhtml/SetupWizard.xml b/dev/tests/functional/tests/app/Magento/Setup/Test/Page/Adminhtml/SetupWizard.xml
index 2e5ad0b1fdc6b8876345cb5a0eb2284185cd7c34..d8d6f828f2f93f72008cd68c3130358a220959d6 100644
--- a/dev/tests/functional/tests/app/Magento/Setup/Test/Page/Adminhtml/SetupWizard.xml
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/Page/Adminhtml/SetupWizard.xml
@@ -21,5 +21,6 @@
         <block name="successMessage" class="Magento\Setup\Test\Block\SuccessMessage" locator="body" strategy="css selector"/>
         <block name="moduleGrid" class="Magento\Setup\Test\Block\Module\Grid" locator=".admin__data-grid-outer-wrap" strategy="css selector"/>
         <block name="moduleStatus" class="Magento\Setup\Test\Block\Module\Status" locator="body" strategy="css selector"/>
+        <block name="extensionsUpdateGrid" class="Magento\Setup\Test\Block\Extension\UpdateGrid" locator="#main" strategy="css selector"/>
     </page>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/Repository/Extension.xml b/dev/tests/functional/tests/app/Magento/Setup/Test/Repository/Extension.xml
index 2a015016a78a74a5215625bd4b70aebce0164e2d..319ae1a6ab81cee7ff4341e4d948480132e395b3 100644
--- a/dev/tests/functional/tests/app/Magento/Setup/Test/Repository/Extension.xml
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/Repository/Extension.xml
@@ -20,5 +20,17 @@
         <dataset name="secondExtension">
             <field name="extensionName" xsi:type="string">magento/module-theme-sample-data</field>
         </dataset>
+
+        <dataset name="thirdExtension">
+            <field name="extensionName" xsi:type="string">magento/module-customer-sample-data</field>
+            <field name="version" xsi:type="string">100.1.0-rc3</field>
+            <field name="versionToUpdate" xsi:type="string">100.1.0</field>
+        </dataset>
+
+        <dataset name="fourthExtension">
+            <field name="extensionName" xsi:type="string">magento/module-theme-sample-data</field>
+            <field name="version" xsi:type="string">100.1.0-rc3</field>
+            <field name="versionToUpdate" xsi:type="string">100.1.0</field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/AbstractExtensionTest.php b/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/AbstractExtensionTest.php
index f1374d4ef73b06e849120ac5d603cb11cb987211..f9358abe828c5f742281f1a2df0c86187720a981 100644
--- a/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/AbstractExtensionTest.php
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/AbstractExtensionTest.php
@@ -79,14 +79,34 @@ abstract class AbstractExtensionTest extends Injectable
         AssertSuccessfulReadinessCheck $assertReadiness,
         BackupOptions $backupOptions
     ) {
+        $this->readinessCheck($assertReadiness);
+        $this->setupWizard->getReadiness()->clickNext();
+        $this->backup($backupOptions);
+        $this->setupWizard->getCreateBackup()->clickNext();
+    }
+
+    /**
+     * Perform Readiness check.
+     *
+     * @param AssertSuccessfulReadinessCheck $assertReadiness
+     */
+    protected function readinessCheck(AssertSuccessfulReadinessCheck $assertReadiness)
+    {
         // Readiness Check
         $this->setupWizard->getReadiness()->clickReadinessCheck();
+
         $assertReadiness->processAssert($this->setupWizard);
-        $this->setupWizard->getReadiness()->clickNext();
+    }
 
+    /**
+     * Perform Backup.
+     *
+     * @param BackupOptions $backupOptions
+     */
+    protected function backup(BackupOptions $backupOptions)
+    {
         // Create Backup page
         $this->setupWizard->getCreateBackup()->fill($backupOptions);
-        $this->setupWizard->getCreateBackup()->clickNext();
     }
 
     /**
@@ -143,4 +163,48 @@ abstract class AbstractExtensionTest extends Injectable
             $this->fail('Extension is not uninstalled!');
         }
     }
+
+    /**
+     * @param Extension $extension
+     * @param BackupOptions $backupOptions
+     * @param AssertFindExtensionOnGrid $assertFindExtensionOnGrid
+     * @param AssertSuccessfulReadinessCheck $assertReadiness
+     * @param AssertExtensionAndVersionCheck $assertExtensionAndVersionCheck
+     * @param AssertSuccessMessage $assertSuccessMessage
+     */
+    protected function installExtension(
+        Extension $extension,
+        BackupOptions $backupOptions,
+        AssertFindExtensionOnGrid $assertFindExtensionOnGrid,
+        AssertSuccessfulReadinessCheck $assertReadiness,
+        AssertExtensionAndVersionCheck $assertExtensionAndVersionCheck,
+        AssertSuccessMessage $assertSuccessMessage
+    ) {
+        // Open Extension Grid with extensions to install
+        $this->setupWizard->getSetupHome()->clickExtensionManager();
+        $this->setupWizard->getExtensionsGrid()->waitLoader();
+        $this->setupWizard->getExtensionsGrid()->clickInstallButton();
+
+        // Find extension on grid and install
+        $assertFindExtensionOnGrid->processAssert($this->setupWizard->getExtensionsInstallGrid(), $extension);
+        $this->setupWizard->getExtensionsInstallGrid()->install($extension);
+
+        $this->readinessCheckAndBackup($assertReadiness, $backupOptions);
+
+        // Install Extension
+        $assertExtensionAndVersionCheck->processAssert(
+            $this->setupWizard,
+            $extension,
+            AssertExtensionAndVersionCheck::TYPE_INSTALL
+        );
+        $this->setupWizard->getUpdaterExtension()->clickStartButton();
+        $assertSuccessMessage->processAssert(
+            $this->setupWizard,
+            $extension,
+            AssertSuccessMessage::TYPE_INSTALL
+        );
+
+        // Open Web Setup Wizard
+        $this->setupWizard->open();
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/ExtensionMultipleUpdateTest.php b/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/ExtensionMultipleUpdateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8175dd27b5d57dbe2a70c6e07b22ab48a647a498
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/ExtensionMultipleUpdateTest.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Setup\Test\TestCase;
+
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Setup\Test\Constraint\AssertSuccessfulReadinessCheck;
+use Magento\Setup\Test\Constraint\Extension\AssertExtensionAndVersionCheck;
+use Magento\Setup\Test\Constraint\Extension\AssertFindExtensionOnGrid;
+use Magento\Setup\Test\Constraint\Extension\AssertMultipleSuccessMessage;
+use Magento\Setup\Test\Constraint\Extension\AssertSelectSeveralExtensions;
+use Magento\Setup\Test\Constraint\Extension\AssertSuccessMessage;
+use Magento\Setup\Test\Fixture\BackupOptions;
+use Magento\Setup\Test\Fixture\Extension;
+use Magento\Setup\Test\Fixture\RepoCredentials;
+
+/**
+ * @group Setup_(CS)
+ * @ZephyrId MAGETWO-56328, MAGETWO-56332
+ */
+class ExtensionMultipleUpdateTest extends AbstractExtensionTest
+{
+    /**
+     * @param FixtureFactory $fixtureFactory
+     * @param RepoCredentials $repoCredentials
+     * @param BackupOptions $backupOptions
+     * @param AssertFindExtensionOnGrid $assertFindExtensionOnGrid
+     * @param AssertSuccessfulReadinessCheck $assertReadiness
+     * @param AssertExtensionAndVersionCheck $assertExtensionAndVersionCheck
+     * @param AssertSuccessMessage $assertSuccessMessage
+     * @param AssertMultipleSuccessMessage $assertMultipleSuccessMessage
+     * @param AssertSelectSeveralExtensions $assertSelectSeveralExtensions
+     * @param $needAuthentication
+     * @param array $extensions
+     * @param array $removeExtensions
+     *
+     * @SuppressWarnings(PHPMD.ExcessiveParameterList)
+     */
+    public function test(
+        FixtureFactory $fixtureFactory,
+        RepoCredentials $repoCredentials,
+        BackupOptions $backupOptions,
+        AssertFindExtensionOnGrid $assertFindExtensionOnGrid,
+        AssertSuccessfulReadinessCheck $assertReadiness,
+        AssertExtensionAndVersionCheck $assertExtensionAndVersionCheck,
+        AssertSuccessMessage $assertSuccessMessage,
+        AssertMultipleSuccessMessage $assertMultipleSuccessMessage,
+        AssertSelectSeveralExtensions $assertSelectSeveralExtensions,
+        $needAuthentication,
+        array $extensions,
+        array $removeExtensions
+    ) {
+        foreach ($extensions as $key => $options) {
+            $extensions[$key] = $fixtureFactory->create(Extension::class, $options);
+        }
+
+        foreach ($removeExtensions as $key => $options) {
+            $removeExtensions[$key] = $fixtureFactory->create(Extension::class, $options);
+        }
+
+        // Authenticate in admin area
+        $this->adminDashboard->open();
+
+        // Open Web Setup Wizard
+        $this->setupWizard->open();
+
+        // Authenticate on repo.magento.com
+        $this->repoAuthentication($needAuthentication, $repoCredentials);
+
+        foreach ($extensions as $extension) {
+            $this->installExtension(
+                $extension,
+                $backupOptions,
+                $assertFindExtensionOnGrid,
+                $assertReadiness,
+                $assertExtensionAndVersionCheck,
+                $assertSuccessMessage
+            );
+        }
+
+        // Open Extension Grid with extensions to update
+        $this->setupWizard->getSetupHome()->clickExtensionManager();
+        $this->setupWizard->getExtensionsGrid()->waitLoader();
+        $this->setupWizard->getExtensionsGrid()->clickUpdateButton();
+
+        // Select several extensions on grid and check it
+        $assertSelectSeveralExtensions->processAssert($this->setupWizard->getExtensionsUpdateGrid(), $extensions);
+
+        // Click general "Update" button
+        $this->setupWizard->getExtensionsUpdateGrid()->clickUpdateAllButton();
+
+        $this->readinessCheck($assertReadiness);
+
+        /** @var Extension $removeExtension */
+        foreach ($removeExtensions as $removeExtension) {
+            $this->setupWizard->getReadiness()->clickRemoveExtension($removeExtension);
+            $this->setupWizard->getReadiness()->clickRemoveExtensionOnModal();
+        }
+
+        $this->setupWizard->getReadiness()->clickTryAgain();
+        $assertReadiness->processAssert($this->setupWizard);
+        $this->setupWizard->getReadiness()->clickNext();
+        $this->backup($backupOptions);
+        $this->setupWizard->getCreateBackup()->clickNext();
+
+        // Start updating
+        $this->setupWizard->getUpdaterExtension()->clickStartButton();
+
+        $updatedExtensions = array_diff_key($extensions, $removeExtensions);
+
+        // Check success message
+        $assertMultipleSuccessMessage->processAssert(
+            $this->setupWizard,
+            $updatedExtensions,
+            AssertSuccessMessage::TYPE_UPDATE
+        );
+
+        // Uninstall installed extensions
+        foreach ($extensions as $extension) {
+            $this->uninstallExtension(
+                $extension,
+                $backupOptions,
+                $assertReadiness,
+                $assertFindExtensionOnGrid,
+                $assertExtensionAndVersionCheck,
+                $assertSuccessMessage
+            );
+        }
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/ExtensionMultipleUpdateTest.xml b/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/ExtensionMultipleUpdateTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b83cc06816360de429d7ebfa3fc67f457a0139d3
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Setup/Test/TestCase/ExtensionMultipleUpdateTest.xml
@@ -0,0 +1,27 @@
+<?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\Setup\Test\TestCase\ExtensionMultipleUpdateTest" summary="Multiple Update Extensions">
+        <variation name="PerformMultipleUpdateExtensions">
+            <data name="needAuthentication" xsi:type="boolean">false</data>
+            <data name="extensions" xsi:type="array">
+                <item name="0" xsi:type="array">
+                    <item name="dataset" xsi:type="string">thirdExtension</item>
+                </item>
+                <item name="1" xsi:type="array">
+                    <item name="dataset" xsi:type="string">fourthExtension</item>
+                </item>
+            </data>
+            <data name="removeExtensions" xsi:type="array">
+                <item name="0" xsi:type="array">
+                    <item name="dataset" xsi:type="string">thirdExtension</item>
+                </item>
+            </data>
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/EavTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/EavTest.php
index ffcf5096b103f74c7406e4a36eeba22115090ac0..eeba8d78cead15a0d444c5cedd24f5ee5b18f7c1 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/EavTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/EavTest.php
@@ -70,6 +70,19 @@ class EavTest extends \PHPUnit_Framework_TestCase
         $this->prepareDataForComparison($actualMeta, $expectedMeta);
         $this->assertEquals($expectedMeta, $actualMeta);
     }
+    
+    public function testModifyMetaNewProduct()
+    {
+        $this->objectManager->get(\Magento\Eav\Model\Entity\AttributeCache::class)->clear();
+        /** @var \Magento\Catalog\Model\Product $product */
+        $product = $this->objectManager->create(\Magento\Catalog\Model\Product::class);
+        $product->setAttributeSetId(4);
+        $this->locatorMock->expects($this->any())->method('getProduct')->willReturn($product);
+        $expectedMeta = include __DIR__ . '/_files/eav_expected_meta_output_w_default.php';
+        $actualMeta = $this->eavModifier->modifyMeta([]);
+        $this->prepareDataForComparison($actualMeta, $expectedMeta);
+        $this->assertEquals($expectedMeta, $actualMeta);
+    }
 
     /**
      * @magentoDataFixture Magento/Catalog/_files/product_simple_with_admin_store.php
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/eav_expected_meta_output.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/eav_expected_meta_output.php
index 1f22ec3b1c6ebcc9a1f4cef384d9d0ac9e875f65..29b092177b522efdebe0cc53e507225493da81c8 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/eav_expected_meta_output.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/eav_expected_meta_output.php
@@ -35,7 +35,6 @@ return [
                                     "visible" => "1",
                                     "required" => "0",
                                     "label" => "Enable Product",
-                                    "default" => "1",
                                     "source" => "product-details",
                                     "scopeLabel" => "[WEBSITE]",
                                     "globalScope" => false,
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/eav_expected_meta_output_w_default.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/eav_expected_meta_output_w_default.php
new file mode 100644
index 0000000000000000000000000000000000000000..999a96d29811ff68fe3dbbea152a02c56dee03fb
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/eav_expected_meta_output_w_default.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+return [
+    "product-details" => [
+        "arguments" => [
+            "data" => [
+                "config" => [
+                    "dataScope" => "data.product",
+                ],
+            ],
+        ],
+        "children" => [
+            "container_status" => [
+                "children" => [
+                    "status" => [
+                        "arguments" => [
+                            "data" => [
+                                "config" => [
+                                    "dataType" => "select",
+                                    "formElement" => "select",
+                                    "options" => [
+                                        [
+                                            "value" => 1,
+                                            "label" => "Enabled"
+                                        ],
+                                        [
+                                            "value" => 2,
+                                            "label" => "Disabled"
+                                        ]
+                                    ],
+                                    "visible" => "1",
+                                    "required" => "0",
+                                    "label" => "Enable Product",
+                                    "default" => "1",
+                                    "source" => "product-details",
+                                    "scopeLabel" => "[WEBSITE]",
+                                    "globalScope" => false,
+                                    "code" => "status",
+                                    "sortOrder" => "__placeholder__",
+                                    "componentType" => "field"
+                                ],
+                            ],
+                        ],
+                    ],
+                ],
+            ],
+            "container_name" => [
+                "children" => [
+                    "name" => [
+                        "arguments" => [
+                            "data" => [
+                                "config" => [
+                                    "dataType" => "text",
+                                    "formElement" => "input",
+                                    "visible" => "1",
+                                    "required" => "1",
+                                    "label" => "Product Name",
+                                    "source" => "product-details",
+                                    "scopeLabel" => "[STORE VIEW]",
+                                    "globalScope" => false,
+                                    "code" => "name",
+                                    "sortOrder" => "__placeholder__",
+                                    "componentType" => "field",
+                                    "validation" => [
+                                        "required-entry" => true
+                                    ],
+                                ],
+                            ],
+                        ],
+                    ],
+                ],
+            ],
+            "container_sku" => [
+                "children" => [
+                    "sku" => [
+                        "arguments" => [
+                            "data" => [
+                                "config" => [
+                                    "dataType" => "text",
+                                    "formElement" => "input",
+                                    "visible" => "1",
+                                    "required" => "1",
+                                    "label" => "SKU",
+                                    "source" => "product-details",
+                                    "scopeLabel" => "[GLOBAL]",
+                                    "globalScope" => true,
+                                    "code" => "sku",
+                                    "sortOrder" => "__placeholder__",
+                                    "componentType" => "field",
+                                    "validation" => [
+                                        "required-entry" => true
+                                    ],
+                                ],
+                            ],
+                        ],
+                    ],
+                ],
+            ],
+        ],
+    ],
+];
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_for_search.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..0a06be7f9dd4a7262d1f3cdd4d4a283693b5dbd8
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_for_search.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+include 'category.php';
+
+use Magento\Catalog\Api\CategoryLinkManagementInterface;
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\Product\Attribute\Source\Status;
+use Magento\Catalog\Model\Product\Visibility;
+
+$products = [
+    [
+        'type' => 'simple',
+        'id' => 101,
+        'name' => 'search product 1',
+        'sku' => 'search_product_1',
+        'status' => Visibility::VISIBILITY_BOTH,
+        'visibility' => Status::STATUS_ENABLED,
+        'attribute_set' => 4,
+        'website_ids' => [1],
+        'price' => 10,
+        'category_id' => 333,
+        'meta_title' => 'Key Title',
+        'meta_keyword' => 'meta keyword',
+        'meta_description' => 'meta description',
+    ],
+    [
+        'type' => 'simple',
+        'id' => 102,
+        'name' => 'search product 2',
+        'sku' => 'search_product_2',
+        'status' => Visibility::VISIBILITY_BOTH,
+        'visibility' => Status::STATUS_ENABLED,
+        'attribute_set' => 4,
+        'website_ids' => [1],
+        'price' => 10,
+        'category_id' => 333,
+        'meta_title' => 'Last Title',
+        'meta_keyword' => 'meta keyword',
+        'meta_description' => 'meta description',
+    ],
+    [
+        'type' => 'simple',
+        'id' => 103,
+        'name' => 'search product 3',
+        'sku' => 'search_product_3',
+        'status' => Visibility::VISIBILITY_BOTH,
+        'visibility' => Status::STATUS_ENABLED,
+        'attribute_set' => 4,
+        'website_ids' => [1],
+        'price' => 20,
+        'category_id' => 333,
+        'meta_title' => 'First Title',
+        'meta_keyword' => 'meta keyword',
+        'meta_description' => 'meta description',
+    ],
+    [
+        'type' => 'simple',
+        'id' => 104,
+        'name' => 'search product 4',
+        'sku' => 'search_product_4',
+        'status' => Visibility::VISIBILITY_BOTH,
+        'visibility' => Status::STATUS_ENABLED,
+        'attribute_set' => 4,
+        'website_ids' => [1],
+        'price' => 30,
+        'category_id' => 333,
+        'meta_title' => 'A title',
+        'meta_keyword' => 'meta keyword',
+        'meta_description' => 'meta description',
+    ],
+    [
+        'type' => 'simple',
+        'id' => 105,
+        'name' => 'search product 5',
+        'sku' => 'search_product_5',
+        'status' => Visibility::VISIBILITY_BOTH,
+        'visibility' => Status::STATUS_ENABLED,
+        'attribute_set' => 4,
+        'website_ids' => [1],
+        'price' => 40,
+        'category_id' => 333,
+        'meta_title' => 'meta title',
+        'meta_keyword' => 'meta keyword',
+        'meta_description' => 'meta description',
+    ],
+];
+
+/** @var CategoryLinkManagementInterface $categoryLinkManagement */
+$categoryLinkManagement = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create(CategoryLinkManagementInterface::class);
+
+$categoriesToAssign = [];
+
+foreach ($products as $data) {
+    /** @var $product Product */
+    $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(Product::class);
+    $product
+        ->setTypeId($data['type'])
+        ->setId($data['id'])
+        ->setAttributeSetId($data['attribute_set'])
+        ->setWebsiteIds($data['website_ids'])
+        ->setName($data['name'])
+        ->setSku($data['sku'])
+        ->setPrice($data['price'])
+        ->setMetaTitle($data['meta_title'])
+        ->setMetaKeyword($data['meta_keyword'])
+        ->setMetaDescription($data['meta_keyword'])
+        ->setVisibility($data['visibility'])
+        ->setStatus($data['status'])
+        ->setStockData(['use_config_manage_stock' => 0])
+        ->save();
+
+    $categoriesToAssign[$data['sku']][] = $data['category_id'];
+}
+
+foreach ($categoriesToAssign as $sku => $categoryIds) {
+    $categoryLinkManagement->assignProductToCategories($sku, $categoryIds);
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_for_search_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_for_search_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c0cf3183eb5900fff9d9133e6696279e4d97e67
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_for_search_rollback.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Registry;
+use Magento\TestFramework\Helper\Bootstrap;
+
+Bootstrap::getInstance()->getInstance()->reinitialize();
+
+/** @var Registry $registry */
+$registry = Bootstrap::getObjectManager()->get(Registry::class);
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+
+/** @var ProductRepositoryInterface $productRepository */
+$productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
+
+$productSkus = ['search_product_1', 'search_product_2', 'search_product_3', 'search_product_4', 'search_product_5'];
+foreach ($productSkus as $sku) {
+    try {
+        $product = $productRepository->get($sku, false, null, true);
+        $productRepository->delete($product);
+    } catch (NoSuchEntityException $e) {
+
+    }
+}
+
+include_once 'category_rollback.php';
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/ResourceModel/AddressRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/ResourceModel/AddressRepositoryTest.php
index 600db468d926b92c51f021fc6dd871960e8a2663..9e8a6a0bb9f38b145be03c8213270f3cd6fd6990 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Model/ResourceModel/AddressRepositoryTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Model/ResourceModel/AddressRepositoryTest.php
@@ -327,31 +327,23 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
             }
         }
 
-        $searchResults = $this->repository->getList($searchBuilder->create());
+        $searchBuilder->setPageSize(1);
+        $searchBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchBuilder->create();
+        $searchResults = $this->repository->getList($searchCriteria);
+
+        $items = array_values($searchResults->getItems());
 
         $this->assertEquals(count($expectedResult), $searchResults->getTotalCount());
+        $this->assertEquals(1, count($items));
 
-        $i = 0;
-        /** @var \Magento\Customer\Api\Data\AddressInterface $item*/
-        foreach ($searchResults->getItems() as $item) {
-            $this->assertEquals(
-                $expectedResult[$i]['id'],
-                $item->getId()
-            );
-            $this->assertEquals(
-                $expectedResult[$i]['city'],
-                $item->getCity()
-            );
-            $this->assertEquals(
-                $expectedResult[$i]['postcode'],
-                $item->getPostcode()
-            );
-            $this->assertEquals(
-                $expectedResult[$i]['firstname'],
-                $item->getFirstname()
-            );
-            $i++;
-        }
+        $expectedResultIndex = count($expectedResult) - 1;
+
+        $this->assertEquals($expectedResult[$expectedResultIndex]['id'], $items[0]->getId());
+        $this->assertEquals($expectedResult[$expectedResultIndex]['city'], $items[0]->getCity());
+        $this->assertEquals($expectedResult[$expectedResultIndex]['postcode'], $items[0]->getPostcode());
+        $this->assertEquals($expectedResult[$expectedResultIndex]['firstname'], $items[0]->getFirstname());
     }
 
     public function searchAddressDataProvider()
@@ -371,13 +363,17 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
                 [$filterBuilder->setField('postcode')->setValue('75477')->create()],
                 null,
                 null,
-                [['id' => 1, 'city' => 'CityM', 'postcode' => 75477, 'firstname' => 'John']],
+                [
+                    ['id' => 1, 'city' => 'CityM', 'postcode' => 75477, 'firstname' => 'John'],
+                ],
             ],
             'Address with city CityM' => [
                 [$filterBuilder->setField('city')->setValue('CityM')->create()],
                 null,
                 null,
-                [['id' => 1, 'city' => 'CityM', 'postcode' => 75477, 'firstname' => 'John']],
+                [
+                    ['id' => 1, 'city' => 'CityM', 'postcode' => 75477, 'firstname' => 'John'],
+                ],
             ],
             'Addresses with firstname John sorted by firstname desc, city asc' => [
                 [$filterBuilder->setField('firstname')->setValue('John')->create()],
diff --git a/dev/tests/integration/testsuite/Magento/Eav/Model/Attribute/GroupRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Eav/Model/Attribute/GroupRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8527628cb2a0d41b1224ebc2ba298f1ec476a906
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Eav/Model/Attribute/GroupRepositoryTest.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Model\Attribute;
+
+use Magento\Eav\Api\AttributeGroupRepositoryInterface;
+use Magento\Eav\Model\Entity\Attribute\Set;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class GroupRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var AttributeGroupRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(AttributeGroupRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Eav/_files/attribute_group_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var Set $attributeSet */
+        $attributeSet = Bootstrap::getObjectManager()->create(Set::class)
+            ->load('attribute_set_1_for_search', 'attribute_set_name');
+
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField('attribute_set_id')
+            ->setValue($attributeSet->getId())
+            ->create();
+        $filter2 = $filterBuilder->setField('default_id')
+            ->setValue(0)
+            ->setConditionType('eq')
+            ->create();
+        $filter3 = $filterBuilder->setField('sort_order')
+            ->setValue(10)
+            ->setConditionType('gteq')
+            ->create();
+        $filter4 = $filterBuilder->setField('sort_order')
+            ->setValue(30)
+            ->setConditionType('lteq')
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder = Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $searchCriteriaBuilder->addFilters([$filter3, $filter4]);
+
+        /** @var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField('attribute_group_code')
+            ->setDirection(SortOrder::SORT_ASC)
+            ->create();
+
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(1);
+        $searchCriteriaBuilder->setCurrentPage(1);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList($searchCriteria);
+
+        $this->assertEquals(2, $searchResult->getTotalCount());
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('attribute_group_3_for_search', $items[0]['attribute_group_code']);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Eav/Model/AttributeRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Eav/Model/AttributeRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c2052183cd8215e2309d298377366e556fe8e24
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Eav/Model/AttributeRepositoryTest.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Model;
+
+use Magento\Eav\Api\AttributeRepositoryInterface;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class AttributeRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var AttributeRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(AttributeRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Eav/_files/attribute_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField('backend_type')
+            ->setValue('varchar')
+            ->create();
+        $filter2 = $filterBuilder->setField('is_user_defined')
+            ->setValue(true)
+            ->create();
+        $filter3 = $filterBuilder->setField('is_required')
+            ->setValue(true)
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder = Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $searchCriteriaBuilder->addFilters([$filter3]);
+
+        /** @var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField('attribute_code')
+            ->setDirection(SortOrder::SORT_ASC)
+            ->create();
+
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList('order', $searchCriteria);
+
+        $this->assertEquals(3, $searchResult->getTotalCount());
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('attribute_for_search_3', $items[0]['attribute_code']);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_for_search.php b/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..18ed20147199f3bcf924e70d47ed6c36c45fd84a
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_for_search.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+$entityTypeId = $objectManager->create(\Magento\Eav\Model\Entity\Type::class)
+    ->loadByCode('order')
+    ->getId();
+
+$attributeData = [
+    [
+        'attribute_code' => 'attribute_for_search_1',
+        'entity_type_id' => $entityTypeId,
+        'backend_type' => 'varchar',
+        'is_required' => 1,
+        'is_user_defined' => 1,
+        'is_unique' => 0,
+    ],
+    [
+        'attribute_code' => 'attribute_for_search_2',
+        'entity_type_id' => $entityTypeId,
+        'backend_type' => 'varchar',
+        'is_required' => 1,
+        'is_user_defined' => 1,
+        'is_unique' => 0,
+    ],
+    [
+        'attribute_code' => 'attribute_for_search_3',
+        'entity_type_id' => $entityTypeId,
+        'backend_type' => 'varchar',
+        'is_required' => 1,
+        'is_user_defined' => 1,
+        'is_unique' => 0,
+    ],
+    [
+        'attribute_code' => 'attribute_for_search_4',
+        'entity_type_id' => $entityTypeId,
+        'backend_type' => 'int',
+        'is_required' => 0,
+        'is_user_defined' => 1,
+        'is_unique' => 0,
+    ],
+    [
+        'attribute_code' => 'attribute_for_search_5',
+        'entity_type_id' => $entityTypeId,
+        'backend_type' => 'varchar',
+        'is_required' => 0,
+        'is_user_defined' => 1,
+        'is_unique' => 0,
+    ],
+];
+
+foreach ($attributeData as $data) {
+    /** @var \Magento\Eav\Model\Entity\Attribute $attribute */
+    $attribute = $objectManager->create(\Magento\Eav\Model\Entity\Attribute::class);
+    $attribute->setData($data);
+    $attribute->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_group_for_search.php b/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_group_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..4400c7d90d13755b884e5b941d7f03829ab42ba7
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_group_for_search.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+/**
+ * Create attribute set
+ */
+$entityTypeId = $objectManager->create(\Magento\Eav\Model\Entity\Type::class)
+    ->loadByCode('catalog_product')
+    ->getId();
+
+/** @var \Magento\Eav\Model\Entity\Attribute\Set $attributeSet */
+$attributeSet = $objectManager->create(\Magento\Eav\Model\Entity\Attribute\Set::class);
+$attributeSet->setData([
+    'attribute_set_name' => 'attribute_set_1_for_search',
+    'entity_type_id' => $entityTypeId,
+    'sort_order' => 100,
+]);
+$attributeSet->validate();
+$attributeSet->save();
+
+/**
+ * Create attribute groups
+ */
+$attributeGroupData = [
+    [
+        'attribute_set_id' => $attributeSet->getAttributeSetId(),
+        'sort_order' => 10,
+        'attribute_group_code' => 'attribute_group_1_for_search',
+        'default_id' => 1,
+    ],
+    [
+        'attribute_set_id' => $attributeSet->getAttributeSetId(),
+        'sort_order' => 20,
+        'attribute_group_code' => 'attribute_group_2_for_search',
+        'default_id' => 0,
+    ],
+    [
+        'attribute_set_id' => $attributeSet->getAttributeSetId(),
+        'sort_order' => 30,
+        'attribute_group_code' => 'attribute_group_3_for_search',
+        'default_id' => 0,
+    ],
+];
+
+foreach ($attributeGroupData as $data) {
+    /** @var \Magento\Eav\Model\Entity\Attribute\Group $attributeGroup */
+    $attributeGroup = $objectManager->create(\Magento\Eav\Model\Entity\Attribute\Group::class);
+    $attributeGroup->setData($data);
+    $attributeGroup->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_set_for_search.php b/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_set_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..c24dfcec7a66914bf9da12fb177e4c353c3b8673
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_set_for_search.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+$entityTypeId = $objectManager->create(\Magento\Eav\Model\Entity\Type::class)
+    ->loadByCode('catalog_product')
+    ->getId();
+
+$attributeSetData = [
+    [
+        'attribute_set_name' => 'attribute_set_1_for_search',
+        'entity_type_id' => $entityTypeId,
+        'sort_order' => 100,
+    ],
+    [
+        'attribute_set_name' => 'attribute_set_2_for_search',
+        'entity_type_id' => $entityTypeId,
+        'sort_order' => 200,
+    ],
+    [
+        'attribute_set_name' => 'attribute_set_3_for_search',
+        'entity_type_id' => $entityTypeId,
+        'sort_order' => 300,
+    ],
+    [
+        'attribute_set_name' => 'attribute_set_4_for_search',
+        'entity_type_id' => $entityTypeId,
+        'sort_order' => 400,
+    ],
+];
+
+foreach ($attributeSetData as $data) {
+    /** @var \Magento\Eav\Model\Entity\Attribute\Set $attributeSet */
+    $attributeSet = $objectManager->create(\Magento\Eav\Model\Entity\Attribute\Set::class);
+    $attributeSet->setData($data);
+    $attributeSet->validate();
+    $attributeSet->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_set_for_search_rollback.php b/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_set_for_search_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..e787e2326312aa11e0ca4186b281c36473f053b3
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Eav/_files/attribute_set_for_search_rollback.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+$attributeSetData = [
+    'attribute_set_1_for_search',
+    'attribute_set_2_for_search',
+    'attribute_set_3_for_search',
+    'attribute_set_4_for_search',
+];
+
+foreach ($attributeSetData as $attributeSetName) {
+    /** @var \Magento\Eav\Model\Entity\Attribute\Set $attributeSet */
+    $attributeSet = $objectManager->create(\Magento\Eav\Model\Entity\Attribute\Set::class)
+        ->load($attributeSetName, 'attribute_set_name');
+    if ($attributeSet->getId()) {
+        $attributeSet->delete();
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Api/CreditmemoCommentRepositoryInterfaceTest.php b/dev/tests/integration/testsuite/Magento/Sales/Api/CreditmemoCommentRepositoryInterfaceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f4089aadaa6288bd08f5928a8b3c7ebab18312f9
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Api/CreditmemoCommentRepositoryInterfaceTest.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Api;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\Sales\Api\Data\CreditmemoCommentInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class CreditmemoCommentRepositoryInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var CreditmemoCommentRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(CreditmemoCommentRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/creditmemo_comments_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(CreditmemoCommentInterface::COMMENT)
+            ->setValue('comment 2')
+            ->create();
+        $filter2 = $filterBuilder->setField(CreditmemoCommentInterface::COMMENT)
+            ->setValue('comment 3')
+            ->create();
+        $filter3 = $filterBuilder->setField(CreditmemoCommentInterface::COMMENT)
+            ->setValue('comment 4')
+            ->create();
+        $filter4 = $filterBuilder->setField(CreditmemoCommentInterface::COMMENT)
+            ->setValue('comment 5')
+            ->create();
+        $filter5 = $filterBuilder->setField(CreditmemoCommentInterface::IS_VISIBLE_ON_FRONT)
+            ->setValue(1)
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(CreditmemoCommentInterface::COMMENT)
+            ->setDirection(SortOrder::SORT_DESC)
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3, $filter4]);
+        $searchCriteriaBuilder->addFilters([$filter5]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList($searchCriteria);
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('comment 2', $items[0][CreditmemoCommentInterface::COMMENT]);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Api/CreditmemoItemRepositoryInterfaceTest.php b/dev/tests/integration/testsuite/Magento/Sales/Api/CreditmemoItemRepositoryInterfaceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..933832954233c15b41dcc80bb28eeecf62ce5864
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Api/CreditmemoItemRepositoryInterfaceTest.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Api;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\Sales\Api\Data\CreditmemoItemInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class CreditmemoItemRepositoryInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var CreditmemoItemRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(CreditmemoItemRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/creditmemo_items_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(CreditmemoItemInterface::NAME)
+            ->setValue('item 2')
+            ->create();
+        $filter2 = $filterBuilder->setField(CreditmemoItemInterface::NAME)
+            ->setValue('item 3')
+            ->create();
+        $filter3 = $filterBuilder->setField(CreditmemoItemInterface::NAME)
+            ->setValue('item 4')
+            ->create();
+        $filter4 = $filterBuilder->setField(CreditmemoItemInterface::NAME)
+            ->setValue('item 5')
+            ->create();
+        $filter5 = $filterBuilder->setField(CreditmemoItemInterface::PRICE)
+            ->setValue(45)
+            ->setConditionType('lt')
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(CreditmemoItemInterface::NAME)
+            ->setDirection(SortOrder::SORT_DESC)
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3, $filter4]);
+        $searchCriteriaBuilder->addFilters([$filter5]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList($searchCriteria);
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('item 2', $items[0][CreditmemoItemInterface::NAME]);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Api/InvoiceCommentRepositoryInterfaceTest.php b/dev/tests/integration/testsuite/Magento/Sales/Api/InvoiceCommentRepositoryInterfaceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5cf0cde4f1fc73f2689e7930652d835bd347a94c
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Api/InvoiceCommentRepositoryInterfaceTest.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Api;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\Sales\Api\Data\InvoiceCommentInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class InvoiceCommentRepositoryInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var InvoiceCommentRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(InvoiceCommentRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/invoice_comments_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(InvoiceCommentInterface::COMMENT)
+            ->setValue('comment 2')
+            ->create();
+        $filter2 = $filterBuilder->setField(InvoiceCommentInterface::COMMENT)
+            ->setValue('comment 3')
+            ->create();
+        $filter3 = $filterBuilder->setField(InvoiceCommentInterface::COMMENT)
+            ->setValue('comment 4')
+            ->create();
+        $filter4 = $filterBuilder->setField(InvoiceCommentInterface::COMMENT)
+            ->setValue('comment 5')
+            ->create();
+        $filter5 = $filterBuilder->setField(InvoiceCommentInterface::IS_VISIBLE_ON_FRONT)
+            ->setValue(1)
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(InvoiceCommentInterface::COMMENT)
+            ->setDirection(SortOrder::SORT_DESC)
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3, $filter4]);
+        $searchCriteriaBuilder->addFilters([$filter5]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList($searchCriteria);
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('comment 2', $items[0][InvoiceCommentInterface::COMMENT]);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Api/InvoiceItemRepositoryInterfaceTest.php b/dev/tests/integration/testsuite/Magento/Sales/Api/InvoiceItemRepositoryInterfaceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f7f64e897bb586e3e72c3dbd9f791d8f47002c1
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Api/InvoiceItemRepositoryInterfaceTest.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Api;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\Sales\Api\Data\InvoiceItemInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class InvoiceItemRepositoryInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var InvoiceItemRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(InvoiceItemRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/invoice_items_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(InvoiceItemInterface::NAME)
+            ->setValue('item 2')
+            ->create();
+        $filter2 = $filterBuilder->setField(InvoiceItemInterface::NAME)
+            ->setValue('item 3')
+            ->create();
+        $filter3 = $filterBuilder->setField(InvoiceItemInterface::NAME)
+            ->setValue('item 4')
+            ->create();
+        $filter4 = $filterBuilder->setField(InvoiceItemInterface::NAME)
+            ->setValue('item 5')
+            ->create();
+        $filter5 = $filterBuilder->setField(InvoiceItemInterface::PRICE)
+            ->setValue(45)
+            ->setConditionType('lt')
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(InvoiceItemInterface::NAME)
+            ->setDirection(SortOrder::SORT_DESC)
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3, $filter4]);
+        $searchCriteriaBuilder->addFilters([$filter5]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList($searchCriteria);
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('item 2', $items[0][InvoiceItemInterface::NAME]);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Api/OrderStatusHistoryRepositoryInterfaceTest.php b/dev/tests/integration/testsuite/Magento/Sales/Api/OrderStatusHistoryRepositoryInterfaceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5dd28b5603de2879b6f1419e545872104dd360f2
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Api/OrderStatusHistoryRepositoryInterfaceTest.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Api;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\Sales\Api\Data\OrderStatusHistoryInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class OrderStatusHistoryRepositoryInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var OrderStatusHistoryRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(OrderStatusHistoryRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/order_status_history_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(OrderStatusHistoryInterface::COMMENT)
+            ->setValue('comment 2')
+            ->create();
+        $filter2 = $filterBuilder->setField(OrderStatusHistoryInterface::COMMENT)
+            ->setValue('comment 3')
+            ->create();
+        $filter3 = $filterBuilder->setField(OrderStatusHistoryInterface::COMMENT)
+            ->setValue('comment 4')
+            ->create();
+        $filter4 = $filterBuilder->setField(OrderStatusHistoryInterface::COMMENT)
+            ->setValue('comment 5')
+            ->create();
+        $filter5 = $filterBuilder->setField(OrderStatusHistoryInterface::IS_VISIBLE_ON_FRONT)
+            ->setValue(1)
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(OrderStatusHistoryInterface::COMMENT)
+            ->setDirection(SortOrder::SORT_DESC)
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3, $filter4]);
+        $searchCriteriaBuilder->addFilters([$filter5]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList($searchCriteria);
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('comment 2', $items[0][OrderStatusHistoryInterface::COMMENT]);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Api/ShipmentCommentRepositoryInterfaceTest.php b/dev/tests/integration/testsuite/Magento/Sales/Api/ShipmentCommentRepositoryInterfaceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..14784958c00a3eb1be1f9d225031df3f458b3bcf
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Api/ShipmentCommentRepositoryInterfaceTest.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Api;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\Sales\Api\Data\ShipmentCommentInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class ShipmentCommentRepositoryInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ShipmentCommentRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(ShipmentCommentRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/shipment_comments_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(ShipmentCommentInterface::COMMENT)
+            ->setValue('comment 2')
+            ->create();
+        $filter2 = $filterBuilder->setField(ShipmentCommentInterface::COMMENT)
+            ->setValue('comment 3')
+            ->create();
+        $filter3 = $filterBuilder->setField(ShipmentCommentInterface::COMMENT)
+            ->setValue('comment 4')
+            ->create();
+        $filter4 = $filterBuilder->setField(ShipmentCommentInterface::COMMENT)
+            ->setValue('comment 5')
+            ->create();
+        $filter5 = $filterBuilder->setField(ShipmentCommentInterface::IS_VISIBLE_ON_FRONT)
+            ->setValue(1)
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(ShipmentCommentInterface::COMMENT)
+            ->setDirection(SortOrder::SORT_DESC)
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3, $filter4]);
+        $searchCriteriaBuilder->addFilters([$filter5]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList($searchCriteria);
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('comment 2', $items[0][ShipmentCommentInterface::COMMENT]);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Api/ShipmentItemRepositoryInterfaceTest.php b/dev/tests/integration/testsuite/Magento/Sales/Api/ShipmentItemRepositoryInterfaceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e0d5799c6c7ca91bb8b550ccb5cdbbb21cf9637b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Api/ShipmentItemRepositoryInterfaceTest.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Api;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\Sales\Api\Data\ShipmentItemInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class ShipmentItemRepositoryInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ShipmentItemRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(ShipmentItemRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/shipment_items_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(ShipmentItemInterface::NAME)
+            ->setValue('item 2')
+            ->create();
+        $filter2 = $filterBuilder->setField(ShipmentItemInterface::NAME)
+            ->setValue('item 3')
+            ->create();
+        $filter3 = $filterBuilder->setField(ShipmentItemInterface::NAME)
+            ->setValue('item 4')
+            ->create();
+        $filter4 = $filterBuilder->setField(ShipmentItemInterface::NAME)
+            ->setValue('item 5')
+            ->create();
+        $filter5 = $filterBuilder->setField(ShipmentItemInterface::PRICE)
+            ->setValue(45)
+            ->setConditionType('lt')
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(ShipmentItemInterface::NAME)
+            ->setDirection(SortOrder::SORT_DESC)
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3, $filter4]);
+        $searchCriteriaBuilder->addFilters([$filter5]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList($searchCriteria);
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('item 2', $items[0][ShipmentItemInterface::NAME]);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Api/ShipmentTrackRepositoryInterfaceTest.php b/dev/tests/integration/testsuite/Magento/Sales/Api/ShipmentTrackRepositoryInterfaceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..dcbba427073ff49e3919c31096dee7c958769542
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Api/ShipmentTrackRepositoryInterfaceTest.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Api;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Api\SortOrderBuilder;
+use Magento\Sales\Api\Data\ShipmentTrackInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class ShipmentTrackRepositoryInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ShipmentTrackRepositoryInterface
+     */
+    private $repository;
+
+    protected function setUp()
+    {
+        $this->repository = Bootstrap::getObjectManager()->create(ShipmentTrackRepositoryInterface::class);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/shipment_tracks_for_search.php
+     */
+    public function testGetList()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = Bootstrap::getObjectManager()->create(FilterBuilder::class);
+
+        $filter1 = $filterBuilder->setField(ShipmentTrackInterface::TITLE)
+            ->setValue('title 2')
+            ->create();
+        $filter2 = $filterBuilder->setField(ShipmentTrackInterface::DESCRIPTION)
+            ->setValue('description 3')
+            ->create();
+        $filter3 = $filterBuilder->setField(ShipmentTrackInterface::TRACK_NUMBER)
+            ->setValue('track number 4')
+            ->create();
+        $filter4 = $filterBuilder->setField(ShipmentTrackInterface::CARRIER_CODE)
+            ->setValue('carrier code 5')
+            ->create();
+        $filter5 = $filterBuilder->setField(ShipmentTrackInterface::QTY)
+            ->setConditionType('lt')
+            ->setValue(5)
+            ->create();
+        $filter6 = $filterBuilder->setField(ShipmentTrackInterface::WEIGHT)
+            ->setValue(1)
+            ->create();
+
+        /**@var SortOrderBuilder $sortOrderBuilder */
+        $sortOrderBuilder = Bootstrap::getObjectManager()->create(SortOrderBuilder::class);
+
+        /** @var SortOrder $sortOrder */
+        $sortOrder = $sortOrderBuilder->setField(ShipmentTrackInterface::DESCRIPTION)
+            ->setDirection(SortOrder::SORT_DESC)
+            ->create();
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder =  Bootstrap::getObjectManager()->create(SearchCriteriaBuilder::class);
+
+        $searchCriteriaBuilder->addFilters([$filter1, $filter2, $filter3, $filter4]);
+        $searchCriteriaBuilder->addFilters([$filter5]);
+        $searchCriteriaBuilder->addFilters([$filter6]);
+        $searchCriteriaBuilder->setSortOrders([$sortOrder]);
+
+        $searchCriteriaBuilder->setPageSize(2);
+        $searchCriteriaBuilder->setCurrentPage(2);
+
+        $searchCriteria = $searchCriteriaBuilder->create();
+
+        $searchResult = $this->repository->getList($searchCriteria);
+
+        $items = array_values($searchResult->getItems());
+        $this->assertEquals(1, count($items));
+        $this->assertEquals('title 2', $items[0][ShipmentTrackInterface::TITLE]);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/AddressRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/AddressRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..687fff317ca50a317cc00e2a3b7b6438dd7e0f3a
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/AddressRepositoryTest.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Model\Order;
+
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrderBuilder;
+
+/**
+ * Class AddressRepositoryTest
+ * @package Magento\Sales\Model\Order]
+ * @magentoDbIsolation enabled
+ */
+class AddressRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var AddressRepository */
+    protected $repository;
+
+    /** @var  SortOrderBuilder */
+    private $sortOrderBuilder;
+
+    /** @var FilterBuilder */
+    private $filterBuilder;
+
+    /** @var SearchCriteriaBuilder */
+    private $searchCriteriaBuilder;
+
+    protected function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->repository = $objectManager->create(AddressRepository::class);
+        $this->searchCriteriaBuilder = $objectManager->create(
+            \Magento\Framework\Api\SearchCriteriaBuilder::class
+        );
+        $this->filterBuilder = $objectManager->get(
+            \Magento\Framework\Api\FilterBuilder::class
+        );
+        $this->sortOrderBuilder = $objectManager->get(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/address_list.php
+     */
+    public function testGetListWithMultipleFiltersAndSorting()
+    {
+        $filter1 = $this->filterBuilder
+            ->setField('postcode')
+            ->setConditionType('neq')
+            ->setValue('ZX0789A')
+            ->create();
+        $filter2 = $this->filterBuilder
+            ->setField('address_type')
+            ->setValue('billing')
+            ->create();
+        $filter3 = $this->filterBuilder
+            ->setField('city')
+            ->setValue('Ena4ka')
+            ->create();
+        $sortOrder = $this->sortOrderBuilder
+            ->setField('region_id')
+            ->setDirection('DESC')
+            ->create();
+
+        $this->searchCriteriaBuilder->addFilters([$filter1]);
+        $this->searchCriteriaBuilder->addFilters([$filter2, $filter3]);
+        $this->searchCriteriaBuilder->addSortOrder($sortOrder);
+        $searchCriteria = $this->searchCriteriaBuilder->create();
+        /** @var \Magento\Sales\Api\Data\OrderAddressSearchResultInterface $result */
+        $result = $this->repository->getList($searchCriteria);
+        $items = $result->getItems();
+        $this->assertCount(2, $items);
+        $this->assertEquals('ZX0789', array_shift($items)->getPostcode());
+        $this->assertEquals('47676', array_shift($items)->getPostcode());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Payment/RepositoryTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Payment/RepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d82e36478743a47ccc12bb67e244b141e1a1646
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Payment/RepositoryTest.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sales\Model\Order\Payment;
+
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrderBuilder;
+
+/**
+ * Class RepositoryTest
+ * @package Magento\Sales\Model\Order\Payment\
+ * @magentoDbIsolation enabled
+ */
+class RepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var Repository */
+    protected $repository;
+
+    /** @var  SortOrderBuilder */
+    private $sortOrderBuilder;
+
+    /** @var FilterBuilder */
+    private $filterBuilder;
+
+    /** @var SearchCriteriaBuilder */
+    private $searchCriteriaBuilder;
+
+    protected function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->repository = $objectManager->create(Repository::class);
+        $this->searchCriteriaBuilder = $objectManager->create(
+            \Magento\Framework\Api\SearchCriteriaBuilder::class
+        );
+        $this->filterBuilder = $objectManager->get(
+            \Magento\Framework\Api\FilterBuilder::class
+        );
+        $this->sortOrderBuilder = $objectManager->get(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/order_payment_list.php
+     */
+    public function testGetListWithMultipleFiltersAndSorting()
+    {
+        $filter1 = $this->filterBuilder
+            ->setField('cc_ss_start_year')
+            ->setValue('2014')
+            ->create();
+        $filter2 = $this->filterBuilder
+            ->setField('cc_exp_month')
+            ->setValue('09')
+            ->create();
+        $filter3 = $this->filterBuilder
+            ->setField('method')
+            ->setValue('checkmo')
+            ->create();
+        $sortOrder = $this->sortOrderBuilder
+            ->setField('cc_exp_month')
+            ->setDirection('DESC')
+            ->create();
+
+        $this->searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $this->searchCriteriaBuilder->addFilters([$filter3]);
+        $this->searchCriteriaBuilder->addSortOrder($sortOrder);
+        $searchCriteria = $this->searchCriteriaBuilder->create();
+        /** @var \Magento\Sales\Api\Data\OrderPaymentSearchResultInterface $result */
+        $result = $this->repository->getList($searchCriteria);
+        $items = $result->getItems();
+        $this->assertCount(2, $items);
+        $this->assertEquals('456', array_shift($items)->getCcLast4());
+        $this->assertEquals('123', array_shift($items)->getCcLast4());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/address_list.php b/dev/tests/integration/testsuite/Magento/Sales/_files/address_list.php
new file mode 100644
index 0000000000000000000000000000000000000000..d48a97b8b3b74eda1eed9b67cf0510c250b6e463
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/address_list.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+$addresses = [
+    [
+        'telephone' => 3234676,
+        'postcode' => 47676,
+        'country_id' => 'US',
+        'city' => 'CityX',
+        'street' => ['Black str, 48'],
+        'lastname' => 'Smith',
+        'firstname' => 'John',
+        'address_type' => 'shipping',
+        'email' => 'some_email@mail.com',
+        'region_id' => 1,
+    ],
+    [
+        'telephone' => 3234676,
+        'postcode' => '47676',
+        'country_id' => 'US',
+        'city' => 'CityX',
+        'street' => ['Black str, 48'],
+        'lastname' => 'Smith',
+        'firstname' => 'John',
+        'address_type' => 'billing',
+        'email' => 'some_email@mail.com',
+        'region_id' => 1,
+    ],
+    [
+        'telephone' => 123123,
+        'postcode' => 'ZX0789',
+        'country_id' => 'US',
+        'city' => 'Ena4ka',
+        'street' => ['Black', 'White'],
+        'lastname' => 'Doe',
+        'firstname' => 'John',
+        'address_type' => 'billing',
+        'email' => 'some_email@mail.com',
+        'region_id' => 2,
+    ],
+    [
+        'telephone' => 123123,
+        'postcode' => 'ZX0789A',
+        'country_id' => 'US',
+        'city' => 'Ena4ka',
+        'street' => ['Black', 'White'],
+        'lastname' => 'Doe',
+        'firstname' => 'John',
+        'address_type' => 'shipping',
+        'email' => 'some_email@mail.com',
+        'region_id' => 1,
+    ]
+];
+
+/** @var array $addresses */
+foreach ($addresses as $addressData) {
+    /** @var $address \Magento\Sales\Model\Order\Address */
+    $address = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+        \Magento\Sales\Model\Order\Address::class
+    );
+    $address
+        ->setData($addressData)
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/address_list_rollback.php b/dev/tests/integration/testsuite/Magento/Sales/_files/address_list_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..248f6469ad870606278f6a70f4939dd9db37bbde
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/address_list_rollback.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require 'default_rollback.php';
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_comments_for_search.php b/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_comments_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b94872792995e89b935e8956c1763cf3bcb3d80
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_comments_for_search.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Creditmemo;
+use Magento\Sales\Model\Order\Creditmemo\Comment;
+use Magento\Sales\Model\Order\CreditmemoFactory;
+use Magento\TestFramework\Helper\Bootstrap;
+
+require 'default_rollback.php';
+require __DIR__ . '/order.php';
+
+/** @var Order $order */
+$order = Bootstrap::getObjectManager()->create(Order::class);
+$order->loadByIncrementId('100000001');
+
+/** @var CreditmemoFactory $creditmemoFactory */
+$creditmemoFactory = Bootstrap::getObjectManager()->get(CreditmemoFactory::class);
+
+/** @var Creditmemo $creditmemo */
+$creditmemo = $creditmemoFactory->createByOrder($order, $order->getData());
+$creditmemo->setOrder($order);
+$creditmemo->setState(Creditmemo::STATE_OPEN);
+$creditmemo->setIncrementId('100000001');
+$creditmemo->save();
+
+$comments = [
+    [
+        'comment' => 'comment 1',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 2',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 3',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 4',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 5',
+        'is_visible_on_front' => 0,
+        'is_customer_notified' => 1,
+    ],
+];
+
+foreach ($comments as $data) {
+    /** @var $comment Comment */
+    $comment = Bootstrap::getObjectManager()->create(Comment::class);
+    $comment->setParentId($creditmemo->getId());
+    $comment->setComment($data['comment']);
+    $comment->setIsVisibleOnFront($data['is_visible_on_front']);
+    $comment->setIsCustomerNotified($data['is_customer_notified']);
+    $comment->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_items_for_search.php b/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_items_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..2fd9b45f98602c95dd291ec161ac5422bd45d84f
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_items_for_search.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Creditmemo;
+use Magento\Sales\Model\Order\Creditmemo\Item;
+use Magento\Sales\Model\Order\Creditmemo\ItemFactory;
+use Magento\Sales\Model\Order\CreditmemoFactory;
+use Magento\Sales\Model\Order\Item as OrderItem;
+use Magento\TestFramework\Helper\Bootstrap;
+
+require 'default_rollback.php';
+require __DIR__ . '/order.php';
+
+$orderCollection = Bootstrap::getObjectManager()->create(Order::class)->getCollection();
+/** @var \Magento\Sales\Model\Order $order */
+$order = $orderCollection->getFirstItem();
+
+/** @var ItemFactory $creditmemoItemFactory */
+$creditmemoItemFactory = Bootstrap::getObjectManager()->create(ItemFactory::class);
+/** @var CreditmemoFactory $creditmemoFactory */
+$creditmemoFactory = Bootstrap::getObjectManager()->get(CreditmemoFactory::class);
+/** @var Creditmemo $creditmemo */
+$creditmemo = $creditmemoFactory->createByOrder($order, $order->getData());
+$creditmemo->setOrder($order);
+$creditmemo->setState(Creditmemo::STATE_OPEN);
+$creditmemo->save();
+
+$items = [
+    [
+        'name' => 'item 1',
+        'base_price' => 10,
+        'price' => 10,
+        'row_total' => 10,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 2',
+        'base_price' => 20,
+        'price' => 20,
+        'row_total' => 20,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 3',
+        'base_price' => 30,
+        'price' => 30,
+        'row_total' => 30,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 4',
+        'base_price' => 40,
+        'price' => 40,
+        'row_total' => 40,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 5',
+        'base_price' => 50,
+        'price' => 50,
+        'row_total' => 50,
+        'product_type' => 'simple',
+        'qty' => 2,
+        'qty_invoiced' => 20,
+        'qty_refunded' => 2,
+    ],
+];
+
+foreach ($items as $data) {
+    /** @var OrderItem $orderItem */
+    $orderItem = $objectManager->create(OrderItem::class);
+    $orderItem->setProductId($product->getId())->setQtyOrdered(10);
+    $orderItem->setBasePrice($data['base_price']);
+    $orderItem->setPrice($data['price']);
+    $orderItem->setRowTotal($data['row_total']);
+    $orderItem->setProductType($data['product_type']);
+    $orderItem->setQtyRefunded(1);
+    $orderItem->setQtyInvoiced(10);
+    $orderItem->setOriginalPrice(20);
+
+    $order->addItem($orderItem);
+    $order->save();
+
+    /** @var Item $creditmemoItem */
+    $creditmemoItem = $creditmemoItemFactory->create();
+    $creditmemoItem->setCreditmemo($creditmemo)
+        ->setName($data['name'])
+        ->setOrderItemId($orderItem->getItemId())
+        ->setQty($data['qty'])
+        ->setPrice($data['price'])
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_list.php b/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_list.php
new file mode 100644
index 0000000000000000000000000000000000000000..08b7ebbaa65c0d060766d95743dfd163bb20d201
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_list.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order;
+
+require 'order.php';
+/** @var Order $order */
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+$creditMemos = [
+    [
+        'store_id' => 1,
+        'grand_total' =>  280.00,
+        'order_id' => $order->getId(),
+        'email_sent' => 0,
+        'send_email' => 0,
+        'increment_id' => '123',
+        'creditmemo_status' => 1,
+        'state'     => 1
+    ],
+    [
+        'store_id' => 1,
+        'grand_total' =>  450.00,
+        'order_id' => $order->getId(),
+        'email_sent' => 1,
+        'send_email' => 1,
+        'increment_id' => '456',
+        'creditmemo_status' => 1,
+        'state'     => 1
+    ],
+    [
+        'store_id' => 1,
+        'grand_total' =>  10.00,
+        'order_id' => $order->getId(),
+        'email_sent' => 1,
+        'send_email' => 1,
+        'increment_id' => '789',
+        'creditmemo_status' => 0,
+        'state'     => 1
+    ],
+    [
+        'store_id' => 1,
+        'grand_total' =>  1110.00,
+        'order_id' => $order->getId(),
+        'email_sent' => 1,
+        'increment_id' => '012',
+        'send_email' => 1,
+        'creditmemo_status' => 1,
+        'state'     => 0
+    ],
+];
+
+/** @var array $creditMemoData */
+foreach ($creditMemos as $creditMemoData) {
+    /** @var \Magento\Sales\Model\Order\Creditmemo $creditMemo */
+    $creditMemo = $objectManager->create(\Magento\Sales\Model\Order\Creditmemo::class);
+    $creditMemo
+        ->setData($creditMemoData)
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_list_rollback.php b/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_list_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..248f6469ad870606278f6a70f4939dd9db37bbde
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/creditmemo_list_rollback.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require 'default_rollback.php';
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_comments_for_search.php b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_comments_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc10027fb35f0eaaae93e0a7af916180daf5e6d0
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_comments_for_search.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Framework\DB\Transaction;
+use Magento\Sales\Api\InvoiceManagementInterface;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Invoice;
+use Magento\Sales\Model\Order\Invoice\Comment;
+use Magento\TestFramework\Helper\Bootstrap;
+
+require 'default_rollback.php';
+require __DIR__ . '/order.php';
+
+/** @var InvoiceManagementInterface $orderService */
+$orderService = Bootstrap::getObjectManager()->create(InvoiceManagementInterface::class);
+/** @var Invoice $invoice */
+$invoice = $orderService->prepareInvoice($order);
+$invoice->register();
+/** @var Order $order */
+$order = $invoice->getOrder();
+$order->setIsInProcess(true);
+/** @var Transaction $transactionSave */
+$transactionSave = Bootstrap::getObjectManager()->create(Transaction::class);
+$transactionSave->addObject($invoice)->addObject($order)->save();
+
+$comments = [
+    [
+        'comment' => 'comment 1',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 2',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 3',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 4',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 5',
+        'is_visible_on_front' => 0,
+        'is_customer_notified' => 1,
+    ],
+];
+
+foreach ($comments as $data) {
+    /** @var $comment Comment */
+    $comment = Bootstrap::getObjectManager()->create(Comment::class);
+    $comment->setParentId($invoice->getId());
+    $comment->setComment($data['comment']);
+    $comment->setIsVisibleOnFront($data['is_visible_on_front']);
+    $comment->setIsCustomerNotified($data['is_customer_notified']);
+    $comment->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_items_for_search.php b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_items_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..737baec6cb6e1439ef5db18586362a09f108acea
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_items_for_search.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Framework\DB\Transaction;
+use Magento\Sales\Api\InvoiceManagementInterface;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Invoice;
+use Magento\Sales\Model\Order\Invoice\Item;
+use Magento\Sales\Model\Order\Invoice\ItemFactory;
+use Magento\Sales\Model\Order\InvoiceFactory;
+use Magento\Sales\Model\Order\Item as OrderItem;
+use Magento\TestFramework\Helper\Bootstrap;
+
+require 'default_rollback.php';
+require __DIR__ . '/order.php';
+
+/** @var InvoiceManagementInterface $orderService */
+$orderService = Bootstrap::getObjectManager()->create(InvoiceManagementInterface::class);
+/** @var Invoice $invoice */
+$invoice = $orderService->prepareInvoice($order);
+$invoice->register();
+/** @var Order $order */
+$order = $invoice->getOrder();
+$order->setIsInProcess(true);
+/** @var Transaction $transactionSave */
+$transactionSave = Bootstrap::getObjectManager()->create(Transaction::class);
+$transactionSave->addObject($invoice)->addObject($order)->save();
+
+/** @var ItemFactory $invoiceItemFactory */
+$invoiceItemFactory = Bootstrap::getObjectManager()->create(ItemFactory::class);
+
+$items = [
+    [
+        'name' => 'item 1',
+        'base_price' => 10,
+        'price' => 10,
+        'row_total' => 10,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 2',
+        'base_price' => 20,
+        'price' => 20,
+        'row_total' => 20,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 3',
+        'base_price' => 30,
+        'price' => 30,
+        'row_total' => 30,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 4',
+        'base_price' => 40,
+        'price' => 40,
+        'row_total' => 40,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 5',
+        'base_price' => 50,
+        'price' => 50,
+        'row_total' => 50,
+        'product_type' => 'simple',
+        'qty' => 2,
+        'qty_invoiced' => 20,
+        'qty_refunded' => 2,
+    ],
+];
+
+foreach ($items as $data) {
+    /** @var OrderItem $orderItem */
+    $orderItem = $objectManager->create(OrderItem::class);
+    $orderItem->setProductId($product->getId())->setQtyOrdered(10);
+    $orderItem->setBasePrice($data['base_price']);
+    $orderItem->setPrice($data['price']);
+    $orderItem->setRowTotal($data['row_total']);
+    $orderItem->setProductType($data['product_type']);
+    $orderItem->setQtyRefunded(1);
+    $orderItem->setQtyInvoiced(10);
+    $orderItem->setOriginalPrice(20);
+
+    $order->addItem($orderItem);
+    $order->save();
+
+    /** @var Item $invoiceItem */
+    $invoiceItem = $invoiceItemFactory->create();
+    $invoiceItem->setInvoice($invoice)
+        ->setName($data['name'])
+        ->setOrderItemId($orderItem->getItemId())
+        ->setQty($data['qty'])
+        ->setPrice($data['price'])
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list.php b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list.php
new file mode 100644
index 0000000000000000000000000000000000000000..41ed4fc2206eeac7670a9678746a0ea0d95f814b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order;
+
+require 'order.php';
+/** @var Order $order */
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+$invoices = [
+    [
+        'store_id' => 1,
+        'grand_total' =>  280.00,
+        'order_id' => $order->getId(),
+        'email_sent' => 0,
+        'send_email' => 0,
+        'increment_id' => '123',
+        'can_void_flag' => 1,
+        'state'     => 1
+    ],
+    [
+        'store_id' => 1,
+        'grand_total' =>  450.00,
+        'order_id' => $order->getId(),
+        'email_sent' => 1,
+        'send_email' => 1,
+        'increment_id' => '456',
+        'can_void_flag' => 1,
+        'state'     => 1
+    ],
+    [
+        'store_id' => 0,
+        'grand_total' =>  10.00,
+        'order_id' => $order->getId(),
+        'email_sent' => 1,
+        'send_email' => 1,
+        'increment_id' => '789',
+        'can_void_flag' => 0,
+        'state'     => 1
+    ],
+    [
+        'store_id' => 1,
+        'grand_total' =>  1110.00,
+        'order_id' => $order->getId(),
+        'email_sent' => 1,
+        'increment_id' => '012',
+        'send_email' => 1,
+        'can_void_flag' => 1,
+        'state'     => 0
+    ],
+];
+
+/** @var array $creditMemoData */
+foreach ($invoices as $invoiceData) {
+    /** @var \Magento\Sales\Model\Order\Creditmemo $creditMemo */
+    $invoice = $objectManager->create(\Magento\Sales\Model\Order\Invoice::class);
+    $invoice
+        ->setData($invoiceData)
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list_rollback.php b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..248f6469ad870606278f6a70f4939dd9db37bbde
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list_rollback.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require 'default_rollback.php';
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_item_list.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_item_list.php
new file mode 100644
index 0000000000000000000000000000000000000000..06fe62997ebba4cc975c82e2f73db096c99b0968
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_item_list.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require 'order.php';
+/** @var \Magento\Catalog\Model\Product $product */
+/** @var \Magento\Sales\Model\Order $order */
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+$orderItems = [
+    [
+        'product_id' => 1,
+        'order_id' => $order->getId(),
+        'base_price' => 90,
+        'price' => 90,
+        'row_total' => 92,
+        'product_type' => 'configurable'
+    ],
+    [
+        'product_id' => 1,
+        'base_price' => 100,
+        'order_id' => $order->getId(),
+        'price' => 100,
+        'row_total' => 102,
+        'product_type' => 'configurable'
+    ],
+    [
+        'product_id' => 12,
+        'base_price' => 110,
+        'order_id' => $order->getId(),
+        'price' => 110,
+        'row_total' => 112,
+        'product_type' => 'virtual'
+    ],
+    [
+        'product_id' => 13,
+        'base_price' => 123,
+        'order_id' => $order->getId(),
+        'price' => 123,
+        'row_total' => 126,
+        'product_type' => 'simple'
+    ]
+];
+
+
+/** @var array $orderItemData */
+foreach ($orderItems as $orderItemData) {
+    /** @var $orderItem \Magento\Sales\Model\Order\Item */
+    $orderItem = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+        \Magento\Sales\Model\Order\Item::class
+    );
+    $orderItem
+        ->setData($orderItemData)
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_list.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_list.php
new file mode 100644
index 0000000000000000000000000000000000000000..58ebcae4935ae878bb806d7da5a6e0f3e2d9c23f
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_list.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order;
+
+require 'order.php';
+/** @var Order $order */
+/** @var  Order\Payment $payment */
+/** @var  Order\Item $orderItem */
+/** @var  Order\Address $billingAddress */
+/** @var  Order\Address $shippingAddress */
+$orders = [
+    [
+        'increment_id' => '100000002',
+        'state' => \Magento\Sales\Model\Order::STATE_NEW,
+        'status' => 'processing',
+        'grand_total' => 120.00,
+        'subtotal' => 120.00,
+        'base_grand_total' => 120.00,
+        'store_id' => 1,
+        'website_id' => 1,
+        'payment' => $payment
+    ],
+    [
+        'increment_id' => '100000003',
+        'state' => \Magento\Sales\Model\Order::STATE_PROCESSING,
+        'status' => 'processing',
+        'grand_total' => 140.00,
+        'base_grand_total' => 140.00,
+        'subtotal' => 140.00,
+        'store_id' => 0,
+        'website_id' => 0,
+        'payment' => $payment
+    ],
+    [
+        'increment_id' => '100000004',
+        'state' => \Magento\Sales\Model\Order::STATE_PROCESSING,
+        'status' => 'closed',
+        'grand_total' => 140.00,
+        'base_grand_total' => 140.00,
+        'subtotal' => 140.00,
+        'store_id' => 1,
+        'website_id' => 1,
+        'payment' => $payment
+    ],
+];
+
+/** @var array $orderData */
+foreach ($orders as $orderData) {
+    /** @var $order \Magento\Sales\Model\Order */
+    $order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+        \Magento\Sales\Model\Order::class
+    );
+    $order
+        ->setData($orderData)
+        ->addItem($orderItem)
+        ->setBillingAddress($billingAddress)
+        ->setBillingAddress($shippingAddress)
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_list_rollback.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_list_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..bec218557ce9dfb0673f2a1e92ca42a2b4761a75
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_list_rollback.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order;
+
+require 'default_rollback.php';
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_payment_list.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_payment_list.php
new file mode 100644
index 0000000000000000000000000000000000000000..96312eb6577d64f50092affd9a4fa5272ef4fa87
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_payment_list.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order;
+
+require 'order.php';
+/** @var Order $order */
+
+$payments = [
+    [
+        'parent_id' => $order->getId(),
+        'cc_exp_month' => '06',
+        'cc_ss_start_year' => '2014',
+        'method' => 'checkmo',
+        'cc_last_4' => '123'
+    ],
+    [
+        'parent_id' => $order->getId(),
+        'cc_exp_month' => '07',
+        'cc_ss_start_year' => '2014',
+        'method' => 'checkmo',
+        'cc_last_4' => '456'
+    ],
+    [
+        'parent_id' => $order->getId(),
+        'cc_exp_month' => '08',
+        'cc_ss_start_year' => '2015',
+        'method' => 'checkmo'
+    ],
+    [
+        'parent_id' => $order->getId(),
+        'cc_exp_month' => '09',
+        'cc_ss_start_year' => '2016',
+        'method' => 'paypal_express'
+    ],
+];
+
+/** @var array $payments */
+foreach ($payments as $paymentData) {
+    /** @var $address \Magento\Sales\Model\Order\Payment */
+    $payment = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+        \Magento\Sales\Model\Order\Payment::class
+    );
+    $payment
+        ->setData($paymentData)
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_status_history_for_search.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_status_history_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..32d63edda1666ede462b1f354761867b22fbe754
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_status_history_for_search.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order\Status\History;
+use Magento\TestFramework\Helper\Bootstrap;
+
+require 'default_rollback.php';
+require __DIR__ . '/order.php';
+
+$comments = [
+    [
+        'comment' => 'comment 1',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 2',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 3',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 4',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 5',
+        'is_visible_on_front' => 0,
+        'is_customer_notified' => 1,
+    ],
+];
+
+foreach ($comments as $data) {
+    /** @var $comment History */
+    $comment = Bootstrap::getObjectManager()->create(History::class);
+    $comment->setParentId($order->getId());
+    $comment->setComment($data['comment']);
+    $comment->setIsVisibleOnFront($data['is_visible_on_front']);
+    $comment->setIsCustomerNotified($data['is_customer_notified']);
+    $comment->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_comments_for_search.php b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_comments_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..a588d7b5accd765fc2e1c0fbc33a55d578087f82
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_comments_for_search.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Payment\Helper\Data;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Shipment;
+use Magento\Sales\Model\Order\Shipment\Comment;
+use Magento\Sales\Model\Order\Shipment\Item;
+use Magento\TestFramework\Helper\Bootstrap;
+
+require 'default_rollback.php';
+require __DIR__ . '/order.php';
+
+/** @var Order $order */
+$payment = $order->getPayment();
+$paymentInfoBlock = Bootstrap::getObjectManager()->get(Data::class)
+    ->getInfoBlock($payment);
+$payment->setBlockMock($paymentInfoBlock);
+
+/** @var Shipment $shipment */
+$shipment = Bootstrap::getObjectManager()->create(Shipment::class);
+$shipment->setOrder($order);
+
+/** @var Item $shipmentItem */
+$shipmentItem = Bootstrap::getObjectManager()->create(Item::class);
+$shipmentItem->setOrderItem($orderItem);
+$shipment->addItem($shipmentItem);
+$shipment->setPackages([['1'], ['2']]);
+$shipment->setShipmentStatus(\Magento\Sales\Model\Order\Shipment::STATUS_NEW);
+$shipment->save();
+
+$comments = [
+    [
+        'comment' => 'comment 1',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 2',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 3',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 4',
+        'is_visible_on_front' => 1,
+        'is_customer_notified' => 1,
+    ],
+    [
+        'comment' => 'comment 5',
+        'is_visible_on_front' => 0,
+        'is_customer_notified' => 1,
+    ],
+];
+
+foreach ($comments as $data) {
+    /** @var $comment Comment */
+    $comment = Bootstrap::getObjectManager()->create(Comment::class);
+    $comment->setParentId($shipment->getId());
+    $comment->setComment($data['comment']);
+    $comment->setIsVisibleOnFront($data['is_visible_on_front']);
+    $comment->setIsCustomerNotified($data['is_customer_notified']);
+    $comment->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_items_for_search.php b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_items_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..a61db84eeb68668633c92d8c76c52f932046e12a
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_items_for_search.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Payment\Helper\Data;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Shipment;
+use Magento\Sales\Model\Order\Shipment\Item;
+use Magento\Sales\Model\Order\Shipment\ItemFactory;
+use Magento\Sales\Model\Order\Item as OrderItem;
+use Magento\TestFramework\Helper\Bootstrap;
+
+require 'default_rollback.php';
+require __DIR__ . '/order.php';
+
+/** @var Order $order */
+$payment = $order->getPayment();
+$paymentInfoBlock = Bootstrap::getObjectManager()->get(Data::class)
+    ->getInfoBlock($payment);
+$payment->setBlockMock($paymentInfoBlock);
+
+/** @var Shipment $shipment */
+$shipment = Bootstrap::getObjectManager()->create(Shipment::class);
+$shipment->setOrder($order);
+
+/** @var Item $shipmentItem */
+$shipmentItem = Bootstrap::getObjectManager()->create(Item::class);
+$shipmentItem->setOrderItem($orderItem);
+$shipment->addItem($shipmentItem);
+$shipment->setPackages([['1'], ['2']]);
+$shipment->setShipmentStatus(\Magento\Sales\Model\Order\Shipment::STATUS_NEW);
+$shipment->save();
+
+/** @var ItemFactory $shipmentItemFactory */
+$shipmentItemFactory = Bootstrap::getObjectManager()->create(ItemFactory::class);
+
+$items = [
+    [
+        'name' => 'item 1',
+        'base_price' => 10,
+        'price' => 10,
+        'row_total' => 10,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 2',
+        'base_price' => 20,
+        'price' => 20,
+        'row_total' => 20,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 3',
+        'base_price' => 30,
+        'price' => 30,
+        'row_total' => 30,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 4',
+        'base_price' => 40,
+        'price' => 40,
+        'row_total' => 40,
+        'product_type' => 'simple',
+        'qty' => 10,
+        'qty_invoiced' => 10,
+        'qty_refunded' => 1,
+    ],
+    [
+        'name' => 'item 5',
+        'base_price' => 50,
+        'price' => 50,
+        'row_total' => 50,
+        'product_type' => 'simple',
+        'qty' => 2,
+        'qty_invoiced' => 20,
+        'qty_refunded' => 2,
+    ],
+];
+
+foreach ($items as $data) {
+    /** @var OrderItem $orderItem */
+    $orderItem = $objectManager->create(OrderItem::class);
+    $orderItem->setProductId($product->getId())->setQtyOrdered(10);
+    $orderItem->setBasePrice($data['base_price']);
+    $orderItem->setPrice($data['price']);
+    $orderItem->setRowTotal($data['row_total']);
+    $orderItem->setProductType($data['product_type']);
+    $orderItem->setQtyOrdered(100);
+    $orderItem->setQtyInvoiced(10);
+    $orderItem->setOriginalPrice(20);
+
+    $order->addItem($orderItem);
+    $order->save();
+
+    /** @var Item $shipmentItem */
+    $shipmentItem = $shipmentItemFactory->create();
+    $shipmentItem->setShipment($shipment)
+        ->setName($data['name'])
+        ->setOrderItem($orderItem)
+        ->setOrderItemId($orderItem->getItemId())
+        ->setQty($data['qty'])
+        ->setPrice($data['price'])
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_list.php b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_list.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe84851c5442632cdea2674ad29872280873686c
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_list.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order;
+
+require 'order.php';
+
+/** @var Order $order */
+/** @var  Order\Payment $payment */
+/** @var  Order\Item $orderItem */
+
+$shipments = [
+    [
+        'increment_id' => '100000001',
+        'order_id' => $order->getId(),
+        'shipping_address_id' => 1,
+        'shipment_status' => \Magento\Sales\Model\Order\Shipment::STATUS_NEW,
+        'store_id' => 1,
+    ],
+    [
+        'increment_id' => '100000002',
+        'order_id' => $order->getId(),
+        'shipping_address_id' => 3,
+        'shipment_status' => \Magento\Sales\Model\Order\Shipment::STATUS_NEW,
+        'store_id' => 1,
+    ],
+    [
+        'increment_id' => '100000003',
+        'order_id' => $order->getId(),
+        'shipping_address_id' => 3,
+        'status' => \Magento\Sales\Model\Order\Shipment::STATUS_NEW,
+        'store_id' => 1,
+    ],
+    [
+        'increment_id' => '100000004',
+        'order_id' => $order->getId(),
+        'shipping_address_id' => 4,
+        'shipment_status' => 'closed',
+        'store_id' => 1,
+    ],
+];
+
+/** @var array $shipmentData */
+foreach ($shipments as $shipmentData) {
+    /** @var $shipment \Magento\Sales\Model\Order\Shipment */
+    $shipment = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+        \Magento\Sales\Model\Order\Shipment::class
+    );
+    /** @var \Magento\Sales\Model\Order\Shipment\Item $shipmentItem */
+    $shipmentItem = $objectManager->create(\Magento\Sales\Model\Order\Shipment\Item::class);
+    $shipmentItem->setParentId($order->getId());
+    $shipmentItem->setOrderItem($orderItem);
+    $shipment
+        ->setData($shipmentData)
+        ->addItem($shipmentItem)
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_list_rollback.php b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_list_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..248f6469ad870606278f6a70f4939dd9db37bbde
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_list_rollback.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require 'default_rollback.php';
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_tracks_for_search.php b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_tracks_for_search.php
new file mode 100644
index 0000000000000000000000000000000000000000..200b1009daa3f790e60caf692f33aa96e6f6ae8b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/shipment_tracks_for_search.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Payment\Helper\Data;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Shipment;
+use Magento\Sales\Model\Order\Shipment\Track;
+use Magento\Sales\Model\Order\Shipment\Item;
+use Magento\TestFramework\Helper\Bootstrap;
+
+require 'default_rollback.php';
+require __DIR__ . '/order.php';
+
+/** @var Order $order */
+$payment = $order->getPayment();
+$paymentInfoBlock = Bootstrap::getObjectManager()->get(Data::class)
+    ->getInfoBlock($payment);
+$payment->setBlockMock($paymentInfoBlock);
+
+/** @var Shipment $shipment */
+$shipment = Bootstrap::getObjectManager()->create(Shipment::class);
+$shipment->setOrder($order);
+
+/** @var Item $shipmentItem */
+$shipmentItem = Bootstrap::getObjectManager()->create(Item::class);
+$shipmentItem->setOrderItem($orderItem);
+$shipment->addItem($shipmentItem);
+$shipment->setPackages([['1'], ['2']]);
+$shipment->setShipmentStatus(\Magento\Sales\Model\Order\Shipment::STATUS_NEW);
+$shipment->save();
+
+$tracks = [
+    [
+        'title' => 'title 1',
+        'carrier_code' => 'carrier code 1',
+        'track_number' => 'track number 1',
+        'description' => 'description 1',
+        'qty' => 1,
+        'weight' => 1,
+    ],
+    [
+        'title' => 'title 2',
+        'carrier_code' => 'carrier code 2',
+        'track_number' => 'track number 2',
+        'description' => 'description 2',
+        'qty' => 2,
+        'weight' => 1,
+    ],
+    [
+        'title' => 'title 3',
+        'carrier_code' => 'carrier code 3',
+        'track_number' => 'track number 3',
+        'description' => 'description 3',
+        'qty' => 3,
+        'weight' => 1,
+    ],
+    [
+        'title' => 'title 4',
+        'carrier_code' => 'carrier code 4',
+        'track_number' => 'track number 4',
+        'description' => 'description 4',
+        'qty' => 4,
+        'weight' => 1,
+    ],
+    [
+        'title' => 'title 5',
+        'carrier_code' => 'carrier code 5',
+        'track_number' => 'track number 5',
+        'description' => 'description 5',
+        'qty' => 5,
+        'weight' => 2,
+    ],
+];
+
+foreach ($tracks as $data) {
+    /** @var $track Track */
+    $track = Bootstrap::getObjectManager()->create(Track::class);
+    $track->setOrderId($order->getId());
+    $track->setParentId($shipment->getId());
+    $track->setTitle($data['title']);
+    $track->setCarrierCode($data['carrier_code']);
+    $track->setTrackNumber($data['track_number']);
+    $track->setDescription($data['description']);
+    $track->setQty($data['qty']);
+    $track->setWeight($data['weight']);
+    $track->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/transactions_list.php b/dev/tests/integration/testsuite/Magento/Sales/_files/transactions_list.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c505d27dfcb4cef329dd765488def62e6949873
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/transactions_list.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Sales\Model\Order;
+
+require 'transactions_list_rollback.php';
+require 'transactions_detailed.php';
+
+/** @var Order $order */
+/** @var  Order\Payment $payment */
+
+$transactions = [
+    [
+        'transaction_id' => 'trx_auth1',
+        'is_transaction_closed' => 1,
+        'order_id' => $order->getId(),
+        'payment_id' => $payment->getId(),
+        'parent_transaction_id' => 'trx_auth1',
+        'txn_id' => 'aaabbbccc',
+    ],
+    [
+        'transaction_id' => 'trx_auth2',
+        'is_transaction_closed' => 1,
+        'parent_transaction_id' => 'trx_auth1',
+        'order_id' => $order->getId(),
+        'payment_id' => $payment->getId(),
+        'txn_id' => '123456',
+    ],
+    [
+        'transaction_id' => 'trx_auth3',
+        'is_transaction_closed' => 1,
+        'parent_transaction_id' => 'trx_auth1',
+        'order_id' => $order->getId(),
+        'payment_id' => $payment->getId(),
+        'txn_id' => 'wooooh',
+    ],
+    [
+        'transaction_id' => 'trx_auth4',
+        'is_transaction_closed' => 1,
+        'parent_transaction_id' => 'trx_auth2',
+        'order_id' => $order->getId(),
+        'payment_id' => $payment->getId(),
+        'txn_id' => '--09--',
+    ]
+];
+
+/** @var array $transactionData */
+foreach ($transactions as $transactionData) {
+    $payment->addData($transactionData);
+    $payment->addTransaction(\Magento\Sales\Model\Order\Payment\Transaction::TYPE_CAPTURE);
+}
+
+$order->save();
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/transactions_list_rollback.php b/dev/tests/integration/testsuite/Magento/Sales/_files/transactions_list_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..248f6469ad870606278f6a70f4939dd9db37bbde
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/transactions_list_rollback.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require 'default_rollback.php';
diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupons.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupons.php
index 51724d6dc12db7fba7ab8f5835f882ce2e954811..4ff08627ea9275b30e0f46d25d5a31661ed61e0d 100644
--- a/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupons.php
+++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupons.php
@@ -19,7 +19,7 @@ $coupon->setRuleId($items[1]->getId())->setCode('autogenerated_2_1')->setType(1)
 $coupon = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Coupon::class);
 $coupon->setRuleId($items[1]->getId())->setCode('autogenerated_2_2')->setType(1)->save();
 
-// type SPECIFIC with generated coupons
+// type SPECIFIC with generated coupons 
 $coupon = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Coupon::class);
 $coupon->setRuleId($items[2]->getId())->setCode('autogenerated_3_1')->setType(1)->save();
 $coupon = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Coupon::class);
diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupons_advanced.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupons_advanced.php
new file mode 100644
index 0000000000000000000000000000000000000000..73b56b382b8c9b1ca524ea2cf09be6b3d2905778
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupons_advanced.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require 'rules_advanced.php';
+
+$this->_collection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+    \Magento\SalesRule\Model\ResourceModel\Rule\Collection::class
+);
+$items = array_values($this->_collection->getItems());
+
+// type SPECIFIC with code
+$coupon = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Coupon::class);
+$coupon->setRuleId($items[0]->getId())->setCode('coupon_code')->setType(0)->save();
+
+// type NO_COUPON with non actual previously generated coupon codes
+$coupon = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Coupon::class);
+$coupon->setRuleId($items[1]->getId())->setCode('autogenerated_2_1')->setType(1)->setIsPrimary(1)->save();
+$coupon = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Coupon::class);
+$coupon->setRuleId($items[1]->getId())->setCode('autogenerated_2_2')->setType(1)->save();
+
+// type SPECIFIC with generated coupons 
+$coupon = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Coupon::class);
+$coupon->setRuleId($items[2]->getId())->setCode('autogenerated_3_1')->setType(1)->save();
+$coupon = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Coupon::class);
+$coupon->setRuleId($items[2]->getId())->setCode('autogenerated_3_2')->setType(1)->setIsPrimary(1)->save();
+
+// type AUTO
+$coupon = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Coupon::class);
+$coupon->setRuleId($items[3]->getId())->setCode('coupon_code_auto')->setType(0)->save();
diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_advanced.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_advanced.php
new file mode 100644
index 0000000000000000000000000000000000000000..a13cba853ce5e05d05078e61b74278c4e0b47e81
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_advanced.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+require 'rules_rollback.php';
+
+/** @var \Magento\SalesRule\Model\Rule $rule */
+$rule = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Rule::class);
+$rule->setName(
+    '#1'
+)->setIsActive(
+    1
+)->setStopRulesProcessing(
+    0
+)->setIsAdvanced(
+    1
+)->setCouponType(
+    Magento\SalesRule\Model\Rule::COUPON_TYPE_SPECIFIC
+)->setUseAutoGeneration(
+    0
+)->setWebsiteIds(
+    '1'
+)
+->setUsesPerCoupon(2)
+->setIsRss(1)
+->setCustomerGroupIds(
+    '0'
+)->setDiscountStep(0)
+    ->save();
+
+/** @var \Magento\SalesRule\Model\Rule $rule */
+$rule = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Rule::class);
+$rule->setName(
+    '#2'
+)->setIsActive(
+    1
+)->setStopRulesProcessing(
+    0
+)->setIsAdvanced(
+    1
+)->setCouponType(
+    Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON
+)
+->setIsRss(1)
+->setUsesPerCoupon(2)
+->setUseAutoGeneration(
+    0
+)->setWebsiteIds(
+    '1'
+)->setCustomerGroupIds(
+    '0'
+)->setDiscountStep(0)
+    ->save();
+
+/** @var \Magento\SalesRule\Model\Rule $rule */
+$rule = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Rule::class);
+$rule->setName(
+    '#3'
+)->setIsActive(
+    1
+)->setStopRulesProcessing(
+    0
+)->setIsAdvanced(
+    1
+)
+->setCouponType(
+    Magento\SalesRule\Model\Rule::COUPON_TYPE_SPECIFIC
+)->setUseAutoGeneration(
+    1
+)->setWebsiteIds(
+    '1'
+)->setCustomerGroupIds(
+    '0'
+)->setDiscountStep(0)
+    ->save();
+
+/** @var \Magento\SalesRule\Model\Rule $rule */
+$rule = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Rule::class);
+$rule->setName(
+    '#4'
+)->setIsActive(
+    1
+)->setStopRulesProcessing(
+    0
+)->setIsAdvanced(
+    1
+)->setCouponType(
+    Magento\SalesRule\Model\Rule::COUPON_TYPE_AUTO
+)->setUseAutoGeneration(
+    0
+)->setWebsiteIds(
+    '1'
+)->setCustomerGroupIds(
+    '0'
+)->setDiscountStep(0)
+    ->save();
+
+/** @var \Magento\SalesRule\Model\Rule $rule */
+$rule = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Rule::class);
+$rule->setName(
+    '#5'
+)->setIsActive(
+    1
+)->setStopRulesProcessing(
+    0
+)->setIsAdvanced(
+    1
+)->setCouponType(
+    Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON
+)->setUseAutoGeneration(
+    0
+)->setWebsiteIds(
+    '1'
+)->setCustomerGroupIds(
+    '0'
+)->setDiscountStep(0)
+    ->save();
diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_rollback.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d6d06978e8e2f8062c7e7f06d8a5e9fd4fcbf34
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_rollback.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\SalesRule\Model\Rule;
+
+$collection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->get(\Magento\SalesRule\Model\ResourceModel\Rule\Collection::class);
+
+/** @var Rule $rule */
+foreach ($collection as $rule) {
+    $rule->delete();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Ui/Api/BookmarkRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Ui/Api/BookmarkRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..576cb3eaffe33e5459141828bb93bd10f99a3304
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Ui/Api/BookmarkRepositoryTest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Ui\Api;
+
+use Magento\Ui\Model\ResourceModel\BookmarkRepository;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrderBuilder;
+
+/**
+ * Class CarrierTest
+ * @package Magento\Ups\Model
+ * @magentoDbIsolation enabled
+ */
+class BookmarkRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var  BookmarkRepository */
+    private $repository;
+
+    /** @var  SortOrderBuilder */
+    private $sortOrderBuilder;
+
+    /** @var FilterBuilder */
+    private $filterBuilder;
+
+    /** @var SearchCriteriaBuilder */
+    private $searchCriteriaBuilder;
+
+    protected function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->repository = $objectManager->create(BookmarkRepository::class);
+        $this->searchCriteriaBuilder = $objectManager->create(
+            \Magento\Framework\Api\SearchCriteriaBuilder::class
+        );
+        $this->filterBuilder = $objectManager->get(
+            \Magento\Framework\Api\FilterBuilder::class
+        );
+        $this->sortOrderBuilder = $objectManager->get(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
+    }
+
+    /**
+     * @magentoDataFixture Magento/Ui/_files/bookmarks.php
+     */
+    public function testGetListWithMultipleFiltersAndSorting()
+    {
+        $filter1 = $this->filterBuilder
+            ->setField('namespace')
+            ->setValue('bm_namespace')
+            ->create();
+        $filter2 = $this->filterBuilder
+            ->setField('namespace')
+            ->setValue('new_namespace')
+            ->create();
+        $filter3 = $this->filterBuilder
+            ->setField('current')
+            ->setValue(1)
+            ->create();
+        $sortOrder = $this->sortOrderBuilder
+            ->setField('title')
+            ->setDirection('DESC')
+            ->create();
+
+        $this->searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $this->searchCriteriaBuilder->addFilters([$filter3]);
+        $this->searchCriteriaBuilder->addSortOrder($sortOrder);
+        $searchCriteria = $this->searchCriteriaBuilder->create();
+        /** @var \Magento\Ui\Api\Data\BookmarkSearchResultsInterface $result */
+        $result = $this->repository->getList($searchCriteria);
+        $this->assertCount(2, $result->getItems());
+        $this->assertEquals('Default View', $result->getItems()[0]->getTitle());
+        $this->assertEquals('Bb', $result->getItems()[1]->getTitle());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Ui/_files/bookmarks.php b/dev/tests/integration/testsuite/Magento/Ui/_files/bookmarks.php
new file mode 100644
index 0000000000000000000000000000000000000000..046c833e1d6d548b271d4541501d2d59b0731673
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Ui/_files/bookmarks.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+use Magento\Ui\Api\Data\BookmarkInterface;
+use Magento\Ui\Model\Bookmark;
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+$bookmarks = [
+    [
+        'user_id' => 1,
+        'namespace' => 'bm_namespace',
+        'identifier' => 'first',
+        'current' => 1,
+        'config' => '{}',
+        'title' => 'Bb'
+    ],
+    [
+        'user_id' => 1,
+        'namespace' => 'bm_namespace',
+        'identifier' => 'second',
+        'current' => 0,
+        'config' => '{1}',
+        'title' => 'Aa'
+    ],
+    [
+        'user_id' => 1,
+        'namespace' => 'new_namespace',
+        'identifier' => 'third',
+        'current' => 1,
+        'config' => '{}',
+        'title' => 'Default View'
+    ],
+];
+
+foreach ($bookmarks as $bookmarkData) {
+    /** @var Bookmark $bookmark */
+    $bookmark = $objectManager->create(BookmarkInterface::class);
+    $bookmark
+        ->setData($bookmarkData)
+        ->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Vault/Model/PaymentTokenRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Vault/Model/PaymentTokenRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cfb126fd9ee4ab53a1104681c929626911e3a249
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Vault/Model/PaymentTokenRepositoryTest.php
@@ -0,0 +1,80 @@
+<?php
+/***
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Vault\Model;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\Api\SortOrderBuilder;
+
+/**
+ * Class PaymentTokenRepositoryTest
+ * @package Magento\Vault\Model
+ * @magentoDbIsolation enabled
+ */
+class PaymentTokenRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var  PaymentTokenRepository */
+    private $repository;
+
+    /** @var  SortOrderBuilder */
+    private $sortOrderBuilder;
+
+    /** @var FilterBuilder */
+    private $filterBuilder;
+
+    /** @var SearchCriteriaBuilder */
+    private $searchCriteriaBuilder;
+
+    public function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->repository = $objectManager->create(PaymentTokenRepository::class);
+        $this->searchCriteriaBuilder = $objectManager->create(
+            \Magento\Framework\Api\SearchCriteriaBuilder::class
+        );
+        $this->filterBuilder = $objectManager->get(
+            \Magento\Framework\Api\FilterBuilder::class
+        );
+        $this->sortOrderBuilder = $objectManager->get(
+            \Magento\Framework\Api\SortOrderBuilder::class
+        );
+    }
+
+    /**
+     * @magentoDataFixture Magento/Vault/_files/payment_tokens.php
+     */
+    public function testGetListWithMultipleFiltersAndSorting()
+    {
+        $filter1 = $this->filterBuilder
+            ->setField('type')
+            ->setValue('simple')
+            ->create();
+        $filter2 = $this->filterBuilder
+            ->setField('is_active')
+            ->setValue(1)
+            ->create();
+        $filter3 = $this->filterBuilder
+            ->setField('expires_at')
+            ->setConditionType('lt')
+            ->setValue('2016-11-04 10:18:15')
+            ->create();
+        $sortOrder = $this->sortOrderBuilder
+            ->setField('public_hash')
+            ->setDirection('DESC')
+            ->create();
+
+        $this->searchCriteriaBuilder->addFilters([$filter1, $filter2]);
+        $this->searchCriteriaBuilder->addFilters([$filter3]);
+        $this->searchCriteriaBuilder->addSortOrder($sortOrder);
+        $searchCriteria = $this->searchCriteriaBuilder->create();
+        /** @var \Magento\Vault\Api\Data\PaymentTokenSearchResultsInterface $result */
+        $result = $this->repository->getList($searchCriteria);
+        $items = $result->getItems();
+        $this->assertCount(2, $items);
+        $this->assertEquals('second', array_shift($items)->getPaymentMethodCode());
+        $this->assertEquals('first', array_shift($items)->getPaymentMethodCode());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Vault/_files/customer.php b/dev/tests/integration/testsuite/Magento/Vault/_files/customer.php
new file mode 100644
index 0000000000000000000000000000000000000000..4a799bb4575e84d206c545de213b80fbdb9ec89b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Vault/_files/customer.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+use Magento\Customer\Model\CustomerRegistry;
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+/** @var $repository \Magento\Customer\Api\CustomerRepositoryInterface */
+$repository = $objectManager->create(\Magento\Customer\Api\CustomerRepositoryInterface::class);
+$customer = $objectManager->create(\Magento\Customer\Model\Customer::class);
+/** @var CustomerRegistry $customerRegistry */
+$customerRegistry = $objectManager->get(CustomerRegistry::class);
+/** @var Magento\Customer\Model\Customer $customer */
+$customer->setWebsiteId(1)
+    ->setId(1)
+    ->setEmail('customer@example.com')
+    ->setPassword('password')
+    ->setGroupId(1)
+    ->setStoreId(1)
+    ->setIsActive(1)
+    ->setPrefix('Mr.')
+    ->setFirstname('John')
+    ->setMiddlename('A')
+    ->setLastname('Smith')
+    ->setSuffix('Esq.')
+    ->setDefaultBilling(1)
+    ->setDefaultShipping(1)
+    ->setTaxvat('12')
+    ->setGender(0);
+
+$customer->isObjectNew(true);
+$customer->save();
+$customerRegistry->remove($customer->getId());
diff --git a/dev/tests/integration/testsuite/Magento/Vault/_files/payment_tokens.php b/dev/tests/integration/testsuite/Magento/Vault/_files/payment_tokens.php
new file mode 100644
index 0000000000000000000000000000000000000000..e021dc7d4372c7342b7fdf0324cd09c1883ccbf7
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Vault/_files/payment_tokens.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+include "customer.php";
+
+use Magento\Customer\Model\Customer;
+use Magento\Vault\Model\PaymentToken;
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+$paymentTokens = [
+    [
+        'customer_id' => 1,
+        'public_hash' => '1234',
+        'payment_method_code' => 'first',
+        'type' => 'simple',
+        'expires_at' => '2016-09-04 10:18:15',
+        'is_active' => 1
+    ],
+    [
+        'customer_id' => 1,
+        'public_hash' => '12345',
+        'payment_method_code' => 'second',
+        'type' => 'simple',
+        'expires_at' => '2016-10-04 10:18:15',
+        'is_active' => 1
+    ],
+    [
+        'customer_id' => 1,
+        'public_hash' => '23456',
+        'payment_method_code' => 'third',
+        'type' => 'notsimple',
+        'expires_at' => '2016-11-04 10:18:15',
+        'is_active' => 1
+    ],
+    [
+        'customer_id' => 1,
+        'public_hash' => '234567',
+        'payment_method_code' => 'fourth',
+        'type' => 'simple',
+        'expires_at' => '2016-12-04 10:18:15',
+        'is_active' => 0
+    ],
+];
+/** @var array $tokenData */
+foreach ($paymentTokens as $tokenData) {
+    /** @var PaymentToken $bookmark */
+    $paymentToken = $objectManager->create(PaymentToken::class);
+    $paymentToken
+        ->setData($tokenData)
+        ->save();
+}
diff --git a/lib/internal/Magento/Framework/Api/Search/SearchCriteriaBuilder.php b/lib/internal/Magento/Framework/Api/Search/SearchCriteriaBuilder.php
index 6f4611d71facb2c9b622eb27cf2f1394f55f31ce..5f595802a98258318b4e7dfc36bd1287fcf2dafc 100644
--- a/lib/internal/Magento/Framework/Api/Search/SearchCriteriaBuilder.php
+++ b/lib/internal/Magento/Framework/Api/Search/SearchCriteriaBuilder.php
@@ -25,6 +25,11 @@ class SearchCriteriaBuilder extends AbstractSimpleObjectBuilder
      */
     protected $filterGroupBuilder;
 
+    /**
+     * @var array
+     */
+    private $filters = [];
+
     /**
      * @param ObjectFactory $objectFactory
      * @param FilterGroupBuilder $filterGroupBuilder
@@ -47,7 +52,11 @@ class SearchCriteriaBuilder extends AbstractSimpleObjectBuilder
      */
     public function create()
     {
-        $this->data[SearchCriteria::FILTER_GROUPS] = [$this->filterGroupBuilder->create()];
+        foreach ($this->filters as $filter) {
+            $this->data[SearchCriteria::FILTER_GROUPS][] = $this->filterGroupBuilder->setFilters([])
+                ->addFilter($filter)
+                ->create();
+        }
         $this->data[SearchCriteria::SORT_ORDERS] = [$this->sortOrderBuilder->create()];
         return parent::create();
     }
@@ -60,7 +69,7 @@ class SearchCriteriaBuilder extends AbstractSimpleObjectBuilder
      */
     public function addFilter(\Magento\Framework\Api\Filter $filter)
     {
-        $this->filterGroupBuilder->addFilter($filter);
+        $this->filters[] = $filter;
         return $this;
     }
 
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..e4769769a971a2294076358b56cd12ab6b6e4448
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\SearchCriteria;
+
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class CollectionProcessor implements CollectionProcessorInterface
+{
+    /**
+     * @var CollectionProcessorInterface[]
+     */
+    private $processors;
+
+    /**
+     * @param CollectionProcessorInterface[] $processors
+     */
+    public function __construct(
+        array $processors
+    ) {
+        $this->processors = $processors;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $collection)
+    {
+        foreach ($this->processors as $name => $processor) {
+            if (!($processor instanceof CollectionProcessorInterface)) {
+                throw new \InvalidArgumentException(
+                    sprintf('Processor %s must implement %s interface.', $name, CollectionProcessorInterface::class)
+                );
+            }
+            $processor->process($searchCriteria, $collection);
+        }
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b2f5705278a05b9f1b36f1c4e9c30a1b526da8d
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\SearchCriteria\CollectionProcessor;
+
+use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class FilterProcessor implements CollectionProcessorInterface
+{
+    /**
+     * @var CustomFilterInterface[]
+     */
+    private $customFilters;
+
+    /**
+     * @var array
+     */
+    private $fieldMapping;
+
+    /**
+     * @param CustomFilterInterface[] $customFilters
+     * @param array $fieldMapping
+     */
+    public function __construct(
+        array $customFilters = [],
+        array $fieldMapping = []
+    ) {
+        $this->customFilters = $customFilters;
+        $this->fieldMapping = $fieldMapping;
+    }
+
+    /**
+     * Apply Search Criteria Filters to collection
+     *
+     * @param SearchCriteriaInterface $searchCriteria
+     * @param AbstractDb $collection
+     * @return void
+     */
+    public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $collection)
+    {
+        foreach ($searchCriteria->getFilterGroups() as $group) {
+            $this->addFilterGroupToCollection($group, $collection);
+        }
+    }
+
+    /**
+     * Add FilterGroup to the collection
+     *
+     * @param FilterGroup $filterGroup
+     * @param AbstractDb $collection
+     * @return void
+     */
+    private function addFilterGroupToCollection(
+        FilterGroup $filterGroup,
+        AbstractDb $collection
+    ) {
+        $fields = [];
+        $conditions = [];
+        foreach ($filterGroup->getFilters() as $filter) {
+            $isApplied = false;
+            $customFilter = $this->getCustomFilterForField($filter->getField());
+            if ($customFilter) {
+                $isApplied = $customFilter->apply($filter, $collection);
+            }
+
+            if (!$isApplied) {
+                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
+                $fields[] = $this->getFieldMapping($filter->getField());
+                $conditions[] = [$condition => $filter->getValue()];
+            }
+        }
+        
+        if ($fields) {
+            $collection->addFieldToFilter($fields, $conditions);
+        }
+    }
+
+    /**
+     * Return custom filters for field if exists
+     *
+     * @param string $field
+     * @return CustomFilterInterface|null
+     * @throws \InvalidArgumentException
+     */
+    private function getCustomFilterForField($field)
+    {
+        $filter = null;
+        if (isset($this->customFilters[$field])) {
+            $filter = $this->customFilters[$field];
+            if (!($this->customFilters[$field] instanceof CustomFilterInterface)) {
+                throw new \InvalidArgumentException(
+                    sprintf(
+                        'Filter for %s must implement %s interface.',
+                        $field,
+                        CustomFilterInterface::class
+                    )
+                );
+            }
+        }
+        return $filter;
+    }
+
+    /**
+     * Return mapped field name
+     *
+     * @param string $field
+     * @return string
+     */
+    private function getFieldMapping($field)
+    {
+        return isset($this->fieldMapping[$field]) ? $this->fieldMapping[$field] : $field;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor/CustomFilterInterface.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor/CustomFilterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..63755d061a9ce9dbeb74b043a4f50caf3cbd4d7a
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor/CustomFilterInterface.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+/**
+ * @api
+ */
+interface CustomFilterInterface
+{
+    /**
+     * Apply Custom Filter to Collection
+     *
+     * @param Filter $filter
+     * @param AbstractDb $collection
+     * @return bool Whether the filter was applied
+     */
+    public function apply(Filter $filter, AbstractDb $collection);
+}
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/JoinProcessor.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/JoinProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..7cf9020f1727830c60a9618b2597111d9b398834
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/JoinProcessor.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\SearchCriteria\CollectionProcessor;
+
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor\CustomJoinInterface;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class JoinProcessor implements CollectionProcessorInterface
+{
+    /**
+     * @var CustomJoinInterface[]
+     */
+    private $joins;
+
+    /**
+     * @var array
+     */
+    private $fieldMapping;
+
+    /** @var array  */
+    private $appliedFields = [];
+
+    /**
+     * @param CustomJoinInterface[] $customFilters
+     * @param array $fieldMapping
+     */
+    public function __construct(
+        array $customJoins = [],
+        array $fieldMapping = []
+    ) {
+        $this->joins = $customJoins;
+        $this->fieldMapping = $fieldMapping;
+    }
+
+    /**
+     * Apply Search Criteria Filters to collection only if we need this
+     *
+     * @param SearchCriteriaInterface $searchCriteria
+     * @param AbstractDb $collection
+     * @return void
+     */
+    public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $collection)
+    {
+        if ($searchCriteria->getFilterGroups()) {
+            //Process filters
+            foreach ($searchCriteria->getFilterGroups() as $group) {
+                foreach ($group->getFilters() as $filter) {
+                    if (!isset($this->appliedFields[$filter->getField()])) {
+                        $this->applyCustomJoin($filter->getField(), $collection);
+                        $this->appliedFields[$filter->getField()] = true;
+                    }
+                }
+            }
+        }
+
+        if ($searchCriteria->getSortOrders()) {
+            // Process Sortings
+            foreach ($searchCriteria->getSortOrders() as $order) {
+                if (!isset($this->appliedFields[$order->getField()])) {
+                    $this->applyCustomJoin($order->getField(), $collection);
+                    $this->appliedFields[$order->getField()] = true;
+                }
+            }
+        }
+    }
+
+    /**
+     * Apply join to collection
+     *
+     * @param string $field
+     * @param AbstractDb $collection
+     * @return void
+     */
+    private function applyCustomJoin($field, AbstractDb $collection)
+    {
+        $field = $this->getFieldMapping($field);
+        $customJoin = $this->getCustomJoin($field);
+
+        if ($customJoin) {
+            $customJoin->apply($collection);
+        }
+    }
+
+    /**
+     * Return custom filters for field if exists
+     *
+     * @param string $field
+     * @return CustomJoinInterface|null
+     * @throws \InvalidArgumentException
+     */
+    private function getCustomJoin($field)
+    {
+        $filter = null;
+        if (isset($this->joins[$field])) {
+            $filter = $this->joins[$field];
+            if (!($this->joins[$field] instanceof CustomJoinInterface)) {
+                throw new \InvalidArgumentException(
+                    sprintf(
+                        'Custom join for %s must implement %s interface.',
+                        $field,
+                        CustomJoinInterface::class
+                    )
+                );
+            }
+        }
+        return $filter;
+    }
+
+    /**
+     * Return mapped field name
+     *
+     * @param string $field
+     * @return string
+     */
+    private function getFieldMapping($field)
+    {
+        return isset($this->fieldMapping[$field]) ? $this->fieldMapping[$field] : $field;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/JoinProcessor/CustomJoinInterface.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/JoinProcessor/CustomJoinInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..97692c4805e82b795374269e89ef53bbea1a98ab
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/JoinProcessor/CustomJoinInterface.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor;
+
+use Magento\Framework\Data\Collection\AbstractDb;
+
+/**
+ * @api
+ */
+interface CustomJoinInterface
+{
+    /**
+     * Make custom joins to collection
+     *
+     * @param AbstractDb $collection
+     * @return bool
+     */
+    public function apply(AbstractDb $collection);
+}
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/PaginationProcessor.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/PaginationProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..781bbc7b92f74d7e368486d299b696a30ae5dd0d
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/PaginationProcessor.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\SearchCriteria\CollectionProcessor;
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class PaginationProcessor implements CollectionProcessorInterface
+{
+    /**
+     * Apply Search Criteria Pagination to collection
+     *
+     * @param SearchCriteriaInterface $searchCriteria
+     * @param AbstractDb $collection
+     * @return void
+     */
+    public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $collection)
+    {
+        $collection->setCurPage($searchCriteria->getCurrentPage());
+        $collection->setPageSize($searchCriteria->getPageSize());
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/SortingProcessor.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/SortingProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e27ce9612a8d2f9fcfa33853f7cacf97f2ca454
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/SortingProcessor.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\SearchCriteria\CollectionProcessor;
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Data\Collection;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class SortingProcessor implements CollectionProcessorInterface
+{
+    /**
+     * @var array
+     */
+    private $fieldMapping;
+
+    /**
+     * @var array
+     */
+    private $defaultOrders;
+
+    /**
+     * @param array $fieldMapping
+     * @param array $defaultOrders
+     */
+    public function __construct(
+        array $fieldMapping = [],
+        array $defaultOrders = []
+    ) {
+        $this->fieldMapping = $fieldMapping;
+        $this->defaultOrders = $defaultOrders;
+    }
+
+    /**
+     * Apply Search Criteria Sorting Orders to collection
+     *
+     * @param SearchCriteriaInterface $searchCriteria
+     * @param AbstractDb $collection
+     * @return void
+     */
+    public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $collection)
+    {
+        if ($searchCriteria->getSortOrders()) {
+            $this->applyOrders($searchCriteria->getSortOrders(), $collection);
+        } elseif ($this->defaultOrders) {
+            $this->applyDefaultOrders($collection);
+        }
+    }
+
+    /**
+     * Return mapped field name
+     *
+     * @param string $field
+     * @return string
+     */
+    private function getFieldMapping($field)
+    {
+        return isset($this->fieldMapping[$field]) ? $this->fieldMapping[$field] : $field;
+    }
+
+    /**
+     * Apply sort orders to collection
+     *
+     * @param SortOrder[] $sortOrders
+     * @param AbstractDb $collection
+     * @return void
+     */
+    private function applyOrders(array $sortOrders, AbstractDb $collection)
+    {
+        /** @var SortOrder $sortOrder */
+        foreach ($sortOrders as $sortOrder) {
+            $field = $this->getFieldMapping($sortOrder->getField());
+            $order = $sortOrder->getDirection() == SortOrder::SORT_ASC
+                ? Collection::SORT_ORDER_ASC
+                : Collection::SORT_ORDER_DESC;
+            $collection->addOrder($field, $order);
+        }
+    }
+
+    /**
+     * Apply default orders to collection
+     *
+     * @param AbstractDb $collection
+     * @return void
+     */
+    private function applyDefaultOrders(AbstractDb $collection)
+    {
+        foreach ($this->defaultOrders as $field => $direction) {
+            $field = $this->getFieldMapping($field);
+            $order = $direction == SortOrder::SORT_ASC
+                ? Collection::SORT_ORDER_ASC
+                : Collection::SORT_ORDER_DESC;
+            $collection->addOrder($field, $order);
+        }
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessorInterface.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessorInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..dd8ec1d0a29a850c81870f94cf49488896e6de84
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessorInterface.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\SearchCriteria;
+
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+/**
+ * @api
+ */
+interface CollectionProcessorInterface
+{
+    /**
+     * Apply Search Criteria to Collection
+     *
+     * @param SearchCriteriaInterface $searchCriteria
+     * @param AbstractDb $collection
+     * @throws \InvalidArgumentException
+     * @return void
+     */
+    public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $collection);
+}
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/FilterProcessorTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/FilterProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d15e34774b303bd131e28761586ab5853f16f44a
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/FilterProcessorTest.php
@@ -0,0 +1,204 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\Test\Unit\SearchCriteria\CollectionProcessor;
+
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class FilterProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Return model
+     *
+     * @param CustomFilterInterface[] $customFilters
+     * @param array $fieldMapping
+     * @return FilterProcessor
+     */
+    private function getModel(array $customFilters, array $fieldMapping)
+    {
+        return new FilterProcessor($customFilters, $fieldMapping);
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     */
+    public function testProcess()
+    {
+        /** @var CustomFilterInterface|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */
+        $customFilterMock = $this->getMockBuilder(CustomFilterInterface::class)
+            ->getMock();
+
+        $customFilterField = 'customFilterField';
+        $customFilters = [$customFilterField => $customFilterMock];
+
+        $otherFilterField = 'otherFilterField';
+        $otherFilterFieldMapped = 'otherFilterFieldMapped';
+        $fieldMapping = [$otherFilterField => $otherFilterFieldMapped];
+        $otherFilterFieldValue = 'otherFilterFieldValue';
+        $otherFilterFieldCondition = 'gt';
+
+        $thirdField = 'thirdField';
+        $thirdFieldValue = 'thirdFieldValue';
+        $thirdFieldCondition = '';
+
+        $resultFieldsOne = [
+            $otherFilterFieldMapped,
+        ];
+        $resultConditionsOne = [
+            [
+                $otherFilterFieldCondition => $otherFilterFieldValue,
+            ],
+        ];
+        $resultFieldsTwo = [
+            $thirdField,
+        ];
+        $resultConditionsTwo = [
+            [
+                'eq' => $thirdFieldValue,
+            ],
+        ];
+
+        $model = $this->getModel($customFilters, $fieldMapping);
+
+        /** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupOneMock */
+        $filterGroupOneMock = $this->getMockBuilder(FilterGroup::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupTwoMock */
+        $filterGroupTwoMock = $this->getMockBuilder(FilterGroup::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterOneMock */
+        $filterOneMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterOneMock->expects($this->once())
+            ->method('getField')
+            ->willReturn($customFilterField);
+
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterTwoMock */
+        $filterTwoMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterTwoMock->expects($this->exactly(2))
+            ->method('getField')
+            ->willReturn($otherFilterField);
+        $filterTwoMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($otherFilterFieldValue);
+        $filterTwoMock->expects($this->exactly(2))
+            ->method('getConditionType')
+            ->willReturn($otherFilterFieldCondition);
+
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterThreeMock */
+        $filterThreeMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterThreeMock->expects($this->exactly(2))
+            ->method('getField')
+            ->willReturn($thirdField);
+        $filterThreeMock->expects($this->once())
+            ->method('getValue')
+            ->willReturn($thirdFieldValue);
+        $filterThreeMock->expects($this->once())
+            ->method('getConditionType')
+            ->willReturn($thirdFieldCondition);
+
+        $filterGroupOneMock->expects($this->once())
+            ->method('getFilters')
+            ->willReturn([$filterOneMock, $filterTwoMock]);
+
+        $filterGroupTwoMock->expects($this->once())
+            ->method('getFilters')
+            ->willReturn([$filterThreeMock]);
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        $searchCriteriaMock->expects($this->once())
+            ->method('getFilterGroups')
+            ->willReturn([$filterGroupOneMock, $filterGroupTwoMock]);
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $customFilterMock->expects($this->once())
+            ->method('apply')
+            ->with($filterOneMock, $collectionMock)
+            ->willReturn(true);
+
+        $collectionMock->expects($this->exactly(2))
+            ->method('addFieldToFilter')
+            ->withConsecutive(
+                [$resultFieldsOne, $resultConditionsOne],
+                [$resultFieldsTwo, $resultConditionsTwo]
+            )->willReturnSelf();
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testProcessWithException()
+    {
+        /** @var \stdClass|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */
+        $customFilterMock = $this->getMockBuilder(\stdClass::class)
+            ->getMock();
+
+        $customFilterField = 'customFilterField';
+        $customFilters = [$customFilterField => $customFilterMock];
+
+        $model = $this->getModel($customFilters, []);
+
+        /** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupOneMock */
+        $filterGroupOneMock = $this->getMockBuilder(FilterGroup::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterOneMock */
+        $filterOneMock = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterOneMock->expects($this->once())
+            ->method('getField')
+            ->willReturn($customFilterField);
+
+        $filterGroupOneMock->expects($this->once())
+            ->method('getFilters')
+            ->willReturn([$filterOneMock]);
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        $searchCriteriaMock->expects($this->once())
+            ->method('getFilterGroups')
+            ->willReturn([$filterGroupOneMock]);
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $customFilterMock->expects($this->never())
+            ->method('apply');
+
+        $collectionMock->expects($this->never())
+            ->method('addFieldToFilter');
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/JoinProcessorTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/JoinProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d704f92f70e030cb086d7635d91ff5105fd022e5
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/JoinProcessorTest.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\Test\Unit\SearchCriteria\CollectionProcessor;
+
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Api\Search\FilterGroup;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor\CustomJoinInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class JoinProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Return model
+     *
+     * @param CustomJoinInterface[] $customJoins
+     * @param array $fieldMapping
+     * @return JoinProcessor
+     */
+    private function getModel(array $customJoins, array $fieldMapping)
+    {
+        return new JoinProcessor($customJoins, $fieldMapping);
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     */
+    public function testProcess()
+    {
+        /** @var \PHPUnit_Framework_MockObject_MockObject $customJoinMock */
+        $customJoinMock = $this->getMock(
+            \Magento\Framework\Api\SearchCriteria\CollectionProcessor\JoinProcessor\CustomJoinInterface::class
+        );
+
+        $customField = 'customJoinField';
+        $joins = [$customField => $customJoinMock];
+        $fieldMapping = [
+            'customJoinFieldAzaza' => 'customJoinField'
+        ];
+
+        $model = $this->getModel($joins, $fieldMapping);
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        /** @var FilterGroup |\PHPUnit_Framework_MockObject_MockObject $JoinGroupOneMock */
+        $filterGroup = $this->getMockBuilder(FilterGroup::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var Filter |\PHPUnit_Framework_MockObject_MockObject $JoinThreeMock */
+        $filter1 = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filter1->expects($this->atLeastOnce())
+            ->method('getField')
+            ->willReturn('customJoinFieldAzaza');
+        $filter2 = $this->getMockBuilder(Filter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filter2->expects($this->atLeastOnce())
+            ->method('getField')
+            ->willReturn('someOtherField');
+        $filterGroup->expects($this->once())
+            ->method('getFilters')
+            ->willReturn([$filter1, $filter2]);
+
+        $searchCriteriaMock->expects($this->exactly(2))
+            ->method('getFilterGroups')
+            ->willReturn([$filterGroup]);
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $customJoinMock->expects($this->once())
+            ->method('apply')
+            ->with($collectionMock)
+            ->willReturn(true);
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testProcessWithException()
+    {
+        /** @var \PHPUnit_Framework_MockObject_MockObject $customJoinMock */
+        $customJoinMock = $this->getMockBuilder(\stdClass::class)
+            ->getMock();
+
+        $customField = 'customJoinField';
+        $joins = [$customField => $customJoinMock];
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        $model = $this->getModel($joins, []);
+        /** @var SortOrder |\PHPUnit_Framework_MockObject_MockObject $JoinGroupOneMock */
+        $sortOrder = $this->getMockBuilder(SortOrder::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $sortOrder->expects($this->atLeastOnce())
+            ->method('getField')
+            ->willReturn('customJoinField');
+        $searchCriteriaMock->expects($this->exactly(2))
+            ->method('getSortOrders')
+            ->willReturn([$sortOrder]);
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/PaginationProcessorTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/PaginationProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..57b2ccf3382f043d1b69f98c2aeef5f2a79c07c3
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/PaginationProcessorTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\Test\Unit\SearchCriteria\CollectionProcessor;
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\PaginationProcessor;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class PaginationProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    public function testProcess()
+    {
+        $model = new PaginationProcessor;
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+        $searchCriteriaMock->expects($this->once())
+            ->method('getCurrentPage')
+            ->willReturn(22);
+        $searchCriteriaMock->expects($this->once())
+            ->method('getPageSize')
+            ->willReturn(33);
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $collectionMock->expects($this->once())
+            ->method('setCurPage')
+            ->with(22)
+            ->willReturnSelf();
+        $collectionMock->expects($this->once())
+            ->method('setPageSize')
+            ->with(33)
+            ->willReturnSelf();
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/SortingProcessorTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/SortingProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..68b4d6cee69610f02b84676e7558ae8f08894c63
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/SortingProcessorTest.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\Test\Unit\SearchCriteria\CollectionProcessor;
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor\SortingProcessor;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Api\SortOrder;
+use Magento\Framework\Data\Collection;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class SortingProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Return model
+     *
+     * @param array $fieldMapping
+     * @param array $defaultOrders
+     * @return SortingProcessor
+     */
+    private function getModel(array $fieldMapping, array $defaultOrders)
+    {
+        return new SortingProcessor($fieldMapping, $defaultOrders);
+    }
+
+    public function testProcess()
+    {
+        $orderOneField = 'orderOneField';
+        $orderOneFieldMapped = 'orderOneFieldMapped';
+        $orderOneDirection = SortOrder::SORT_ASC;
+
+        $orderTwoField = 'orderTwoField';
+        $orderTwoDirection = SortOrder::SORT_DESC;
+
+        $orderThreeField = 'orderTwoField';
+        $orderThreeDirection = '!!@!@';
+
+        $fieldMapping = [$orderOneField => $orderOneFieldMapped];
+
+        $defaultOrders = ['orderTwoField' => 'DESC'];
+
+        $model = $this->getModel($fieldMapping, $defaultOrders);
+
+        /** @var SortOrder|\PHPUnit_Framework_MockObject_MockObject $sortOrderOneMock */
+        $sortOrderOneMock = $this->getMockBuilder(SortOrder::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $sortOrderOneMock->expects($this->once())
+            ->method('getField')
+            ->willReturn($orderOneField);
+        $sortOrderOneMock->expects($this->once())
+            ->method('getDirection')
+            ->willReturn($orderOneDirection);
+
+        /** @var SortOrder|\PHPUnit_Framework_MockObject_MockObject $sortOrderTwoMock */
+        $sortOrderTwoMock = $this->getMockBuilder(SortOrder::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $sortOrderTwoMock->expects($this->once())
+            ->method('getField')
+            ->willReturn($orderTwoField);
+        $sortOrderTwoMock->expects($this->once())
+            ->method('getDirection')
+            ->willReturn($orderTwoDirection);
+
+        /** @var SortOrder|\PHPUnit_Framework_MockObject_MockObject $sortOrderThreeMock */
+        $sortOrderThreeMock = $this->getMockBuilder(SortOrder::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $sortOrderThreeMock->expects($this->once())
+            ->method('getField')
+            ->willReturn($orderThreeField);
+        $sortOrderThreeMock->expects($this->once())
+            ->method('getDirection')
+            ->willReturn($orderThreeDirection);
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        $searchCriteriaMock->expects($this->exactly(2))
+            ->method('getSortOrders')
+            ->willReturn([$sortOrderOneMock, $sortOrderTwoMock, $sortOrderThreeMock]);
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $collectionMock->expects($this->exactly(3))
+            ->method('addOrder')
+            ->withConsecutive(
+                [$orderOneFieldMapped, $orderOneDirection],
+                [$orderTwoField, $orderTwoDirection],
+                [$orderThreeField, Collection::SORT_ORDER_DESC]
+            )->willReturnSelf();
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+
+    public function testProcessWithDefaults()
+    {
+        $defaultOneField = 'defaultOneField';
+        $defaultOneFieldMapped = 'defaultOneFieldMapped';
+        $defaultOneDirection = SortOrder::SORT_ASC;
+
+        $defaultTwoField = 'defaultTwoField';
+        $defaultTwoDirection = SortOrder::SORT_DESC;
+
+        $defaultThreeField = 'defaultThreeField';
+        $defaultThreeDirection = '$#%^';
+
+        $fieldMapping = [$defaultOneField => $defaultOneFieldMapped];
+
+        $defaultOrders = [
+            $defaultOneField => $defaultOneDirection,
+            $defaultTwoField => $defaultTwoDirection,
+            $defaultThreeField => $defaultThreeDirection,
+        ];
+
+        $model = $this->getModel($fieldMapping, $defaultOrders);
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        $searchCriteriaMock->expects($this->once())
+            ->method('getSortOrders')
+            ->willReturn([]);
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $collectionMock->expects($this->exactly(3))
+            ->method('addOrder')
+            ->withConsecutive(
+                [$defaultOneFieldMapped, $defaultOneDirection],
+                [$defaultTwoField, $defaultTwoDirection],
+                [$defaultThreeField, Collection::SORT_ORDER_DESC]
+            )->willReturnSelf();
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessorTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae52d722e050cbf9dbf4fce39a308834c405c61e
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessorTest.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\Test\Unit\SearchCriteria;
+
+use Magento\Framework\Api\SearchCriteria\CollectionProcessor;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+use Magento\Framework\Api\SearchCriteriaInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+
+class CollectionProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Return model
+     *
+     * @param CollectionProcessorInterface[] $processors
+     * @return CollectionProcessor
+     */
+    private function getModel(array $processors)
+    {
+        return new CollectionProcessor($processors);
+    }
+
+    public function testProcess()
+    {
+        /** @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */
+        $processorOneMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
+
+        /** @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject $processorTwoMock */
+        $processorTwoMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
+
+        $processors = [$processorOneMock, $processorTwoMock];
+
+        $model = $this->getModel($processors);
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $processorOneMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
+
+        $processorTwoMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testProcessWithException()
+    {
+        /** @var CollectionProcessorInterface|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */
+        $processorOneMock = $this->getMockBuilder(CollectionProcessorInterface::class)
+            ->getMock();
+
+        /** @var \stdClass|\PHPUnit_Framework_MockObject_MockObject $processorTwoMock */
+        $processorTwoMock = $this->getMockBuilder(\stdClass::class)
+            ->getMock();
+
+        $processors = [$processorOneMock, $processorTwoMock];
+
+        $model = $this->getModel($processors);
+
+        /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
+        $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
+            ->getMock();
+
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        $collectionMock = $this->getMockBuilder(AbstractDb::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $processorOneMock->expects($this->once())
+            ->method('process')
+            ->with($searchCriteriaMock, $collectionMock);
+
+        $processorTwoMock->expects($this->never())
+            ->method('process');
+
+        $model->process($searchCriteriaMock, $collectionMock);
+    }
+}
diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php
index c520835f09f8cc987caeba798678ea08b5e6d5c5..0c825a5ed5ac50915fbaaee27a5a23717f1b7d9c 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php
@@ -8,6 +8,9 @@
 
 namespace Magento\Framework\ObjectManager\Code\Generator;
 
+use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
+use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
+
 /**
  * Class Repository
  */
@@ -82,7 +85,21 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                         [
                             'name' => 'var',
                             'description' =>
-                                '\\' . \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface::class,
+                                '\\' . JoinProcessorInterface::class,
+                        ],
+                    ],
+                ]
+            ],
+            [
+                'name' => 'collectionProcessor',
+                'visibility' => 'private',
+                'docblock' => [
+                    'shortDescription' => 'Search Criteria Collection processor.',
+                    'tags' => [
+                        [
+                            'name' => 'var',
+                            'description' =>
+                                '\\' . CollectionProcessorInterface::class,
                         ],
                     ],
                 ]
@@ -154,7 +171,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                 ],
                 [
                     'name' => 'extensionAttributesJoinProcessor',
-                    'type' => '\\' . \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface::class,
+                    'type' => '\\' . JoinProcessorInterface::class,
                 ],
             ],
             'body' => "\$this->"
@@ -175,12 +192,11 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                     [
                         'name' => 'param',
                         'description' => $this->_getCollectionFactoryClassName()
-                            . " \$" . $this->_getSourceCollectionFactoryPropertyName()
+                            . " \$" . $this->_getSourceCollectionFactoryPropertyName(),
                     ],
                     [
                         'name' => 'param',
-                        'description' => '\\' . \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface::class
-                            . " \$extensionAttributesJoinProcessor"
+                        'description' => '\\' . JoinProcessorInterface::class . " \$extensionAttributesJoinProcessor",
                     ],
                 ],
             ]
@@ -468,14 +484,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
     {
         $body = "\$collection = \$this->" . $this->_getSourceCollectionFactoryPropertyName() . "->create();\n"
         . "\$this->extensionAttributesJoinProcessor->process(\$collection);\n"
-        . "foreach (\$searchCriteria->getFilterGroups() as \$filterGroup) {\n"
-        . "    foreach (\$filterGroup->getFilters() as \$filter) {\n"
-        . "        \$condition = \$filter->getConditionType() ? \$filter->getConditionType() : 'eq';\n"
-        . "        \$collection->addFieldToFilter(\$filter->getField(), [\$condition => \$filter->getValue()]);\n"
-        . "    }\n"
-        . "}\n"
-        . "\$collection->setCurPage(\$searchCriteria->getCurrentPage());\n"
-        . "\$collection->setPageSize(\$searchCriteria->getPageSize());\n"
+        . "\$this->getCollectionProcessor()->process(\$searchCriteria, \$collection);\n"
         . "return \$collection;\n";
         return [
             'name' => 'getList',
@@ -502,6 +511,39 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
         ];
     }
 
+    /**
+     * Returns getList() method
+     *
+     * @return string
+     */
+    private function _getGetCollectionProcessorMethod()
+    {
+        $body = "if (!\$this->collectionProcessor) {\n"
+            . "    \$this->collectionProcessor = \\Magento\\Framework\\App\\ObjectManager::getInstance()->get(\n"
+            . "        \\" . CollectionProcessorInterface::class . "::class\n"
+            . "    );\n"
+            . "}\n"
+            . "return \$this->collectionProcessor;\n";
+        return [
+            'name' => 'getCollectionProcessor',
+            'visibility' => 'private',
+            'parameters' => [],
+            'body' => $body,
+            'docblock' => [
+                'shortDescription' => 'Retrieve collection processor',
+                'tags' => [
+                    [
+                        'name' => 'deprecated',
+                    ],
+                    [
+                        'name' => 'return',
+                        'description' => "\\" . CollectionProcessorInterface::class,
+                    ],
+                ],
+            ]
+        ];
+    }
+
     /**
      * Returns list of methods for class generator
      *
@@ -519,7 +561,8 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
             $this->_getDeleteMethod(),
             $this->_getDeleteByIdMethod(),
             $this->_getFlushMethod(),
-            $this->_getSaveMethod()
+            $this->_getSaveMethod(),
+            $this->_getGetCollectionProcessorMethod(),
         ];
     }
 
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt
index b56cf46027540e1027d61d10a395bd14f6b76955..4ddebf82816cd7fa57ddec33ca62ad1e306afd74 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt
+++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt
@@ -35,6 +35,13 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato
      */
     protected $extensionAttributesJoinProcessor = null;
 
+    /**
+     * Search Criteria Collection processor.
+     *
+     * @var \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface
+     */
+    private $collectionProcessor = null;
+
     /**
      * Repository constructor
      *
@@ -104,14 +111,7 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato
     {
         $collection = $this->sampleInterfaceSearchResultFactory->create();
         $this->extensionAttributesJoinProcessor->process($collection);
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            foreach ($filterGroup->getFilters() as $filter) {
-                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
-                $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
-            }
-        }
-        $collection->setCurPage($searchCriteria->getCurrentPage());
-        $collection->setPageSize($searchCriteria->getPageSize());
+        $this->getCollectionProcessor()->process($searchCriteria, $collection);
         return $collection;
     }
 
@@ -172,4 +172,20 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato
         $this->sampleInterfacePersistor->doPersistEntity($entity);
         return $entity;
     }
+
+    /**
+     * Retrieve collection processor
+     *
+     * @deprecated
+     * @return \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface
+     */
+    private function getCollectionProcessor()
+    {
+        if (!$this->collectionProcessor) {
+            $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface::class
+            );
+        }
+        return $this->collectionProcessor;
+    }
 }
diff --git a/setup/config/states.extensionManager.config.php b/setup/config/states.extensionManager.config.php
index 5c70105c721f2d870443b393d8855a57bd3e0e36..e46b83c50c3e9bab59eeaab69d4161ffbe8f759d 100644
--- a/setup/config/states.extensionManager.config.php
+++ b/setup/config/states.extensionManager.config.php
@@ -65,7 +65,7 @@ return [
             'templateUrl' => "$base/start-updater",
             'controller'  => 'startUpdaterController',
             'title'       => "Component \n Install",
-            'header'      => 'Step 3: Component Install',
+            'header'      => 'Step 3: Install',
             'nav'         => true,
             'order'       => 6,
             'type'        => 'install',
diff --git a/setup/config/states.update.config.php b/setup/config/states.update.config.php
index 38e2ca5bff5348a35b40e201a392aa7d3b487708..4e3970e086ab9ecca1c7ca101e3b89897ae79e71 100644
--- a/setup/config/states.update.config.php
+++ b/setup/config/states.update.config.php
@@ -60,8 +60,8 @@ return [
             'url'         => 'start-updater',
             'templateUrl' => "$base/start-updater",
             'controller'  => 'startUpdaterController',
-            'title'       => "Component \n Update",
-            'header'      => 'Step 3: Component Update',
+            'title'       => "Extension \n Update",
+            'header'      => 'Step 3: Extension Update',
             'nav'         => true,
             'order'       => 6,
             'type'        => 'update'
diff --git a/setup/pub/magento/setup/extension-grid.js b/setup/pub/magento/setup/extension-grid.js
index 255547cb5f7508298ce08729377d0bf080184940..e5fc525dbd1bc8f00f0a50d73b54f363ccadcdfc 100644
--- a/setup/pub/magento/setup/extension-grid.js
+++ b/setup/pub/magento/setup/extension-grid.js
@@ -129,7 +129,7 @@ angular.module('extension-grid', ['ngStorage'])
                         version: $scope.availableUpdatePackages[extension.name]['latestVersion']
                     }
                 ];
-                titleService.setTitle('update', extension.moduleName ? extension.moduleName : extension.name);
+                titleService.setTitle('update', extension);
                 $state.go('root.readiness-check-update');
             };
 
@@ -139,7 +139,7 @@ angular.module('extension-grid', ['ngStorage'])
                         name: extension.name
                     }
                 ];
-                titleService.setTitle('uninstall', extension.moduleName ? extension.moduleName : extension.name);
+                titleService.setTitle('uninstall', extension);
                 $localStorage.componentType = extension.type;
                 $state.go('root.readiness-check-uninstall');
             };
diff --git a/setup/pub/magento/setup/install-extension-grid.js b/setup/pub/magento/setup/install-extension-grid.js
index f4ed97baae386b4387f545d0d1b09fb16c6e8f0a..0ec3b66911f10fda24aaf75a3e2a6583f55ce0ce 100644
--- a/setup/pub/magento/setup/install-extension-grid.js
+++ b/setup/pub/magento/setup/install-extension-grid.js
@@ -5,20 +5,17 @@
 
 'use strict';
 angular.module('install-extension-grid', ['ngStorage', 'clickOut'])
-    .controller('installExtensionGridController', ['$scope', '$http', '$localStorage', 'authService', 'paginationService',
-        function ($scope, $http, $localStorage, authService, paginationService) {
+    .controller('installExtensionGridController', ['$scope', '$http', '$localStorage', 'authService', 'paginationService', 'multipleChoiceService',
+        function ($scope, $http, $localStorage, authService, paginationService, multipleChoiceService) {
 
             $http.get('index.php/installExtensionGrid/extensions').success(function(data) {
                 $scope.error = false;
                 $scope.errorMessage = '';
-                $scope.selectedExtensions = {};
-                $scope.allExtensions = {};
+                $scope.multipleChoiceService = multipleChoiceService;
+                $scope.multipleChoiceService.reset();
                 angular.forEach(data.extensions, function(value) {
-                    this[value.name] = {
-                        'name': value.name,
-                        'version': value.version
-                    };
-                }, $scope.allExtensions);
+                    $scope.multipleChoiceService.addExtension(value.name, value.version);
+                });
                 $scope.extensions = data.extensions;
                 $scope.total = data.total;
                 $scope.currentPage = 1;
@@ -28,31 +25,6 @@ angular.module('install-extension-grid', ['ngStorage', 'clickOut'])
 
             paginationService.initWatchers($scope);
 
-            $scope.updateSelectedExtensions = function($event, name, version) {
-                var checkbox = $event.target;
-                if (checkbox.checked) {
-                    $scope.selectedExtensions[name] = {
-                        'name': name,
-                        'version': version
-                    };
-                    if ($scope.getObjectSize($scope.selectedExtensions) == $scope.getObjectSize($scope.allExtensions)) {
-                        $scope.someExtensionsSelected = false;
-                        $scope.allExtensionsSelected = true;
-                    } else {
-                        $scope.someExtensionsSelected = true;
-                        $scope.allExtensionsSelected = false;
-                    }
-                } else {
-                    delete $scope.selectedExtensions[name];
-                    $scope.allExtensionsSelected = false;
-                    if ($scope.getObjectSize($scope.selectedExtensions) > 0) {
-                        $scope.someExtensionsSelected = true;
-                    } else {
-                        $scope.someExtensionsSelected = false;
-                    }
-                }
-            };
-
             $scope.predicate = 'name';
             $scope.reverse = false;
             $scope.order = function(predicate) {
@@ -60,58 +32,22 @@ angular.module('install-extension-grid', ['ngStorage', 'clickOut'])
                 $scope.predicate = predicate;
             };
 
-            $scope.getObjectSize = function(obj) {
-                var size = 0, key;
-                for (key in obj) {
-                    if (obj.hasOwnProperty(key)) {
-                        ++size;
-                    }
-                }
-                return size;
-            };
-
-            $scope.isNewExtensionsMenuVisible = false;
-            $scope.toggleNewExtensionsMenu = function() {
-                $scope.isNewExtensionsMenuVisible = !$scope.isNewExtensionsMenuVisible;
-            };
-            $scope.hideNewExtensionsMenu = function() {
-                $scope.isNewExtensionsMenuVisible = false;
-            };
-            $scope.someExtensionsSelected = false;
-            $scope.allExtensionsSelected = false;
-            $scope.selectAllExtensions = function() {
-                $scope.isNewExtensionsMenuVisible = false;
-                $scope.someExtensionsSelected = false;
-                $scope.allExtensionsSelected = true;
-                $scope.selectedExtensions = angular.copy($scope.allExtensions);
-            };
-            $scope.deselectAllExtensions = function() {
-                $scope.isNewExtensionsMenuVisible = false;
-                $scope.someExtensionsSelected = false;
-                $scope.allExtensionsSelected = false;
-                $scope.selectedExtensions = {};
-            };
-
             $scope.isHiddenSpinner = true;
             $scope.installAll = function() {
                 $scope.isHiddenSpinner = false;
                 authService.checkAuth({
                     success: function(response) {
                         $scope.isHiddenSpinner = true;
-                        if ($scope.getObjectSize($scope.selectedExtensions) > 0) {
-                            $scope.error = false;
-                            $scope.errorMessage = '';
-                            $localStorage.packages = $scope.selectedExtensions;
-                        } else {
-                            $scope.error = true;
-                            $scope.errorMessage = 'Please select at least one extension';
-                        }
+                        var result = $scope.multipleChoiceService.checkSelectedExtensions();
+                        $scope.error = result.error;
+                        $scope.errorMessage = result.errorMessage;
 
                         if (!$scope.error) {
                             $scope.nextState();
                         }
                     },
                     fail: function(response) {
+                        $scope.isHiddenSpinner = true;
                         authService.openAuthDialog($scope);
                     },
                     error: function() {
@@ -138,6 +74,7 @@ angular.module('install-extension-grid', ['ngStorage', 'clickOut'])
                                 }
                             ];
                             $localStorage.moduleName = extension.name;
+                            $localStorage.packageTitle = extension.package_title;
                             $scope.error = false;
                             $scope.errorMessage = '';
                         }
diff --git a/setup/pub/magento/setup/main.js b/setup/pub/magento/setup/main.js
index b62d03f990f5b4db60aab890d24e905d3599bd23..3f359df3232d7720be259d1b34f958973bdd3e6c 100644
--- a/setup/pub/magento/setup/main.js
+++ b/setup/pub/magento/setup/main.js
@@ -251,13 +251,19 @@ main.controller('navigationController',
 .service('titleService', ['$localStorage', '$rootScope',
     function ($localStorage, $rootScope) {
         return {
-            setTitle: function(type, moduleName) {
-                $localStorage.moduleName = moduleName;
+            setTitle: function(type, component) {
+                if (type === 'enable' || type === 'disable') {
+                    $localStorage.packageTitle = $localStorage.moduleName = component.moduleName;
+                } else {
+                    $localStorage.moduleName = component.moduleName ? component.moduleName : component.name;
+                    $localStorage.packageTitle = component.package_title;
+                }
+
                 if (typeof $localStorage.titles === 'undefined') {
                     $localStorage.titles = [];
                 }
                 $localStorage.titles[type] = type.charAt(0).toUpperCase() + type.slice(1) + ' '
-                    + $localStorage.moduleName;
+                    + ($localStorage.packageTitle ? $localStorage.packageTitle : $localStorage.moduleName);
                 $rootScope.titles = $localStorage.titles;
             }
         };
@@ -277,6 +283,91 @@ main.controller('navigationController',
         };
     }
 ])
+.service('multipleChoiceService', ['$localStorage',
+    function ($localStorage) {
+        return {
+            selectedExtensions: {},
+            allExtensions: {},
+            someExtensionsSelected: false,
+            allExtensionsSelected: false,
+            isNewExtensionsMenuVisible: false,
+
+            addExtension: function (name, version) {
+                this.allExtensions[name] = {
+                    'name': name,
+                    'version': version
+                };
+            },
+            reset: function () {
+                this.allExtensions = {};
+                this.selectedExtensions = {};
+                this.someExtensionsSelected = false;
+                this.allExtensionsSelected = false;
+                this.isNewExtensionsMenuVisible = false;
+            },
+            updateSelectedExtensions: function ($event, name, version) {
+                var checkbox = $event.target;
+                if (checkbox.checked) {
+                    this.selectedExtensions[name] = {
+                        'name': name,
+                        'version': version
+                    };
+                    if (this._getObjectSize(this.selectedExtensions) == this._getObjectSize(this.allExtensions)) {
+                        this.someExtensionsSelected = false;
+                        this.allExtensionsSelected = true;
+                    } else {
+                        this.someExtensionsSelected = true;
+                        this.allExtensionsSelected = false;
+                    }
+                } else {
+                    delete this.selectedExtensions[name];
+                    this.allExtensionsSelected = false;
+                    this.someExtensionsSelected = (this._getObjectSize(this.selectedExtensions) > 0);
+                }
+            },
+            toggleNewExtensionsMenu: function() {
+                this.isNewExtensionsMenuVisible = !this.isNewExtensionsMenuVisible;
+            },
+            hideNewExtensionsMenu: function() {
+                this.isNewExtensionsMenuVisible = false;
+            },
+            selectAllExtensions: function() {
+                this.isNewExtensionsMenuVisible = false;
+                this.someExtensionsSelected = false;
+                this.allExtensionsSelected = true;
+                this.selectedExtensions = angular.copy(this.allExtensions);
+            },
+            deselectAllExtensions: function() {
+                this.isNewExtensionsMenuVisible = false;
+                this.someExtensionsSelected = false;
+                this.allExtensionsSelected = false;
+                this.selectedExtensions = {};
+            },
+            checkSelectedExtensions: function() {
+                var result = {error: false, errorMessage: ''};
+                if (this._getObjectSize(this.selectedExtensions) > 0) {
+                    result.error = false;
+                    result.errorMessage = '';
+                    $localStorage.packages = this.selectedExtensions;
+                } else {
+                    result.error = true;
+                    result.errorMessage = 'Please select at least one extension';
+                }
+
+                return result;
+            },
+            _getObjectSize: function (obj) {
+                var size = 0, key;
+                for (key in obj) {
+                    if (obj.hasOwnProperty(key)) {
+                        ++size;
+                    }
+                }
+                return size;
+            }
+        };
+    }
+])
 .filter('startFrom', function () {
     return function (input, start) {
         if (input !== undefined && start !== 'NaN') {
diff --git a/setup/pub/magento/setup/module-grid.js b/setup/pub/magento/setup/module-grid.js
index 7b9f53ddcf2bffc571e0f768ffd21198330c80f4..21dec8795f13505ca5ca8a5bcd08ac603cad2d94 100644
--- a/setup/pub/magento/setup/module-grid.js
+++ b/setup/pub/magento/setup/module-grid.js
@@ -66,7 +66,7 @@ angular.module('module-grid', ['ngStorage'])
                         isComposerPackage: component.name !== 'unknown',
                     }
                 ];
-                titleService.setTitle(type, component.moduleName ? component.moduleName : component.name);
+                titleService.setTitle(type, component);
                 $localStorage.componentType = component.type;
                 $state.go('root.readiness-check-'+type);
             };
diff --git a/setup/pub/magento/setup/readiness-check.js b/setup/pub/magento/setup/readiness-check.js
index 167651b062091731b778a47e8c01ee54ff879ff0..dad3fc087c01601720813fe895fa9c4137ec8972 100644
--- a/setup/pub/magento/setup/readiness-check.js
+++ b/setup/pub/magento/setup/readiness-check.js
@@ -4,13 +4,14 @@
  */
 
 'use strict';
-angular.module('readiness-check', [])
+angular.module('readiness-check', ['remove-dialog'])
     .constant('COUNTER', 1)
-    .controller('readinessCheckController', ['$rootScope', '$scope', '$localStorage', '$http', '$timeout', '$sce', '$state', 'COUNTER', function ($rootScope, $scope, $localStorage, $http, $timeout, $sce, $state, COUNTER) {
+    .controller('readinessCheckController', ['$rootScope', '$scope', '$localStorage', '$http', '$timeout', '$sce', '$state', 'COUNTER', 'ngDialog', function ($rootScope, $scope, $localStorage, $http, $timeout, $sce, $state, COUNTER, ngDialog) {
         $scope.Object = Object;
         $scope.titles = $localStorage.titles;
         $scope.moduleName = $localStorage.moduleName;
         $scope.progressCounter = COUNTER;
+        $rootScope.needReCheck = false;
         $scope.startProgress = function() {
             ++$scope.progressCounter;
         };
@@ -352,7 +353,7 @@ angular.module('readiness-check', [])
         $scope.wordingOfReadinessCheckAction = function() {
             var $actionString = 'We\'re making sure your server environment is ready for ';
             if ($localStorage.moduleName) {
-                $actionString += $localStorage.moduleName;
+                $actionString += $localStorage.packageTitle ? $localStorage.packageTitle : $localStorage.moduleName;
             } else {
                 if($state.current.type === 'install' || $state.current.type === 'upgrade') {
                     $actionString += 'Magento';
@@ -361,6 +362,9 @@ angular.module('readiness-check', [])
                     }
                 } else {
                     $actionString += 'package';
+                    if ($scope.getObjectSize($localStorage.packages) > 1) {
+                        $actionString += 's';
+                    }
                 }
             }
             $actionString += " to be " + $state.current.type;
@@ -369,6 +373,58 @@ angular.module('readiness-check', [])
             } else {
                 $actionString +='ed';
             }
+
+            if ($localStorage.moduleName
+                && $localStorage.packageTitle
+                && $localStorage.moduleName != $localStorage.packageTitle
+            ) {
+                $actionString += ', which consists of the following packages:<br/>- ' + $localStorage.moduleName;
+            }
+
             return $actionString;
-        }
+        };
+
+        $scope.getExtensionsList = function () {
+            return $scope.componentDependency.packages ? $scope.componentDependency.packages : {};
+        };
+
+        $scope.openDialog = function (name) {
+            $scope.extensionToRemove = name;
+            ngDialog.open({scope: $scope, template: 'removeDialog', controller: 'removeDialogController'});
+        };
+
+        $scope.getCurrentVersion = function (name) {
+            if ($scope.getExtensionInfo(name).hasOwnProperty('currentVersion')) {
+                return $scope.getExtensionInfo(name)['currentVersion'];
+            }
+            
+            return '';
+        };
+
+        $scope.getVersionsList = function (name) {
+            if ($scope.getExtensionInfo(name).hasOwnProperty('versions')) {
+                return $scope.getExtensionInfo(name)['versions'];
+            }
+
+            return {};
+        };
+
+        $scope.getExtensionInfo = function (name) {
+            var extensionsVersions = $localStorage.extensionsVersions;
+            return extensionsVersions.hasOwnProperty(name) ? extensionsVersions[name] : {};
+        };
+
+        $scope.versionChanged = function () {
+            $rootScope.needReCheck = true;
+        };
+
+        $scope.getObjectSize = function (obj) {
+            var size = 0, key;
+            for (key in obj) {
+                if (obj.hasOwnProperty(key)) {
+                    ++size;
+                }
+            }
+            return size;
+        };
     }]);
diff --git a/setup/pub/magento/setup/remove-dialog.js b/setup/pub/magento/setup/remove-dialog.js
new file mode 100644
index 0000000000000000000000000000000000000000..96a63ec5193b2e04b5a384e406c938e3fedfc58e
--- /dev/null
+++ b/setup/pub/magento/setup/remove-dialog.js
@@ -0,0 +1,16 @@
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+'use strict';
+angular.module('remove-dialog', [])
+    .controller('removeDialogController', ['$rootScope', '$scope', '$localStorage',
+        function ($rootScope, $scope, $localStorage) {
+            $scope.removeExtension = function (name) {
+                delete $scope.componentDependency.packages[name];
+                $localStorage.packages = $scope.componentDependency.packages;
+                $rootScope.needReCheck = true;
+                $scope.closeThisDialog();
+            };
+        }]);
diff --git a/setup/pub/magento/setup/start-updater.js b/setup/pub/magento/setup/start-updater.js
index ee9bc1e1c0df7c61cfc68ed9f4da85eedad32f1c..5b90c5333cdd15c16eb7aec382f8ebfb5fed9c82 100644
--- a/setup/pub/magento/setup/start-updater.js
+++ b/setup/pub/magento/setup/start-updater.js
@@ -31,7 +31,7 @@ angular.module('start-updater', ['ngStorage'])
             var payLoad = {
                 'packages': $scope.packages,
                 'type': $state.current.type,
-                'headerTitle': $scope.title,
+                'headerTitle': $scope.packages.size == 1 ? $scope.title : 'Process extensions',
                 'dataOption': $localStorage.dataOption
             };
             $http.post('index.php/start-updater/update', payLoad)
diff --git a/setup/pub/magento/setup/update-extension-grid.js b/setup/pub/magento/setup/update-extension-grid.js
index f28e0aa385af478c5770b740410fef1dd5bd4f62..8f7149bf1645ee0e98f81783131468bb6af097a0 100644
--- a/setup/pub/magento/setup/update-extension-grid.js
+++ b/setup/pub/magento/setup/update-extension-grid.js
@@ -5,15 +5,23 @@
 
 'use strict';
 angular.module('update-extension-grid', ['ngStorage', 'clickOut'])
-    .controller('updateExtensionGridController', ['$scope', '$http', '$localStorage', 'titleService', 'paginationService',
-        function ($scope, $http, $localStorage, titleService, paginationService) {
+    .controller('updateExtensionGridController', ['$scope', '$http', '$localStorage', 'titleService', 'authService', 'paginationService', 'multipleChoiceService',
+        function ($scope, $http, $localStorage, titleService, authService, paginationService, multipleChoiceService) {
             $scope.isHiddenSpinner = false;
 
             $http.get('index.php/updateExtensionGrid/extensions').success(function(data) {
                 $scope.error = false;
                 $scope.errorMessage = '';
+                $scope.extensionsVersions = {};
+                $scope.multipleChoiceService = multipleChoiceService;
+                $scope.multipleChoiceService.reset();
                 angular.forEach(data.extensions, function(extension) {
                     extension.updateVersion = extension.latestVersion;
+                    $scope.multipleChoiceService.addExtension(extension.name, extension.latestVersion);
+                    $scope.extensionsVersions[extension.name] = {
+                        'currentVersion': extension.version,
+                        'versions': extension.versions
+                    };
                 });
                 $scope.extensions = data.extensions;
                 $scope.total = data.total;
@@ -21,6 +29,7 @@ angular.module('update-extension-grid', ['ngStorage', 'clickOut'])
                 $scope.rowLimit = 20;
                 $scope.numberOfPages = Math.ceil($scope.total / $scope.rowLimit);
                 $scope.isHiddenSpinner = true;
+                $localStorage.extensionsVersions = $scope.extensionsVersions;
             });
 
             paginationService.initWatchers($scope);
@@ -39,8 +48,33 @@ angular.module('update-extension-grid', ['ngStorage', 'clickOut'])
                         version: extension.updateVersion
                     }
                 ];
-                titleService.setTitle('update', extension.name);
+                titleService.setTitle('update', extension);
                 $scope.nextState();
             };
+            $scope.isHiddenSpinner = true;
+            $scope.updateAll = function() {
+                $scope.isHiddenSpinner = false;
+                authService.checkAuth({
+                    success: function(response) {
+                        $scope.isHiddenSpinner = true;
+                        var result = $scope.multipleChoiceService.checkSelectedExtensions();
+                        $scope.error = result.error;
+                        $scope.errorMessage = result.errorMessage;
+
+                        if (!$scope.error) {
+                            $scope.nextState();
+                        }
+                    },
+                    fail: function(response) {
+                        $scope.isHiddenSpinner = true;
+                        authService.openAuthDialog($scope);
+                    },
+                    error: function() {
+                        $scope.isHiddenSpinner = true;
+                        $scope.error = true;
+                        $scope.errorMessage = 'Internal server error';
+                    }
+                });
+            };
         }
     ]);
diff --git a/setup/pub/styles/setup.css b/setup/pub/styles/setup.css
index 4ee5d4979d214c22cdcc95d707542ffd4afe892f..61893c04c3f160f7290ba3dcb8bef288fd25d5fe 100644
--- a/setup/pub/styles/setup.css
+++ b/setup/pub/styles/setup.css
@@ -3,4 +3,4 @@
  * See COPYING.txt for license details.
  */
 
-.abs-action-delete,.abs-icon,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.validation-symbol:after{color:#e22626;content:'*';font-weight:400;margin-left:3px}.abs-modal-overlay,.modals-overlay{background:rgba(0,0,0,.35);bottom:0;left:0;position:fixed;right:0;top:0}.abs-action-delete>span,.abs-visually-hidden,.action-multicheck-wrap .action-multicheck-toggle>span,.admin__actions-switch-checkbox,.admin__control-fields .admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label)>.admin__field-label,.admin__field-tooltip .admin__field-tooltip-action span,.customize-your-store .customize-your-store-default .legend,.form-el-checkbox,.form-el-radio,.selectmenu .action-delete>span,.selectmenu .action-edit>span,.selectmenu .action-save>span,.selectmenu-toggle span,.tooltip .help a span,.tooltip .help span span,[class*=admin__control-grouped]>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.abs-visually-hidden-reset,.admin__field-group-columns>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label[class]{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.abs-clearfix:after,.abs-clearfix:before,.action-multicheck-wrap:after,.action-multicheck-wrap:before,.actions-split:after,.actions-split:before,.admin__control-table-pagination:after,.admin__control-table-pagination:before,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:before,.admin__data-grid-filters-footer:after,.admin__data-grid-filters-footer:before,.admin__data-grid-filters:after,.admin__data-grid-filters:before,.admin__data-grid-header-row:after,.admin__data-grid-header-row:before,.admin__field-complex:after,.admin__field-complex:before,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .magento-message .insert-title-inner:before,.modal-slide .main-col .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:before,.page-actions._fixed:after,.page-actions._fixed:before,.page-content:after,.page-content:before,.page-header-actions:after,.page-header-actions:before,.page-main-actions:not(._hidden):after,.page-main-actions:not(._hidden):before{content:'';display:table}.abs-clearfix:after,.action-multicheck-wrap:after,.actions-split:after,.admin__control-table-pagination:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-filters-footer:after,.admin__data-grid-filters:after,.admin__data-grid-header-row:after,.admin__field-complex:after,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:after,.page-actions._fixed:after,.page-content:after,.page-header-actions:after,.page-main-actions:not(._hidden):after{clear:both}.abs-list-reset-styles{margin:0;padding:0;list-style:none}.abs-draggable-handle,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle,.admin__control-table .draggable-handle,.data-grid .data-grid-draggable-row-cell .draggable-handle{cursor:-webkit-grab;cursor:move;font-size:0;margin-top:-4px;padding:0 1rem 0 0;vertical-align:middle;display:inline-block;text-decoration:none}.abs-draggable-handle:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:before,.admin__control-table .draggable-handle:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:before{-webkit-font-smoothing:antialiased;font-size:1.8rem;line-height:inherit;color:#9e9e9e;content:'\e617';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.abs-draggable-handle:hover:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:hover:before,.admin__control-table .draggable-handle:hover:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:hover:before{color:#858585}.abs-config-scope-label,.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]:before{bottom:-1.3rem;color:gray;content:attr(data-config-scope);font-size:1.1rem;font-weight:400;min-width:15rem;position:absolute;right:0;text-transform:lowercase}.abs-word-wrap,.admin__field:not(.admin__field-option)>.admin__field-label{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box}*,:after,:before{box-sizing:inherit}:focus{box-shadow:none;outline:0}._keyfocus :focus{box-shadow:0 0 0 1px #008bdb}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}embed,img,object,video{max-width:100%}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/light/opensans-300.eot);src:url(../fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../fonts/opensans/light/opensans-300.woff) format('woff'),url(../fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/regular/opensans-400.eot);src:url(../fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../fonts/opensans/regular/opensans-400.woff) format('woff'),url(../fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/semibold/opensans-600.eot);src:url(../fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/bold/opensans-700.eot);src:url(../fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../fonts/opensans/bold/opensans-700.woff) format('woff'),url(../fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#333;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.36;font-size:1.4rem}h1{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2.8rem}h2{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2rem}h3{margin:0 0 2rem;color:#41362f;font-weight:600;line-height:1.2;font-size:1.7rem}h4,h5,h6{font-weight:600;margin-top:0}p{margin:0 0 1em}small{font-size:1.2rem}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}dl,ol,ul{padding-left:0}nav ol,nav ul{list-style:none;margin:0;padding:0}html{height:100%}body{background-color:#fff;min-height:100%;min-width:102.4rem}.page-wrapper{background-color:#fff;display:inline-block;margin-left:-4px;vertical-align:top;width:calc(100% - 8.8rem)}.page-content{padding-bottom:3rem;padding-left:3rem;padding-right:3rem}.notices-wrapper{margin:0 3rem}.notices-wrapper .messages{margin-bottom:0}.row{margin-left:0;margin-right:0}.row:after{clear:both;content:'';display:table}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{min-height:1px;padding-left:0;padding-right:0;position:relative}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.row-gutter{margin-left:-1.5rem;margin-right:-1.5rem}.row-gutter>[class*=col-]{padding-left:1.5rem;padding-right:1.5rem}.abs-clearer:after,.extension-manager-content:after,.extension-manager-title:after,.form-row:after,.header:after,.nav:after,body:after{clear:both;content:'';display:table}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:Icons;src:url(../fonts/icons/icons.eot);src:url(../fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../fonts/icons/icons.woff2) format('woff2'),url(../fonts/icons/icons.woff) format('woff'),url(../fonts/icons/icons.ttf) format('truetype'),url(../fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}.icon-failed:before,.icon-success:before,[class*=icon-]:after{font-family:Icons}.icon-success{color:#79a22e}.icon-success:before{content:'\e62d'}.icon-failed{color:#e22626}.icon-failed:before{content:'\e632'}.icon-success-thick:after{content:'\e62d'}.icon-collapse:after{content:'\e615'}.icon-failed-thick:after{content:'\e632'}.icon-expand:after{content:'\e616'}.icon-warning:after{content:'\e623'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.5em;left:0;position:absolute;right:0;top:.45em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e62d'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e632'}dl,ol,ul{margin-top:0}.list{padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success,.list-item-warning{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{left:-.1em;position:absolute}.list-item-success:before{color:#79a22e}.list-item-failed:before{color:#e22626}.list-item-warning:before{color:#ef672f}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .9em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-medium{font-size:1.4rem;padding:.5em 1.5em .6em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:active,.btn-link:focus,.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:focus,.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1);color:#fff}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;-webkit-filter:none;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active,.btn-secondary:focus{background-color:#574e48;color:#fff}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary[disabled]:active{background-color:#514943;-webkit-filter:none;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:focus:after,.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:focus:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:focus:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:focus:after,.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:focus:after,.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:focus:after,.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}.form-row.form-row-text{padding-top:.6rem}.form-row.form-row-text .action-sign-out{font-size:1.2rem;margin-left:1rem}.form-note{font-size:1.2rem;font-weight:600;margin-top:1rem}.form-el-dummy{display:none}.fieldset{border:0;margin:0;min-width:0;padding:0}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-el-input:required{box-shadow:none}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;padding:.43em .55em .5em 0;vertical-align:top}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{font-size:1.25em;font-weight:600;margin-bottom:2.5em;padding-top:1.5em}.form-legend{border-top:1px solid #ccc;width:100%}.form-legend-light{font-size:1em;margin-bottom:1.5em}.form-legend-expand{cursor:pointer;transition:opacity .2s linear}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e615'}.form-legend-expand:after{content:'\e616';font-family:Icons;font-size:1.15em;font-weight:400;margin-left:.5em;vertical-align:sub}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{background-color:#fff;border-color:#adadad;border-radius:2px;font-size:1.2rem;height:1.6rem;line-height:1.2;width:1.6rem}.form-el-checkbox:checked+.form-label::before{content:'\e62d';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.8rem;width:1.8rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative;z-index:0}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-select-label .form-el-select::-ms-expand{display:none}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{border:1px solid #adadad;height:45.2rem;margin:0 0 1.5rem;overflow:auto;position:relative}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fffbbb;border:1px solid #ee7d7d;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.8rem 1rem .9rem}.check-result-message{margin-left:.5em;min-height:3.68rem;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}body:not([class]){min-width:0}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0}.abs-action-delete,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.text-stretch{margin-bottom:1.5em}.page-title-jumbo{font-size:4rem;font-weight:300;letter-spacing:-.05em;margin-bottom:2.9rem}.page-title-jumbo-success:before{color:#79a22e;content:'\e62d';font-size:3.9rem;margin-left:-.3rem;margin-right:2.4rem}.list{margin-bottom:3rem}.list-dot .list-item{display:list-item;list-style-position:inside;margin-bottom:1.2rem}.list-title{color:#333;font-size:1.4rem;font-weight:700;letter-spacing:.025em;margin-bottom:1.2rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{font-family:Icons;font-size:1.6rem;top:0}.list-item-success:before{content:'\e62d';font-size:1.6rem}.list-item-failed:before{content:'\e632';font-size:1.4rem;left:.1rem;top:.2rem}.list-item-warning:before{content:'\e623';font-size:1.3rem;left:.2rem}.form-wrap{margin-bottom:3.6rem;padding-top:2.1rem}.form-el-label-horizontal{display:inline-block;font-size:1.3rem;font-weight:600;letter-spacing:.025em;margin-bottom:.4rem;margin-left:.4rem}.app-updater{min-width:768px}body._has-modal{height:100%;overflow:hidden;width:100%}.modals-overlay{z-index:899}.modal-popup,.modal-slide{bottom:0;min-width:0;position:fixed;right:0;top:0;visibility:hidden}.modal-popup._show,.modal-slide._show{visibility:visible}.modal-popup._show .modal-inner-wrap,.modal-slide._show .modal-inner-wrap{-ms-transform:translate(0,0);transform:translate(0,0)}.modal-popup .modal-inner-wrap,.modal-slide .modal-inner-wrap{background-color:#fff;box-shadow:0 0 12px 2px rgba(0,0,0,.35);opacity:1;pointer-events:auto}.modal-slide{left:14.8rem;z-index:900}.modal-slide._show .modal-inner-wrap{-ms-transform:translateX(0);transform:translateX(0)}.modal-slide .modal-inner-wrap{height:100%;overflow-y:auto;position:static;-ms-transform:translateX(100%);transform:translateX(100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;width:auto}.modal-slide._inner-scroll .modal-inner-wrap{overflow-y:visible;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.modal-slide._inner-scroll .modal-footer,.modal-slide._inner-scroll .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-slide._inner-scroll .modal-content{overflow-y:auto}.modal-slide._inner-scroll .modal-footer{margin-top:auto}.modal-slide .modal-content,.modal-slide .modal-footer,.modal-slide .modal-header{padding:0 2.6rem 2.6rem}.modal-slide .modal-header{padding-bottom:2.1rem;padding-top:2.1rem}.modal-popup{z-index:900;left:0;overflow-y:auto}.modal-popup._show .modal-inner-wrap{-ms-transform:translateY(0);transform:translateY(0)}.modal-popup .modal-inner-wrap{margin:5rem auto;width:75%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;box-sizing:border-box;height:auto;left:0;position:absolute;right:0;-ms-transform:translateY(-200%);transform:translateY(-200%);transition-duration:.2s;transition-property:transform,visibility;transition-timing-function:ease}.modal-popup._inner-scroll{overflow-y:visible}.ie10 .modal-popup._inner-scroll,.ie9 .modal-popup._inner-scroll{overflow-y:auto}.modal-popup._inner-scroll .modal-inner-wrap{max-height:90%}.ie10 .modal-popup._inner-scroll .modal-inner-wrap,.ie9 .modal-popup._inner-scroll .modal-inner-wrap{max-height:none}.modal-popup._inner-scroll .modal-content{overflow-y:auto}.modal-popup .modal-content,.modal-popup .modal-footer,.modal-popup .modal-header{padding-left:3rem;padding-right:3rem}.modal-popup .modal-footer,.modal-popup .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-popup .modal-header{padding-bottom:1.2rem;padding-top:3rem}.modal-popup .modal-footer{margin-top:auto;padding-bottom:3rem}.modal-popup .modal-footer-actions{text-align:right}.admin__action-dropdown-wrap{display:inline-block;position:relative}.admin__action-dropdown-wrap .admin__action-dropdown-text:after{left:-6px;right:0}.admin__action-dropdown-wrap .admin__action-dropdown-menu{left:auto;right:0}.admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__action-dropdown-wrap.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin__action-dropdown-wrap._active .admin__action-dropdown-text:after,.admin__action-dropdown-wrap.active .admin__action-dropdown-text:after{background-color:#fff;content:'';height:6px;position:absolute;top:100%}.admin__action-dropdown-wrap._active .admin__action-dropdown-menu,.admin__action-dropdown-wrap.active .admin__action-dropdown-menu{display:block}.admin__action-dropdown-wrap._disabled .admin__action-dropdown{cursor:default}.admin__action-dropdown-wrap._disabled:hover .admin__action-dropdown{color:#333}.admin__action-dropdown{background-color:#fff;border:1px solid transparent;border-bottom:none;border-radius:0;box-shadow:none;color:#333;display:inline-block;font-size:1.3rem;font-weight:400;letter-spacing:-.025em;padding:.7rem 3.3rem .8rem 1.5rem;position:relative;vertical-align:baseline;z-index:2}.admin__action-dropdown._active:after,.admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .admin__action-dropdown:after,.active .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin__action-dropdown:focus,.admin__action-dropdown:hover{background-color:#fff;color:#000;text-decoration:none}.admin__action-dropdown:after{right:1.5rem}.admin__action-dropdown:before{margin-right:1rem}.admin__action-dropdown-menu{background-color:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;line-height:1.36;margin-top:-1px;min-width:120%;padding:.5rem 1rem;position:absolute;top:100%;transition:all .15s ease;z-index:1}.admin__action-dropdown-menu>li{display:block}.admin__action-dropdown-menu>li>a{color:#333;display:block;text-decoration:none;padding:.6rem .5rem}.selectmenu{display:inline-block;position:relative;text-align:left;z-index:1}.selectmenu._active{border-color:#007bdb;z-index:500}.selectmenu .action-delete,.selectmenu .action-edit,.selectmenu .action-save{background-color:transparent;border-color:transparent;box-shadow:none;padding:0 1rem}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover,.selectmenu .action-save:hover{background-color:transparent;border-color:transparent;box-shadow:none}.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before{content:'\e630'}.selectmenu .action-delete,.selectmenu .action-edit{border:0 solid #fff;border-left-width:1px;bottom:0;position:absolute;right:0;top:0;z-index:1}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover{border:0 solid #fff;border-left-width:1px}.selectmenu .action-save:before{content:'\e625'}.selectmenu .action-edit:before{content:'\e631'}.selectmenu-value{display:inline-block}.selectmenu-value input[type=text]{-moz-appearance:none;-webkit-appearance:none;appearance:none;border:0;display:inline;margin:0;width:6rem}body._keyfocus .selectmenu-value input[type=text]:focus{box-shadow:none}.selectmenu-toggle{padding-right:3rem;background:0 0;border-width:0;bottom:0;float:right;position:absolute;right:0;top:0;width:0}.selectmenu-toggle._active:after,.selectmenu-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.1rem;top:50%;transition:all .2s linear;width:0}._active .selectmenu-toggle:after,.active .selectmenu-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:hover:after{border-color:#000 transparent transparent}.selectmenu-toggle:active,.selectmenu-toggle:focus,.selectmenu-toggle:hover{background:0 0}.selectmenu._active .selectmenu-toggle:before{border-color:#007bdb}body._keyfocus .selectmenu-toggle:focus{box-shadow:none}.selectmenu-toggle:before{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';display:block;position:absolute;right:0;top:0;width:3.2rem}.selectmenu-items{background:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;float:left;left:-1px;margin-top:3px;max-width:20rem;min-width:calc(100% + 2px);position:absolute;top:100%}.selectmenu-items._active{display:block}.selectmenu-items ul{float:left;list-style-type:none;margin:0;min-width:100%;padding:0}.selectmenu-items li{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row;transition:background .2s linear}.selectmenu-items li:hover{background:#e3e3e3}.selectmenu-items li:last-child .selectmenu-item-action,.selectmenu-items li:last-child .selectmenu-item-action:visited{color:#008bdb;text-decoration:none}.selectmenu-items li:last-child .selectmenu-item-action:hover{color:#0fa7ff;text-decoration:underline}.selectmenu-items li:last-child .selectmenu-item-action:active{color:#ff5501;text-decoration:underline}.selectmenu-item{position:relative;width:100%;z-index:1}li._edit>.selectmenu-item{display:none}.selectmenu-item-edit{display:none;padding:.3rem 4rem .3rem .4rem;position:relative;white-space:nowrap;z-index:1}li:last-child .selectmenu-item-edit{padding-right:.4rem}.selectmenu-item-edit .admin__control-text{margin:0;width:5.4rem}li._edit .selectmenu-item-edit{display:block}.selectmenu-item-action{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:0;color:#333;display:block;font-size:1.4rem;font-weight:400;min-width:100%;padding:1rem 6rem 1rem 1.5rem;text-align:left;transition:background .2s linear;width:5rem}.selectmenu-item-action:focus,.selectmenu-item-action:hover{background:#e3e3e3}.abs-actions-split-xl .action-default,.page-actions .actions-split .action-default{margin-right:4rem}.abs-actions-split-xl .action-toggle,.page-actions .actions-split .action-toggle{padding-right:4rem}.abs-actions-split-xl .action-toggle:after,.page-actions .actions-split .action-toggle:after{border-width:.9rem .6rem 0;margin-top:-.3rem;right:1.4rem}.actions-split{position:relative;z-index:400}.actions-split._active,.actions-split.active,.actions-split:hover{box-shadow:0 0 0 1px #007bdb}.actions-split._active .action-toggle.action-primary,.actions-split._active .action-toggle.primary,.actions-split.active .action-toggle.action-primary,.actions-split.active .action-toggle.primary{background-color:#ba4000;border-color:#ba4000}.actions-split._active .dropdown-menu,.actions-split.active .dropdown-menu{opacity:1;visibility:visible;display:block}.actions-split .action-default,.actions-split .action-toggle{float:left;margin:0}.actions-split .action-default._active,.actions-split .action-default.active,.actions-split .action-default:hover,.actions-split .action-toggle._active,.actions-split .action-toggle.active,.actions-split .action-toggle:hover{box-shadow:none}.actions-split .action-default{margin-right:3.2rem;min-width:9.3rem}.actions-split .action-toggle{padding-right:3.2rem;border-left-color:rgba(0,0,0,.2);bottom:0;padding-left:0;position:absolute;right:0;top:0}.actions-split .action-toggle._active:after,.actions-split .action-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .actions-split .action-toggle:after,.active .actions-split .action-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:hover:after{border-color:#000 transparent transparent}.actions-split .action-toggle.action-primary:after,.actions-split .action-toggle.action-secondary:after,.actions-split .action-toggle.primary:after,.actions-split .action-toggle.secondary:after{border-color:#fff transparent transparent}.actions-split .action-toggle>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-select-wrap{display:inline-block;position:relative}.action-select-wrap .action-select{padding-right:3.2rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#fff;font-weight:400;text-align:left}.action-select-wrap .action-select._active:after,.action-select-wrap .action-select.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .action-select-wrap .action-select:after,.active .action-select-wrap .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:hover:after{border-color:#000 transparent transparent}.action-select-wrap .action-select:hover,.action-select-wrap .action-select:hover:before{border-color:#878787}.action-select-wrap .action-select:before{background-color:#e3e3e3;border:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:3.2rem}.action-select-wrap .action-select._active{border-color:#007bdb}.action-select-wrap .action-select._active:before{border-color:#007bdb #007bdb #007bdb #adadad}.action-select-wrap .action-select[disabled]{color:#333}.action-select-wrap .action-select[disabled]:after{border-color:#333 transparent transparent}.action-select-wrap._active{z-index:500}.action-select-wrap._active .action-select,.action-select-wrap._active .action-select:before{border-color:#007bdb}.action-select-wrap._active .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .abs-action-menu .action-submenu,.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu,.action-select-wrap .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:45rem;overflow-y:auto}.action-select-wrap .abs-action-menu .action-submenu ._disabled:hover,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .action-menu ._disabled:hover,.action-select-wrap .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled:hover{background:#fff}.action-select-wrap .abs-action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .action-menu ._disabled .action-menu-item,.action-select-wrap .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled .action-menu-item{cursor:default;opacity:.5}.action-select-wrap .action-menu-items{left:0;position:absolute;right:0;top:100%}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu{min-width:100%;position:static}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{position:absolute}.action-multicheck-wrap{display:inline-block;height:1.6rem;padding-top:1px;position:relative;width:3.1rem;z-index:200}.action-multicheck-wrap:hover .action-multicheck-toggle,.action-multicheck-wrap:hover .admin__control-checkbox+label:before{border-color:#878787}.action-multicheck-wrap._active .action-multicheck-toggle,.action-multicheck-wrap._active .admin__control-checkbox+label:before{border-color:#007bdb}.action-multicheck-wrap._active .abs-action-menu .action-submenu,.action-multicheck-wrap._active .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .action-menu,.action-multicheck-wrap._active .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu .action-submenu{opacity:1;visibility:visible;display:block}.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{background-color:#fff}.action-multicheck-wrap._disabled .action-multicheck-toggle,.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{border-color:#adadad;opacity:1}.action-multicheck-wrap .action-multicheck-toggle,.action-multicheck-wrap .admin__control-checkbox,.action-multicheck-wrap .admin__control-checkbox+label{float:left}.action-multicheck-wrap .action-multicheck-toggle{border-radius:0 1px 1px 0;height:1.6rem;margin-left:-1px;padding:0;position:relative;transition:border-color .1s linear;width:1.6rem}.action-multicheck-wrap .action-multicheck-toggle._active:after,.action-multicheck-wrap .action-multicheck-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .action-multicheck-wrap .action-multicheck-toggle:after,.active .action-multicheck-wrap .action-multicheck-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:hover:after{border-color:#000 transparent transparent}.action-multicheck-wrap .action-multicheck-toggle:focus{border-color:#007bdb}.action-multicheck-wrap .action-multicheck-toggle:after{right:.3rem}.action-multicheck-wrap .abs-action-menu .action-submenu,.action-multicheck-wrap .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap .action-menu,.action-multicheck-wrap .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:-1.1rem;margin-top:1px;right:auto;text-align:left}.action-multicheck-wrap .action-menu-item{white-space:nowrap}.admin__action-multiselect-wrap{display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.admin__action-multiselect-wrap.action-select-wrap:focus{box-shadow:none}.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .action-menu,.admin__action-multiselect-wrap.action-select-wrap .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:none;overflow-y:inherit}.admin__action-multiselect-wrap .action-menu-item{transition:background-color .1s linear}.admin__action-multiselect-wrap .action-menu-item._selected{background-color:#e0f6fe}.admin__action-multiselect-wrap .action-menu-item._hover{background-color:#e3e3e3}.admin__action-multiselect-wrap .action-menu-item._unclickable{cursor:default}.admin__action-multiselect-wrap .admin__action-multiselect{border:1px solid #adadad;cursor:pointer;display:block;min-height:3.2rem;padding-right:3.6rem;white-space:normal}.admin__action-multiselect-wrap .admin__action-multiselect:after{bottom:1.25rem;top:auto}.admin__action-multiselect-wrap .admin__action-multiselect:before{height:3.3rem;top:auto}.admin__control-table-wrapper .admin__action-multiselect-wrap{position:static}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect{position:relative}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect:before{right:-1px;top:-1px}.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:34rem;right:auto;top:auto;z-index:1}.admin__action-multiselect-wrap .admin__action-multiselect-item-path{color:#a79d95;font-size:1.2rem;font-weight:400;padding-left:1rem}.admin__action-multiselect-actions-wrap{border-top:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;text-align:center}.admin__action-multiselect-actions-wrap .action-default{font-size:1.3rem;min-width:13rem}.admin__action-multiselect-text{padding:.6rem 1rem}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{text-align:left}.admin__action-multiselect-label{cursor:pointer;position:relative;z-index:1}.admin__action-multiselect-label:before{margin-right:.5rem}._unclickable .admin__action-multiselect-label{cursor:default;font-weight:700}.admin__action-multiselect-search-wrap{border-bottom:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;position:relative}.admin__action-multiselect-search{padding-right:3rem;width:100%}.admin__action-multiselect-search-label{display:block;font-size:1.5rem;height:1em;overflow:hidden;position:absolute;right:2.2rem;top:1.7rem;width:1em}.admin__action-multiselect-search-label:before{content:'\e60c'}.admin__action-multiselect-search-count{color:#a79d95;margin-top:1rem}.admin__action-multiselect-menu-inner{margin-bottom:0;max-height:46rem;overflow-y:auto}.admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{list-style:none;max-height:none;overflow:hidden;padding-left:2.2rem}.admin__action-multiselect-menu-inner ._hidden{display:none}.admin__action-multiselect-crumb{background-color:#f5f5f5;border:1px solid #a79d95;border-radius:1px;display:inline-block;font-size:1.2rem;margin:.3rem -4px .3rem .3rem;padding:.3rem 2.4rem .4rem 1rem;position:relative;transition:border-color .1s linear}.admin__action-multiselect-crumb:hover{border-color:#908379}.admin__action-multiselect-crumb .action-close{bottom:0;font-size:.5em;position:absolute;right:0;top:0;width:2rem}.admin__action-multiselect-crumb .action-close:hover{color:#000}.admin__action-multiselect-crumb .action-close:active,.admin__action-multiselect-crumb .action-close:focus{background-color:transparent}.admin__action-multiselect-crumb .action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__action-multiselect-tree .abs-action-menu .action-submenu,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .action-menu,.admin__action-multiselect-tree .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu{min-width:34.7rem}.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item{margin-top:.1rem}.admin__action-multiselect-tree .action-menu-item{margin-left:4.2rem;position:relative}.admin__action-multiselect-tree .action-menu-item._expended:before{border-left:1px dashed #a79d95;bottom:0;content:'';left:-1rem;position:absolute;top:1rem;width:1px}.admin__action-multiselect-tree .action-menu-item._expended .admin__action-multiselect-dropdown:before{content:'\e615'}.admin__action-multiselect-tree .action-menu-item._with-checkbox .admin__action-multiselect-label{padding-left:2.6rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{padding-left:3.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner:before{left:4.3rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:last-child:before{height:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after,.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{content:'';left:0;position:absolute}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after{border-top:1px dashed #a79d95;height:1px;top:2.1rem;width:5.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{border-left:1px dashed #a79d95;height:100%;top:0;width:1px}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._parent:after{width:4.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root{margin-left:-1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:after{left:3.2rem;width:2.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:before{left:3.2rem;top:1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root._parent:after{display:none}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:first-child:before{top:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:last-child:before{height:1rem}.admin__action-multiselect-tree .admin__action-multiselect-label{line-height:2.2rem;vertical-align:middle;word-break:break-all}.admin__action-multiselect-tree .admin__action-multiselect-label:before{left:0;position:absolute;top:.4rem}.admin__action-multiselect-dropdown{border-radius:50%;height:2.2rem;left:-2.2rem;position:absolute;top:1rem;width:2.2rem;z-index:1}.admin__action-multiselect-dropdown:before{background:#fff;color:#a79d95;content:'\e616';font-size:2.2rem}.admin__actions-switch{display:inline-block;position:relative;vertical-align:middle}.admin__field-control .admin__actions-switch{line-height:3.2rem}.admin__actions-switch+.admin__field-service{min-width:34rem}._disabled .admin__actions-switch-checkbox+.admin__actions-switch-label,.admin__actions-switch-checkbox.disabled+.admin__actions-switch-label{cursor:not-allowed;opacity:.5;pointer-events:none}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:before{left:15px}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:after{background:#79a22e}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label .admin__actions-switch-text:before{content:attr(data-text-on)}.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:after,.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:before{border-color:#007bdb}._error .admin__actions-switch-checkbox+.admin__actions-switch-label:after,._error .admin__actions-switch-checkbox+.admin__actions-switch-label:before{border-color:#e22626}.admin__actions-switch-label{cursor:pointer;display:inline-block;height:22px;line-height:22px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.admin__actions-switch-label:after,.admin__actions-switch-label:before{left:0;position:absolute;right:auto;top:0}.admin__actions-switch-label:before{background:#fff;border:1px solid #aaa6a0;border-radius:100%;content:'';display:block;height:22px;transition:left .2s ease-in 0s;width:22px;z-index:1}.admin__actions-switch-label:after{background:#e3e3e3;border:1px solid #aaa6a0;border-radius:12px;content:'';display:block;height:22px;transition:background .2s ease-in 0s;vertical-align:middle;width:37px;z-index:0}.admin__actions-switch-text:before{content:attr(data-text-off);padding-left:47px;white-space:nowrap}.abs-action-delete,.abs-action-reset,.action-close,.admin__field-fallback-reset,.notifications-close,.search-global-field._active .search-global-action{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0}.abs-action-delete:hover,.abs-action-reset:hover,.action-close:hover,.admin__field-fallback-reset:hover,.notifications-close:hover,.search-global-field._active .search-global-action:hover{background-color:transparent;border:none;box-shadow:none}.abs-action-default,.abs-action-pattern,.abs-action-primary,.abs-action-quaternary,.abs-action-secondary,.abs-action-tertiary,.action-default,.action-primary,.action-quaternary,.action-secondary,.action-tertiary,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions>button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary,button,button.primary,button.secondary,button.tertiary{border:1px solid;border-radius:0;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:1.36;padding:.6rem 1em;text-align:center;vertical-align:baseline}.abs-action-default.disabled,.abs-action-default[disabled],.abs-action-pattern.disabled,.abs-action-pattern[disabled],.abs-action-primary.disabled,.abs-action-primary[disabled],.abs-action-quaternary.disabled,.abs-action-quaternary[disabled],.abs-action-secondary.disabled,.abs-action-secondary[disabled],.abs-action-tertiary.disabled,.abs-action-tertiary[disabled],.action-default.disabled,.action-default[disabled],.action-primary.disabled,.action-primary[disabled],.action-quaternary.disabled,.action-quaternary[disabled],.action-secondary.disabled,.action-secondary[disabled],.action-tertiary.disabled,.action-tertiary[disabled],.modal-popup .modal-footer .action-primary.disabled,.modal-popup .modal-footer .action-primary[disabled],.modal-popup .modal-footer .action-secondary.disabled,.modal-popup .modal-footer .action-secondary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.action-secondary.disabled,.page-actions .page-actions-buttons>button.action-secondary[disabled],.page-actions .page-actions-buttons>button.disabled,.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions .page-actions-buttons>button[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.action-secondary.disabled,.page-actions>button.action-secondary[disabled],.page-actions>button.disabled,.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],.page-actions>button[disabled],button.disabled,button.primary.disabled,button.primary[disabled],button.secondary.disabled,button.secondary[disabled],button.tertiary.disabled,button.tertiary[disabled],button[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-l,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary{font-size:1.6rem;letter-spacing:.025em;padding-bottom:.6875em;padding-top:.6875em}.abs-action-delete{display:inline-block;font-size:1.6rem;margin-left:1.2rem;padding-top:.7rem;text-decoration:none;vertical-align:middle}.abs-action-delete:after{color:#666;content:'\e630'}.abs-action-delete:hover:after{color:#35302c}.abs-action-button-as-link,.action-advanced,.data-grid .action-delete{line-height:1.36;padding:0;color:#008bdb;text-decoration:none;background:0 0;border:0;display:inline;font-weight:400;border-radius:0}.abs-action-button-as-link:visited,.action-advanced:visited,.data-grid .action-delete:visited{color:#008bdb;text-decoration:none}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{text-decoration:underline}.abs-action-button-as-link:active,.action-advanced:active,.data-grid .action-delete:active{color:#ff5501;text-decoration:underline}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{color:#0fa7ff}.abs-action-button-as-link:active,.abs-action-button-as-link:focus,.abs-action-button-as-link:hover,.action-advanced:active,.action-advanced:focus,.action-advanced:hover,.data-grid .action-delete:active,.data-grid .action-delete:focus,.data-grid .action-delete:hover{background:0 0;border:0}.abs-action-button-as-link.disabled,.abs-action-button-as-link[disabled],.action-advanced.disabled,.action-advanced[disabled],.data-grid .action-delete.disabled,.data-grid .action-delete[disabled],fieldset[disabled] .abs-action-button-as-link,fieldset[disabled] .action-advanced,fieldset[disabled] .data-grid .action-delete{color:#008bdb;opacity:.5;cursor:default;pointer-events:none;text-decoration:underline}.abs-action-button-as-link:active,.abs-action-button-as-link:not(:focus),.action-advanced:active,.action-advanced:not(:focus),.data-grid .action-delete:active,.data-grid .action-delete:not(:focus){box-shadow:none}.abs-action-button-as-link:focus,.action-advanced:focus,.data-grid .action-delete:focus{color:#0fa7ff}.abs-action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.abs-action-default:active,.abs-action-default:focus,.abs-action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.abs-action-primary,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary,button.primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.abs-action-primary:active,.abs-action-primary:focus,.abs-action-primary:hover,.page-actions .page-actions-buttons>button.action-primary:active,.page-actions .page-actions-buttons>button.action-primary:focus,.page-actions .page-actions-buttons>button.action-primary:hover,.page-actions .page-actions-buttons>button.primary:active,.page-actions .page-actions-buttons>button.primary:focus,.page-actions .page-actions-buttons>button.primary:hover,.page-actions>button.action-primary:active,.page-actions>button.action-primary:focus,.page-actions>button.action-primary:hover,.page-actions>button.primary:active,.page-actions>button.primary:focus,.page-actions>button.primary:hover,button.primary:active,button.primary:focus,button.primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-primary.disabled,.abs-action-primary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],button.primary.disabled,button.primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-secondary,.modal-popup .modal-footer .action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions>button.action-secondary,button.secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.abs-action-secondary:active,.abs-action-secondary:focus,.abs-action-secondary:hover,.modal-popup .modal-footer .action-primary:active,.modal-popup .modal-footer .action-primary:focus,.modal-popup .modal-footer .action-primary:hover,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions .page-actions-buttons>button.action-secondary:focus,.page-actions .page-actions-buttons>button.action-secondary:hover,.page-actions>button.action-secondary:active,.page-actions>button.action-secondary:focus,.page-actions>button.action-secondary:hover,button.secondary:active,button.secondary:focus,button.secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-secondary:active,.modal-popup .modal-footer .action-primary:active,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions>button.action-secondary:active,button.secondary:active{background-color:#35302c}.abs-action-tertiary,.modal-popup .modal-footer .action-secondary,button.tertiary{background-color:transparent;border-color:transparent;text-shadow:none;color:#008bdb}.abs-action-tertiary:active,.abs-action-tertiary:focus,.abs-action-tertiary:hover,.modal-popup .modal-footer .action-secondary:active,.modal-popup .modal-footer .action-secondary:focus,.modal-popup .modal-footer .action-secondary:hover,button.tertiary:active,button.tertiary:focus,button.tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#0fa7ff;text-decoration:underline}.abs-action-quaternary,.page-actions .page-actions-buttons>button,.page-actions>button{background-color:transparent;border-color:transparent;text-shadow:none;color:#333}.abs-action-quaternary:active,.abs-action-quaternary:focus,.abs-action-quaternary:hover,.page-actions .page-actions-buttons>button:active,.page-actions .page-actions-buttons>button:focus,.page-actions .page-actions-buttons>button:hover,.page-actions>button:active,.page-actions>button:focus,.page-actions>button:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#1a1a1a}.abs-action-menu,.actions-split .abs-action-menu .action-submenu,.actions-split .abs-action-menu .action-submenu .action-submenu,.actions-split .action-menu,.actions-split .action-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.actions-split .dropdown-menu{text-align:left;background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu._active,.actions-split .abs-action-menu .action-submenu .action-submenu._active,.actions-split .abs-action-menu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .action-menu._active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .actions-split .dropdown-menu .action-submenu._active,.actions-split .dropdown-menu._active{display:block}.abs-action-menu>li,.actions-split .abs-action-menu .action-submenu .action-submenu>li,.actions-split .abs-action-menu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .action-menu>li,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .actions-split .dropdown-menu .action-submenu>li,.actions-split .dropdown-menu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu>li>a:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .abs-action-menu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .action-menu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu>li>a:hover{text-decoration:none}.abs-action-menu>li._visible,.abs-action-menu>li:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu .action-submenu>li:hover,.actions-split .abs-action-menu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .action-menu>li._visible,.actions-split .action-menu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu>li:hover,.actions-split .dropdown-menu>li._visible,.actions-split .dropdown-menu>li:hover{background-color:#e3e3e3}.abs-action-menu>li:active,.actions-split .abs-action-menu .action-submenu .action-submenu>li:active,.actions-split .abs-action-menu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .action-menu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu>li:active,.actions-split .dropdown-menu>li:active{background-color:#cacaca}.abs-action-menu>li._parent,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent,.actions-split .abs-action-menu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .action-menu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent,.actions-split .dropdown-menu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-menu-item,.abs-action-menu .item,.actions-split .abs-action-menu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .item,.actions-split .abs-action-menu .action-submenu .item,.actions-split .action-menu .action-menu-item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .item,.actions-split .action-menu .item,.actions-split .actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .actions-split .dropdown-menu .action-submenu .item,.actions-split .dropdown-menu .action-menu-item,.actions-split .dropdown-menu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu a.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .abs-action-menu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .action-menu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu a.action-menu-item{color:#333}.abs-action-menu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.abs-action-wrap-triangle{position:relative}.abs-action-wrap-triangle .action-default{width:100%}.abs-action-wrap-triangle .action-default:after,.abs-action-wrap-triangle .action-default:before{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.abs-action-wrap-triangle .action-default:active,.abs-action-wrap-triangle .action-default:focus,.abs-action-wrap-triangle .action-default:hover{box-shadow:none}._keyfocus .abs-action-wrap-triangle .action-default:focus{box-shadow:0 0 0 1px #007bdb}.ie10 .abs-action-wrap-triangle .action-default.disabled,.ie10 .abs-action-wrap-triangle .action-default[disabled],.ie9 .abs-action-wrap-triangle .action-default.disabled,.ie9 .abs-action-wrap-triangle .action-default[disabled]{background-color:#fcfcfc;opacity:1;text-shadow:none}.abs-action-wrap-triangle-right{display:inline-block;padding-right:1.6rem;position:relative}.abs-action-wrap-triangle-right .action-default:after,.abs-action-wrap-triangle-right .action-default:before{border-color:transparent transparent transparent #e3e3e3;border-width:1.7rem 0 1.6rem 1.7rem;left:100%;margin-left:-1.7rem}.abs-action-wrap-triangle-right .action-default:before{border-left-color:#949494;right:-1px}.abs-action-wrap-triangle-right .action-default:active:after,.abs-action-wrap-triangle-right .action-default:focus:after,.abs-action-wrap-triangle-right .action-default:hover:after{border-left-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-right .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-right .action-default[disabled]:after{border-color:transparent transparent transparent #fcfcfc}.abs-action-wrap-triangle-right .action-primary:after{border-color:transparent transparent transparent #eb5202}.abs-action-wrap-triangle-right .action-primary:active:after,.abs-action-wrap-triangle-right .action-primary:focus:after,.abs-action-wrap-triangle-right .action-primary:hover:after{border-left-color:#ba4000}.abs-action-wrap-triangle-left{display:inline-block;padding-left:1.6rem}.abs-action-wrap-triangle-left .action-default{text-indent:-.85rem}.abs-action-wrap-triangle-left .action-default:after,.abs-action-wrap-triangle-left .action-default:before{border-color:transparent #e3e3e3 transparent transparent;border-width:1.7rem 1.7rem 1.6rem 0;margin-right:-1.7rem;right:100%}.abs-action-wrap-triangle-left .action-default:before{border-right-color:#949494;left:-1px}.abs-action-wrap-triangle-left .action-default:active:after,.abs-action-wrap-triangle-left .action-default:focus:after,.abs-action-wrap-triangle-left .action-default:hover:after{border-right-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-left .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-left .action-default[disabled]:after{border-color:transparent #fcfcfc transparent transparent}.abs-action-wrap-triangle-left .action-primary:after{border-color:transparent #eb5202 transparent transparent}.abs-action-wrap-triangle-left .action-primary:active:after,.abs-action-wrap-triangle-left .action-primary:focus:after,.abs-action-wrap-triangle-left .action-primary:hover:after{border-right-color:#ba4000}.action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.action-default:active,.action-default:focus,.action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.action-primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.action-primary:active,.action-primary:focus,.action-primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-primary.disabled,.action-primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.action-secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.action-secondary:active,.action-secondary:focus,.action-secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-secondary:active{background-color:#35302c}.action-quaternary,.action-tertiary{background-color:transparent;border-color:transparent;text-shadow:none}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover,.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none}.action-tertiary{color:#008bdb}.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{color:#0fa7ff;text-decoration:underline}.action-quaternary{color:#333}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover{color:#1a1a1a}.action-close>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.action-close:before{content:'\e62f';transition:color .1s linear}.action-close:hover{cursor:pointer;text-decoration:none}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu .action-submenu .action-submenu._active,.abs-action-menu .action-submenu._active,.action-menu .action-submenu._active,.action-menu._active,.actions-split .action-menu .action-submenu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .dropdown-menu .action-submenu._active{display:block}.abs-action-menu .action-submenu .action-submenu>li,.abs-action-menu .action-submenu>li,.action-menu .action-submenu>li,.action-menu>li,.actions-split .action-menu .action-submenu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .dropdown-menu .action-submenu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu .action-submenu .action-submenu>li>a:hover,.abs-action-menu .action-submenu>li>a:hover,.action-menu .action-submenu>li>a:hover,.action-menu>li>a:hover,.actions-split .action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu>li>a:hover{text-decoration:none}.abs-action-menu .action-submenu .action-submenu>li._visible,.abs-action-menu .action-submenu .action-submenu>li:hover,.abs-action-menu .action-submenu>li._visible,.abs-action-menu .action-submenu>li:hover,.action-menu .action-submenu>li._visible,.action-menu .action-submenu>li:hover,.action-menu>li._visible,.action-menu>li:hover,.actions-split .action-menu .action-submenu .action-submenu>li._visible,.actions-split .action-menu .action-submenu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu>li:hover{background-color:#e3e3e3}.abs-action-menu .action-submenu .action-submenu>li:active,.abs-action-menu .action-submenu>li:active,.action-menu .action-submenu>li:active,.action-menu>li:active,.actions-split .action-menu .action-submenu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu>li:active{background-color:#cacaca}.abs-action-menu .action-submenu .action-submenu>li._parent,.abs-action-menu .action-submenu>li._parent,.action-menu .action-submenu>li._parent,.action-menu>li._parent,.actions-split .action-menu .action-submenu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.abs-action-menu .action-submenu>li._parent>.action-menu-item,.action-menu .action-submenu>li._parent>.action-menu-item,.action-menu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .item,.abs-action-menu .action-submenu .item,.action-menu .action-menu-item,.action-menu .action-submenu .action-menu-item,.action-menu .action-submenu .item,.action-menu .item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .item,.actions-split .action-menu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu .action-submenu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu .action-submenu,.ie9 .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .action-menu .action-submenu,.ie9 .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu .action-submenu .action-submenu a.action-menu-item,.abs-action-menu .action-submenu a.action-menu-item,.action-menu .action-submenu a.action-menu-item,.action-menu a.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu a.action-menu-item{color:#333}.abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.abs-action-menu .action-submenu a.action-menu-item:focus,.action-menu .action-submenu a.action-menu-item:focus,.action-menu a.action-menu-item:focus,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.messages .message:last-child{margin:0 0 2rem}.message{background:#fffbbb;border:none;border-radius:0;color:#333;font-size:1.4rem;margin:0 0 1px;padding:1.8rem 4rem 1.8rem 5.5rem;position:relative;text-shadow:none}.message:before{background:0 0;border:0;color:#007bdb;content:'\e61a';font-family:Icons;font-size:1.9rem;font-style:normal;font-weight:400;height:auto;left:1.9rem;line-height:inherit;margin-top:-1.3rem;position:absolute;speak:none;text-shadow:none;top:50%;width:auto}.message-notice:before{color:#007bdb;content:'\e61a'}.message-warning:before{color:#eb5202;content:'\e623'}.message-error{background:#fcc}.message-error:before{color:#e22626;content:'\e632';font-size:1.5rem;left:2.2rem;margin-top:-1rem}.message-success:before{color:#79a22e;content:'\e62d'}.message-spinner:before{display:none}.message-spinner .spinner{font-size:2.5rem;left:1.5rem;position:absolute;top:1.5rem}.message-in-rating-edit{margin-left:1.8rem;margin-right:1.8rem}.modal-popup .action-close,.modal-slide .action-close{color:#736963;position:absolute;right:0;top:0;z-index:1}.modal-popup .action-close:active,.modal-slide .action-close:active{-ms-transform:none;transform:none}.modal-popup .action-close:active:before,.modal-slide .action-close:active:before{font-size:1.8rem}.modal-popup .action-close:hover:before,.modal-slide .action-close:hover:before{color:#58504b}.modal-popup .action-close:before,.modal-slide .action-close:before{font-size:2rem}.modal-popup .action-close:focus,.modal-slide .action-close:focus{background-color:transparent}.modal-popup.prompt .prompt-message{padding:2rem 0}.modal-popup.prompt .prompt-message input{width:100%}.modal-popup.confirm .modal-inner-wrap .message,.modal-popup.prompt .modal-inner-wrap .message{background:#fff}.modal-popup.modal-system-messages .modal-inner-wrap{background:#fffbbb}.modal-popup._image-box .modal-inner-wrap{margin:5rem auto;max-width:78rem;position:static}.modal-popup._image-box .thumbnail-preview{padding-bottom:3rem;text-align:center}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image-block{border:1px solid #ccc;margin:0 auto 2rem;max-width:58rem;padding:2rem}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image{max-height:54rem}.modal-popup .modal-title{font-size:2.4rem;margin-right:6.4rem}.modal-popup .modal-footer{padding-top:2.6rem;text-align:right}.modal-popup .action-close{padding:3rem}.modal-popup .action-close:active,.modal-popup .action-close:focus{background:0 0;padding-right:3.1rem;padding-top:3.1rem}.modal-slide .modal-content-new-attribute{-webkit-overflow-scrolling:touch;overflow:auto;padding-bottom:0}.modal-slide .modal-content-new-attribute iframe{margin-bottom:-2.5rem}.modal-slide .modal-title{font-size:2.1rem;margin-right:5.7rem}.modal-slide .action-close{padding:2.1rem 2.6rem}.modal-slide .action-close:active{padding-right:2.7rem;padding-top:2.2rem}.modal-slide .page-main-actions{margin-bottom:.6rem;margin-top:2.1rem}.modal-slide .magento-message{padding:0 3rem 3rem;position:relative}.modal-slide .magento-message .insert-title-inner,.modal-slide .main-col .insert-title-inner{border-bottom:1px solid #adadad;margin:0 0 2rem;padding-bottom:.5rem}.modal-slide .magento-message .insert-actions,.modal-slide .main-col .insert-actions{float:right}.modal-slide .magento-message .title,.modal-slide .main-col .title{font-size:1.6rem;padding-top:.5rem}.modal-slide .main-col,.modal-slide .side-col{float:left;padding-bottom:0}.modal-slide .main-col:after,.modal-slide .side-col:after{display:none}.modal-slide .side-col{width:20%}.modal-slide .main-col{padding-right:0;width:80%}.modal-slide .content-footer .form-buttons{float:right}.modal-title{font-weight:400;margin-bottom:0;min-height:1em}.modal-title span{font-size:1.4rem;font-style:italic;margin-left:1rem}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}.spinner>span:nth-child(1){animation-delay:.27s;-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){animation-delay:.36s;-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){animation-delay:.45s;-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){animation-delay:.54s;-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){animation-delay:.63s;-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){animation-delay:.72s;-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){animation-delay:.81s;-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){animation-delay:.9;-ms-transform:rotate(0deg);transform:rotate(0deg)}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span{-ms-transform:scale(0.4);transform:scale(0.4);animation-name:fade;animation-duration:.72s;animation-iteration-count:infinite;animation-direction:linear;background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.popup-loading{background:rgba(255,255,255,.8);border-color:#ef672f;color:#ef672f;font-size:14px;font-weight:700;left:50%;margin-left:-100px;padding:100px 0 10px;position:fixed;text-align:center;top:40%;width:200px;z-index:1003}.popup-loading:after{background-image:url(../images/loader-1.gif);content:'';height:64px;left:50%;margin:-32px 0 0 -32px;position:absolute;top:40%;width:64px;z-index:2}.loading-mask,.loading-old{background:rgba(255,255,255,.4);bottom:0;left:0;position:fixed;right:0;top:0;z-index:2003}.loading-mask img,.loading-old img{display:none}.loading-mask p,.loading-old p{margin-top:118px}.loading-mask .loader,.loading-old .loader{background:url(../images/loader-1.gif) 50% 30% no-repeat #f7f3eb;border-radius:5px;bottom:0;color:#575757;font-size:14px;font-weight:700;height:160px;left:0;margin:auto;opacity:.95;position:absolute;right:0;text-align:center;top:0;width:160px}.admin-user{float:right;line-height:1.36;margin-left:.3rem;z-index:490}.admin-user._active .admin__action-dropdown,.admin-user.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin-user .admin__action-dropdown{height:3.3rem;padding:.7rem 2.8rem .4rem 4rem}.admin-user .admin__action-dropdown._active:after,.admin-user .admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:after{border-color:#777 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.3rem;top:50%;transition:all .2s linear;width:0}._active .admin-user .admin__action-dropdown:after,.active .admin-user .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin-user .admin__action-dropdown:before{color:#777;content:'\e600';font-size:2rem;left:1.1rem;margin-top:-1.1rem;position:absolute;top:50%}.admin-user .admin__action-dropdown:hover:before{color:#333}.admin-user .admin__action-dropdown-menu{min-width:20rem;padding-left:1rem;padding-right:1rem}.admin-user .admin__action-dropdown-menu>li>a{padding-left:.5em;padding-right:1.8rem;transition:background-color .1s linear;white-space:nowrap}.admin-user .admin__action-dropdown-menu>li>a:hover{background-color:#e0f6fe;color:#333}.admin-user .admin__action-dropdown-menu>li>a:active{background-color:#c7effd;bottom:-1px;position:relative}.admin-user .admin__action-dropdown-menu .admin-user-name{text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:20rem;overflow:hidden;vertical-align:top}.admin-user-account-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:11.2rem}.search-global{float:right;margin-right:-.3rem;position:relative;z-index:480}.search-global-field{min-width:5rem}.search-global-field._active .search-global-input{background-color:#fff;border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);padding-right:4rem;width:25rem}.search-global-field._active .search-global-action{display:block;height:3.3rem;position:absolute;right:0;text-indent:-100%;top:0;width:5rem;z-index:3}.search-global-field .autocomplete-results{height:3.3rem;position:absolute;right:0;top:0;width:25rem}.search-global-field .search-global-menu{border:1px solid #007bdb;border-top-color:transparent;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin-top:-2px;padding:0;position:absolute;right:0;top:100%;z-index:2}.search-global-field .search-global-menu:after{background-color:#fff;content:'';height:5px;left:0;position:absolute;right:0;top:-5px}.search-global-field .search-global-menu>li{background-color:#fff;border-top:1px solid #ddd;display:block;font-size:1.2rem;padding:.75rem 1.4rem .55rem}.search-global-field .search-global-menu>li._active{background-color:#e0f6fe}.search-global-field .search-global-menu .title{display:block;font-size:1.4rem}.search-global-field .search-global-menu .type{color:#1a1a1a;display:block}.search-global-label{cursor:pointer;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;z-index:2}.search-global-label:active{-ms-transform:scale(0.9);transform:scale(0.9)}.search-global-label:hover:before{color:#000}.search-global-label:before{color:#777;content:'\e60c';font-size:2rem}.search-global-input{background-color:transparent;border:1px solid transparent;font-size:1.4rem;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;transition:all .1s linear,width .3s linear;width:5rem;z-index:1}.search-global-action{display:none}.notifications-wrapper{float:right;line-height:1;position:relative}.notifications-wrapper.active{z-index:500}.notifications-wrapper.active .notifications-action{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.notifications-wrapper.active .notifications-action:after{background-color:#fff;border:none;content:'';display:block;height:6px;left:-6px;margin-top:0;position:absolute;right:0;top:100%;width:auto}.notifications-wrapper .admin__action-dropdown-menu{padding:1rem 0 0;width:32rem}.notifications-action{color:#777;height:3.3rem;padding:.75rem 2rem .65rem}.notifications-action:after{display:none}.notifications-action:before{content:'\e607';font-size:1.9rem;margin-right:0}.notifications-action:active:before{position:relative;top:1px}.notifications-action .notifications-counter{background-color:#e22626;border-radius:1em;color:#fff;display:inline-block;font-size:1.1rem;font-weight:700;left:50%;margin-left:.3em;margin-top:-1.1em;padding:.3em .5em;position:absolute;top:50%}.notifications-entry{line-height:1.36;padding:.6rem 2rem .8rem;position:relative;transition:background-color .1s linear}.notifications-entry:hover{background-color:#e0f6fe}.notifications-entry.notifications-entry-last{margin:0 2rem;padding:.3rem 0 1.3rem;text-align:center}.notifications-entry.notifications-entry-last:hover{background-color:transparent}.notifications-entry+.notifications-entry-last{border-top:1px solid #ddd;padding-bottom:.6rem}.notifications-entry ._cutted{cursor:pointer}.notifications-entry ._cutted .notifications-entry-description-start:after{content:'...'}.notifications-entry-title{color:#ef672f;display:block;font-size:1.1rem;font-weight:700;margin-bottom:.7rem;margin-right:1em}.notifications-entry-description{color:#333;font-size:1.1rem;margin-bottom:.8rem}.notifications-entry-description-end{display:none}.notifications-entry-description-end._show{display:inline}.notifications-entry-time{color:#777;font-size:1.1rem}.notifications-close{line-height:1;padding:1rem;position:absolute;right:0;top:.6rem}.notifications-close:before{color:#ccc;content:'\e620';transition:color .1s linear}.notifications-close:hover:before{color:#b3b3b3}.notifications-close:active{-ms-transform:scale(0.95);transform:scale(0.95)}.page-header-actions{padding-top:1.1rem}.page-header-hgroup{padding-right:1.5rem}.page-title{color:#333;font-size:2.8rem}.page-header{padding:1.5rem 3rem}.menu-wrapper{display:inline-block;position:relative;width:8.8rem;z-index:700}.menu-wrapper:before{background-color:#373330;bottom:0;content:'';left:0;position:fixed;top:0;width:8.8rem;z-index:699}.menu-wrapper._fixed{left:0;position:fixed;top:0}.menu-wrapper._fixed~.page-wrapper{margin-left:8.8rem}.menu-wrapper .logo{display:block;height:8.8rem;padding:2.4rem 0 2.2rem;position:relative;text-align:center;z-index:700}._keyfocus .menu-wrapper .logo:focus{background-color:#4a4542;box-shadow:none}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a{background-color:#373330}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a:after{display:none}.menu-wrapper .logo:hover .logo-img{-webkit-filter:brightness(1.1);filter:brightness(1.1)}.menu-wrapper .logo:active .logo-img{-ms-transform:scale(0.95);transform:scale(0.95)}.menu-wrapper .logo .logo-img{height:4.2rem;transition:-webkit-filter .2s linear,filter .2s linear,transform .1s linear;width:3.5rem}.abs-menu-separator,.admin__menu .item-partners>a:after,.admin__menu .level-0:first-child>a:after{background-color:#736963;content:'';display:block;height:1px;left:0;margin-left:16%;position:absolute;top:0;width:68%}.admin__menu li{display:block}.admin__menu .level-0:first-child>a{position:relative}.admin__menu .level-0._active>a,.admin__menu .level-0:hover>a{color:#f7f3eb}.admin__menu .level-0._active>a{background-color:#524d49}.admin__menu .level-0:hover>a{background-color:#4a4542}.admin__menu .level-0>a{color:#aaa6a0;display:block;font-size:1rem;letter-spacing:.025em;min-height:6.2rem;padding:1.2rem .5rem .5rem;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;transition:background-color .1s linear;word-wrap:break-word;z-index:700}.admin__menu .level-0>a:focus{box-shadow:none}.admin__menu .level-0>a:before{content:'\e63a';display:block;font-size:2.2rem;height:2.2rem}.admin__menu .level-0>.submenu{background-color:#4a4542;box-shadow:0 0 3px #000;left:100%;min-height:calc(8.8rem + 2rem + 100%);padding:2rem 0 0;position:absolute;top:0;-ms-transform:translateX(-100%);transform:translateX(-100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;visibility:hidden;z-index:697}.ie10 .admin__menu .level-0>.submenu,.ie11 .admin__menu .level-0>.submenu{height:100%}.admin__menu .level-0._show>.submenu{-ms-transform:translateX(0);transform:translateX(0);visibility:visible;z-index:698}.admin__menu .level-1{margin-left:1.5rem;margin-right:1.5rem}.admin__menu [class*=level-]:not(.level-0) a{display:block;padding:1.25rem 1.5rem}.admin__menu [class*=level-]:not(.level-0) a:hover{background-color:#403934}.admin__menu [class*=level-]:not(.level-0) a:active{background-color:#322c29;padding-bottom:1.15rem;padding-top:1.35rem}.admin__menu .submenu li{min-width:23.8rem}.admin__menu .submenu a{color:#fcfcfc;transition:background-color .1s linear}.admin__menu .submenu a:focus,.admin__menu .submenu a:hover{box-shadow:none;text-decoration:none}._keyfocus .admin__menu .submenu a:focus{background-color:#403934}._keyfocus .admin__menu .submenu a:active{background-color:#322c29}.admin__menu .submenu .parent{margin-bottom:4.5rem}.admin__menu .submenu .parent .submenu-group-title,.admin__menu .submenu .parent>a{color:#a79d95;display:block;font-size:1.6rem;font-weight:600;margin-bottom:.7rem;padding:1.25rem 1.5rem;pointer-events:none}.admin__menu .submenu .column{display:table-cell}.admin__menu .submenu-title{color:#fff;display:block;font-size:2.2rem;font-weight:600;margin-bottom:4.2rem;margin-left:3rem;margin-right:5.8rem}.admin__menu .submenu-sub-title{color:#fff;display:block;font-size:1.2rem;margin:-3.8rem 5.8rem 3.8rem 3rem}.admin__menu .action-close{padding:2.4rem 2.8rem;position:absolute;right:0;top:0}.admin__menu .action-close:before{color:#a79d95;font-size:1.7rem}.admin__menu .action-close:hover:before{color:#fff}.admin__menu .item-dashboard>a:before{content:'\e604';font-size:1.8rem;padding-top:.4rem}.admin__menu .item-sales>a:before{content:'\e60b'}.admin__menu .item-catalog>a:before{content:'\e608'}.admin__menu .item-customer>a:before{content:'\e603';font-size:2.6rem;position:relative;top:-.4rem}.admin__menu .item-marketing>a:before{content:'\e609';font-size:2rem;padding-top:.2rem}.admin__menu .item-content>a:before{content:'\e602';font-size:2.4rem;position:relative;top:-.2rem}.admin__menu .item-report>a:before{content:'\e60a'}.admin__menu .item-stores>a:before{content:'\e60d';font-size:1.9rem;padding-top:.3rem}.admin__menu .item-system>a:before{content:'\e610'}.admin__menu .item-partners._active>a:after,.admin__menu .item-system._current+.item-partners>a:after{display:none}.admin__menu .item-partners>a{padding-bottom:1rem}.admin__menu .item-partners>a:before{content:'\e612'}.admin__menu-overlay{bottom:0;left:0;position:fixed;right:0;top:0;z-index:697}.store-switcher{color:#333;float:left;font-size:1.3rem;margin-top:.7rem}.store-switcher .admin__action-dropdown{background-color:#f8f8f8;margin-left:.5em}.store-switcher .dropdown{display:inline-block;position:relative}.store-switcher .dropdown:after,.store-switcher .dropdown:before{content:'';display:table}.store-switcher .dropdown:after{clear:both}.store-switcher .dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e607';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle:active:after,.store-switcher .dropdown .action.toggle:hover:after{color:#333}.store-switcher .dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle.active:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e618';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle.active:active:after,.store-switcher .dropdown .action.toggle.active:hover:after{color:#333}.store-switcher .dropdown .dropdown-menu{margin:4px 0 0;padding:0;list-style:none;background:#fff;border:1px solid #aaa6a0;min-width:19.5rem;z-index:100;box-sizing:border-box;display:none;position:absolute;top:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.store-switcher .dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .dropdown .dropdown-menu li:hover{background:0 0;cursor:pointer}.store-switcher .dropdown.active{overflow:visible}.store-switcher .dropdown.active .dropdown-menu{display:block}.store-switcher .dropdown-menu{left:0;margin-top:.5em;max-height:250px;overflow-y:auto;padding-top:.25em}.store-switcher .dropdown-menu li{border:0;cursor:default}.store-switcher .dropdown-menu li:hover{cursor:default}.store-switcher .dropdown-menu li a,.store-switcher .dropdown-menu li span{color:#333;display:block;padding:.5rem 1.3rem}.store-switcher .dropdown-menu li a{text-decoration:none}.store-switcher .dropdown-menu li a:hover{background:#e9e9e9}.store-switcher .dropdown-menu li span{color:#adadad;cursor:default}.store-switcher .dropdown-menu li.current span{background:#eee;color:#333}.store-switcher .dropdown-menu .store-switcher-store a,.store-switcher .dropdown-menu .store-switcher-store span{padding-left:2.6rem}.store-switcher .dropdown-menu .store-switcher-store-view a,.store-switcher .dropdown-menu .store-switcher-store-view span{padding-left:3.9rem}.store-switcher .dropdown-menu .dropdown-toolbar{border-top:1px solid #ebebeb;margin-top:1rem}.store-switcher .dropdown-menu .dropdown-toolbar a:before{content:'\e610';margin-right:.25em;position:relative;top:1px}.store-switcher-label{font-weight:700}.store-switcher-alt{display:inline-block;position:relative}.store-switcher-alt.active .dropdown-menu{display:block}.store-switcher-alt .dropdown-menu{margin-top:2px;white-space:nowrap}.store-switcher-alt .dropdown-menu ul{list-style:none;margin:0;padding:0}.store-switcher-alt strong{color:#a79d95;display:block;font-size:14px;font-weight:500;line-height:1.333;padding:5px 10px}.store-switcher-alt .store-selected{color:#676056;cursor:pointer;font-size:12px;font-weight:400;line-height:1.333}.store-switcher-alt .store-selected:after{-webkit-font-smoothing:antialiased;color:#afadac;content:'\e02c';font-style:normal;font-weight:400;margin:0 0 0 3px;speak:none;vertical-align:text-top}.store-switcher-alt .store-switcher-store,.store-switcher-alt .store-switcher-website{padding:0}.store-switcher-alt .store-switcher-store:hover,.store-switcher-alt .store-switcher-website:hover{background:0 0}.store-switcher-alt .manage-stores,.store-switcher-alt .store-switcher-all,.store-switcher-alt .store-switcher-store-view{padding:0}.store-switcher-alt .manage-stores>a,.store-switcher-alt .store-switcher-all>a{color:#676056;display:block;font-size:12px;padding:8px 15px;text-decoration:none}.store-switcher-website{margin:5px 0 0}.store-switcher-website>strong{padding-left:13px}.store-switcher-store{margin:1px 0 0}.store-switcher-store>strong{padding-left:20px}.store-switcher-store>ul{margin-top:1px}.store-switcher-store-view:first-child{border-top:1px solid #e5e5e5}.store-switcher-store-view>a{color:#333;display:block;font-size:13px;padding:5px 15px 5px 24px;text-decoration:none}.store-view:not(.store-switcher){float:left}.store-view .store-switcher-label{display:inline-block;margin-top:1rem}.tooltip{margin-left:.5em}.tooltip .help a,.tooltip .help span{cursor:pointer;display:inline-block;height:22px;position:relative;vertical-align:middle;width:22px;z-index:2}.tooltip .help a:before,.tooltip .help span:before{color:#333;content:'\e633';font-size:1.7rem}.tooltip .help a:hover{text-decoration:none}.tooltip .tooltip-content{background:#000;border-radius:3px;color:#fff;display:none;margin-left:-19px;margin-top:10px;max-width:200px;padding:4px 8px;position:absolute;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{border-bottom:5px solid #000;border-left:5px solid transparent;border-right:5px solid transparent;content:'';height:0;left:20px;opacity:.8;position:absolute;top:-5px;width:0}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}.page-actions._fixed,.page-main-actions:not(._hidden){background:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;padding:1.5rem}.page-main-actions{margin:0 0 3rem}.page-main-actions._hidden .store-switcher{display:none}.page-main-actions._hidden .page-actions-placeholder{min-height:50px}.page-actions{float:right}.page-main-actions .page-actions._fixed{left:8.8rem;position:fixed;right:0;top:0;z-index:501}.page-main-actions .page-actions._fixed .page-actions-inner:before{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;content:attr(data-title);float:left;font-size:2.8rem;margin-top:.3rem;max-width:50%}.page-actions .page-actions-buttons>button,.page-actions>button{float:right;margin-left:1.3rem}.page-actions .page-actions-buttons>button.action-back,.page-actions .page-actions-buttons>button.back,.page-actions>button.action-back,.page-actions>button.back{float:left;-ms-flex-order:-1;order:-1}.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before{content:'\e626';margin-right:.5em;position:relative;top:1px}.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary{-ms-flex-order:2;order:2}.page-actions .page-actions-buttons>button.save:not(.primary),.page-actions>button.save:not(.primary){-ms-flex-order:1;order:1}.page-actions .page-actions-buttons>button.delete,.page-actions>button.delete{-ms-flex-order:-1;order:-1}.page-actions .actions-split{float:right;margin-left:1.3rem;-ms-flex-order:2;order:2}.page-actions .actions-split .dropdown-menu .item{display:block}.page-actions-buttons{float:right;-ms-flex-pack:end;justify-content:flex-end;display:-ms-flexbox;display:flex}.customer-index-edit .page-actions-buttons{background-color:transparent}.admin__page-nav{background:#f1f1f1;border:1px solid #e3e3e3}.admin__page-nav._collapsed:first-child{border-bottom:none}.admin__page-nav._collapsed._show{border-bottom:1px solid #e3e3e3}.admin__page-nav._collapsed._show ._collapsible{background:#f1f1f1}.admin__page-nav._collapsed._show ._collapsible:after{content:'\e62b'}.admin__page-nav._collapsed._show ._collapsible+.admin__page-nav-items{display:block}.admin__page-nav._collapsed._hide .admin__page-nav-title-messages,.admin__page-nav._collapsed._hide .admin__page-nav-title-messages ._active{display:inline-block}.admin__page-nav+._collapsed{border-bottom:none;border-top:none}.admin__page-nav-title{border-bottom:1px solid #e3e3e3;color:#303030;display:block;font-size:1.4rem;line-height:1.2;margin:0 0 -1px;padding:1.8rem 1.5rem;position:relative;text-transform:uppercase}.admin__page-nav-title._collapsible{background:#fff;cursor:pointer;margin:0;padding-right:3.5rem;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-title._collapsible+.admin__page-nav-items{display:none;margin-top:-1px}.admin__page-nav-title._collapsible:after{content:'\e628';font-size:1.3rem;font-weight:700;position:absolute;right:1.8rem;top:2rem}.admin__page-nav-title._collapsible:hover{background:#f1f1f1}.admin__page-nav-title._collapsible:last-child{margin:0 0 -1px}.admin__page-nav-title strong{font-weight:700}.admin__page-nav-title .admin__page-nav-title-messages{display:none}.admin__page-nav-items{list-style-type:none;margin:0;padding:1rem 0 1.3rem}.admin__page-nav-item{border-left:3px solid transparent;margin-left:.7rem;padding:0;position:relative;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-item:hover{border-color:#e4e4e4}.admin__page-nav-item:hover .admin__page-nav-link{background:#e4e4e4;color:#303030;text-decoration:none}.admin__page-nav-item._active,.admin__page-nav-item.ui-state-active{border-color:#eb5202}.admin__page-nav-item._active .admin__page-nav-link,.admin__page-nav-item.ui-state-active .admin__page-nav-link{background:#fff;border-color:#e3e3e3;border-right:1px solid #fff;color:#303030;margin-right:-1px;font-weight:600}.admin__page-nav-item._loading:before,.admin__page-nav-item.ui-tabs-loading:before{display:none}.admin__page-nav-item._loading .admin__page-nav-item-message-loader,.admin__page-nav-item.ui-tabs-loading .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-link{border:1px solid transparent;border-width:1px 0;color:#303030;display:block;font-weight:500;line-height:1.2;margin:0 0 -1px;padding:2rem 4rem 2rem 1rem;transition:border-color .1s ease-out,background-color .1s ease-out;word-wrap:break-word}.admin__page-nav-item-messages{display:inline-block}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-size:1.4rem;font-weight:400;left:-1rem;line-height:1.36;padding:1.5rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after,.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf;margin-top:1px}.admin__page-nav-item-message-loader{display:none;margin-top:-1rem;position:absolute;right:0;top:50%}.admin__page-nav-item-message-loader .spinner{font-size:2rem;margin-right:1.5rem}._loading>.admin__page-nav-item-messages .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-item-message{position:relative}.admin__page-nav-item-message:hover{z-index:500}.admin__page-nav-item-message:hover .admin__page-nav-item-message-tooltip{display:block}.admin__page-nav-item-message._changed,.admin__page-nav-item-message._error{display:none}.admin__page-nav-item-message .admin__page-nav-item-message-icon{display:inline-block;font-size:1.4rem;padding-left:.8em;vertical-align:baseline}.admin__page-nav-item-message .admin__page-nav-item-message-icon:after{color:#666;content:'\e631'}._changed:not(._error)>.admin__page-nav-item-messages ._changed{display:inline-block}._error .admin__page-nav-item-message-icon:after{color:#eb5202;content:'\e623'}._error>.admin__page-nav-item-messages ._error{display:inline-block}._error>.admin__page-nav-item-messages ._error .spinner{font-size:2rem;margin-right:1.5rem}._error .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;left:-1rem;line-height:1.36;padding:2rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}._error .admin__page-nav-item-message-tooltip:after,._error .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}._error .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}._error .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf}.admin__data-grid-wrap-static .data-grid{box-sizing:border-box}.admin__data-grid-wrap-static .data-grid thead{color:#333}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td{background-color:#f5f5f5}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td._dragging{background-color:rgba(245,245,245,.95)}.admin__data-grid-wrap-static .data-grid ul{margin-left:1rem;padding-left:1rem}.admin__data-grid-wrap-static .admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-wrap-static .admin__data-grid-loading-mask .grid-loader{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-filters-actions-wrap{float:right}.data-grid-search-control-wrap{float:left;max-width:45.5rem;position:relative;width:35%}.data-grid-search-control-wrap :-ms-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-webkit-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-moz-placeholder{font-style:italic}.data-grid-search-control-wrap .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:.6rem 2rem .2rem;position:absolute;right:0;top:1px}.data-grid-search-control-wrap .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.data-grid-search-control-wrap .action-submit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.data-grid-search-control-wrap .action-submit:hover:before{color:#1a1a1a}._keyfocus .data-grid-search-control-wrap .action-submit:focus{box-shadow:0 0 0 1px #008bdb}.data-grid-search-control-wrap .action-submit:before{content:'\e60c';font-size:2rem;transition:color .1s linear}.data-grid-search-control-wrap .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.data-grid-search-control-wrap .abs-action-menu .action-submenu,.data-grid-search-control-wrap .abs-action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .action-menu,.data-grid-search-control-wrap .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:19.25rem;overflow-y:auto;z-index:398}.data-grid-search-control-wrap .action-menu-item._selected{background-color:#e0f6fe}.data-grid-search-control-wrap .data-grid-search-label{display:none}.data-grid-search-control{padding-right:6rem;width:100%}.data-grid-filters-action-wrap{float:left;padding-left:2rem}.data-grid-filters-action-wrap .action-default{font-size:1.3rem;margin-bottom:1rem;padding-left:1.7rem;padding-right:2.1rem;padding-top:.7rem}.data-grid-filters-action-wrap .action-default._active{background-color:#fff;border-bottom-color:#fff;border-right-color:#ccc;font-weight:600;margin:-.1rem 0 0;padding-bottom:1.6rem;padding-top:.8rem;position:relative;z-index:281}.data-grid-filters-action-wrap .action-default._active:after{background-color:#eb5202;bottom:100%;content:'';height:3px;left:-1px;position:absolute;right:-1px}.data-grid-filters-action-wrap .action-default:before{color:#333;content:'\e605';font-size:1.8rem;margin-right:.4rem;position:relative;top:-1px;vertical-align:top}.data-grid-filters-action-wrap .filters-active{display:none}.admin__action-grid-select .admin__control-select{margin:-.5rem .5rem 0 0;padding-bottom:.6rem;padding-top:.6rem}.admin__data-grid-filters-wrap{opacity:0;visibility:hidden;clear:both;font-size:1.3rem;transition:opacity .3s ease}.admin__data-grid-filters-wrap._show{opacity:1;visibility:visible;border-bottom:1px solid #ccc;border-top:1px solid #ccc;margin-bottom:.7rem;padding:3.6rem 0 3rem;position:relative;top:-1px;z-index:280}.admin__data-grid-filters-wrap._show .admin__data-grid-filters,.admin__data-grid-filters-wrap._show .admin__data-grid-filters-footer{display:block}.admin__data-grid-filters-wrap .admin__form-field-label,.admin__data-grid-filters-wrap .admin__form-field-legend{display:block;font-weight:700;margin:0 0 .3rem;text-align:left}.admin__data-grid-filters-wrap .admin__form-field{display:inline-block;margin-bottom:2em;margin-left:0;padding-left:2rem;padding-right:2rem;vertical-align:top;width:calc(100% / 4 - 4px)}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field{display:block;float:none;margin-bottom:1.5rem;padding-left:0;padding-right:0;width:auto}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field:last-child{margin-bottom:0}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-label{border:1px solid transparent;float:left;font-weight:400;line-height:1.36;margin-bottom:0;padding-bottom:.6rem;padding-right:1em;padding-top:.6rem;width:25%}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-control{margin-left:25%}.admin__data-grid-filters-wrap .admin__action-multiselect,.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text,.admin__data-grid-filters-wrap .admin__form-field-label{font-size:1.3rem}.admin__data-grid-filters-wrap .admin__control-select{height:3.2rem;padding-top:.5rem}.admin__data-grid-filters-wrap .admin__action-multiselect:before{height:3.2rem;width:3.2rem}.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text._has-datepicker{width:100%}.admin__data-grid-filters{display:none;margin-left:-2rem;margin-right:-2rem}.admin__filters-legend{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-filters-footer{display:none;font-size:1.4rem}.admin__data-grid-filters-footer .admin__footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-filters-footer .admin__footer-secondary-actions{float:left;width:50%}.admin__data-grid-filters-current{border-bottom:.1rem solid #ccc;border-top:.1rem solid #ccc;display:none;font-size:1.3rem;margin-bottom:.9rem;padding-bottom:.8rem;padding-top:1.1rem;width:100%}.admin__data-grid-filters-current._show{display:table;position:relative;top:-1px;z-index:3}.admin__data-grid-filters-current._show+.admin__data-grid-filters-wrap._show{margin-top:-1rem}.admin__current-filters-actions-wrap,.admin__current-filters-list-wrap,.admin__current-filters-title-wrap{display:table-cell;vertical-align:top}.admin__current-filters-title{margin-right:1em;white-space:nowrap}.admin__current-filters-list-wrap{width:100%}.admin__current-filters-list{margin-bottom:0}.admin__current-filters-list>li{display:inline-block;font-weight:600;margin:0 1rem .5rem;padding-right:2.6rem;position:relative}.admin__current-filters-list .action-remove{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0;line-height:1;position:absolute;right:0;top:1px}.admin__current-filters-list .action-remove:hover{background-color:transparent;border:none;box-shadow:none}.admin__current-filters-list .action-remove:hover:before{color:#949494}.admin__current-filters-list .action-remove:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__current-filters-list .action-remove:before{color:#adadad;content:'\e620';font-size:1.6rem;transition:color .1s linear}.admin__current-filters-list .action-remove>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__current-filters-actions-wrap .action-clear{border:none;padding-bottom:0;padding-top:0;white-space:nowrap}.admin__data-grid-pager-wrap{float:right;text-align:right}.admin__data-grid-pager{display:inline-block;margin-left:3rem}.admin__data-grid-pager .admin__control-text::-webkit-inner-spin-button,.admin__data-grid-pager .admin__control-text::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.admin__data-grid-pager .admin__control-text{-moz-appearance:textfield;text-align:center;width:4.4rem}.action-next,.action-previous{width:4.4rem}.action-next:before,.action-previous:before{font-weight:700}.action-next>span,.action-previous>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-previous{margin-right:2.5rem;text-indent:-.25em}.action-previous:before{content:'\e629'}.action-next{margin-left:1.5rem;text-indent:.1em}.action-next:before{content:'\e62a'}.admin__data-grid-action-bookmarks{opacity:.98}.admin__data-grid-action-bookmarks .admin__action-dropdown-text:after{left:0;right:-6px}.admin__data-grid-action-bookmarks._active{z-index:290}.admin__data-grid-action-bookmarks .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:15rem;min-width:4.9rem;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown:before{content:'\e60f'}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu{font-size:1.3rem;left:0;padding:1rem 0;right:auto}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li{padding:0 5rem 0 0;position:relative;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action){transition:background-color .1s linear}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action):hover{background-color:#e3e3e3}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item{max-width:23rem;min-width:18rem;white-space:normal;word-break:break-all}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit{display:none;padding-bottom:1rem;padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit .action-dropdown-menu-item-actions{padding-bottom:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action{padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action+.action-dropdown-menu-item-last{padding-top:.5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a{color:#008bdb;text-decoration:none;display:inline-block;padding-left:1.1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a:hover{color:#0fa7ff;text-decoration:underline}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-last{padding-bottom:0}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item{display:none}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item-edit{display:block}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._active .action-dropdown-menu-link{font-weight:600}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{font-size:1.3rem;min-width:15rem;width:calc(100% - 4rem)}.ie9 .admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{width:15rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-actions{border-left:1px solid #fff;bottom:0;position:absolute;right:0;top:0;width:5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-link{color:#333;display:block;text-decoration:none;padding:1rem 1rem 1rem 2.1rem}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit,.admin__data-grid-action-bookmarks .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;vertical-align:top}.admin__data-grid-action-bookmarks .action-delete:hover,.admin__data-grid-action-bookmarks .action-edit:hover,.admin__data-grid-action-bookmarks .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before{font-size:1.7rem}.admin__data-grid-action-bookmarks .action-delete>span,.admin__data-grid-action-bookmarks .action-edit>span,.admin__data-grid-action-bookmarks .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit{padding:.6rem 1.4rem}.admin__data-grid-action-bookmarks .action-delete:active,.admin__data-grid-action-bookmarks .action-edit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__data-grid-action-bookmarks .action-submit{padding:.6rem 1rem .6rem .8rem}.admin__data-grid-action-bookmarks .action-submit:active{position:relative;right:-1px}.admin__data-grid-action-bookmarks .action-submit:before{content:'\e625'}.admin__data-grid-action-bookmarks .action-delete:before{content:'\e630'}.admin__data-grid-action-bookmarks .action-edit{padding-top:.8rem}.admin__data-grid-action-bookmarks .action-edit:before{content:'\e631'}.admin__data-grid-action-columns._active{opacity:.98;z-index:290}.admin__data-grid-action-columns .admin__action-dropdown:before{content:'\e610';font-size:1.8rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-columns-menu{color:#303030;font-size:1.3rem;overflow:hidden;padding:2.2rem 3.5rem 1rem;z-index:1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-header{border-bottom:1px solid #d1d1d1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-content{width:49.2rem}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-footer{border-top:1px solid #d1d1d1;padding-top:2.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content{max-height:22.85rem;overflow-y:auto;padding-top:1.5rem;position:relative;width:47.4rem}.admin__data-grid-action-columns-menu .admin__field-option{float:left;height:1.9rem;margin-bottom:1.5rem;padding:0 1rem 0 0;width:15.8rem}.admin__data-grid-action-columns-menu .admin__field-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-header{padding-bottom:1.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-footer{padding:1rem 0 2rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-secondary-actions{float:left;margin-left:-1em}.admin__data-grid-action-export._active{opacity:.98;z-index:290}.admin__data-grid-action-export .admin__action-dropdown:before{content:'\e635';font-size:1.7rem;left:.3rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-export-menu{padding-left:2rem;padding-right:2rem;padding-top:1rem}.admin__data-grid-action-export-menu .admin__action-dropdown-footer-main-actions{padding-bottom:2rem;padding-top:2.5rem;white-space:nowrap}.sticky-header{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:8.8rem;margin-top:-1px;padding:.5rem 3rem 0;position:fixed;right:0;top:77px;z-index:398}.sticky-header .admin__data-grid-wrap{margin-bottom:0;overflow-x:visible;padding-bottom:0}.sticky-header .admin__data-grid-header-row{position:relative;text-align:right}.sticky-header .admin__data-grid-header-row:last-child{margin:0}.sticky-header .admin__data-grid-actions-wrap,.sticky-header .admin__data-grid-filters-wrap,.sticky-header .admin__data-grid-pager-wrap,.sticky-header .data-grid-filters-actions-wrap,.sticky-header .data-grid-search-control-wrap{display:inline-block;float:none;vertical-align:top}.sticky-header .action-select-wrap{float:left;margin-right:1.5rem;width:16.66666667%}.sticky-header .admin__control-support-text{float:left}.sticky-header .data-grid-search-control-wrap{margin:-.5rem 0 0 1.1rem;width:auto}.sticky-header .data-grid-search-control-wrap .data-grid-search-label{box-sizing:border-box;cursor:pointer;display:block;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;position:relative;text-align:center}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before{color:#333;content:'\e60c';font-size:2rem;transition:color .1s linear}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:hover:before{color:#000}.sticky-header .data-grid-search-control-wrap .data-grid-search-label span{display:none}.sticky-header .data-grid-filters-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-left:0;position:relative}.sticky-header .data-grid-filters-actions-wrap .action-default{background-color:transparent;border:1px solid transparent;box-sizing:border-box;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;text-align:center;transition:all .15s ease}.sticky-header .data-grid-filters-actions-wrap .action-default span{display:none}.sticky-header .data-grid-filters-actions-wrap .action-default:before{margin:0}.sticky-header .data-grid-filters-actions-wrap .action-default._active{background-color:#fff;border-color:#adadad #adadad #fff;box-shadow:1px 1px 5px rgba(0,0,0,.5);z-index:210}.sticky-header .data-grid-filters-actions-wrap .action-default._active:after{background-color:#fff;content:'';height:6px;left:-2px;position:absolute;right:-6px;top:100%}.sticky-header .data-grid-filters-action-wrap{padding:0}.sticky-header .admin__data-grid-filters-wrap{background-color:#fff;border:1px solid #adadad;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:0;padding-left:3.5rem;padding-right:3.5rem;position:absolute;top:100%;width:100%;z-index:209}.sticky-header .admin__data-grid-filters-current+.admin__data-grid-filters-wrap._show{margin-top:-6px}.sticky-header .filters-active{background-color:#e04f00;border-radius:10px;color:#fff;display:block;font-size:1.4rem;font-weight:700;padding:.1rem .7rem;position:absolute;right:-7px;top:0;z-index:211}.sticky-header .filters-active:empty{padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-right:.3rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown{background-color:transparent;box-sizing:border-box;min-width:3.8rem;padding-left:.6rem;padding-right:.6rem;text-align:center}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:0;min-width:0;overflow:hidden}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:before{margin:0}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap{margin-right:1.1rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after,.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:after{display:none}.sticky-header .admin__data-grid-actions-wrap ._active .admin__action-dropdown{background-color:#fff}.sticky-header .admin__data-grid-action-bookmarks .admin__action-dropdown:before{position:relative;top:-3px}.sticky-header .admin__data-grid-filters-current{border-bottom:0;border-top:0;margin-bottom:0;padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-pager .admin__control-text,.sticky-header .admin__data-grid-pager-wrap .admin__control-support-text,.sticky-header .data-grid-search-control-wrap .action-submit,.sticky-header .data-grid-search-control-wrap .data-grid-search-control{display:none}.sticky-header .action-next{margin:0}.sticky-header .data-grid{margin-bottom:-1px}.data-grid-cap-left,.data-grid-cap-right{background-color:#f8f8f8;bottom:-2px;position:absolute;top:6rem;width:3rem;z-index:201}.data-grid-cap-left{left:0}.admin__data-grid-header{font-size:1.4rem}.admin__data-grid-header-row+.admin__data-grid-header-row{margin-top:1.1rem}.admin__data-grid-header-row:last-child{margin-bottom:0}.admin__data-grid-header-row .action-select-wrap{display:block}.admin__data-grid-header-row .action-select{width:100%}.admin__data-grid-actions-wrap{float:right;margin-left:1.1rem;margin-top:-.5rem;text-align:right}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap{position:relative;text-align:left;vertical-align:middle}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._hide+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:first-child:after{display:none}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown-menu{border-color:#adadad}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after{border-left:1px solid #ccc;content:'';height:3.2rem;left:0;position:absolute;top:.5rem;z-index:3}.admin__data-grid-actions-wrap .admin__action-dropdown{padding-bottom:1.7rem;padding-top:1.2rem}.admin__data-grid-actions-wrap .admin__action-dropdown:after{margin-top:-.4rem}.admin__data-grid-outer-wrap{min-height:8rem;position:relative}.admin__data-grid-wrap{margin-bottom:2rem;max-width:100%;overflow-x:auto;padding-bottom:1rem;padding-top:2rem}.admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-loading-mask .spinner{font-size:4rem;left:50%;margin-left:-2rem;margin-top:-2rem;position:absolute;top:50%}.ie9 .admin__data-grid-loading-mask .spinner{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-cell-content{display:inline-block;overflow:hidden;width:100%}body._in-resize{cursor:col-resize;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body._in-resize *,body._in-resize .data-grid-th,body._in-resize .data-grid-th._draggable,body._in-resize .data-grid-th._sortable{cursor:col-resize!important}._layout-fixed{table-layout:fixed}.data-grid{border:none;font-size:1.3rem;margin-bottom:0;width:100%}.data-grid:not(._dragging-copy) ._odd-row td._dragging{background-color:#d0d0d0}.data-grid:not(._dragging-copy) ._dragging{background-color:#d9d9d9;color:rgba(48,48,48,.95)}.data-grid:not(._dragging-copy) ._dragging a{color:rgba(0,139,219,.95)}.data-grid:not(._dragging-copy) ._dragging a:hover{color:rgba(15,167,255,.95)}.data-grid._dragged{outline:#007bdb solid 1px}.data-grid thead{background-color:transparent}.data-grid tfoot th{padding:1rem}.data-grid tr._odd-row td{background-color:#f5f5f5}.data-grid tr._odd-row td._update-status-active{background:#89e1ff}.data-grid tr._odd-row td._update-status-upcoming{background:#b7ee63}.data-grid tr:hover td._update-status-active,.data-grid tr:hover td._update-status-upcoming{background-color:#e5f7fe}.data-grid tr.data-grid-tr-no-data td{font-size:1.6rem;padding:3rem;text-align:center}.data-grid tr.data-grid-tr-no-data:hover td{background-color:#fff;cursor:default}.data-grid tr:active td{background-color:#e0f6fe}.data-grid tr:hover td{background-color:#e5f7fe}.data-grid tr._dragged td{background:#d0d0d0}.data-grid tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.data-grid tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.data-grid tr:not(.data-grid-editable-row):last-child td{border-bottom:.1rem solid #d6d6d6}.data-grid tr ._clickable,.data-grid tr._clickable{cursor:pointer}.data-grid tr._disabled{pointer-events:none}.data-grid td,.data-grid th{font-size:1.3rem;line-height:1.36;transition:background-color .1s linear;vertical-align:top}.data-grid td._resizing,.data-grid th._resizing{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid td._hidden,.data-grid th._hidden{display:none}.data-grid td._fit,.data-grid th._fit{width:1%}.data-grid td{background-color:#fff;border-left:.1rem dashed #d6d6d6;border-right:.1rem dashed #d6d6d6;color:#303030;padding:1rem}.data-grid td:first-child{border-left-style:solid}.data-grid td:last-child{border-right-style:solid}.data-grid td .action-select-wrap{position:static}.data-grid td .action-select{color:#008bdb;text-decoration:none;background-color:transparent;border:none;font-size:1.3rem;padding:0 3rem 0 0;position:relative}.data-grid td .action-select:hover{color:#0fa7ff;text-decoration:underline}.data-grid td .action-select:hover:after{border-color:#0fa7ff transparent transparent}.data-grid td .action-select:after{border-color:#008bdb transparent transparent;margin:.6rem 0 0 .7rem;right:auto;top:auto}.data-grid td .action-select:before{display:none}.data-grid td .abs-action-menu .action-submenu,.data-grid td .abs-action-menu .action-submenu .action-submenu,.data-grid td .action-menu,.data-grid td .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:10rem;right:0;text-align:left;top:auto;z-index:1}.data-grid td._update-status-active{background:#bceeff}.data-grid td._update-status-upcoming{background:#ccf391}.data-grid th{background-color:#514943;border:.1rem solid #8a837f;border-left-color:transparent;color:#fff;font-weight:600;padding:0;text-align:left}.data-grid th:first-child{border-left-color:#8a837f}.data-grid th._dragover-left{box-shadow:inset 3px 0 0 0 #fff;z-index:2}.data-grid th._dragover-right{box-shadow:inset -3px 0 0 0 #fff}.data-grid .shadow-div{cursor:col-resize;height:100%;margin-right:-5px;position:absolute;right:0;top:0;width:10px}.data-grid .data-grid-th{background-clip:padding-box;color:#fff;padding:1rem;position:relative;vertical-align:middle}.data-grid .data-grid-th._resize-visible .shadow-div{cursor:auto;display:none}.data-grid .data-grid-th._draggable{cursor:grab}.data-grid .data-grid-th._sortable{cursor:pointer;transition:background-color .1s linear;z-index:1}.data-grid .data-grid-th._sortable:focus,.data-grid .data-grid-th._sortable:hover{background-color:#5f564f}.data-grid .data-grid-th._sortable:active{padding-bottom:.9rem;padding-top:1.1rem}.data-grid .data-grid-th.required>span:after{color:#f38a5e;content:'*';margin-left:.3rem}.data-grid .data-grid-checkbox-cell{overflow:hidden;padding:0;vertical-align:top;width:5.2rem}.data-grid .data-grid-checkbox-cell:hover{cursor:default}.data-grid .data-grid-thumbnail-cell{text-align:center;width:7rem}.data-grid .data-grid-thumbnail-cell img{border:1px solid #d6d6d6;width:5rem}.data-grid .data-grid-multicheck-cell{padding:1rem 1rem .9rem;text-align:center;vertical-align:middle}.data-grid .data-grid-onoff-cell{text-align:center;width:12rem}.data-grid .data-grid-actions-cell{padding-left:2rem;padding-right:2rem;text-align:center;width:1%}.data-grid._hidden{display:none}.data-grid._dragging-copy{box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;opacity:.95;position:fixed;top:0;z-index:1000}.data-grid._dragging-copy .data-grid-th{border:1px solid #007bdb;border-bottom:none}.data-grid._dragging-copy .data-grid-th,.data-grid._dragging-copy .data-grid-th._sortable{cursor:grabbing}.data-grid._dragging-copy tr:last-child td{border-bottom:1px solid #007bdb}.data-grid._dragging-copy td{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:rgba(255,251,230,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td,.data-grid._dragging-copy._in-edit .data-grid-editable-row:hover td{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:after,.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{left:0;right:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:only-child{border-left:1px solid #007bdb;border-right:1px solid #007bdb;left:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-select,.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-text{opacity:.5}.data-grid .data-grid-controls-row td{padding-top:1.6rem}.data-grid .data-grid-controls-row td.data-grid-checkbox-cell{padding-top:.6rem}.data-grid .data-grid-controls-row td [class*=admin__control-],.data-grid .data-grid-controls-row td button{margin-top:-1.7rem}.data-grid._in-edit tr:hover td{background-color:#e6e6e6}.data-grid._in-edit ._odd-row.data-grid-editable-row td,.data-grid._in-edit ._odd-row.data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit ._odd-row td,.data-grid._in-edit ._odd-row:hover td{background-color:#dcdcdc}.data-grid._in-edit .data-grid-editable-row-actions td,.data-grid._in-edit .data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid._in-edit td{background-color:#e6e6e6;pointer-events:none}.data-grid._in-edit .data-grid-checkbox-cell{pointer-events:auto}.data-grid._in-edit .data-grid-editable-row{border:.1rem solid #adadad;border-bottom-color:#c2c2c2}.data-grid._in-edit .data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit .data-grid-editable-row td{background-color:#fff;border-bottom-color:#fff;border-left-style:hidden;border-right-style:hidden;border-top-color:#fff;pointer-events:auto;vertical-align:middle}.data-grid._in-edit .data-grid-editable-row td:first-child{border-left-color:#adadad;border-left-style:solid}.data-grid._in-edit .data-grid-editable-row td:first-child:after,.data-grid._in-edit .data-grid-editable-row td:first-child:before{left:0}.data-grid._in-edit .data-grid-editable-row td:last-child{border-right-color:#adadad;border-right-style:solid;left:-.1rem}.data-grid._in-edit .data-grid-editable-row td:last-child:after,.data-grid._in-edit .data-grid-editable-row td:last-child:before{right:0}.data-grid._in-edit .data-grid-editable-row .admin__control-select,.data-grid._in-edit .data-grid-editable-row .admin__control-text{width:100%}.data-grid._in-edit .data-grid-bulk-edit-panel td{vertical-align:bottom}.data-grid .data-grid-editable-row td{border-left-color:#fff;border-left-style:solid;position:relative;z-index:1}.data-grid .data-grid-editable-row td:after{bottom:0;box-shadow:0 5px 5px rgba(0,0,0,.25);content:'';height:.9rem;left:0;margin-top:-1rem;position:absolute;right:0}.data-grid .data-grid-editable-row td:before{background-color:#fff;bottom:0;content:'';height:1rem;left:-10px;position:absolute;right:-10px;z-index:1}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td,.data-grid .data-grid-editable-row.data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:first-child{border-left-color:#fff;border-right-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:last-child{left:0}.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:#fffbe6}.data-grid .data-grid-editable-row-actions{left:50%;margin-left:-12.5rem;margin-top:-2px;position:absolute;text-align:center}.data-grid .data-grid-editable-row-actions td{width:25rem}.data-grid .data-grid-editable-row-actions [class*=action-]{min-width:9rem}.data-grid .data-grid-draggable-row-cell{width:1%}.data-grid .data-grid-draggable-row-cell .draggable-handle{padding:0}.data-grid-th._sortable._ascend,.data-grid-th._sortable._descend{padding-right:2.7rem}.data-grid-th._sortable._ascend:before,.data-grid-th._sortable._descend:before{margin-top:-1em;position:absolute;right:1rem;top:50%}.data-grid-th._sortable._ascend:before{content:'\2193'}.data-grid-th._sortable._descend:before{content:'\2191'}.data-grid-checkbox-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:right}.data-grid-checkbox-cell-inner:hover{cursor:pointer}.data-grid-state-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:center}.data-grid-state-cell-inner>span{display:inline-block;font-style:italic;padding:.6rem 0}.data-grid-row-parent._active>td .data-grid-checkbox-cell-inner:before{content:'\e62b'}.data-grid-row-parent>td .data-grid-checkbox-cell-inner{padding-left:3.7rem;position:relative}.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before{content:'\e628';font-size:1rem;font-weight:700;left:1.35rem;position:absolute;top:1.6rem}.data-grid-th._col-xs{width:1%}.data-grid-info-panel{box-shadow:0 0 5px rgba(0,0,0,.5);margin:2rem .1rem -2rem}.data-grid-info-panel .messages{overflow:hidden}.data-grid-info-panel .messages .message{margin:1rem}.data-grid-info-panel .messages .message:last-child{margin-bottom:1rem}.data-grid-info-panel-actions{padding:1rem;text-align:right}.data-grid-editable-row .admin__field-control{position:relative}.data-grid-editable-row .admin__field-control._error:after{border-color:transparent #ee7d7d transparent transparent;border-style:solid;border-width:0 12px 12px 0;content:'';position:absolute;right:0;top:0}.data-grid-editable-row .admin__field-control._error .admin__control-text{border-color:#ee7d7d}.data-grid-editable-row .admin__field-control._focus:after{display:none}.data-grid-editable-row .admin__field-error{bottom:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin:0 auto 1.5rem;max-width:32rem;position:absolute;right:0}.data-grid-editable-row .admin__field-error:after,.data-grid-editable-row .admin__field-error:before{border-style:solid;content:'';left:50%;position:absolute;top:100%}.data-grid-editable-row .admin__field-error:after{border-color:#fffbbb transparent transparent;border-width:10px 10px 0;margin-left:-10px;z-index:1}.data-grid-editable-row .admin__field-error:before{border-color:#ee7d7d transparent transparent;border-width:11px 12px 0;margin-left:-12px}.data-grid-bulk-edit-panel .admin__field-label-vertical{display:block;font-size:1.2rem;margin-bottom:.5rem;text-align:left}.data-grid-row-changed{cursor:default;display:block;opacity:.5;position:relative;width:100%;z-index:1}.data-grid-row-changed:after{content:'\e631';display:inline-block}.data-grid-row-changed .data-grid-row-changed-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:100%;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;line-height:1.36;margin-bottom:1.5rem;padding:1rem;position:absolute;right:-1rem;text-transform:none;width:27rem;word-break:normal;z-index:2}.data-grid-row-changed._changed{opacity:1;z-index:3}.data-grid-row-changed._changed:hover .data-grid-row-changed-tooltip{display:block}.data-grid-row-changed._changed:hover:before{background:#f1f1f1;border:1px solid #f1f1f1;bottom:100%;box-shadow:4px 4px 3px -1px rgba(0,0,0,.15);content:'';display:block;height:1.6rem;left:50%;margin:0 0 .7rem -.8rem;position:absolute;-ms-transform:rotate(45deg);transform:rotate(45deg);width:1.6rem;z-index:3}.ie9 .data-grid-row-changed._changed:hover:before{display:none}.admin__data-grid-outer-wrap .data-grid-checkbox-cell{overflow:hidden}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner{position:relative}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner:before{bottom:0;content:'';height:500%;left:0;position:absolute;right:0;top:0}.admin__data-grid-wrap-static .data-grid-checkbox-cell:hover{cursor:pointer}.admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:1.1rem 1.8rem .9rem;padding:0}.adminhtml-cms-hierarchy-index .admin__data-grid-wrap-static .data-grid-actions-cell:first-child{padding:0}.adminhtml-export-index .admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:0;padding:1.1rem 1.8rem 1.9rem}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before,.admin__control-file-label:before,.admin__control-multiselect,.admin__control-select,.admin__control-text,.admin__control-textarea,.selectmenu{-webkit-appearance:none;background-color:#fff;border:1px solid #adadad;border-radius:1px;box-shadow:none;color:#303030;font-size:1.4rem;font-weight:400;height:auto;line-height:1.36;padding:.6rem 1rem;transition:border-color .1s linear;vertical-align:baseline;width:auto}.admin__control-addon [class*=admin__control-][class]:hover~[class*=admin__addon-]:last-child:before,.admin__control-multiselect:hover,.admin__control-select:hover,.admin__control-text:hover,.admin__control-textarea:hover,.selectmenu:hover,.selectmenu:hover .selectmenu-toggle:before{border-color:#878787}.admin__control-addon [class*=admin__control-][class]:focus~[class*=admin__addon-]:last-child:before,.admin__control-file:active+.admin__control-file-label:before,.admin__control-file:focus+.admin__control-file-label:before,.admin__control-multiselect:focus,.admin__control-select:focus,.admin__control-text:focus,.admin__control-textarea:focus,.selectmenu._focus,.selectmenu._focus .selectmenu-toggle:before{border-color:#007bdb;box-shadow:none;outline:0}.admin__control-addon [class*=admin__control-][class][disabled]~[class*=admin__addon-]:last-child:before,.admin__control-file[disabled]+.admin__control-file-label:before,.admin__control-multiselect[disabled],.admin__control-select[disabled],.admin__control-text[disabled],.admin__control-textarea[disabled]{background-color:#e9e9e9;border-color:#adadad;color:#303030;cursor:not-allowed;opacity:.5}.admin__field-row[class]>.admin__field-control,.admin__fieldset>.admin__field.admin__field-wide[class]>.admin__field-control{clear:left;float:none;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label{display:block;line-height:1.4rem;margin-bottom:.86rem;margin-top:-.14rem;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label:before,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label:before{display:none}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span{padding-left:1.5rem}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span:after{left:0;margin-left:30px}.admin__legend{font-size:1.8rem;font-weight:600;margin-bottom:3rem}.admin__control-checkbox,.admin__control-radio{cursor:pointer;opacity:.01;overflow:hidden;position:absolute;vertical-align:top}.admin__control-checkbox:after,.admin__control-radio:after{display:none}.admin__control-checkbox+label,.admin__control-radio+label{cursor:pointer;display:inline-block}.admin__control-checkbox+label:before,.admin__control-radio+label:before{background-color:#fff;border:1px solid #adadad;color:transparent;float:left;height:1.6rem;text-align:center;vertical-align:top;width:1.6rem}.admin__control-checkbox+.admin__field-label,.admin__control-radio+.admin__field-label{padding-left:2.6rem}.admin__control-checkbox+.admin__field-label:before,.admin__control-radio+.admin__field-label:before{margin:1px 1rem 0 -2.6rem}.admin__control-checkbox:checked+label:before,.admin__control-radio:checked+label:before{color:#514943}.admin__control-checkbox.disabled+label,.admin__control-checkbox[disabled]+label,.admin__control-radio.disabled+label,.admin__control-radio[disabled]+label{color:#303030;cursor:default;opacity:.5}.admin__control-checkbox.disabled+label:before,.admin__control-checkbox[disabled]+label:before,.admin__control-radio.disabled+label:before,.admin__control-radio[disabled]+label:before{background-color:#e9e9e9;border-color:#adadad;cursor:default}._keyfocus .admin__control-checkbox:not(.disabled):focus+label:before,._keyfocus .admin__control-checkbox:not([disabled]):focus+label:before,._keyfocus .admin__control-radio:not(.disabled):focus+label:before,._keyfocus .admin__control-radio:not([disabled]):focus+label:before{border-color:#007bdb}.admin__control-checkbox:not(.disabled):hover+label:before,.admin__control-checkbox:not([disabled]):hover+label:before,.admin__control-radio:not(.disabled):hover+label:before,.admin__control-radio:not([disabled]):hover+label:before{border-color:#878787}.admin__control-radio+label:before{border-radius:1.6rem;content:'';transition:border-color .1s linear,color .1s ease-in}.admin__control-radio.admin__control-radio+label:before{line-height:140%}.admin__control-radio:checked+label{position:relative}.admin__control-radio:checked+label:after{background-color:#514943;border-radius:50%;content:'';height:10px;left:3px;position:absolute;top:4px;width:10px}.admin__control-radio:checked:not(.disabled):hover,.admin__control-radio:checked:not(.disabled):hover+label,.admin__control-radio:checked:not([disabled]):hover,.admin__control-radio:checked:not([disabled]):hover+label{cursor:default}.admin__control-radio:checked:not(.disabled):hover+label:before,.admin__control-radio:checked:not([disabled]):hover+label:before{border-color:#adadad}.admin__control-checkbox+label:before{border-radius:1px;content:'';font-size:0;transition:font-size .1s ease-out,color .1s ease-out,border-color .1s linear}.admin__control-checkbox:checked+label:before{content:'\e62d';font-size:1.1rem;line-height:125%}.admin__control-checkbox:not(:checked)._indeterminate+label:before,.admin__control-checkbox:not(:checked):indeterminate+label:before{color:#514943;content:'-';font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700}input[type=checkbox].admin__control-checkbox,input[type=radio].admin__control-checkbox{margin:0;position:absolute}.admin__control-text{min-width:4rem}.admin__control-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#adadad,#adadad);background-position:calc(100% - 12px) -34px,100%,calc(100% - 3.2rem) 0;background-size:auto,3.2rem 100%,1px 100%;background-repeat:no-repeat;max-width:100%;min-width:8.5rem;padding-bottom:.5rem;padding-right:4.4rem;padding-top:.5rem;transition:border-color .1s linear}.admin__control-select:hover{border-color:#878787;cursor:pointer}.admin__control-select:focus{background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#007bdb,#007bdb);background-position:calc(100% - 12px) 13px,100%,calc(100% - 3.2rem) 0;border-color:#007bdb}.admin__control-select::-ms-expand{display:none}.ie9 .admin__control-select{background-image:none;padding-right:1rem}option:empty{display:none}.admin__control-multiselect{height:auto;max-width:100%;min-width:15rem;overflow:auto;padding:0;resize:both}.admin__control-multiselect optgroup,.admin__control-multiselect option{padding:.5rem 1rem}.admin__control-file-wrapper{display:inline-block;padding:.5rem 1rem;position:relative;z-index:1}.admin__control-file-label:before{content:'';left:0;position:absolute;top:0;width:100%;z-index:0}.admin__control-file{background:0 0;border:0;padding-top:.7rem;position:relative;width:auto;z-index:1}.admin__control-support-text{border:1px solid transparent;display:inline-block;font-size:1.4rem;line-height:1.36;padding-bottom:.6rem;padding-top:.6rem}.admin__control-support-text+[class*=admin__control-],[class*=admin__control-]+.admin__control-support-text{margin-left:.7rem}.admin__control-service{float:left;margin:.8rem 0 0 3rem}.admin__control-textarea{height:8.48rem;line-height:1.18;padding-top:.8rem;resize:vertical}.admin__control-addon{-ms-flex-direction:row;flex-direction:row;display:inline-flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;position:relative;width:100%;z-index:1}.admin__control-addon>[class*=admin__addon-],.admin__control-addon>[class*=admin__control-]{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;z-index:1}.admin__control-addon .admin__control-select{width:auto}.admin__control-addon .admin__control-text{margin:.1rem;padding:.5rem .9rem;width:100%}.admin__control-addon [class*=admin__control-][class]{appearence:none;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-order:1;order:1;-ms-flex-negative:1;flex-shrink:1;background-color:transparent;border-color:transparent;box-shadow:none;vertical-align:top}.admin__control-addon [class*=admin__control-][class]+[class*=admin__control-]{border-left-color:#adadad}.admin__control-addon [class*=admin__control-][class] :focus{box-shadow:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child{padding-left:1rem;position:static!important;z-index:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child>*{position:relative;vertical-align:top;z-index:1}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:empty{padding:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before{bottom:0;box-sizing:border-box;content:'';left:0;position:absolute;top:0;width:100%;z-index:-1}.admin__addon-prefix,.admin__addon-suffix{border:0;box-sizing:border-box;color:#858585;display:inline-block;font-size:1.4rem;font-weight:400;height:3.2rem;line-height:3.2rem;padding:0}.admin__addon-suffix{-ms-flex-order:3;order:3}.admin__addon-suffix:last-child{padding-right:1rem}.admin__addon-prefix{-ms-flex-order:0;order:0}.ie9 .admin__control-addon:after{clear:both;content:'';display:block;height:0;overflow:hidden}.ie9 .admin__addon{min-width:0;overflow:hidden;text-align:right;white-space:nowrap;width:auto}.ie9 .admin__addon [class*=admin__control-]{display:inline}.ie9 .admin__addon-prefix{float:left}.ie9 .admin__addon-suffix{float:right}.admin__control-collapsible{width:100%}.admin__control-collapsible ._dragged .admin__collapsible-block-wrapper .admin__collapsible-title{background:#d0d0d0}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before,.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{background:#008bdb;content:'';display:block;height:3px;left:0;position:absolute;right:0}.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{top:-3px}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before{bottom:-3px}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper{border:0;margin:0;position:relative}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper .fieldset-wrapper-title{background:#f8f8f8;border:2px solid #ccc}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title{font-size:1.4rem;font-weight:400;line-height:1;padding:1.6rem 4rem 1.6rem 3.8rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title:before{left:1rem;right:auto;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding:0;position:absolute;right:1rem;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before{content:'\e630';font-size:2rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete>span{display:none}.admin__control-collapsible .admin__collapsible-content{background-color:#fff;margin-bottom:1rem}.admin__control-collapsible .admin__collapsible-content>.fieldset-wrapper{border:1px solid #ccc;margin-top:-1px;padding:1rem}.admin__control-collapsible .admin__collapsible-content .admin__fieldset{padding:0}.admin__control-collapsible .admin__collapsible-content .admin__field:last-child{margin-bottom:0}.admin__control-table-wrapper{max-width:100%;overflow-x:auto;overflow-y:hidden}.admin__control-table{width:100%}.admin__control-table thead{background-color:transparent}.admin__control-table tbody td{vertical-align:top}.admin__control-table tfoot th{padding-bottom:1.3rem}.admin__control-table tfoot th.validation{padding-bottom:0;padding-top:0}.admin__control-table tfoot td{border-top:1px solid #fff}.admin__control-table tfoot .admin__control-table-pagination{float:right;padding-bottom:0}.admin__control-table tfoot .action-previous{margin-right:.5rem}.admin__control-table tfoot .action-next{margin-left:.9rem}.admin__control-table tr:last-child td{border-bottom:none}.admin__control-table tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.admin__control-table tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.admin__control-table tr._dragged td,.admin__control-table tr._dragged th{background:#d0d0d0}.admin__control-table td,.admin__control-table th{background-color:#efefef;border:0;border-bottom:1px solid #fff;padding:1.3rem 1rem 1.3rem 0;text-align:left;vertical-align:top}.admin__control-table td:first-child,.admin__control-table th:first-child{padding-left:1rem}.admin__control-table td>.admin__control-select,.admin__control-table td>.admin__control-text,.admin__control-table th>.admin__control-select,.admin__control-table th>.admin__control-text{width:100%}.admin__control-table td._hidden,.admin__control-table th._hidden{display:none}.admin__control-table td._fit,.admin__control-table th._fit{width:1px}.admin__control-table th{color:#303030;font-size:1.4rem;font-weight:600;vertical-align:bottom}.admin__control-table th._required span:after{color:#eb5202;content:'*'}.admin__control-table .control-table-actions-th{white-space:nowrap}.admin__control-table .control-table-actions-cell{padding-top:1.8rem;text-align:center;width:1%}.admin__control-table .control-table-options-th{text-align:center;width:10rem}.admin__control-table .control-table-options-cell{text-align:center}.admin__control-table .control-table-text{line-height:3.2rem}.admin__control-table .col-draggable{padding-top:2.2rem;width:1%}.admin__control-table .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.admin__control-table .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-table .action-delete:before{content:'\e630';font-size:2rem}.admin__control-table .action-delete>span{display:none}.admin__control-table .draggable-handle{padding:0}.admin__control-table._dragged{outline:#007bdb solid 1px}.admin__control-table-action{background-color:#efefef;border-top:1px solid #fff;padding:1.3rem 1rem}.admin__dynamic-rows._dragged{opacity:.95;position:absolute;z-index:999}.admin__dynamic-rows.admin__control-table .admin__control-fields>.admin__field{border:0;padding:0}.admin__dynamic-rows td>.admin__field{border:0;margin:0;padding:0}.admin__control-table-pagination{padding-bottom:1rem}.admin__control-table-pagination .admin__data-grid-pager{float:right}.admin__field-tooltip{display:inline-block;margin-top:.5rem;max-width:45px;overflow:visible;vertical-align:top;width:0}.admin__field-tooltip:hover{position:relative;z-index:500}.admin__field-option .admin__field-tooltip{margin-top:.5rem}.admin__field-tooltip .admin__field-tooltip-action{margin-left:2rem;position:relative;z-index:2;display:inline-block;text-decoration:none}.admin__field-tooltip .admin__field-tooltip-action:before{-webkit-font-smoothing:antialiased;font-size:2.2rem;line-height:1;color:#514943;content:'\e633';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.admin__field-tooltip .admin__control-text:focus+.admin__field-tooltip-content,.admin__field-tooltip:hover .admin__field-tooltip-content{display:block}.admin__field-tooltip .admin__field-tooltip-content{bottom:3.8rem;display:none;right:-2.3rem}.admin__field-tooltip .admin__field-tooltip-content:after,.admin__field-tooltip .admin__field-tooltip-content:before{border:1.6rem solid transparent;height:0;width:0;border-top-color:#afadac;content:'';display:block;position:absolute;right:2rem;top:100%;z-index:3}.admin__field-tooltip .admin__field-tooltip-content:after{border-top-color:#fffbbb;margin-top:-1px;z-index:4}.abs-admin__field-tooltip-content,.admin__field-tooltip .admin__field-tooltip-content{box-shadow:0 2px 8px 0 rgba(0,0,0,.3);background:#fffbbb;border:1px solid #afadac;border-radius:1px;padding:1.5rem 2.5rem;position:absolute;width:32rem;z-index:1}.admin__field-fallback-reset{font-size:1.25rem;white-space:nowrap;width:30px}.admin__field-fallback-reset>span{margin-left:.5rem;position:relative}.admin__field-fallback-reset:active{-ms-transform:scale(0.98);transform:scale(0.98)}.admin__field-fallback-reset:before{transition:color .1s linear;content:'\e642';font-size:1.3rem;margin-left:.5rem}.admin__field-fallback-reset:hover{cursor:pointer;text-decoration:none}.admin__field-fallback-reset:focus{background:0 0}.abs-field-size-x-small,.abs-field-sizes.admin__field-x-small>.admin__field-control,.admin__field.admin__field-x-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-x-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-x-small>.admin__field-control{width:8rem}.abs-field-size-small,.abs-field-sizes.admin__field-small>.admin__field-control,.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control,.admin__field.admin__field-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-small>.admin__field-control{width:15rem}.abs-field-size-medium,.abs-field-sizes.admin__field-medium>.admin__field-control,.admin__field.admin__field-medium>.admin__field-control,.admin__fieldset>.admin__field.admin__field-medium>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-medium>.admin__field-control{width:34rem}.abs-field-size-large,.abs-field-sizes.admin__field-large>.admin__field-control,.admin__field.admin__field-large>.admin__field-control,.admin__fieldset>.admin__field.admin__field-large>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-large>.admin__field-control{width:64rem}.abs-field-no-label,.admin__field-group-additional,.admin__field-no-label,.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-control{margin-left:calc((100%) * .25 + 30px)}.admin__fieldset{border:0;margin:0;min-width:0;padding:0}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title{padding-left:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title strong{font-size:1.7rem;font-weight:600}.admin__fieldset .fieldset-wrapper.admin__fieldset-section .admin__fieldset-wrapper-content>.admin__fieldset{padding-top:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section:last-child .admin__fieldset-wrapper-content>.admin__fieldset{padding-bottom:0}.admin__fieldset>.admin__field{border:0;margin:0 0 0 -30px;padding:0}.admin__fieldset>.admin__field:after{clear:both;content:'';display:table}.admin__fieldset>.admin__field>.admin__field-control{width:calc((100%) * .5 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-label{display:none}.admin__fieldset>.admin__field+.admin__field._empty._no-header{margin-top:-3rem}.admin__fieldset-product-websites{position:relative;z-index:300}.admin__fieldset-note{margin-bottom:2rem}.admin__form-field{border:0;margin:0;padding:0}.admin__field-control .admin__control-text,.admin__field-control .admin__control-textarea,.admin__form-field-control .admin__control-text,.admin__form-field-control .admin__control-textarea{width:100%}.admin__field-label{color:#303030;cursor:pointer;margin:0;text-align:right}.admin__field-label+br{display:none}.admin__field:not(.admin__field-option)>.admin__field-label{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:3.2rem;padding:0;white-space:nowrap}.admin__field:not(.admin__field-option)>.admin__field-label:before{opacity:0;visibility:hidden;content:'.';margin-left:-7px;overflow:hidden}.admin__field:not(.admin__field-option)>.admin__field-label span{display:inline-block;line-height:1.2;vertical-align:middle;white-space:normal}.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]{position:relative}._required>.admin__field-label>span:after,.required>.admin__field-label>span:after{color:#eb5202;content:'*';display:inline-block;font-size:1.6rem;font-weight:500;line-height:1;margin-left:10px;margin-top:.2rem;position:absolute;z-index:1}._disabled>.admin__field-label{color:#999;cursor:default}.admin__field{margin-bottom:0}.admin__field+.admin__field{margin-top:1.5rem}.admin__field:not(.admin__field-option)~.admin__field-option{margin-top:.5rem}.admin__field.admin__field-option~.admin__field-option{margin-top:.9rem}.admin__field~.admin__field-option:last-child{margin-bottom:.8rem}.admin__fieldset>.admin__field{margin-bottom:3rem;position:relative}.admin__field legend.admin__field-label{opacity:0}.admin__field[data-config-scope]:before{color:gray;content:attr(data-config-scope);display:inline-block;font-size:1.2rem;left:calc((100%) * .75 - 30px);line-height:3.2rem;margin-left:60px;position:absolute;width:calc((100%) * .25 - 30px)}.admin__field-control .admin__field[data-config-scope]:nth-child(n+2):before{content:''}.admin__field._error .admin__field-control [class*=admin__addon-]:before,.admin__field._error .admin__field-control [class*=admin__control-] [class*=admin__addon-]:before,.admin__field._error .admin__field-control>[class*=admin__control-]{border-color:#e22626}.admin__field._disabled,.admin__field._disabled:hover{box-shadow:inherit;cursor:inherit;opacity:1;outline:inherit}.admin__field._hidden{display:none}.admin__field-control+.admin__field-control{margin-top:1.5rem}.admin__field-control._with-tooltip>.admin__control-addon,.admin__field-control._with-tooltip>.admin__control-select,.admin__field-control._with-tooltip>.admin__control-text,.admin__field-control._with-tooltip>.admin__control-textarea,.admin__field-control._with-tooltip>.admin__field-option{max-width:calc(100% - 45px - 4px)}.admin__field-control._with-tooltip .admin__field-tooltip{width:auto}.admin__field-control._with-tooltip .admin__field-option{display:inline-block}.admin__field-control._with-reset>.admin__control-addon,.admin__field-control._with-reset>.admin__control-text,.admin__field-control._with-reset>.admin__control-textarea{width:calc(100% - 30px - .5rem - 4px)}.admin__field-control._with-reset .admin__field-fallback-reset{margin-left:.5rem;margin-top:1rem;vertical-align:top}.admin__field-control._with-reset._with-tooltip>.admin__control-addon,.admin__field-control._with-reset._with-tooltip>.admin__control-text,.admin__field-control._with-reset._with-tooltip>.admin__control-textarea{width:calc(100% - 30px - .5rem - 45px - 8px)}.admin__fieldset>.admin__field-collapsible{margin-bottom:0}.admin__fieldset>.admin__field-collapsible .admin__field-control{border-top:1px solid #ccc;display:block;font-size:1.7rem;font-weight:700;padding:1.7rem 0;width:calc(97%)}.admin__fieldset>.admin__field-collapsible .admin__field-option{padding-top:0}.admin__field-collapsible+div{margin-top:2.5rem}.admin__field-collapsible .admin__control-radio+label:before{height:1.8rem;width:1.8rem}.admin__field-collapsible .admin__control-radio:checked+label:after{left:4px;top:5px}.admin__field-error{background:#fffbbb;border:1px solid #ee7d7d;box-sizing:border-box;color:#555;display:block;font-size:1.2rem;font-weight:400;line-height:1.2;margin:.2rem 0 0;padding:.8rem 1rem .9rem}.admin__field-note{color:#303030;font-size:1.2rem;margin:10px 0 0;padding:0}.admin__additional-info{padding-top:1rem}.admin__field-option{padding-top:.8rem}.admin__field-option .admin__field-label{text-align:left}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2),.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1){display:inline-block}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option{display:inline-block;margin-left:41px;margin-top:0}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option:before,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option:before{background:#cacaca;content:'';display:inline-block;height:20px;margin-left:-20px;position:absolute;width:1px}.admin__field-value{padding-top:.8rem}.admin__field-service{padding-top:1rem}.admin__control-fields>.admin__field:first-child,[class*=admin__control-grouped]>.admin__field:first-child{position:static}.admin__control-fields>.admin__field:first-child>.admin__field-label,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px;background:#fff;cursor:pointer;left:0;position:absolute;top:0}.admin__control-fields>.admin__field:first-child>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label span:before{display:block}.admin__control-fields>.admin__field._disabled>.admin__field-label,[class*=admin__control-grouped]>.admin__field._disabled>.admin__field-label{cursor:default}.admin__control-fields>.admin__field>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field>.admin__field-label span:before{display:none}.admin__control-fields .admin__field-label~.admin__field-control{width:100%}.admin__control-fields .admin__field-option{padding-top:0}[class*=admin__control-grouped]{box-sizing:border-box;display:table;width:100%}[class*=admin__control-grouped]>.admin__field{display:table-cell;vertical-align:top}[class*=admin__control-grouped]>.admin__field>.admin__field-control{float:none;width:100%}[class*=admin__control-grouped]>.admin__field.admin__field-default,[class*=admin__control-grouped]>.admin__field.admin__field-large,[class*=admin__control-grouped]>.admin__field.admin__field-medium,[class*=admin__control-grouped]>.admin__field.admin__field-small,[class*=admin__control-grouped]>.admin__field.admin__field-x-small{width:1px}[class*=admin__control-grouped]>.admin__field.admin__field-default+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-large+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-medium+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-small+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-x-small+.admin__field:last-child{width:auto}[class*=admin__control-grouped]>.admin__field:nth-child(n+2){padding-left:20px}.admin__control-group-equal{table-layout:fixed}.admin__control-group-equal>.admin__field{width:50%}.admin__field-control-group{margin-top:.8rem}.admin__field-control-group>.admin__field{padding:0}.admin__control-grouped-date>.admin__field-date{white-space:nowrap;width:1px}.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control{float:left;position:relative}.admin__control-grouped-date>.admin__field-date+.admin__field:last-child{width:auto}.admin__control-grouped-date>.admin__field-date+.admin__field-date>.admin__field-label{float:left;padding-right:20px}.admin__control-grouped-date .ui-datepicker-trigger{left:100%;top:0}.admin__field-group-columns.admin__field-control.admin__control-grouped{width:calc((100%) * 1 - 30px);float:left;margin-left:30px}.admin__field-group-columns>.admin__field:first-child>.admin__field-label{float:none;margin:0;opacity:1;position:static;text-align:left}.admin__field-group-columns .admin__control-select{width:100%}.admin__field-group-additional{clear:both}.admin__field-group-additional .action-advanced{margin-top:1rem}.admin__field-group-additional .action-secondary{width:100%}.admin__field-group-show-label{white-space:nowrap}.admin__field-group-show-label>.admin__field-control,.admin__field-group-show-label>.admin__field-label{display:inline-block;vertical-align:top}.admin__field-group-show-label>.admin__field-label{margin-right:20px}.admin__field-complex{margin:1rem 0 3rem;padding-left:1rem}.admin__field:not(._hidden)+.admin__field-complex{margin-top:3rem}.admin__field-complex .admin__field-complex-title{clear:both;color:#303030;font-size:1.7rem;font-weight:600;letter-spacing:.025em;margin-bottom:1rem}.admin__field-complex .admin__field-complex-elements{float:right;max-width:40%}.admin__field-complex .admin__field-complex-elements button{margin-left:1rem}.admin__field-complex .admin__field-complex-content{max-width:60%;overflow:hidden}.admin__field-complex+.admin__field._empty._no-header{margin-top:-3rem}.admin__legend{float:left;position:static;width:100%}.admin__legend+br{clear:left;display:block;height:0;overflow:hidden}.message{margin-bottom:3rem}.message-icon-top:before{margin-top:0;top:1.8rem}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;margin-bottom:3rem;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav .btn-group .btn-wrap .btn,.nav-bar-outer-actions .btn-wrap .btn{padding-left:.5rem;padding-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:1rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before,.nav-bar>li.ui-state-disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after,.nav-bar>li.ui-state-active~li:after{display:none}.nav-bar>li.active~li a:after,.nav-bar>li.ui-state-active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a,.nav-bar>li.ui-state-active a{color:#000}.nav-bar>li.active a:hover,.nav-bar>li.ui-state-active a:hover{cursor:default}.nav-bar>li.active a:after,.nav-bar>li.ui-state-active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:1.5rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:1.5rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.3rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.3rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip p:last-child{margin-bottom:0}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:31rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;clear:left;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{animation:progress-bar-stripes 2s linear infinite}.progress-bar-text-description{margin-bottom:1.6rem}.progress-bar-text-progress{text-align:right}.page-columns .page-inner-sidebar{margin:0 0 3rem}.page-header{margin-bottom:2.7rem;padding-bottom:2rem;position:relative}.page-header:before{border-bottom:1px solid #e3e3e3;bottom:0;content:'';display:block;height:1px;left:3rem;position:absolute;right:3rem}.container .page-header:before{content:normal}.page-header .message{margin-bottom:1.8rem}.page-header .message+.message{margin-top:-1.5rem}.page-header .admin__action-dropdown,.page-header .search-global-input{transition:none}.container .page-header{margin-bottom:0}.page-title-wrapper{margin-top:1.1rem}.container .page-title-wrapper{background:url(../../pub/images/logo.svg) no-repeat;min-height:41px;padding:4px 0 0 45px}.admin__menu .level-0:first-child>a{margin-top:1.6rem}.admin__menu .level-0:first-child>a:after{top:-1.6rem}.admin__menu .level-0:first-child._active>a:after{display:block}.admin__menu .level-0>a{padding-bottom:1.3rem;padding-top:1.3rem}.admin__menu .level-0>a:before{margin-bottom:.7rem}.admin__menu .item-home>a:before{content:'\e611';font-size:2.3rem;padding-top:-.1rem}.admin__menu .item-extension>a:before{content:'\e612'}.admin__menu .item-component>a:before{content:'\e647'}.admin__menu .item-upgrade>a:before{content:'\e614'}.admin__menu .item-system-config>a:before{content:'\e610'}.admin__menu .item-tools>a:before{content:'\e613'}.modal-sub-title{font-size:1.7rem;font-weight:600}.modal-connect-signin .modal-inner-wrap{max-width:80rem}@keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}.ngdialog{-webkit-overflow-scrolling:touch;bottom:0;box-sizing:border-box;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:999}.ngdialog *,.ngdialog:after,.ngdialog:before{box-sizing:inherit}.ngdialog.ngdialog-disabled-animation *{animation:none!important}.ngdialog.ngdialog-closing .ngdialog-content,.ngdialog.ngdialog-closing .ngdialog-overlay{-webkit-animation:ngdialog-fadeout .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadeout .5s}.ngdialog-overlay{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s;background:rgba(0,0,0,.4);bottom:0;left:0;position:fixed;right:0;top:0}.ngdialog-content{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s}body.ngdialog-open{overflow:hidden}.component-indicator{border-radius:50%;cursor:help;display:inline-block;height:16px;text-align:center;vertical-align:middle;width:16px}.component-indicator::after,.component-indicator::before{background:#fff;display:block;opacity:0;position:absolute;transition:opacity .2s linear .1s;visibility:hidden}.component-indicator::before{border:1px solid #adadad;border-radius:1px;box-shadow:0 0 2px rgba(0,0,0,.4);content:attr(data-label);font-size:1.2rem;margin:30px 0 0 -10px;min-width:50px;padding:4px 5px}.component-indicator::after{border-color:#999;border-style:solid;border-width:1px 0 0 1px;box-shadow:-1px -1px 1px rgba(0,0,0,.1);content:'';height:10px;margin:9px 0 0 5px;-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.component-indicator:hover::after,.component-indicator:hover::before{opacity:1;transition:opacity .2s linear;visibility:visible}.component-indicator span{display:block;height:16px;overflow:hidden;width:16px}.component-indicator span:before{content:'';display:block;font-family:Icons;font-size:16px;height:100%;line-height:16px;width:100%}.component-indicator._on{background:#79a22e}.component-indicator._off{background:#e22626}.component-indicator._off span:before{background:#fff;height:4px;margin:8px auto 20px;width:12px}.component-indicator._info{background:0 0}.component-indicator._info span{width:21px}.component-indicator._info span:before{color:#008bdb;content:'\e648';font-family:Icons;font-size:16px}.col-manager-item-name .data-grid-data{padding-left:5px}.col-manager-item-name .ng-hide+.data-grid-data{padding-left:24px}.col-manager-item-name ._hide-dependencies,.col-manager-item-name ._show-dependencies{cursor:pointer;padding-left:24px;position:relative}.col-manager-item-name ._hide-dependencies:before,.col-manager-item-name ._show-dependencies:before{display:block;font-family:Icons;font-size:12px;left:0;position:absolute;top:1px}.col-manager-item-name ._show-dependencies:before{content:'\e62b'}.col-manager-item-name ._hide-dependencies:before{content:'\e628'}.col-manager-item-name ._no-dependencies{padding-left:24px}.product-modules-block{font-size:1.2rem;padding:15px 0 0}.col-manager-item-name .product-modules-block{padding-left:1rem}.product-modules-descriprion,.product-modules-title{font-weight:700;margin:0 0 7px}.product-modules-list{font-size:1.1rem;list-style:none;margin:0}.col-manager-item-name .product-modules-list{margin-left:15px}.col-manager-item-name .product-modules-list li{padding:0 0 0 15px;position:relative}.product-modules-list li{margin:0 0 .5rem}.product-modules-list .component-indicator{height:10px;left:0;position:absolute;top:3px;width:10px}.module-summary{white-space:nowrap}.module-summary-title{font-size:2.1rem;margin-right:1rem}.app-updater .nav{display:block;margin-bottom:3.1rem;margin-top:-2.8rem}.app-updater .nav-bar-outer-actions{margin-top:1rem;padding-right:0}.app-updater .nav-bar-outer-actions .btn-wrap-cancel{margin-right:2.6rem}.main{padding-bottom:2rem;padding-top:3rem}.menu-wrapper .logo-static{pointer-events:none}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;line-height:1.4;margin:2.5rem 0 3.5rem 5rem}.page-title{margin-bottom:1rem}.page-sub-title{font-size:2rem}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.spinner.side{float:left;font-size:2.4rem;margin-left:2rem;margin-top:-5px}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit,.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.readiness-check-item{margin-bottom:4rem;min-height:2.5rem}.readiness-check-item .spinner{float:left;font-size:2.5rem;margin:-.4rem 0 0 1.7rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:5.7rem}.readiness-check-content{margin-left:5.7rem;margin-right:22rem;position:relative}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.readiness-check-side{left:100%;padding-left:2.4rem;position:absolute;top:0;width:22rem}.readiness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:1.7rem;margin-top:.3rem}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.customize-your-store .message-error:before{margin-top:0;top:1.8rem}.customize-your-store .message-error a{color:#333;text-decoration:underline}.customize-your-store .message-error .form-label:before{background:#fff}.customize-your-store .customize-database-clean p{margin-top:2.5rem}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;height:20rem;margin:1rem 0 2rem;overflow-y:auto;padding:1.5rem 2rem 2rem;resize:vertical}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}.install-database-clean{margin-top:4rem}.install-database-clean .btn{margin-right:1rem}.page-sub-title{margin-bottom:2.1rem;margin-top:3rem}.multiselect-custom{max-width:71.1rem}.content-install{margin-top:3.7rem}.home-page-inner-wrap{margin:0 auto;max-width:91rem}.setup-home-title{margin-bottom:3.9rem;padding-top:1.8rem;text-align:center}.setup-home-item{background-color:#fafafa;border:1px solid #ccc;color:#333;display:block;margin-bottom:2rem;margin-left:1.3rem;margin-right:1.3rem;min-height:30rem;padding:2rem;text-align:center}.setup-home-item:hover{border-color:#8c8c8c;color:#333;text-decoration:none;transition:border-color .1s linear}.setup-home-item:active{-ms-transform:scale(0.99);transform:scale(0.99)}.setup-home-item:before{display:block;font-size:7rem;margin-bottom:3.3rem;margin-top:4rem}.setup-home-item-component:before,.setup-home-item-extension:before{content:'\e612'}.setup-home-item-module:before{content:'\e647'}.setup-home-item-upgrade:before{content:'\e614'}.setup-home-item-configuration:before{content:'\e610'}.setup-home-item-title{display:block;font-size:1.8rem;letter-spacing:.025em;margin-bottom:1rem}.setup-home-item-description{display:block}.extension-manager-wrap{border:1px solid #bbb;margin:0 0 4rem}.extension-manager-account{font-size:2.1rem;display:inline-block;font-weight:400}.extension-manager-title{font-size:3.2rem;background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;color:#41362f;font-weight:600;line-height:1.2;padding:2rem}.extension-manager-content{padding:2.5rem 2rem 2rem}.extension-manager-items{list-style:none;margin:0;text-align:center}.extension-manager-items .btn{border:1px solid #adadad;display:block;margin:1rem auto 0}.extension-manager-items .item-title{font-size:2.1rem;display:inline-block;text-align:left}.extension-manager-items .item-number{font-size:4.1rem;display:inline-block;line-height:.8;margin:0 5px 1.5rem 0;vertical-align:top}.extension-manager-items .item-date{font-size:2.6rem;margin-top:1px}.extension-manager-items .item-date-title{font-size:1.5rem}.extension-manager-items .item-install{margin:0 0 2rem}.sync-login-wrap{padding:0 10% 4rem}.sync-login-wrap .legend{font-size:2.6rem;color:#eb5202;float:left;font-weight:300;line-height:1.2;margin:-1rem 0 2.5rem;position:static;width:100%}.sync-login-wrap .legend._hidden{display:none}.sync-login-wrap .login-header{font-size:3.4rem;font-weight:300;margin:0 0 2rem}.sync-login-wrap .login-header span{display:inline-block;padding:.9rem 0 0;vertical-align:top}.sync-login-wrap h4{font-size:1.4rem;margin:0 0 2rem}.sync-login-wrap .sync-login-steps{margin:0 0 2rem 1.5rem}.sync-login-wrap .sync-login-steps li{padding:0 0 0 1rem}.sync-login-wrap .form-row .form-label{display:inline-block}.sync-login-wrap .form-row .form-label.required{padding-left:1.5rem}.sync-login-wrap .form-row .form-label.required:after{left:0;position:absolute;right:auto}.sync-login-wrap .form-row{max-width:28rem}.sync-login-wrap .form-actions{display:table;margin-top:-1.3rem}.sync-login-wrap .form-actions .links{display:table-header-group}.sync-login-wrap .form-actions .actions{padding:3rem 0 0}@media all and (max-width:1047px){.admin__menu .submenu li{min-width:19.8rem}.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}.app-updater .nav{padding-bottom:1.7rem}.app-updater .nav-bar-outer-actions{margin-top:2rem}}@media all and (min-width:768px){.page-layout-admin-2columns-left .page-columns{margin-left:-30px}.page-layout-admin-2columns-left .page-columns:after{clear:both;content:'';display:table}.page-layout-admin-2columns-left .page-columns .main-col{width:calc((100%) * .75 - 30px);float:right}.page-layout-admin-2columns-left .page-columns .side-col{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}.page-columns{margin-left:-30px}.page-columns:after{clear:both;content:'';display:table}.page-columns .page-inner-content{width:calc((100%) * .75 - 30px);float:right}.page-columns .page-inner-sidebar{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.abs-clearer-mobile:after,.nav-bar:after{clear:both;content:'';display:table}.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.readiness-check-side{padding:2rem 0;position:static}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}}
\ No newline at end of file
+.abs-action-delete,.abs-icon,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.extensions-information .list .extension-delete,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.validation-symbol:after{color:#e22626;content:'*';font-weight:400;margin-left:3px}.abs-modal-overlay,.modals-overlay{background:rgba(0,0,0,.35);bottom:0;left:0;position:fixed;right:0;top:0}.abs-action-delete>span,.abs-visually-hidden,.action-multicheck-wrap .action-multicheck-toggle>span,.admin__actions-switch-checkbox,.admin__control-fields .admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label)>.admin__field-label,.admin__field-tooltip .admin__field-tooltip-action span,.customize-your-store .customize-your-store-default .legend,.extensions-information .list .extension-delete>span,.form-el-checkbox,.form-el-radio,.selectmenu .action-delete>span,.selectmenu .action-edit>span,.selectmenu .action-save>span,.selectmenu-toggle span,.tooltip .help a span,.tooltip .help span span,[class*=admin__control-grouped]>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.abs-visually-hidden-reset,.admin__field-group-columns>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label[class]{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.abs-clearfix:after,.abs-clearfix:before,.action-multicheck-wrap:after,.action-multicheck-wrap:before,.actions-split:after,.actions-split:before,.admin__control-table-pagination:after,.admin__control-table-pagination:before,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:before,.admin__data-grid-filters-footer:after,.admin__data-grid-filters-footer:before,.admin__data-grid-filters:after,.admin__data-grid-filters:before,.admin__data-grid-header-row:after,.admin__data-grid-header-row:before,.admin__field-complex:after,.admin__field-complex:before,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .magento-message .insert-title-inner:before,.modal-slide .main-col .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:before,.page-actions._fixed:after,.page-actions._fixed:before,.page-content:after,.page-content:before,.page-header-actions:after,.page-header-actions:before,.page-main-actions:not(._hidden):after,.page-main-actions:not(._hidden):before{content:'';display:table}.abs-clearfix:after,.action-multicheck-wrap:after,.actions-split:after,.admin__control-table-pagination:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-filters-footer:after,.admin__data-grid-filters:after,.admin__data-grid-header-row:after,.admin__field-complex:after,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:after,.page-actions._fixed:after,.page-content:after,.page-header-actions:after,.page-main-actions:not(._hidden):after{clear:both}.abs-list-reset-styles{margin:0;padding:0;list-style:none}.abs-draggable-handle,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle,.admin__control-table .draggable-handle,.data-grid .data-grid-draggable-row-cell .draggable-handle{cursor:-webkit-grab;cursor:move;font-size:0;margin-top:-4px;padding:0 1rem 0 0;vertical-align:middle;display:inline-block;text-decoration:none}.abs-draggable-handle:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:before,.admin__control-table .draggable-handle:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:before{-webkit-font-smoothing:antialiased;font-size:1.8rem;line-height:inherit;color:#9e9e9e;content:'\e617';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.abs-draggable-handle:hover:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:hover:before,.admin__control-table .draggable-handle:hover:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:hover:before{color:#858585}.abs-config-scope-label,.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]:before{bottom:-1.3rem;color:gray;content:attr(data-config-scope);font-size:1.1rem;font-weight:400;min-width:15rem;position:absolute;right:0;text-transform:lowercase}.abs-word-wrap,.admin__field:not(.admin__field-option)>.admin__field-label{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box}*,:after,:before{box-sizing:inherit}:focus{box-shadow:none;outline:0}._keyfocus :focus{box-shadow:0 0 0 1px #008bdb}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}embed,img,object,video{max-width:100%}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/light/opensans-300.eot);src:url(../fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../fonts/opensans/light/opensans-300.woff) format('woff'),url(../fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/regular/opensans-400.eot);src:url(../fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../fonts/opensans/regular/opensans-400.woff) format('woff'),url(../fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/semibold/opensans-600.eot);src:url(../fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/bold/opensans-700.eot);src:url(../fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../fonts/opensans/bold/opensans-700.woff) format('woff'),url(../fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#333;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.36;font-size:1.4rem}h1{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2.8rem}h2{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2rem}h3{margin:0 0 2rem;color:#41362f;font-weight:600;line-height:1.2;font-size:1.7rem}h4,h5,h6{font-weight:600;margin-top:0}p{margin:0 0 1em}small{font-size:1.2rem}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}dl,ol,ul{padding-left:0}nav ol,nav ul{list-style:none;margin:0;padding:0}html{height:100%}body{background-color:#fff;min-height:100%;min-width:102.4rem}.page-wrapper{background-color:#fff;display:inline-block;margin-left:-4px;vertical-align:top;width:calc(100% - 8.8rem)}.page-content{padding-bottom:3rem;padding-left:3rem;padding-right:3rem}.notices-wrapper{margin:0 3rem}.notices-wrapper .messages{margin-bottom:0}.row{margin-left:0;margin-right:0}.row:after{clear:both;content:'';display:table}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{min-height:1px;padding-left:0;padding-right:0;position:relative}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.row-gutter{margin-left:-1.5rem;margin-right:-1.5rem}.row-gutter>[class*=col-]{padding-left:1.5rem;padding-right:1.5rem}.abs-clearer:after,.extension-manager-content:after,.extension-manager-title:after,.form-row:after,.header:after,.nav:after,body:after{clear:both;content:'';display:table}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:Icons;src:url(../fonts/icons/icons.eot);src:url(../fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../fonts/icons/icons.woff2) format('woff2'),url(../fonts/icons/icons.woff) format('woff'),url(../fonts/icons/icons.ttf) format('truetype'),url(../fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}.icon-failed:before,.icon-success:before,[class*=icon-]:after{font-family:Icons}.icon-success{color:#79a22e}.icon-success:before{content:'\e62d'}.icon-failed{color:#e22626}.icon-failed:before{content:'\e632'}.icon-success-thick:after{content:'\e62d'}.icon-collapse:after{content:'\e615'}.icon-failed-thick:after{content:'\e632'}.icon-expand:after{content:'\e616'}.icon-warning:after{content:'\e623'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.5em;left:0;position:absolute;right:0;top:.45em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e62d'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e632'}dl,ol,ul{margin-top:0}.list{padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success,.list-item-warning{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{left:-.1em;position:absolute}.list-item-success:before{color:#79a22e}.list-item-failed:before{color:#e22626}.list-item-warning:before{color:#ef672f}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .9em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-medium{font-size:1.4rem;padding:.5em 1.5em .6em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:active,.btn-link:focus,.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:focus,.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1);color:#fff}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;-webkit-filter:none;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active,.btn-secondary:focus{background-color:#574e48;color:#fff}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary[disabled]:active{background-color:#514943;-webkit-filter:none;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:focus:after,.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:focus:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:focus:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:focus:after,.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:focus:after,.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:focus:after,.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}.form-row.form-row-text{padding-top:.6rem}.form-row.form-row-text .action-sign-out{font-size:1.2rem;margin-left:1rem}.form-note{font-size:1.2rem;font-weight:600;margin-top:1rem}.form-el-dummy{display:none}.fieldset{border:0;margin:0;min-width:0;padding:0}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-el-input:required{box-shadow:none}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;padding:.43em .55em .5em 0;vertical-align:top}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{font-size:1.25em;font-weight:600;margin-bottom:2.5em;padding-top:1.5em}.form-legend{border-top:1px solid #ccc;width:100%}.form-legend-light{font-size:1em;margin-bottom:1.5em}.form-legend-expand{cursor:pointer;transition:opacity .2s linear}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e615'}.form-legend-expand:after{content:'\e616';font-family:Icons;font-size:1.15em;font-weight:400;margin-left:.5em;vertical-align:sub}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{background-color:#fff;border-color:#adadad;border-radius:2px;font-size:1.2rem;height:1.6rem;line-height:1.2;width:1.6rem}.form-el-checkbox:checked+.form-label::before{content:'\e62d';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.8rem;width:1.8rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative;z-index:0}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-select-label .form-el-select::-ms-expand{display:none}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{border:1px solid #adadad;height:45.2rem;margin:0 0 1.5rem;overflow:auto;position:relative}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fffbbb;border:1px solid #ee7d7d;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.8rem 1rem .9rem}.check-result-message{margin-left:.5em;min-height:3.68rem;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}body:not([class]){min-width:0}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0}.abs-action-delete,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.extensions-information .list .extension-delete,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.text-stretch{margin-bottom:1.5em}.page-title-jumbo{font-size:4rem;font-weight:300;letter-spacing:-.05em;margin-bottom:2.9rem}.page-title-jumbo-success:before{color:#79a22e;content:'\e62d';font-size:3.9rem;margin-left:-.3rem;margin-right:2.4rem}.list{margin-bottom:3rem}.list-dot .list-item{display:list-item;list-style-position:inside;margin-bottom:1.2rem}.list-title{color:#333;font-size:1.4rem;font-weight:700;letter-spacing:.025em;margin-bottom:1.2rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{font-family:Icons;font-size:1.6rem;top:0}.list-item-success:before{content:'\e62d';font-size:1.6rem}.list-item-failed:before{content:'\e632';font-size:1.4rem;left:.1rem;top:.2rem}.list-item-warning:before{content:'\e623';font-size:1.3rem;left:.2rem}.form-wrap{margin-bottom:3.6rem;padding-top:2.1rem}.form-el-label-horizontal{display:inline-block;font-size:1.3rem;font-weight:600;letter-spacing:.025em;margin-bottom:.4rem;margin-left:.4rem}.app-updater{min-width:768px}body._has-modal{height:100%;overflow:hidden;width:100%}.modals-overlay{z-index:899}.modal-popup,.modal-slide{bottom:0;min-width:0;position:fixed;right:0;top:0;visibility:hidden}.modal-popup._show,.modal-slide._show{visibility:visible}.modal-popup._show .modal-inner-wrap,.modal-slide._show .modal-inner-wrap{-ms-transform:translate(0,0);transform:translate(0,0)}.modal-popup .modal-inner-wrap,.modal-slide .modal-inner-wrap{background-color:#fff;box-shadow:0 0 12px 2px rgba(0,0,0,.35);opacity:1;pointer-events:auto}.modal-slide{left:14.8rem;z-index:900}.modal-slide._show .modal-inner-wrap{-ms-transform:translateX(0);transform:translateX(0)}.modal-slide .modal-inner-wrap{height:100%;overflow-y:auto;position:static;-ms-transform:translateX(100%);transform:translateX(100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;width:auto}.modal-slide._inner-scroll .modal-inner-wrap{overflow-y:visible;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.modal-slide._inner-scroll .modal-footer,.modal-slide._inner-scroll .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-slide._inner-scroll .modal-content{overflow-y:auto}.modal-slide._inner-scroll .modal-footer{margin-top:auto}.modal-slide .modal-content,.modal-slide .modal-footer,.modal-slide .modal-header{padding:0 2.6rem 2.6rem}.modal-slide .modal-header{padding-bottom:2.1rem;padding-top:2.1rem}.modal-popup{z-index:900;left:0;overflow-y:auto}.modal-popup._show .modal-inner-wrap{-ms-transform:translateY(0);transform:translateY(0)}.modal-popup .modal-inner-wrap{margin:5rem auto;width:75%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;box-sizing:border-box;height:auto;left:0;position:absolute;right:0;-ms-transform:translateY(-200%);transform:translateY(-200%);transition-duration:.2s;transition-property:transform,visibility;transition-timing-function:ease}.modal-popup._inner-scroll{overflow-y:visible}.ie10 .modal-popup._inner-scroll,.ie9 .modal-popup._inner-scroll{overflow-y:auto}.modal-popup._inner-scroll .modal-inner-wrap{max-height:90%}.ie10 .modal-popup._inner-scroll .modal-inner-wrap,.ie9 .modal-popup._inner-scroll .modal-inner-wrap{max-height:none}.modal-popup._inner-scroll .modal-content{overflow-y:auto}.modal-popup .modal-content,.modal-popup .modal-footer,.modal-popup .modal-header{padding-left:3rem;padding-right:3rem}.modal-popup .modal-footer,.modal-popup .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-popup .modal-header{padding-bottom:1.2rem;padding-top:3rem}.modal-popup .modal-footer{margin-top:auto;padding-bottom:3rem}.modal-popup .modal-footer-actions{text-align:right}.admin__action-dropdown-wrap{display:inline-block;position:relative}.admin__action-dropdown-wrap .admin__action-dropdown-text:after{left:-6px;right:0}.admin__action-dropdown-wrap .admin__action-dropdown-menu{left:auto;right:0}.admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__action-dropdown-wrap.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin__action-dropdown-wrap._active .admin__action-dropdown-text:after,.admin__action-dropdown-wrap.active .admin__action-dropdown-text:after{background-color:#fff;content:'';height:6px;position:absolute;top:100%}.admin__action-dropdown-wrap._active .admin__action-dropdown-menu,.admin__action-dropdown-wrap.active .admin__action-dropdown-menu{display:block}.admin__action-dropdown-wrap._disabled .admin__action-dropdown{cursor:default}.admin__action-dropdown-wrap._disabled:hover .admin__action-dropdown{color:#333}.admin__action-dropdown{background-color:#fff;border:1px solid transparent;border-bottom:none;border-radius:0;box-shadow:none;color:#333;display:inline-block;font-size:1.3rem;font-weight:400;letter-spacing:-.025em;padding:.7rem 3.3rem .8rem 1.5rem;position:relative;vertical-align:baseline;z-index:2}.admin__action-dropdown._active:after,.admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .admin__action-dropdown:after,.active .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin__action-dropdown:focus,.admin__action-dropdown:hover{background-color:#fff;color:#000;text-decoration:none}.admin__action-dropdown:after{right:1.5rem}.admin__action-dropdown:before{margin-right:1rem}.admin__action-dropdown-menu{background-color:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;line-height:1.36;margin-top:-1px;min-width:120%;padding:.5rem 1rem;position:absolute;top:100%;transition:all .15s ease;z-index:1}.admin__action-dropdown-menu>li{display:block}.admin__action-dropdown-menu>li>a{color:#333;display:block;text-decoration:none;padding:.6rem .5rem}.selectmenu{display:inline-block;position:relative;text-align:left;z-index:1}.selectmenu._active{border-color:#007bdb;z-index:500}.selectmenu .action-delete,.selectmenu .action-edit,.selectmenu .action-save{background-color:transparent;border-color:transparent;box-shadow:none;padding:0 1rem}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover,.selectmenu .action-save:hover{background-color:transparent;border-color:transparent;box-shadow:none}.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before{content:'\e630'}.selectmenu .action-delete,.selectmenu .action-edit{border:0 solid #fff;border-left-width:1px;bottom:0;position:absolute;right:0;top:0;z-index:1}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover{border:0 solid #fff;border-left-width:1px}.selectmenu .action-save:before{content:'\e625'}.selectmenu .action-edit:before{content:'\e631'}.selectmenu-value{display:inline-block}.selectmenu-value input[type=text]{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;border:0;display:inline;margin:0;width:6rem}body._keyfocus .selectmenu-value input[type=text]:focus{box-shadow:none}.selectmenu-toggle{padding-right:3rem;background:0 0;border-width:0;bottom:0;float:right;position:absolute;right:0;top:0;width:0}.selectmenu-toggle._active:after,.selectmenu-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.1rem;top:50%;transition:all .2s linear;width:0}._active .selectmenu-toggle:after,.active .selectmenu-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:hover:after{border-color:#000 transparent transparent}.selectmenu-toggle:active,.selectmenu-toggle:focus,.selectmenu-toggle:hover{background:0 0}.selectmenu._active .selectmenu-toggle:before{border-color:#007bdb}body._keyfocus .selectmenu-toggle:focus{box-shadow:none}.selectmenu-toggle:before{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';display:block;position:absolute;right:0;top:0;width:3.2rem}.selectmenu-items{background:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;float:left;left:-1px;margin-top:3px;max-width:20rem;min-width:calc(100% + 2px);position:absolute;top:100%}.selectmenu-items._active{display:block}.selectmenu-items ul{float:left;list-style-type:none;margin:0;min-width:100%;padding:0}.selectmenu-items li{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row;transition:background .2s linear}.selectmenu-items li:hover{background:#e3e3e3}.selectmenu-items li:last-child .selectmenu-item-action,.selectmenu-items li:last-child .selectmenu-item-action:visited{color:#008bdb;text-decoration:none}.selectmenu-items li:last-child .selectmenu-item-action:hover{color:#0fa7ff;text-decoration:underline}.selectmenu-items li:last-child .selectmenu-item-action:active{color:#ff5501;text-decoration:underline}.selectmenu-item{position:relative;width:100%;z-index:1}li._edit>.selectmenu-item{display:none}.selectmenu-item-edit{display:none;padding:.3rem 4rem .3rem .4rem;position:relative;white-space:nowrap;z-index:1}li:last-child .selectmenu-item-edit{padding-right:.4rem}.selectmenu-item-edit .admin__control-text{margin:0;width:5.4rem}li._edit .selectmenu-item-edit{display:block}.selectmenu-item-action{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background:0 0;border:0;color:#333;display:block;font-size:1.4rem;font-weight:400;min-width:100%;padding:1rem 6rem 1rem 1.5rem;text-align:left;transition:background .2s linear;width:5rem}.selectmenu-item-action:focus,.selectmenu-item-action:hover{background:#e3e3e3}.abs-actions-split-xl .action-default,.page-actions .actions-split .action-default{margin-right:4rem}.abs-actions-split-xl .action-toggle,.page-actions .actions-split .action-toggle{padding-right:4rem}.abs-actions-split-xl .action-toggle:after,.page-actions .actions-split .action-toggle:after{border-width:.9rem .6rem 0;margin-top:-.3rem;right:1.4rem}.actions-split{position:relative;z-index:400}.actions-split._active,.actions-split.active,.actions-split:hover{box-shadow:0 0 0 1px #007bdb}.actions-split._active .action-toggle.action-primary,.actions-split._active .action-toggle.primary,.actions-split.active .action-toggle.action-primary,.actions-split.active .action-toggle.primary{background-color:#ba4000;border-color:#ba4000}.actions-split._active .dropdown-menu,.actions-split.active .dropdown-menu{opacity:1;visibility:visible;display:block}.actions-split .action-default,.actions-split .action-toggle{float:left;margin:0}.actions-split .action-default._active,.actions-split .action-default.active,.actions-split .action-default:hover,.actions-split .action-toggle._active,.actions-split .action-toggle.active,.actions-split .action-toggle:hover{box-shadow:none}.actions-split .action-default{margin-right:3.2rem;min-width:9.3rem}.actions-split .action-toggle{padding-right:3.2rem;border-left-color:rgba(0,0,0,.2);bottom:0;padding-left:0;position:absolute;right:0;top:0}.actions-split .action-toggle._active:after,.actions-split .action-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .actions-split .action-toggle:after,.active .actions-split .action-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:hover:after{border-color:#000 transparent transparent}.actions-split .action-toggle.action-primary:after,.actions-split .action-toggle.action-secondary:after,.actions-split .action-toggle.primary:after,.actions-split .action-toggle.secondary:after{border-color:#fff transparent transparent}.actions-split .action-toggle>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-select-wrap{display:inline-block;position:relative}.action-select-wrap .action-select{padding-right:3.2rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#fff;font-weight:400;text-align:left}.action-select-wrap .action-select._active:after,.action-select-wrap .action-select.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .action-select-wrap .action-select:after,.active .action-select-wrap .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:hover:after{border-color:#000 transparent transparent}.action-select-wrap .action-select:hover,.action-select-wrap .action-select:hover:before{border-color:#878787}.action-select-wrap .action-select:before{background-color:#e3e3e3;border:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:3.2rem}.action-select-wrap .action-select._active{border-color:#007bdb}.action-select-wrap .action-select._active:before{border-color:#007bdb #007bdb #007bdb #adadad}.action-select-wrap .action-select[disabled]{color:#333}.action-select-wrap .action-select[disabled]:after{border-color:#333 transparent transparent}.action-select-wrap._active{z-index:500}.action-select-wrap._active .action-select,.action-select-wrap._active .action-select:before{border-color:#007bdb}.action-select-wrap._active .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .abs-action-menu .action-submenu,.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu,.action-select-wrap .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:45rem;overflow-y:auto}.action-select-wrap .abs-action-menu .action-submenu ._disabled:hover,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .action-menu ._disabled:hover,.action-select-wrap .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled:hover{background:#fff}.action-select-wrap .abs-action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .action-menu ._disabled .action-menu-item,.action-select-wrap .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled .action-menu-item{cursor:default;opacity:.5}.action-select-wrap .action-menu-items{left:0;position:absolute;right:0;top:100%}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu{min-width:100%;position:static}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{position:absolute}.action-multicheck-wrap{display:inline-block;height:1.6rem;padding-top:1px;position:relative;width:3.1rem;z-index:200}.action-multicheck-wrap:hover .action-multicheck-toggle,.action-multicheck-wrap:hover .admin__control-checkbox+label:before{border-color:#878787}.action-multicheck-wrap._active .action-multicheck-toggle,.action-multicheck-wrap._active .admin__control-checkbox+label:before{border-color:#007bdb}.action-multicheck-wrap._active .abs-action-menu .action-submenu,.action-multicheck-wrap._active .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .action-menu,.action-multicheck-wrap._active .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu .action-submenu{opacity:1;visibility:visible;display:block}.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{background-color:#fff}.action-multicheck-wrap._disabled .action-multicheck-toggle,.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{border-color:#adadad;opacity:1}.action-multicheck-wrap .action-multicheck-toggle,.action-multicheck-wrap .admin__control-checkbox,.action-multicheck-wrap .admin__control-checkbox+label{float:left}.action-multicheck-wrap .action-multicheck-toggle{border-radius:0 1px 1px 0;height:1.6rem;margin-left:-1px;padding:0;position:relative;transition:border-color .1s linear;width:1.6rem}.action-multicheck-wrap .action-multicheck-toggle._active:after,.action-multicheck-wrap .action-multicheck-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .action-multicheck-wrap .action-multicheck-toggle:after,.active .action-multicheck-wrap .action-multicheck-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:hover:after{border-color:#000 transparent transparent}.action-multicheck-wrap .action-multicheck-toggle:focus{border-color:#007bdb}.action-multicheck-wrap .action-multicheck-toggle:after{right:.3rem}.action-multicheck-wrap .abs-action-menu .action-submenu,.action-multicheck-wrap .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap .action-menu,.action-multicheck-wrap .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:-1.1rem;margin-top:1px;right:auto;text-align:left}.action-multicheck-wrap .action-menu-item{white-space:nowrap}.admin__action-multiselect-wrap{display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.admin__action-multiselect-wrap.action-select-wrap:focus{box-shadow:none}.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .action-menu,.admin__action-multiselect-wrap.action-select-wrap .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:none;overflow-y:inherit}.admin__action-multiselect-wrap .action-menu-item{transition:background-color .1s linear}.admin__action-multiselect-wrap .action-menu-item._selected{background-color:#e0f6fe}.admin__action-multiselect-wrap .action-menu-item._hover{background-color:#e3e3e3}.admin__action-multiselect-wrap .action-menu-item._unclickable{cursor:default}.admin__action-multiselect-wrap .admin__action-multiselect{border:1px solid #adadad;cursor:pointer;display:block;min-height:3.2rem;padding-right:3.6rem;white-space:normal}.admin__action-multiselect-wrap .admin__action-multiselect:after{bottom:1.25rem;top:auto}.admin__action-multiselect-wrap .admin__action-multiselect:before{height:3.3rem;top:auto}.admin__control-table-wrapper .admin__action-multiselect-wrap{position:static}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect{position:relative}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect:before{right:-1px;top:-1px}.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:34rem;right:auto;top:auto;z-index:1}.admin__action-multiselect-wrap .admin__action-multiselect-item-path{color:#a79d95;font-size:1.2rem;font-weight:400;padding-left:1rem}.admin__action-multiselect-actions-wrap{border-top:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;text-align:center}.admin__action-multiselect-actions-wrap .action-default{font-size:1.3rem;min-width:13rem}.admin__action-multiselect-text{padding:.6rem 1rem}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{text-align:left}.admin__action-multiselect-label{cursor:pointer;position:relative;z-index:1}.admin__action-multiselect-label:before{margin-right:.5rem}._unclickable .admin__action-multiselect-label{cursor:default;font-weight:700}.admin__action-multiselect-search-wrap{border-bottom:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;position:relative}.admin__action-multiselect-search{padding-right:3rem;width:100%}.admin__action-multiselect-search-label{display:block;font-size:1.5rem;height:1em;overflow:hidden;position:absolute;right:2.2rem;top:1.7rem;width:1em}.admin__action-multiselect-search-label:before{content:'\e60c'}.admin__action-multiselect-search-count{color:#a79d95;margin-top:1rem}.admin__action-multiselect-menu-inner{margin-bottom:0;max-height:46rem;overflow-y:auto}.admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{list-style:none;max-height:none;overflow:hidden;padding-left:2.2rem}.admin__action-multiselect-menu-inner ._hidden{display:none}.admin__action-multiselect-crumb{background-color:#f5f5f5;border:1px solid #a79d95;border-radius:1px;display:inline-block;font-size:1.2rem;margin:.3rem -4px .3rem .3rem;padding:.3rem 2.4rem .4rem 1rem;position:relative;transition:border-color .1s linear}.admin__action-multiselect-crumb:hover{border-color:#908379}.admin__action-multiselect-crumb .action-close{bottom:0;font-size:.5em;position:absolute;right:0;top:0;width:2rem}.admin__action-multiselect-crumb .action-close:hover{color:#000}.admin__action-multiselect-crumb .action-close:active,.admin__action-multiselect-crumb .action-close:focus{background-color:transparent}.admin__action-multiselect-crumb .action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__action-multiselect-tree .abs-action-menu .action-submenu,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .action-menu,.admin__action-multiselect-tree .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu{min-width:34.7rem}.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item{margin-top:.1rem}.admin__action-multiselect-tree .action-menu-item{margin-left:4.2rem;position:relative}.admin__action-multiselect-tree .action-menu-item._expended:before{border-left:1px dashed #a79d95;bottom:0;content:'';left:-1rem;position:absolute;top:1rem;width:1px}.admin__action-multiselect-tree .action-menu-item._expended .admin__action-multiselect-dropdown:before{content:'\e615'}.admin__action-multiselect-tree .action-menu-item._with-checkbox .admin__action-multiselect-label{padding-left:2.6rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{padding-left:3.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner:before{left:4.3rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:last-child:before{height:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after,.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{content:'';left:0;position:absolute}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after{border-top:1px dashed #a79d95;height:1px;top:2.1rem;width:5.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{border-left:1px dashed #a79d95;height:100%;top:0;width:1px}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._parent:after{width:4.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root{margin-left:-1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:after{left:3.2rem;width:2.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:before{left:3.2rem;top:1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root._parent:after{display:none}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:first-child:before{top:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:last-child:before{height:1rem}.admin__action-multiselect-tree .admin__action-multiselect-label{line-height:2.2rem;vertical-align:middle;word-break:break-all}.admin__action-multiselect-tree .admin__action-multiselect-label:before{left:0;position:absolute;top:.4rem}.admin__action-multiselect-dropdown{border-radius:50%;height:2.2rem;left:-2.2rem;position:absolute;top:1rem;width:2.2rem;z-index:1}.admin__action-multiselect-dropdown:before{background:#fff;color:#a79d95;content:'\e616';font-size:2.2rem}.admin__actions-switch{display:inline-block;position:relative;vertical-align:middle}.admin__field-control .admin__actions-switch{line-height:3.2rem}.admin__actions-switch+.admin__field-service{min-width:34rem}._disabled .admin__actions-switch-checkbox+.admin__actions-switch-label,.admin__actions-switch-checkbox.disabled+.admin__actions-switch-label{cursor:not-allowed;opacity:.5;pointer-events:none}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:before{left:15px}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:after{background:#79a22e}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label .admin__actions-switch-text:before{content:attr(data-text-on)}.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:after,.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:before{border-color:#007bdb}._error .admin__actions-switch-checkbox+.admin__actions-switch-label:after,._error .admin__actions-switch-checkbox+.admin__actions-switch-label:before{border-color:#e22626}.admin__actions-switch-label{cursor:pointer;display:inline-block;height:22px;line-height:22px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.admin__actions-switch-label:after,.admin__actions-switch-label:before{left:0;position:absolute;right:auto;top:0}.admin__actions-switch-label:before{background:#fff;border:1px solid #aaa6a0;border-radius:100%;content:'';display:block;height:22px;transition:left .2s ease-in 0s;width:22px;z-index:1}.admin__actions-switch-label:after{background:#e3e3e3;border:1px solid #aaa6a0;border-radius:12px;content:'';display:block;height:22px;transition:background .2s ease-in 0s;vertical-align:middle;width:37px;z-index:0}.admin__actions-switch-text:before{content:attr(data-text-off);padding-left:47px;white-space:nowrap}.abs-action-delete,.abs-action-reset,.action-close,.admin__field-fallback-reset,.extensions-information .list .extension-delete,.notifications-close,.search-global-field._active .search-global-action{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0}.abs-action-delete:hover,.abs-action-reset:hover,.action-close:hover,.admin__field-fallback-reset:hover,.extensions-information .list .extension-delete:hover,.notifications-close:hover,.search-global-field._active .search-global-action:hover{background-color:transparent;border:none;box-shadow:none}.abs-action-default,.abs-action-pattern,.abs-action-primary,.abs-action-quaternary,.abs-action-secondary,.abs-action-tertiary,.action-default,.action-primary,.action-quaternary,.action-secondary,.action-tertiary,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions>button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary,button,button.primary,button.secondary,button.tertiary{border:1px solid;border-radius:0;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:1.36;padding:.6rem 1em;text-align:center;vertical-align:baseline}.abs-action-default.disabled,.abs-action-default[disabled],.abs-action-pattern.disabled,.abs-action-pattern[disabled],.abs-action-primary.disabled,.abs-action-primary[disabled],.abs-action-quaternary.disabled,.abs-action-quaternary[disabled],.abs-action-secondary.disabled,.abs-action-secondary[disabled],.abs-action-tertiary.disabled,.abs-action-tertiary[disabled],.action-default.disabled,.action-default[disabled],.action-primary.disabled,.action-primary[disabled],.action-quaternary.disabled,.action-quaternary[disabled],.action-secondary.disabled,.action-secondary[disabled],.action-tertiary.disabled,.action-tertiary[disabled],.modal-popup .modal-footer .action-primary.disabled,.modal-popup .modal-footer .action-primary[disabled],.modal-popup .modal-footer .action-secondary.disabled,.modal-popup .modal-footer .action-secondary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.action-secondary.disabled,.page-actions .page-actions-buttons>button.action-secondary[disabled],.page-actions .page-actions-buttons>button.disabled,.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions .page-actions-buttons>button[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.action-secondary.disabled,.page-actions>button.action-secondary[disabled],.page-actions>button.disabled,.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],.page-actions>button[disabled],button.disabled,button.primary.disabled,button.primary[disabled],button.secondary.disabled,button.secondary[disabled],button.tertiary.disabled,button.tertiary[disabled],button[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-l,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary{font-size:1.6rem;letter-spacing:.025em;padding-bottom:.6875em;padding-top:.6875em}.abs-action-delete,.extensions-information .list .extension-delete{display:inline-block;font-size:1.6rem;margin-left:1.2rem;padding-top:.7rem;text-decoration:none;vertical-align:middle}.abs-action-delete:after,.extensions-information .list .extension-delete:after{color:#666;content:'\e630'}.abs-action-delete:hover:after,.extensions-information .list .extension-delete:hover:after{color:#35302c}.abs-action-button-as-link,.action-advanced,.data-grid .action-delete{line-height:1.36;padding:0;color:#008bdb;text-decoration:none;background:0 0;border:0;display:inline;font-weight:400;border-radius:0}.abs-action-button-as-link:visited,.action-advanced:visited,.data-grid .action-delete:visited{color:#008bdb;text-decoration:none}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{text-decoration:underline}.abs-action-button-as-link:active,.action-advanced:active,.data-grid .action-delete:active{color:#ff5501;text-decoration:underline}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{color:#0fa7ff}.abs-action-button-as-link:active,.abs-action-button-as-link:focus,.abs-action-button-as-link:hover,.action-advanced:active,.action-advanced:focus,.action-advanced:hover,.data-grid .action-delete:active,.data-grid .action-delete:focus,.data-grid .action-delete:hover{background:0 0;border:0}.abs-action-button-as-link.disabled,.abs-action-button-as-link[disabled],.action-advanced.disabled,.action-advanced[disabled],.data-grid .action-delete.disabled,.data-grid .action-delete[disabled],fieldset[disabled] .abs-action-button-as-link,fieldset[disabled] .action-advanced,fieldset[disabled] .data-grid .action-delete{color:#008bdb;opacity:.5;cursor:default;pointer-events:none;text-decoration:underline}.abs-action-button-as-link:active,.abs-action-button-as-link:not(:focus),.action-advanced:active,.action-advanced:not(:focus),.data-grid .action-delete:active,.data-grid .action-delete:not(:focus){box-shadow:none}.abs-action-button-as-link:focus,.action-advanced:focus,.data-grid .action-delete:focus{color:#0fa7ff}.abs-action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.abs-action-default:active,.abs-action-default:focus,.abs-action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.abs-action-primary,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary,button.primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.abs-action-primary:active,.abs-action-primary:focus,.abs-action-primary:hover,.page-actions .page-actions-buttons>button.action-primary:active,.page-actions .page-actions-buttons>button.action-primary:focus,.page-actions .page-actions-buttons>button.action-primary:hover,.page-actions .page-actions-buttons>button.primary:active,.page-actions .page-actions-buttons>button.primary:focus,.page-actions .page-actions-buttons>button.primary:hover,.page-actions>button.action-primary:active,.page-actions>button.action-primary:focus,.page-actions>button.action-primary:hover,.page-actions>button.primary:active,.page-actions>button.primary:focus,.page-actions>button.primary:hover,button.primary:active,button.primary:focus,button.primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-primary.disabled,.abs-action-primary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],button.primary.disabled,button.primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-secondary,.modal-popup .modal-footer .action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions>button.action-secondary,button.secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.abs-action-secondary:active,.abs-action-secondary:focus,.abs-action-secondary:hover,.modal-popup .modal-footer .action-primary:active,.modal-popup .modal-footer .action-primary:focus,.modal-popup .modal-footer .action-primary:hover,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions .page-actions-buttons>button.action-secondary:focus,.page-actions .page-actions-buttons>button.action-secondary:hover,.page-actions>button.action-secondary:active,.page-actions>button.action-secondary:focus,.page-actions>button.action-secondary:hover,button.secondary:active,button.secondary:focus,button.secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-secondary:active,.modal-popup .modal-footer .action-primary:active,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions>button.action-secondary:active,button.secondary:active{background-color:#35302c}.abs-action-tertiary,.modal-popup .modal-footer .action-secondary,button.tertiary{background-color:transparent;border-color:transparent;text-shadow:none;color:#008bdb}.abs-action-tertiary:active,.abs-action-tertiary:focus,.abs-action-tertiary:hover,.modal-popup .modal-footer .action-secondary:active,.modal-popup .modal-footer .action-secondary:focus,.modal-popup .modal-footer .action-secondary:hover,button.tertiary:active,button.tertiary:focus,button.tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#0fa7ff;text-decoration:underline}.abs-action-quaternary,.page-actions .page-actions-buttons>button,.page-actions>button{background-color:transparent;border-color:transparent;text-shadow:none;color:#333}.abs-action-quaternary:active,.abs-action-quaternary:focus,.abs-action-quaternary:hover,.page-actions .page-actions-buttons>button:active,.page-actions .page-actions-buttons>button:focus,.page-actions .page-actions-buttons>button:hover,.page-actions>button:active,.page-actions>button:focus,.page-actions>button:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#1a1a1a}.abs-action-menu,.actions-split .abs-action-menu .action-submenu,.actions-split .abs-action-menu .action-submenu .action-submenu,.actions-split .action-menu,.actions-split .action-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.actions-split .dropdown-menu{text-align:left;background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu._active,.actions-split .abs-action-menu .action-submenu .action-submenu._active,.actions-split .abs-action-menu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .action-menu._active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .actions-split .dropdown-menu .action-submenu._active,.actions-split .dropdown-menu._active{display:block}.abs-action-menu>li,.actions-split .abs-action-menu .action-submenu .action-submenu>li,.actions-split .abs-action-menu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .action-menu>li,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .actions-split .dropdown-menu .action-submenu>li,.actions-split .dropdown-menu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu>li>a:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .abs-action-menu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .action-menu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu>li>a:hover{text-decoration:none}.abs-action-menu>li._visible,.abs-action-menu>li:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu .action-submenu>li:hover,.actions-split .abs-action-menu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .action-menu>li._visible,.actions-split .action-menu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu>li:hover,.actions-split .dropdown-menu>li._visible,.actions-split .dropdown-menu>li:hover{background-color:#e3e3e3}.abs-action-menu>li:active,.actions-split .abs-action-menu .action-submenu .action-submenu>li:active,.actions-split .abs-action-menu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .action-menu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu>li:active,.actions-split .dropdown-menu>li:active{background-color:#cacaca}.abs-action-menu>li._parent,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent,.actions-split .abs-action-menu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .action-menu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent,.actions-split .dropdown-menu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-menu-item,.abs-action-menu .item,.actions-split .abs-action-menu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .item,.actions-split .abs-action-menu .action-submenu .item,.actions-split .action-menu .action-menu-item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .item,.actions-split .action-menu .item,.actions-split .actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .actions-split .dropdown-menu .action-submenu .item,.actions-split .dropdown-menu .action-menu-item,.actions-split .dropdown-menu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu a.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .abs-action-menu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .action-menu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu a.action-menu-item{color:#333}.abs-action-menu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.abs-action-wrap-triangle{position:relative}.abs-action-wrap-triangle .action-default{width:100%}.abs-action-wrap-triangle .action-default:after,.abs-action-wrap-triangle .action-default:before{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.abs-action-wrap-triangle .action-default:active,.abs-action-wrap-triangle .action-default:focus,.abs-action-wrap-triangle .action-default:hover{box-shadow:none}._keyfocus .abs-action-wrap-triangle .action-default:focus{box-shadow:0 0 0 1px #007bdb}.ie10 .abs-action-wrap-triangle .action-default.disabled,.ie10 .abs-action-wrap-triangle .action-default[disabled],.ie9 .abs-action-wrap-triangle .action-default.disabled,.ie9 .abs-action-wrap-triangle .action-default[disabled]{background-color:#fcfcfc;opacity:1;text-shadow:none}.abs-action-wrap-triangle-right{display:inline-block;padding-right:1.6rem;position:relative}.abs-action-wrap-triangle-right .action-default:after,.abs-action-wrap-triangle-right .action-default:before{border-color:transparent transparent transparent #e3e3e3;border-width:1.7rem 0 1.6rem 1.7rem;left:100%;margin-left:-1.7rem}.abs-action-wrap-triangle-right .action-default:before{border-left-color:#949494;right:-1px}.abs-action-wrap-triangle-right .action-default:active:after,.abs-action-wrap-triangle-right .action-default:focus:after,.abs-action-wrap-triangle-right .action-default:hover:after{border-left-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-right .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-right .action-default[disabled]:after{border-color:transparent transparent transparent #fcfcfc}.abs-action-wrap-triangle-right .action-primary:after{border-color:transparent transparent transparent #eb5202}.abs-action-wrap-triangle-right .action-primary:active:after,.abs-action-wrap-triangle-right .action-primary:focus:after,.abs-action-wrap-triangle-right .action-primary:hover:after{border-left-color:#ba4000}.abs-action-wrap-triangle-left{display:inline-block;padding-left:1.6rem}.abs-action-wrap-triangle-left .action-default{text-indent:-.85rem}.abs-action-wrap-triangle-left .action-default:after,.abs-action-wrap-triangle-left .action-default:before{border-color:transparent #e3e3e3 transparent transparent;border-width:1.7rem 1.7rem 1.6rem 0;margin-right:-1.7rem;right:100%}.abs-action-wrap-triangle-left .action-default:before{border-right-color:#949494;left:-1px}.abs-action-wrap-triangle-left .action-default:active:after,.abs-action-wrap-triangle-left .action-default:focus:after,.abs-action-wrap-triangle-left .action-default:hover:after{border-right-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-left .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-left .action-default[disabled]:after{border-color:transparent #fcfcfc transparent transparent}.abs-action-wrap-triangle-left .action-primary:after{border-color:transparent #eb5202 transparent transparent}.abs-action-wrap-triangle-left .action-primary:active:after,.abs-action-wrap-triangle-left .action-primary:focus:after,.abs-action-wrap-triangle-left .action-primary:hover:after{border-right-color:#ba4000}.action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.action-default:active,.action-default:focus,.action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.action-primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.action-primary:active,.action-primary:focus,.action-primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-primary.disabled,.action-primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.action-secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.action-secondary:active,.action-secondary:focus,.action-secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-secondary:active{background-color:#35302c}.action-quaternary,.action-tertiary{background-color:transparent;border-color:transparent;text-shadow:none}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover,.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none}.action-tertiary{color:#008bdb}.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{color:#0fa7ff;text-decoration:underline}.action-quaternary{color:#333}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover{color:#1a1a1a}.action-close>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.action-close:before{content:'\e62f';transition:color .1s linear}.action-close:hover{cursor:pointer;text-decoration:none}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu .action-submenu .action-submenu._active,.abs-action-menu .action-submenu._active,.action-menu .action-submenu._active,.action-menu._active,.actions-split .action-menu .action-submenu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .dropdown-menu .action-submenu._active{display:block}.abs-action-menu .action-submenu .action-submenu>li,.abs-action-menu .action-submenu>li,.action-menu .action-submenu>li,.action-menu>li,.actions-split .action-menu .action-submenu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .dropdown-menu .action-submenu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu .action-submenu .action-submenu>li>a:hover,.abs-action-menu .action-submenu>li>a:hover,.action-menu .action-submenu>li>a:hover,.action-menu>li>a:hover,.actions-split .action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu>li>a:hover{text-decoration:none}.abs-action-menu .action-submenu .action-submenu>li._visible,.abs-action-menu .action-submenu .action-submenu>li:hover,.abs-action-menu .action-submenu>li._visible,.abs-action-menu .action-submenu>li:hover,.action-menu .action-submenu>li._visible,.action-menu .action-submenu>li:hover,.action-menu>li._visible,.action-menu>li:hover,.actions-split .action-menu .action-submenu .action-submenu>li._visible,.actions-split .action-menu .action-submenu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu>li:hover{background-color:#e3e3e3}.abs-action-menu .action-submenu .action-submenu>li:active,.abs-action-menu .action-submenu>li:active,.action-menu .action-submenu>li:active,.action-menu>li:active,.actions-split .action-menu .action-submenu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu>li:active{background-color:#cacaca}.abs-action-menu .action-submenu .action-submenu>li._parent,.abs-action-menu .action-submenu>li._parent,.action-menu .action-submenu>li._parent,.action-menu>li._parent,.actions-split .action-menu .action-submenu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.abs-action-menu .action-submenu>li._parent>.action-menu-item,.action-menu .action-submenu>li._parent>.action-menu-item,.action-menu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .item,.abs-action-menu .action-submenu .item,.action-menu .action-menu-item,.action-menu .action-submenu .action-menu-item,.action-menu .action-submenu .item,.action-menu .item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .item,.actions-split .action-menu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu .action-submenu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu .action-submenu,.ie9 .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .action-menu .action-submenu,.ie9 .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu .action-submenu .action-submenu a.action-menu-item,.abs-action-menu .action-submenu a.action-menu-item,.action-menu .action-submenu a.action-menu-item,.action-menu a.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu a.action-menu-item{color:#333}.abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.abs-action-menu .action-submenu a.action-menu-item:focus,.action-menu .action-submenu a.action-menu-item:focus,.action-menu a.action-menu-item:focus,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.messages .message:last-child{margin:0 0 2rem}.message{background:#fffbbb;border:none;border-radius:0;color:#333;font-size:1.4rem;margin:0 0 1px;padding:1.8rem 4rem 1.8rem 5.5rem;position:relative;text-shadow:none}.message:before{background:0 0;border:0;color:#007bdb;content:'\e61a';font-family:Icons;font-size:1.9rem;font-style:normal;font-weight:400;height:auto;left:1.9rem;line-height:inherit;margin-top:-1.3rem;position:absolute;speak:none;text-shadow:none;top:50%;width:auto}.message-notice:before{color:#007bdb;content:'\e61a'}.message-warning:before{color:#eb5202;content:'\e623'}.message-error{background:#fcc}.message-error:before{color:#e22626;content:'\e632';font-size:1.5rem;left:2.2rem;margin-top:-1rem}.message-success:before{color:#79a22e;content:'\e62d'}.message-spinner:before{display:none}.message-spinner .spinner{font-size:2.5rem;left:1.5rem;position:absolute;top:1.5rem}.message-in-rating-edit{margin-left:1.8rem;margin-right:1.8rem}.modal-popup .action-close,.modal-slide .action-close{color:#736963;position:absolute;right:0;top:0;z-index:1}.modal-popup .action-close:active,.modal-slide .action-close:active{-ms-transform:none;transform:none}.modal-popup .action-close:active:before,.modal-slide .action-close:active:before{font-size:1.8rem}.modal-popup .action-close:hover:before,.modal-slide .action-close:hover:before{color:#58504b}.modal-popup .action-close:before,.modal-slide .action-close:before{font-size:2rem}.modal-popup .action-close:focus,.modal-slide .action-close:focus{background-color:transparent}.modal-popup.prompt .prompt-message{padding:2rem 0}.modal-popup.prompt .prompt-message input{width:100%}.modal-popup.confirm .modal-inner-wrap .message,.modal-popup.prompt .modal-inner-wrap .message{background:#fff}.modal-popup.modal-system-messages .modal-inner-wrap{background:#fffbbb}.modal-popup._image-box .modal-inner-wrap{margin:5rem auto;max-width:78rem;position:static}.modal-popup._image-box .thumbnail-preview{padding-bottom:3rem;text-align:center}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image-block{border:1px solid #ccc;margin:0 auto 2rem;max-width:58rem;padding:2rem}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image{max-height:54rem}.modal-popup .modal-title{font-size:2.4rem;margin-right:6.4rem}.modal-popup .modal-footer{padding-top:2.6rem;text-align:right}.modal-popup .action-close{padding:3rem}.modal-popup .action-close:active,.modal-popup .action-close:focus{background:0 0;padding-right:3.1rem;padding-top:3.1rem}.modal-slide .modal-content-new-attribute{-webkit-overflow-scrolling:touch;overflow:auto;padding-bottom:0}.modal-slide .modal-content-new-attribute iframe{margin-bottom:-2.5rem}.modal-slide .modal-title{font-size:2.1rem;margin-right:5.7rem}.modal-slide .action-close{padding:2.1rem 2.6rem}.modal-slide .action-close:active{padding-right:2.7rem;padding-top:2.2rem}.modal-slide .page-main-actions{margin-bottom:.6rem;margin-top:2.1rem}.modal-slide .magento-message{padding:0 3rem 3rem;position:relative}.modal-slide .magento-message .insert-title-inner,.modal-slide .main-col .insert-title-inner{border-bottom:1px solid #adadad;margin:0 0 2rem;padding-bottom:.5rem}.modal-slide .magento-message .insert-actions,.modal-slide .main-col .insert-actions{float:right}.modal-slide .magento-message .title,.modal-slide .main-col .title{font-size:1.6rem;padding-top:.5rem}.modal-slide .main-col,.modal-slide .side-col{float:left;padding-bottom:0}.modal-slide .main-col:after,.modal-slide .side-col:after{display:none}.modal-slide .side-col{width:20%}.modal-slide .main-col{padding-right:0;width:80%}.modal-slide .content-footer .form-buttons{float:right}.modal-title{font-weight:400;margin-bottom:0;min-height:1em}.modal-title span{font-size:1.4rem;font-style:italic;margin-left:1rem}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}.spinner>span:nth-child(1){animation-delay:.27s;-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){animation-delay:.36s;-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){animation-delay:.45s;-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){animation-delay:.54s;-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){animation-delay:.63s;-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){animation-delay:.72s;-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){animation-delay:.81s;-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){animation-delay:.9;-ms-transform:rotate(0deg);transform:rotate(0deg)}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span{-ms-transform:scale(0.4);transform:scale(0.4);animation-name:fade;animation-duration:.72s;animation-iteration-count:infinite;animation-direction:linear;background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.popup-loading{background:rgba(255,255,255,.8);border-color:#ef672f;color:#ef672f;font-size:14px;font-weight:700;left:50%;margin-left:-100px;padding:100px 0 10px;position:fixed;text-align:center;top:40%;width:200px;z-index:1003}.popup-loading:after{background-image:url(../images/loader-1.gif);content:'';height:64px;left:50%;margin:-32px 0 0 -32px;position:absolute;top:40%;width:64px;z-index:2}.loading-mask,.loading-old{background:rgba(255,255,255,.4);bottom:0;left:0;position:fixed;right:0;top:0;z-index:2003}.loading-mask img,.loading-old img{display:none}.loading-mask p,.loading-old p{margin-top:118px}.loading-mask .loader,.loading-old .loader{background:url(../images/loader-1.gif) 50% 30% no-repeat #f7f3eb;border-radius:5px;bottom:0;color:#575757;font-size:14px;font-weight:700;height:160px;left:0;margin:auto;opacity:.95;position:absolute;right:0;text-align:center;top:0;width:160px}.admin-user{float:right;line-height:1.36;margin-left:.3rem;z-index:490}.admin-user._active .admin__action-dropdown,.admin-user.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin-user .admin__action-dropdown{height:3.3rem;padding:.7rem 2.8rem .4rem 4rem}.admin-user .admin__action-dropdown._active:after,.admin-user .admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:after{border-color:#777 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.3rem;top:50%;transition:all .2s linear;width:0}._active .admin-user .admin__action-dropdown:after,.active .admin-user .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin-user .admin__action-dropdown:before{color:#777;content:'\e600';font-size:2rem;left:1.1rem;margin-top:-1.1rem;position:absolute;top:50%}.admin-user .admin__action-dropdown:hover:before{color:#333}.admin-user .admin__action-dropdown-menu{min-width:20rem;padding-left:1rem;padding-right:1rem}.admin-user .admin__action-dropdown-menu>li>a{padding-left:.5em;padding-right:1.8rem;transition:background-color .1s linear;white-space:nowrap}.admin-user .admin__action-dropdown-menu>li>a:hover{background-color:#e0f6fe;color:#333}.admin-user .admin__action-dropdown-menu>li>a:active{background-color:#c7effd;bottom:-1px;position:relative}.admin-user .admin__action-dropdown-menu .admin-user-name{text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:20rem;overflow:hidden;vertical-align:top}.admin-user-account-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:11.2rem}.search-global{float:right;margin-right:-.3rem;position:relative;z-index:480}.search-global-field{min-width:5rem}.search-global-field._active .search-global-input{background-color:#fff;border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);padding-right:4rem;width:25rem}.search-global-field._active .search-global-action{display:block;height:3.3rem;position:absolute;right:0;text-indent:-100%;top:0;width:5rem;z-index:3}.search-global-field .autocomplete-results{height:3.3rem;position:absolute;right:0;top:0;width:25rem}.search-global-field .search-global-menu{border:1px solid #007bdb;border-top-color:transparent;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin-top:-2px;padding:0;position:absolute;right:0;top:100%;z-index:2}.search-global-field .search-global-menu:after{background-color:#fff;content:'';height:5px;left:0;position:absolute;right:0;top:-5px}.search-global-field .search-global-menu>li{background-color:#fff;border-top:1px solid #ddd;display:block;font-size:1.2rem;padding:.75rem 1.4rem .55rem}.search-global-field .search-global-menu>li._active{background-color:#e0f6fe}.search-global-field .search-global-menu .title{display:block;font-size:1.4rem}.search-global-field .search-global-menu .type{color:#1a1a1a;display:block}.search-global-label{cursor:pointer;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;z-index:2}.search-global-label:active{-ms-transform:scale(0.9);transform:scale(0.9)}.search-global-label:hover:before{color:#000}.search-global-label:before{color:#777;content:'\e60c';font-size:2rem}.search-global-input{background-color:transparent;border:1px solid transparent;font-size:1.4rem;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;transition:all .1s linear,width .3s linear;width:5rem;z-index:1}.search-global-action{display:none}.notifications-wrapper{float:right;line-height:1;position:relative}.notifications-wrapper.active{z-index:500}.notifications-wrapper.active .notifications-action{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.notifications-wrapper.active .notifications-action:after{background-color:#fff;border:none;content:'';display:block;height:6px;left:-6px;margin-top:0;position:absolute;right:0;top:100%;width:auto}.notifications-wrapper .admin__action-dropdown-menu{padding:1rem 0 0;width:32rem}.notifications-action{color:#777;height:3.3rem;padding:.75rem 2rem .65rem}.notifications-action:after{display:none}.notifications-action:before{content:'\e607';font-size:1.9rem;margin-right:0}.notifications-action:active:before{position:relative;top:1px}.notifications-action .notifications-counter{background-color:#e22626;border-radius:1em;color:#fff;display:inline-block;font-size:1.1rem;font-weight:700;left:50%;margin-left:.3em;margin-top:-1.1em;padding:.3em .5em;position:absolute;top:50%}.notifications-entry{line-height:1.36;padding:.6rem 2rem .8rem;position:relative;transition:background-color .1s linear}.notifications-entry:hover{background-color:#e0f6fe}.notifications-entry.notifications-entry-last{margin:0 2rem;padding:.3rem 0 1.3rem;text-align:center}.notifications-entry.notifications-entry-last:hover{background-color:transparent}.notifications-entry+.notifications-entry-last{border-top:1px solid #ddd;padding-bottom:.6rem}.notifications-entry ._cutted{cursor:pointer}.notifications-entry ._cutted .notifications-entry-description-start:after{content:'...'}.notifications-entry-title{color:#ef672f;display:block;font-size:1.1rem;font-weight:700;margin-bottom:.7rem;margin-right:1em}.notifications-entry-description{color:#333;font-size:1.1rem;margin-bottom:.8rem}.notifications-entry-description-end{display:none}.notifications-entry-description-end._show{display:inline}.notifications-entry-time{color:#777;font-size:1.1rem}.notifications-close{line-height:1;padding:1rem;position:absolute;right:0;top:.6rem}.notifications-close:before{color:#ccc;content:'\e620';transition:color .1s linear}.notifications-close:hover:before{color:#b3b3b3}.notifications-close:active{-ms-transform:scale(0.95);transform:scale(0.95)}.page-header-actions{padding-top:1.1rem}.page-header-hgroup{padding-right:1.5rem}.page-title{color:#333;font-size:2.8rem}.page-header{padding:1.5rem 3rem}.menu-wrapper{display:inline-block;position:relative;width:8.8rem;z-index:700}.menu-wrapper:before{background-color:#373330;bottom:0;content:'';left:0;position:fixed;top:0;width:8.8rem;z-index:699}.menu-wrapper._fixed{left:0;position:fixed;top:0}.menu-wrapper._fixed~.page-wrapper{margin-left:8.8rem}.menu-wrapper .logo{display:block;height:8.8rem;padding:2.4rem 0 2.2rem;position:relative;text-align:center;z-index:700}._keyfocus .menu-wrapper .logo:focus{background-color:#4a4542;box-shadow:none}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a{background-color:#373330}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a:after{display:none}.menu-wrapper .logo:hover .logo-img{-webkit-filter:brightness(1.1);filter:brightness(1.1)}.menu-wrapper .logo:active .logo-img{-ms-transform:scale(0.95);transform:scale(0.95)}.menu-wrapper .logo .logo-img{height:4.2rem;transition:-webkit-filter .2s linear,filter .2s linear,transform .1s linear;width:3.5rem}.abs-menu-separator,.admin__menu .item-partners>a:after,.admin__menu .level-0:first-child>a:after{background-color:#736963;content:'';display:block;height:1px;left:0;margin-left:16%;position:absolute;top:0;width:68%}.admin__menu li{display:block}.admin__menu .level-0:first-child>a{position:relative}.admin__menu .level-0._active>a,.admin__menu .level-0:hover>a{color:#f7f3eb}.admin__menu .level-0._active>a{background-color:#524d49}.admin__menu .level-0:hover>a{background-color:#4a4542}.admin__menu .level-0>a{color:#aaa6a0;display:block;font-size:1rem;letter-spacing:.025em;min-height:6.2rem;padding:1.2rem .5rem .5rem;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;transition:background-color .1s linear;word-wrap:break-word;z-index:700}.admin__menu .level-0>a:focus{box-shadow:none}.admin__menu .level-0>a:before{content:'\e63a';display:block;font-size:2.2rem;height:2.2rem}.admin__menu .level-0>.submenu{background-color:#4a4542;box-shadow:0 0 3px #000;left:100%;min-height:calc(8.8rem + 2rem + 100%);padding:2rem 0 0;position:absolute;top:0;-ms-transform:translateX(-100%);transform:translateX(-100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;visibility:hidden;z-index:697}.ie10 .admin__menu .level-0>.submenu,.ie11 .admin__menu .level-0>.submenu{height:100%}.admin__menu .level-0._show>.submenu{-ms-transform:translateX(0);transform:translateX(0);visibility:visible;z-index:698}.admin__menu .level-1{margin-left:1.5rem;margin-right:1.5rem}.admin__menu [class*=level-]:not(.level-0) a{display:block;padding:1.25rem 1.5rem}.admin__menu [class*=level-]:not(.level-0) a:hover{background-color:#403934}.admin__menu [class*=level-]:not(.level-0) a:active{background-color:#322c29;padding-bottom:1.15rem;padding-top:1.35rem}.admin__menu .submenu li{min-width:23.8rem}.admin__menu .submenu a{color:#fcfcfc;transition:background-color .1s linear}.admin__menu .submenu a:focus,.admin__menu .submenu a:hover{box-shadow:none;text-decoration:none}._keyfocus .admin__menu .submenu a:focus{background-color:#403934}._keyfocus .admin__menu .submenu a:active{background-color:#322c29}.admin__menu .submenu .parent{margin-bottom:4.5rem}.admin__menu .submenu .parent .submenu-group-title{color:#a79d95;display:block;font-size:1.6rem;font-weight:600;margin-bottom:.7rem;padding:1.25rem 1.5rem;pointer-events:none}.admin__menu .submenu .column{display:table-cell}.admin__menu .submenu-title{color:#fff;display:block;font-size:2.2rem;font-weight:600;margin-bottom:4.2rem;margin-left:3rem;margin-right:5.8rem}.admin__menu .submenu-sub-title{color:#fff;display:block;font-size:1.2rem;margin:-3.8rem 5.8rem 3.8rem 3rem}.admin__menu .action-close{padding:2.4rem 2.8rem;position:absolute;right:0;top:0}.admin__menu .action-close:before{color:#a79d95;font-size:1.7rem}.admin__menu .action-close:hover:before{color:#fff}.admin__menu .item-dashboard>a:before{content:'\e604';font-size:1.8rem;padding-top:.4rem}.admin__menu .item-sales>a:before{content:'\e60b'}.admin__menu .item-catalog>a:before{content:'\e608'}.admin__menu .item-customer>a:before{content:'\e603';font-size:2.6rem;position:relative;top:-.4rem}.admin__menu .item-marketing>a:before{content:'\e609';font-size:2rem;padding-top:.2rem}.admin__menu .item-content>a:before{content:'\e602';font-size:2.4rem;position:relative;top:-.2rem}.admin__menu .item-report>a:before{content:'\e60a'}.admin__menu .item-stores>a:before{content:'\e60d';font-size:1.9rem;padding-top:.3rem}.admin__menu .item-system>a:before{content:'\e610'}.admin__menu .item-partners._active>a:after,.admin__menu .item-system._current+.item-partners>a:after{display:none}.admin__menu .item-partners>a{padding-bottom:1rem}.admin__menu .item-partners>a:before{content:'\e612'}.admin__menu .level-0>.submenu>ul>.level-1:only-of-type>.submenu-group-title,.admin__menu .submenu .column:only-of-type .submenu-group-title{display:none}.admin__menu-overlay{bottom:0;left:0;position:fixed;right:0;top:0;z-index:697}.store-switcher{color:#333;float:left;font-size:1.3rem;margin-top:.7rem}.store-switcher .admin__action-dropdown{background-color:#f8f8f8;margin-left:.5em}.store-switcher .dropdown{display:inline-block;position:relative}.store-switcher .dropdown:after,.store-switcher .dropdown:before{content:'';display:table}.store-switcher .dropdown:after{clear:both}.store-switcher .dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e607';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle:active:after,.store-switcher .dropdown .action.toggle:hover:after{color:#333}.store-switcher .dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle.active:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e618';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle.active:active:after,.store-switcher .dropdown .action.toggle.active:hover:after{color:#333}.store-switcher .dropdown .dropdown-menu{margin:4px 0 0;padding:0;list-style:none;background:#fff;border:1px solid #aaa6a0;min-width:19.5rem;z-index:100;box-sizing:border-box;display:none;position:absolute;top:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.store-switcher .dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .dropdown .dropdown-menu li:hover{background:0 0;cursor:pointer}.store-switcher .dropdown.active{overflow:visible}.store-switcher .dropdown.active .dropdown-menu{display:block}.store-switcher .dropdown-menu{left:0;margin-top:.5em;max-height:250px;overflow-y:auto;padding-top:.25em}.store-switcher .dropdown-menu li{border:0;cursor:default}.store-switcher .dropdown-menu li:hover{cursor:default}.store-switcher .dropdown-menu li a,.store-switcher .dropdown-menu li span{color:#333;display:block;padding:.5rem 1.3rem}.store-switcher .dropdown-menu li a{text-decoration:none}.store-switcher .dropdown-menu li a:hover{background:#e9e9e9}.store-switcher .dropdown-menu li span{color:#adadad;cursor:default}.store-switcher .dropdown-menu li.current span{background:#eee;color:#333}.store-switcher .dropdown-menu .store-switcher-store a,.store-switcher .dropdown-menu .store-switcher-store span{padding-left:2.6rem}.store-switcher .dropdown-menu .store-switcher-store-view a,.store-switcher .dropdown-menu .store-switcher-store-view span{padding-left:3.9rem}.store-switcher .dropdown-menu .dropdown-toolbar{border-top:1px solid #ebebeb;margin-top:1rem}.store-switcher .dropdown-menu .dropdown-toolbar a:before{content:'\e610';margin-right:.25em;position:relative;top:1px}.store-switcher-label{font-weight:700}.store-switcher-alt{display:inline-block;position:relative}.store-switcher-alt.active .dropdown-menu{display:block}.store-switcher-alt .dropdown-menu{margin-top:2px;white-space:nowrap}.store-switcher-alt .dropdown-menu ul{list-style:none;margin:0;padding:0}.store-switcher-alt strong{color:#a79d95;display:block;font-size:14px;font-weight:500;line-height:1.333;padding:5px 10px}.store-switcher-alt .store-selected{color:#676056;cursor:pointer;font-size:12px;font-weight:400;line-height:1.333}.store-switcher-alt .store-selected:after{-webkit-font-smoothing:antialiased;color:#afadac;content:'\e02c';font-style:normal;font-weight:400;margin:0 0 0 3px;speak:none;vertical-align:text-top}.store-switcher-alt .store-switcher-store,.store-switcher-alt .store-switcher-website{padding:0}.store-switcher-alt .store-switcher-store:hover,.store-switcher-alt .store-switcher-website:hover{background:0 0}.store-switcher-alt .manage-stores,.store-switcher-alt .store-switcher-all,.store-switcher-alt .store-switcher-store-view{padding:0}.store-switcher-alt .manage-stores>a,.store-switcher-alt .store-switcher-all>a{color:#676056;display:block;font-size:12px;padding:8px 15px;text-decoration:none}.store-switcher-website{margin:5px 0 0}.store-switcher-website>strong{padding-left:13px}.store-switcher-store{margin:1px 0 0}.store-switcher-store>strong{padding-left:20px}.store-switcher-store>ul{margin-top:1px}.store-switcher-store-view:first-child{border-top:1px solid #e5e5e5}.store-switcher-store-view>a{color:#333;display:block;font-size:13px;padding:5px 15px 5px 24px;text-decoration:none}.store-view:not(.store-switcher){float:left}.store-view .store-switcher-label{display:inline-block;margin-top:1rem}.tooltip{margin-left:.5em}.tooltip .help a,.tooltip .help span{cursor:pointer;display:inline-block;height:22px;position:relative;vertical-align:middle;width:22px;z-index:2}.tooltip .help a:before,.tooltip .help span:before{color:#333;content:'\e633';font-size:1.7rem}.tooltip .help a:hover{text-decoration:none}.tooltip .tooltip-content{background:#000;border-radius:3px;color:#fff;display:none;margin-left:-19px;margin-top:10px;max-width:200px;padding:4px 8px;position:absolute;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{border-bottom:5px solid #000;border-left:5px solid transparent;border-right:5px solid transparent;content:'';height:0;left:20px;opacity:.8;position:absolute;top:-5px;width:0}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}.page-actions._fixed,.page-main-actions:not(._hidden){background:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;padding:1.5rem}.page-main-actions{margin:0 0 3rem}.page-main-actions._hidden .store-switcher{display:none}.page-main-actions._hidden .page-actions-placeholder{min-height:50px}.page-actions{float:right}.page-main-actions .page-actions._fixed{left:8.8rem;position:fixed;right:0;top:0;z-index:501}.page-main-actions .page-actions._fixed .page-actions-inner:before{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;content:attr(data-title);float:left;font-size:2.8rem;margin-top:.3rem;max-width:50%}.page-actions .page-actions-buttons>button,.page-actions>button{float:right;margin-left:1.3rem}.page-actions .page-actions-buttons>button.action-back,.page-actions .page-actions-buttons>button.back,.page-actions>button.action-back,.page-actions>button.back{float:left;-ms-flex-order:-1;order:-1}.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before{content:'\e626';margin-right:.5em;position:relative;top:1px}.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary{-ms-flex-order:2;order:2}.page-actions .page-actions-buttons>button.save:not(.primary),.page-actions>button.save:not(.primary){-ms-flex-order:1;order:1}.page-actions .page-actions-buttons>button.delete,.page-actions>button.delete{-ms-flex-order:-1;order:-1}.page-actions .actions-split{float:right;margin-left:1.3rem;-ms-flex-order:2;order:2}.page-actions .actions-split .dropdown-menu .item{display:block}.page-actions-buttons{float:right;-ms-flex-pack:end;justify-content:flex-end;display:-ms-flexbox;display:flex}.customer-index-edit .page-actions-buttons{background-color:transparent}.admin__page-nav{background:#f1f1f1;border:1px solid #e3e3e3}.admin__page-nav._collapsed:first-child{border-bottom:none}.admin__page-nav._collapsed._show{border-bottom:1px solid #e3e3e3}.admin__page-nav._collapsed._show ._collapsible{background:#f1f1f1}.admin__page-nav._collapsed._show ._collapsible:after{content:'\e62b'}.admin__page-nav._collapsed._show ._collapsible+.admin__page-nav-items{display:block}.admin__page-nav._collapsed._hide .admin__page-nav-title-messages,.admin__page-nav._collapsed._hide .admin__page-nav-title-messages ._active{display:inline-block}.admin__page-nav+._collapsed{border-bottom:none;border-top:none}.admin__page-nav-title{border-bottom:1px solid #e3e3e3;color:#303030;display:block;font-size:1.4rem;line-height:1.2;margin:0 0 -1px;padding:1.8rem 1.5rem;position:relative;text-transform:uppercase}.admin__page-nav-title._collapsible{background:#fff;cursor:pointer;margin:0;padding-right:3.5rem;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-title._collapsible+.admin__page-nav-items{display:none;margin-top:-1px}.admin__page-nav-title._collapsible:after{content:'\e628';font-size:1.3rem;font-weight:700;position:absolute;right:1.8rem;top:2rem}.admin__page-nav-title._collapsible:hover{background:#f1f1f1}.admin__page-nav-title._collapsible:last-child{margin:0 0 -1px}.admin__page-nav-title strong{font-weight:700}.admin__page-nav-title .admin__page-nav-title-messages{display:none}.admin__page-nav-items{list-style-type:none;margin:0;padding:1rem 0 1.3rem}.admin__page-nav-item{border-left:3px solid transparent;margin-left:.7rem;padding:0;position:relative;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-item:hover{border-color:#e4e4e4}.admin__page-nav-item:hover .admin__page-nav-link{background:#e4e4e4;color:#303030;text-decoration:none}.admin__page-nav-item._active,.admin__page-nav-item.ui-state-active{border-color:#eb5202}.admin__page-nav-item._active .admin__page-nav-link,.admin__page-nav-item.ui-state-active .admin__page-nav-link{background:#fff;border-color:#e3e3e3;border-right:1px solid #fff;color:#303030;margin-right:-1px;font-weight:600}.admin__page-nav-item._loading:before,.admin__page-nav-item.ui-tabs-loading:before{display:none}.admin__page-nav-item._loading .admin__page-nav-item-message-loader,.admin__page-nav-item.ui-tabs-loading .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-link{border:1px solid transparent;border-width:1px 0;color:#303030;display:block;font-weight:500;line-height:1.2;margin:0 0 -1px;padding:2rem 4rem 2rem 1rem;transition:border-color .1s ease-out,background-color .1s ease-out;word-wrap:break-word}.admin__page-nav-item-messages{display:inline-block}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-size:1.4rem;font-weight:400;left:-1rem;line-height:1.36;padding:1.5rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after,.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf;margin-top:1px}.admin__page-nav-item-message-loader{display:none;margin-top:-1rem;position:absolute;right:0;top:50%}.admin__page-nav-item-message-loader .spinner{font-size:2rem;margin-right:1.5rem}._loading>.admin__page-nav-item-messages .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-item-message{position:relative}.admin__page-nav-item-message:hover{z-index:500}.admin__page-nav-item-message:hover .admin__page-nav-item-message-tooltip{display:block}.admin__page-nav-item-message._changed,.admin__page-nav-item-message._error{display:none}.admin__page-nav-item-message .admin__page-nav-item-message-icon{display:inline-block;font-size:1.4rem;padding-left:.8em;vertical-align:baseline}.admin__page-nav-item-message .admin__page-nav-item-message-icon:after{color:#666;content:'\e631'}._changed:not(._error)>.admin__page-nav-item-messages ._changed{display:inline-block}._error .admin__page-nav-item-message-icon:after{color:#eb5202;content:'\e623'}._error>.admin__page-nav-item-messages ._error{display:inline-block}._error>.admin__page-nav-item-messages ._error .spinner{font-size:2rem;margin-right:1.5rem}._error .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;left:-1rem;line-height:1.36;padding:2rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}._error .admin__page-nav-item-message-tooltip:after,._error .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}._error .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}._error .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf}.admin__data-grid-wrap-static .data-grid{box-sizing:border-box}.admin__data-grid-wrap-static .data-grid thead{color:#333}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td{background-color:#f5f5f5}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td._dragging{background-color:rgba(245,245,245,.95)}.admin__data-grid-wrap-static .data-grid ul{margin-left:1rem;padding-left:1rem}.admin__data-grid-wrap-static .admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-wrap-static .admin__data-grid-loading-mask .grid-loader{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-filters-actions-wrap{float:right}.data-grid-search-control-wrap{float:left;max-width:45.5rem;position:relative;width:35%}.data-grid-search-control-wrap :-ms-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-webkit-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-moz-placeholder{font-style:italic}.data-grid-search-control-wrap .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:.6rem 2rem .2rem;position:absolute;right:0;top:1px}.data-grid-search-control-wrap .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.data-grid-search-control-wrap .action-submit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.data-grid-search-control-wrap .action-submit:hover:before{color:#1a1a1a}._keyfocus .data-grid-search-control-wrap .action-submit:focus{box-shadow:0 0 0 1px #008bdb}.data-grid-search-control-wrap .action-submit:before{content:'\e60c';font-size:2rem;transition:color .1s linear}.data-grid-search-control-wrap .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.data-grid-search-control-wrap .abs-action-menu .action-submenu,.data-grid-search-control-wrap .abs-action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .action-menu,.data-grid-search-control-wrap .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:19.25rem;overflow-y:auto;z-index:398}.data-grid-search-control-wrap .action-menu-item._selected{background-color:#e0f6fe}.data-grid-search-control-wrap .data-grid-search-label{display:none}.data-grid-search-control{padding-right:6rem;width:100%}.data-grid-filters-action-wrap{float:left;padding-left:2rem}.data-grid-filters-action-wrap .action-default{font-size:1.3rem;margin-bottom:1rem;padding-left:1.7rem;padding-right:2.1rem;padding-top:.7rem}.data-grid-filters-action-wrap .action-default._active{background-color:#fff;border-bottom-color:#fff;border-right-color:#ccc;font-weight:600;margin:-.1rem 0 0;padding-bottom:1.6rem;padding-top:.8rem;position:relative;z-index:281}.data-grid-filters-action-wrap .action-default._active:after{background-color:#eb5202;bottom:100%;content:'';height:3px;left:-1px;position:absolute;right:-1px}.data-grid-filters-action-wrap .action-default:before{color:#333;content:'\e605';font-size:1.8rem;margin-right:.4rem;position:relative;top:-1px;vertical-align:top}.data-grid-filters-action-wrap .filters-active{display:none}.admin__action-grid-select .admin__control-select{margin:-.5rem .5rem 0 0;padding-bottom:.6rem;padding-top:.6rem}.admin__data-grid-filters-wrap{opacity:0;visibility:hidden;clear:both;font-size:1.3rem;transition:opacity .3s ease}.admin__data-grid-filters-wrap._show{opacity:1;visibility:visible;border-bottom:1px solid #ccc;border-top:1px solid #ccc;margin-bottom:.7rem;padding:3.6rem 0 3rem;position:relative;top:-1px;z-index:280}.admin__data-grid-filters-wrap._show .admin__data-grid-filters,.admin__data-grid-filters-wrap._show .admin__data-grid-filters-footer{display:block}.admin__data-grid-filters-wrap .admin__form-field-label,.admin__data-grid-filters-wrap .admin__form-field-legend{display:block;font-weight:700;margin:0 0 .3rem;text-align:left}.admin__data-grid-filters-wrap .admin__form-field{display:inline-block;margin-bottom:2em;margin-left:0;padding-left:2rem;padding-right:2rem;vertical-align:top;width:calc(100% / 4 - 4px)}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field{display:block;float:none;margin-bottom:1.5rem;padding-left:0;padding-right:0;width:auto}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field:last-child{margin-bottom:0}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-label{border:1px solid transparent;float:left;font-weight:400;line-height:1.36;margin-bottom:0;padding-bottom:.6rem;padding-right:1em;padding-top:.6rem;width:25%}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-control{margin-left:25%}.admin__data-grid-filters-wrap .admin__action-multiselect,.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text,.admin__data-grid-filters-wrap .admin__form-field-label{font-size:1.3rem}.admin__data-grid-filters-wrap .admin__control-select{height:3.2rem;padding-top:.5rem}.admin__data-grid-filters-wrap .admin__action-multiselect:before{height:3.2rem;width:3.2rem}.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text._has-datepicker{width:100%}.admin__data-grid-filters{display:none;margin-left:-2rem;margin-right:-2rem}.admin__filters-legend{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-filters-footer{display:none;font-size:1.4rem}.admin__data-grid-filters-footer .admin__footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-filters-footer .admin__footer-secondary-actions{float:left;width:50%}.admin__data-grid-filters-current{border-bottom:.1rem solid #ccc;border-top:.1rem solid #ccc;display:none;font-size:1.3rem;margin-bottom:.9rem;padding-bottom:.8rem;padding-top:1.1rem;width:100%}.admin__data-grid-filters-current._show{display:table;position:relative;top:-1px;z-index:3}.admin__data-grid-filters-current._show+.admin__data-grid-filters-wrap._show{margin-top:-1rem}.admin__current-filters-actions-wrap,.admin__current-filters-list-wrap,.admin__current-filters-title-wrap{display:table-cell;vertical-align:top}.admin__current-filters-title{margin-right:1em;white-space:nowrap}.admin__current-filters-list-wrap{width:100%}.admin__current-filters-list{margin-bottom:0}.admin__current-filters-list>li{display:inline-block;font-weight:600;margin:0 1rem .5rem;padding-right:2.6rem;position:relative}.admin__current-filters-list .action-remove{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0;line-height:1;position:absolute;right:0;top:1px}.admin__current-filters-list .action-remove:hover{background-color:transparent;border:none;box-shadow:none}.admin__current-filters-list .action-remove:hover:before{color:#949494}.admin__current-filters-list .action-remove:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__current-filters-list .action-remove:before{color:#adadad;content:'\e620';font-size:1.6rem;transition:color .1s linear}.admin__current-filters-list .action-remove>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__current-filters-actions-wrap .action-clear{border:none;padding-bottom:0;padding-top:0;white-space:nowrap}.admin__data-grid-pager-wrap{float:right;text-align:right}.admin__data-grid-pager{display:inline-block;margin-left:3rem}.admin__data-grid-pager .admin__control-text::-webkit-inner-spin-button,.admin__data-grid-pager .admin__control-text::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.admin__data-grid-pager .admin__control-text{-moz-appearance:textfield;text-align:center;width:4.4rem}.action-next,.action-previous{width:4.4rem}.action-next:before,.action-previous:before{font-weight:700}.action-next>span,.action-previous>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-previous{margin-right:2.5rem;text-indent:-.25em}.action-previous:before{content:'\e629'}.action-next{margin-left:1.5rem;text-indent:.1em}.action-next:before{content:'\e62a'}.admin__data-grid-action-bookmarks{opacity:.98}.admin__data-grid-action-bookmarks .admin__action-dropdown-text:after{left:0;right:-6px}.admin__data-grid-action-bookmarks._active{z-index:290}.admin__data-grid-action-bookmarks .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:15rem;min-width:4.9rem;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown:before{content:'\e60f'}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu{font-size:1.3rem;left:0;padding:1rem 0;right:auto}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li{padding:0 5rem 0 0;position:relative;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action){transition:background-color .1s linear}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action):hover{background-color:#e3e3e3}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item{max-width:23rem;min-width:18rem;white-space:normal;word-break:break-all}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit{display:none;padding-bottom:1rem;padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit .action-dropdown-menu-item-actions{padding-bottom:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action{padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action+.action-dropdown-menu-item-last{padding-top:.5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a{color:#008bdb;text-decoration:none;display:inline-block;padding-left:1.1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a:hover{color:#0fa7ff;text-decoration:underline}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-last{padding-bottom:0}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item{display:none}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item-edit{display:block}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._active .action-dropdown-menu-link{font-weight:600}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{font-size:1.3rem;min-width:15rem;width:calc(100% - 4rem)}.ie9 .admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{width:15rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-actions{border-left:1px solid #fff;bottom:0;position:absolute;right:0;top:0;width:5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-link{color:#333;display:block;text-decoration:none;padding:1rem 1rem 1rem 2.1rem}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit,.admin__data-grid-action-bookmarks .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;vertical-align:top}.admin__data-grid-action-bookmarks .action-delete:hover,.admin__data-grid-action-bookmarks .action-edit:hover,.admin__data-grid-action-bookmarks .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before{font-size:1.7rem}.admin__data-grid-action-bookmarks .action-delete>span,.admin__data-grid-action-bookmarks .action-edit>span,.admin__data-grid-action-bookmarks .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit{padding:.6rem 1.4rem}.admin__data-grid-action-bookmarks .action-delete:active,.admin__data-grid-action-bookmarks .action-edit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__data-grid-action-bookmarks .action-submit{padding:.6rem 1rem .6rem .8rem}.admin__data-grid-action-bookmarks .action-submit:active{position:relative;right:-1px}.admin__data-grid-action-bookmarks .action-submit:before{content:'\e625'}.admin__data-grid-action-bookmarks .action-delete:before{content:'\e630'}.admin__data-grid-action-bookmarks .action-edit{padding-top:.8rem}.admin__data-grid-action-bookmarks .action-edit:before{content:'\e631'}.admin__data-grid-action-columns._active{opacity:.98;z-index:290}.admin__data-grid-action-columns .admin__action-dropdown:before{content:'\e610';font-size:1.8rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-columns-menu{color:#303030;font-size:1.3rem;overflow:hidden;padding:2.2rem 3.5rem 1rem;z-index:1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-header{border-bottom:1px solid #d1d1d1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-content{width:49.2rem}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-footer{border-top:1px solid #d1d1d1;padding-top:2.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content{max-height:22.85rem;overflow-y:auto;padding-top:1.5rem;position:relative;width:47.4rem}.admin__data-grid-action-columns-menu .admin__field-option{float:left;height:1.9rem;margin-bottom:1.5rem;padding:0 1rem 0 0;width:15.8rem}.admin__data-grid-action-columns-menu .admin__field-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-header{padding-bottom:1.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-footer{padding:1rem 0 2rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-secondary-actions{float:left;margin-left:-1em}.admin__data-grid-action-export._active{opacity:.98;z-index:290}.admin__data-grid-action-export .admin__action-dropdown:before{content:'\e635';font-size:1.7rem;left:.3rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-export-menu{padding-left:2rem;padding-right:2rem;padding-top:1rem}.admin__data-grid-action-export-menu .admin__action-dropdown-footer-main-actions{padding-bottom:2rem;padding-top:2.5rem;white-space:nowrap}.sticky-header{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:8.8rem;margin-top:-1px;padding:.5rem 3rem 0;position:fixed;right:0;top:77px;z-index:398}.sticky-header .admin__data-grid-wrap{margin-bottom:0;overflow-x:visible;padding-bottom:0}.sticky-header .admin__data-grid-header-row{position:relative;text-align:right}.sticky-header .admin__data-grid-header-row:last-child{margin:0}.sticky-header .admin__data-grid-actions-wrap,.sticky-header .admin__data-grid-filters-wrap,.sticky-header .admin__data-grid-pager-wrap,.sticky-header .data-grid-filters-actions-wrap,.sticky-header .data-grid-search-control-wrap{display:inline-block;float:none;vertical-align:top}.sticky-header .action-select-wrap{float:left;margin-right:1.5rem;width:16.66666667%}.sticky-header .admin__control-support-text{float:left}.sticky-header .data-grid-search-control-wrap{margin:-.5rem 0 0 1.1rem;width:auto}.sticky-header .data-grid-search-control-wrap .data-grid-search-label{box-sizing:border-box;cursor:pointer;display:block;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;position:relative;text-align:center}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before{color:#333;content:'\e60c';font-size:2rem;transition:color .1s linear}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:hover:before{color:#000}.sticky-header .data-grid-search-control-wrap .data-grid-search-label span{display:none}.sticky-header .data-grid-filters-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-left:0;position:relative}.sticky-header .data-grid-filters-actions-wrap .action-default{background-color:transparent;border:1px solid transparent;box-sizing:border-box;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;text-align:center;transition:all .15s ease}.sticky-header .data-grid-filters-actions-wrap .action-default span{display:none}.sticky-header .data-grid-filters-actions-wrap .action-default:before{margin:0}.sticky-header .data-grid-filters-actions-wrap .action-default._active{background-color:#fff;border-color:#adadad #adadad #fff;box-shadow:1px 1px 5px rgba(0,0,0,.5);z-index:210}.sticky-header .data-grid-filters-actions-wrap .action-default._active:after{background-color:#fff;content:'';height:6px;left:-2px;position:absolute;right:-6px;top:100%}.sticky-header .data-grid-filters-action-wrap{padding:0}.sticky-header .admin__data-grid-filters-wrap{background-color:#fff;border:1px solid #adadad;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:0;padding-left:3.5rem;padding-right:3.5rem;position:absolute;top:100%;width:100%;z-index:209}.sticky-header .admin__data-grid-filters-current+.admin__data-grid-filters-wrap._show{margin-top:-6px}.sticky-header .filters-active{background-color:#e04f00;border-radius:10px;color:#fff;display:block;font-size:1.4rem;font-weight:700;padding:.1rem .7rem;position:absolute;right:-7px;top:0;z-index:211}.sticky-header .filters-active:empty{padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-right:.3rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown{background-color:transparent;box-sizing:border-box;min-width:3.8rem;padding-left:.6rem;padding-right:.6rem;text-align:center}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:0;min-width:0;overflow:hidden}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:before{margin:0}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap{margin-right:1.1rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after,.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:after{display:none}.sticky-header .admin__data-grid-actions-wrap ._active .admin__action-dropdown{background-color:#fff}.sticky-header .admin__data-grid-action-bookmarks .admin__action-dropdown:before{position:relative;top:-3px}.sticky-header .admin__data-grid-filters-current{border-bottom:0;border-top:0;margin-bottom:0;padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-pager .admin__control-text,.sticky-header .admin__data-grid-pager-wrap .admin__control-support-text,.sticky-header .data-grid-search-control-wrap .action-submit,.sticky-header .data-grid-search-control-wrap .data-grid-search-control{display:none}.sticky-header .action-next{margin:0}.sticky-header .data-grid{margin-bottom:-1px}.data-grid-cap-left,.data-grid-cap-right{background-color:#f8f8f8;bottom:-2px;position:absolute;top:6rem;width:3rem;z-index:201}.data-grid-cap-left{left:0}.admin__data-grid-header{font-size:1.4rem}.admin__data-grid-header-row+.admin__data-grid-header-row{margin-top:1.1rem}.admin__data-grid-header-row:last-child{margin-bottom:0}.admin__data-grid-header-row .action-select-wrap{display:block}.admin__data-grid-header-row .action-select{width:100%}.admin__data-grid-actions-wrap{float:right;margin-left:1.1rem;margin-top:-.5rem;text-align:right}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap{position:relative;text-align:left;vertical-align:middle}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._hide+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:first-child:after{display:none}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown-menu{border-color:#adadad}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after{border-left:1px solid #ccc;content:'';height:3.2rem;left:0;position:absolute;top:.5rem;z-index:3}.admin__data-grid-actions-wrap .admin__action-dropdown{padding-bottom:1.7rem;padding-top:1.2rem}.admin__data-grid-actions-wrap .admin__action-dropdown:after{margin-top:-.4rem}.admin__data-grid-outer-wrap{min-height:8rem;position:relative}.admin__data-grid-wrap{margin-bottom:2rem;max-width:100%;overflow-x:auto;padding-bottom:1rem;padding-top:2rem}.admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-loading-mask .spinner{font-size:4rem;left:50%;margin-left:-2rem;margin-top:-2rem;position:absolute;top:50%}.ie9 .admin__data-grid-loading-mask .spinner{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-cell-content{display:inline-block;overflow:hidden;width:100%}body._in-resize{cursor:col-resize;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body._in-resize *,body._in-resize .data-grid-th,body._in-resize .data-grid-th._draggable,body._in-resize .data-grid-th._sortable{cursor:col-resize!important}._layout-fixed{table-layout:fixed}.data-grid{border:none;font-size:1.3rem;margin-bottom:0;width:100%}.data-grid:not(._dragging-copy) ._odd-row td._dragging{background-color:#d0d0d0}.data-grid:not(._dragging-copy) ._dragging{background-color:#d9d9d9;color:rgba(48,48,48,.95)}.data-grid:not(._dragging-copy) ._dragging a{color:rgba(0,139,219,.95)}.data-grid:not(._dragging-copy) ._dragging a:hover{color:rgba(15,167,255,.95)}.data-grid._dragged{outline:#007bdb solid 1px}.data-grid thead{background-color:transparent}.data-grid tfoot th{padding:1rem}.data-grid tr._odd-row td{background-color:#f5f5f5}.data-grid tr._odd-row td._update-status-active{background:#89e1ff}.data-grid tr._odd-row td._update-status-upcoming{background:#b7ee63}.data-grid tr:hover td._update-status-active,.data-grid tr:hover td._update-status-upcoming{background-color:#e5f7fe}.data-grid tr.data-grid-tr-no-data td{font-size:1.6rem;padding:3rem;text-align:center}.data-grid tr.data-grid-tr-no-data:hover td{background-color:#fff;cursor:default}.data-grid tr:active td{background-color:#e0f6fe}.data-grid tr:hover td{background-color:#e5f7fe}.data-grid tr._dragged td{background:#d0d0d0}.data-grid tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.data-grid tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.data-grid tr:not(.data-grid-editable-row):last-child td{border-bottom:.1rem solid #d6d6d6}.data-grid tr ._clickable,.data-grid tr._clickable{cursor:pointer}.data-grid tr._disabled{pointer-events:none}.data-grid td,.data-grid th{font-size:1.3rem;line-height:1.36;transition:background-color .1s linear;vertical-align:top}.data-grid td._resizing,.data-grid th._resizing{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid td._hidden,.data-grid th._hidden{display:none}.data-grid td._fit,.data-grid th._fit{width:1%}.data-grid td{background-color:#fff;border-left:.1rem dashed #d6d6d6;border-right:.1rem dashed #d6d6d6;color:#303030;padding:1rem}.data-grid td:first-child{border-left-style:solid}.data-grid td:last-child{border-right-style:solid}.data-grid td .action-select-wrap{position:static}.data-grid td .action-select{color:#008bdb;text-decoration:none;background-color:transparent;border:none;font-size:1.3rem;padding:0 3rem 0 0;position:relative}.data-grid td .action-select:hover{color:#0fa7ff;text-decoration:underline}.data-grid td .action-select:hover:after{border-color:#0fa7ff transparent transparent}.data-grid td .action-select:after{border-color:#008bdb transparent transparent;margin:.6rem 0 0 .7rem;right:auto;top:auto}.data-grid td .action-select:before{display:none}.data-grid td .abs-action-menu .action-submenu,.data-grid td .abs-action-menu .action-submenu .action-submenu,.data-grid td .action-menu,.data-grid td .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:10rem;right:0;text-align:left;top:auto;z-index:1}.data-grid td._update-status-active{background:#bceeff}.data-grid td._update-status-upcoming{background:#ccf391}.data-grid th{background-color:#514943;border:.1rem solid #8a837f;border-left-color:transparent;color:#fff;font-weight:600;padding:0;text-align:left}.data-grid th:first-child{border-left-color:#8a837f}.data-grid th._dragover-left{box-shadow:inset 3px 0 0 0 #fff;z-index:2}.data-grid th._dragover-right{box-shadow:inset -3px 0 0 0 #fff}.data-grid .shadow-div{cursor:col-resize;height:100%;margin-right:-5px;position:absolute;right:0;top:0;width:10px}.data-grid .data-grid-th{background-clip:padding-box;color:#fff;padding:1rem;position:relative;vertical-align:middle}.data-grid .data-grid-th._resize-visible .shadow-div{cursor:auto;display:none}.data-grid .data-grid-th._draggable{cursor:grab}.data-grid .data-grid-th._sortable{cursor:pointer;transition:background-color .1s linear;z-index:1}.data-grid .data-grid-th._sortable:focus,.data-grid .data-grid-th._sortable:hover{background-color:#5f564f}.data-grid .data-grid-th._sortable:active{padding-bottom:.9rem;padding-top:1.1rem}.data-grid .data-grid-th.required>span:after{color:#f38a5e;content:'*';margin-left:.3rem}.data-grid .data-grid-checkbox-cell{overflow:hidden;padding:0;vertical-align:top;width:5.2rem}.data-grid .data-grid-checkbox-cell:hover{cursor:default}.data-grid .data-grid-thumbnail-cell{text-align:center;width:7rem}.data-grid .data-grid-thumbnail-cell img{border:1px solid #d6d6d6;width:5rem}.data-grid .data-grid-multicheck-cell{padding:1rem 1rem .9rem;text-align:center;vertical-align:middle}.data-grid .data-grid-onoff-cell{text-align:center;width:12rem}.data-grid .data-grid-actions-cell{padding-left:2rem;padding-right:2rem;text-align:center;width:1%}.data-grid._hidden{display:none}.data-grid._dragging-copy{box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;opacity:.95;position:fixed;top:0;z-index:1000}.data-grid._dragging-copy .data-grid-th{border:1px solid #007bdb;border-bottom:none}.data-grid._dragging-copy .data-grid-th,.data-grid._dragging-copy .data-grid-th._sortable{cursor:grabbing}.data-grid._dragging-copy tr:last-child td{border-bottom:1px solid #007bdb}.data-grid._dragging-copy td{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:rgba(255,251,230,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td,.data-grid._dragging-copy._in-edit .data-grid-editable-row:hover td{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:after,.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{left:0;right:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:only-child{border-left:1px solid #007bdb;border-right:1px solid #007bdb;left:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-select,.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-text{opacity:.5}.data-grid .data-grid-controls-row td{padding-top:1.6rem}.data-grid .data-grid-controls-row td.data-grid-checkbox-cell{padding-top:.6rem}.data-grid .data-grid-controls-row td [class*=admin__control-],.data-grid .data-grid-controls-row td button{margin-top:-1.7rem}.data-grid._in-edit tr:hover td{background-color:#e6e6e6}.data-grid._in-edit ._odd-row.data-grid-editable-row td,.data-grid._in-edit ._odd-row.data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit ._odd-row td,.data-grid._in-edit ._odd-row:hover td{background-color:#dcdcdc}.data-grid._in-edit .data-grid-editable-row-actions td,.data-grid._in-edit .data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid._in-edit td{background-color:#e6e6e6;pointer-events:none}.data-grid._in-edit .data-grid-checkbox-cell{pointer-events:auto}.data-grid._in-edit .data-grid-editable-row{border:.1rem solid #adadad;border-bottom-color:#c2c2c2}.data-grid._in-edit .data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit .data-grid-editable-row td{background-color:#fff;border-bottom-color:#fff;border-left-style:hidden;border-right-style:hidden;border-top-color:#fff;pointer-events:auto;vertical-align:middle}.data-grid._in-edit .data-grid-editable-row td:first-child{border-left-color:#adadad;border-left-style:solid}.data-grid._in-edit .data-grid-editable-row td:first-child:after,.data-grid._in-edit .data-grid-editable-row td:first-child:before{left:0}.data-grid._in-edit .data-grid-editable-row td:last-child{border-right-color:#adadad;border-right-style:solid;left:-.1rem}.data-grid._in-edit .data-grid-editable-row td:last-child:after,.data-grid._in-edit .data-grid-editable-row td:last-child:before{right:0}.data-grid._in-edit .data-grid-editable-row .admin__control-select,.data-grid._in-edit .data-grid-editable-row .admin__control-text{width:100%}.data-grid._in-edit .data-grid-bulk-edit-panel td{vertical-align:bottom}.data-grid .data-grid-editable-row td{border-left-color:#fff;border-left-style:solid;position:relative;z-index:1}.data-grid .data-grid-editable-row td:after{bottom:0;box-shadow:0 5px 5px rgba(0,0,0,.25);content:'';height:.9rem;left:0;margin-top:-1rem;position:absolute;right:0}.data-grid .data-grid-editable-row td:before{background-color:#fff;bottom:0;content:'';height:1rem;left:-10px;position:absolute;right:-10px;z-index:1}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td,.data-grid .data-grid-editable-row.data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:first-child{border-left-color:#fff;border-right-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:last-child{left:0}.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:#fffbe6}.data-grid .data-grid-editable-row-actions{left:50%;margin-left:-12.5rem;margin-top:-2px;position:absolute;text-align:center}.data-grid .data-grid-editable-row-actions td{width:25rem}.data-grid .data-grid-editable-row-actions [class*=action-]{min-width:9rem}.data-grid .data-grid-draggable-row-cell{width:1%}.data-grid .data-grid-draggable-row-cell .draggable-handle{padding:0}.data-grid-th._sortable._ascend,.data-grid-th._sortable._descend{padding-right:2.7rem}.data-grid-th._sortable._ascend:before,.data-grid-th._sortable._descend:before{margin-top:-1em;position:absolute;right:1rem;top:50%}.data-grid-th._sortable._ascend:before{content:'\2193'}.data-grid-th._sortable._descend:before{content:'\2191'}.data-grid-checkbox-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:right}.data-grid-checkbox-cell-inner:hover{cursor:pointer}.data-grid-state-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:center}.data-grid-state-cell-inner>span{display:inline-block;font-style:italic;padding:.6rem 0}.data-grid-row-parent._active>td .data-grid-checkbox-cell-inner:before{content:'\e62b'}.data-grid-row-parent>td .data-grid-checkbox-cell-inner{padding-left:3.7rem;position:relative}.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before{content:'\e628';font-size:1rem;font-weight:700;left:1.35rem;position:absolute;top:1.6rem}.data-grid-th._col-xs{width:1%}.data-grid-info-panel{box-shadow:0 0 5px rgba(0,0,0,.5);margin:2rem .1rem -2rem}.data-grid-info-panel .messages{overflow:hidden}.data-grid-info-panel .messages .message{margin:1rem}.data-grid-info-panel .messages .message:last-child{margin-bottom:1rem}.data-grid-info-panel-actions{padding:1rem;text-align:right}.data-grid-editable-row .admin__field-control{position:relative}.data-grid-editable-row .admin__field-control._error:after{border-color:transparent #ee7d7d transparent transparent;border-style:solid;border-width:0 12px 12px 0;content:'';position:absolute;right:0;top:0}.data-grid-editable-row .admin__field-control._error .admin__control-text{border-color:#ee7d7d}.data-grid-editable-row .admin__field-control._focus:after{display:none}.data-grid-editable-row .admin__field-error{bottom:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin:0 auto 1.5rem;max-width:32rem;position:absolute;right:0}.data-grid-editable-row .admin__field-error:after,.data-grid-editable-row .admin__field-error:before{border-style:solid;content:'';left:50%;position:absolute;top:100%}.data-grid-editable-row .admin__field-error:after{border-color:#fffbbb transparent transparent;border-width:10px 10px 0;margin-left:-10px;z-index:1}.data-grid-editable-row .admin__field-error:before{border-color:#ee7d7d transparent transparent;border-width:11px 12px 0;margin-left:-12px}.data-grid-bulk-edit-panel .admin__field-label-vertical{display:block;font-size:1.2rem;margin-bottom:.5rem;text-align:left}.data-grid-row-changed{cursor:default;display:block;opacity:.5;position:relative;width:100%;z-index:1}.data-grid-row-changed:after{content:'\e631';display:inline-block}.data-grid-row-changed .data-grid-row-changed-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:100%;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;line-height:1.36;margin-bottom:1.5rem;padding:1rem;position:absolute;right:-1rem;text-transform:none;width:27rem;word-break:normal;z-index:2}.data-grid-row-changed._changed{opacity:1;z-index:3}.data-grid-row-changed._changed:hover .data-grid-row-changed-tooltip{display:block}.data-grid-row-changed._changed:hover:before{background:#f1f1f1;border:1px solid #f1f1f1;bottom:100%;box-shadow:4px 4px 3px -1px rgba(0,0,0,.15);content:'';display:block;height:1.6rem;left:50%;margin:0 0 .7rem -.8rem;position:absolute;-ms-transform:rotate(45deg);transform:rotate(45deg);width:1.6rem;z-index:3}.ie9 .data-grid-row-changed._changed:hover:before{display:none}.admin__data-grid-outer-wrap .data-grid-checkbox-cell{overflow:hidden}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner{position:relative}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner:before{bottom:0;content:'';height:500%;left:0;position:absolute;right:0;top:0}.admin__data-grid-wrap-static .data-grid-checkbox-cell:hover{cursor:pointer}.admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:1.1rem 1.8rem .9rem;padding:0}.adminhtml-cms-hierarchy-index .admin__data-grid-wrap-static .data-grid-actions-cell:first-child{padding:0}.adminhtml-export-index .admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:0;padding:1.1rem 1.8rem 1.9rem}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before,.admin__control-file-label:before,.admin__control-multiselect,.admin__control-select,.admin__control-text,.admin__control-textarea,.selectmenu{-webkit-appearance:none;background-color:#fff;border:1px solid #adadad;border-radius:1px;box-shadow:none;color:#303030;font-size:1.4rem;font-weight:400;height:auto;line-height:1.36;padding:.6rem 1rem;transition:border-color .1s linear;vertical-align:baseline;width:auto}.admin__control-addon [class*=admin__control-][class]:hover~[class*=admin__addon-]:last-child:before,.admin__control-multiselect:hover,.admin__control-select:hover,.admin__control-text:hover,.admin__control-textarea:hover,.selectmenu:hover,.selectmenu:hover .selectmenu-toggle:before{border-color:#878787}.admin__control-addon [class*=admin__control-][class]:focus~[class*=admin__addon-]:last-child:before,.admin__control-file:active+.admin__control-file-label:before,.admin__control-file:focus+.admin__control-file-label:before,.admin__control-multiselect:focus,.admin__control-select:focus,.admin__control-text:focus,.admin__control-textarea:focus,.selectmenu._focus,.selectmenu._focus .selectmenu-toggle:before{border-color:#007bdb;box-shadow:none;outline:0}.admin__control-addon [class*=admin__control-][class][disabled]~[class*=admin__addon-]:last-child:before,.admin__control-file[disabled]+.admin__control-file-label:before,.admin__control-multiselect[disabled],.admin__control-select[disabled],.admin__control-text[disabled],.admin__control-textarea[disabled]{background-color:#e9e9e9;border-color:#adadad;color:#303030;cursor:not-allowed;opacity:.5}.admin__field-row[class]>.admin__field-control,.admin__fieldset>.admin__field.admin__field-wide[class]>.admin__field-control{clear:left;float:none;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label{display:block;line-height:1.4rem;margin-bottom:.86rem;margin-top:-.14rem;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label:before,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label:before{display:none}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span{padding-left:1.5rem}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span:after{left:0;margin-left:30px}.admin__legend{font-size:1.8rem;font-weight:600;margin-bottom:3rem}.admin__control-checkbox,.admin__control-radio{cursor:pointer;opacity:.01;overflow:hidden;position:absolute;vertical-align:top}.admin__control-checkbox:after,.admin__control-radio:after{display:none}.admin__control-checkbox+label,.admin__control-radio+label{cursor:pointer;display:inline-block}.admin__control-checkbox+label:before,.admin__control-radio+label:before{background-color:#fff;border:1px solid #adadad;color:transparent;float:left;height:1.6rem;text-align:center;vertical-align:top;width:1.6rem}.admin__control-checkbox+.admin__field-label,.admin__control-radio+.admin__field-label{padding-left:2.6rem}.admin__control-checkbox+.admin__field-label:before,.admin__control-radio+.admin__field-label:before{margin:1px 1rem 0 -2.6rem}.admin__control-checkbox:checked+label:before,.admin__control-radio:checked+label:before{color:#514943}.admin__control-checkbox.disabled+label,.admin__control-checkbox[disabled]+label,.admin__control-radio.disabled+label,.admin__control-radio[disabled]+label{color:#303030;cursor:default;opacity:.5}.admin__control-checkbox.disabled+label:before,.admin__control-checkbox[disabled]+label:before,.admin__control-radio.disabled+label:before,.admin__control-radio[disabled]+label:before{background-color:#e9e9e9;border-color:#adadad;cursor:default}._keyfocus .admin__control-checkbox:not(.disabled):focus+label:before,._keyfocus .admin__control-checkbox:not([disabled]):focus+label:before,._keyfocus .admin__control-radio:not(.disabled):focus+label:before,._keyfocus .admin__control-radio:not([disabled]):focus+label:before{border-color:#007bdb}.admin__control-checkbox:not(.disabled):hover+label:before,.admin__control-checkbox:not([disabled]):hover+label:before,.admin__control-radio:not(.disabled):hover+label:before,.admin__control-radio:not([disabled]):hover+label:before{border-color:#878787}.admin__control-radio+label:before{border-radius:1.6rem;content:'';transition:border-color .1s linear,color .1s ease-in}.admin__control-radio.admin__control-radio+label:before{line-height:140%}.admin__control-radio:checked+label{position:relative}.admin__control-radio:checked+label:after{background-color:#514943;border-radius:50%;content:'';height:10px;left:3px;position:absolute;top:4px;width:10px}.admin__control-radio:checked:not(.disabled):hover,.admin__control-radio:checked:not(.disabled):hover+label,.admin__control-radio:checked:not([disabled]):hover,.admin__control-radio:checked:not([disabled]):hover+label{cursor:default}.admin__control-radio:checked:not(.disabled):hover+label:before,.admin__control-radio:checked:not([disabled]):hover+label:before{border-color:#adadad}.admin__control-checkbox+label:before{border-radius:1px;content:'';font-size:0;transition:font-size .1s ease-out,color .1s ease-out,border-color .1s linear}.admin__control-checkbox:checked+label:before{content:'\e62d';font-size:1.1rem;line-height:125%}.admin__control-checkbox:not(:checked)._indeterminate+label:before,.admin__control-checkbox:not(:checked):indeterminate+label:before{color:#514943;content:'-';font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700}input[type=checkbox].admin__control-checkbox,input[type=radio].admin__control-checkbox{margin:0;position:absolute}.admin__control-text{min-width:4rem}.admin__control-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#adadad,#adadad);background-position:calc(100% - 12px) -34px,100%,calc(100% - 3.2rem) 0;background-size:auto,3.2rem 100%,1px 100%;background-repeat:no-repeat;max-width:100%;min-width:8.5rem;padding-bottom:.5rem;padding-right:4.4rem;padding-top:.5rem;transition:border-color .1s linear}.admin__control-select:hover{border-color:#878787;cursor:pointer}.admin__control-select:focus{background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#007bdb,#007bdb);background-position:calc(100% - 12px) 13px,100%,calc(100% - 3.2rem) 0;border-color:#007bdb}.admin__control-select::-ms-expand{display:none}.ie9 .admin__control-select{background-image:none;padding-right:1rem}option:empty{display:none}.admin__control-multiselect{height:auto;max-width:100%;min-width:15rem;overflow:auto;padding:0;resize:both}.admin__control-multiselect optgroup,.admin__control-multiselect option{padding:.5rem 1rem}.admin__control-file-wrapper{display:inline-block;padding:.5rem 1rem;position:relative;z-index:1}.admin__control-file-label:before{content:'';left:0;position:absolute;top:0;width:100%;z-index:0}.admin__control-file{background:0 0;border:0;padding-top:.7rem;position:relative;width:auto;z-index:1}.admin__control-support-text{border:1px solid transparent;display:inline-block;font-size:1.4rem;line-height:1.36;padding-bottom:.6rem;padding-top:.6rem}.admin__control-support-text+[class*=admin__control-],[class*=admin__control-]+.admin__control-support-text{margin-left:.7rem}.admin__control-service{float:left;margin:.8rem 0 0 3rem}.admin__control-textarea{height:8.48rem;line-height:1.18;padding-top:.8rem;resize:vertical}.admin__control-addon{-ms-flex-direction:row;flex-direction:row;display:inline-flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;position:relative;width:100%;z-index:1}.admin__control-addon>[class*=admin__addon-],.admin__control-addon>[class*=admin__control-]{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;z-index:1}.admin__control-addon .admin__control-select{width:auto}.admin__control-addon .admin__control-text{margin:.1rem;padding:.5rem .9rem;width:100%}.admin__control-addon [class*=admin__control-][class]{appearence:none;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-order:1;order:1;-ms-flex-negative:1;flex-shrink:1;background-color:transparent;border-color:transparent;box-shadow:none;vertical-align:top}.admin__control-addon [class*=admin__control-][class]+[class*=admin__control-]{border-left-color:#adadad}.admin__control-addon [class*=admin__control-][class] :focus{box-shadow:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child{padding-left:1rem;position:static!important;z-index:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child>*{position:relative;vertical-align:top;z-index:1}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:empty{padding:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before{bottom:0;box-sizing:border-box;content:'';left:0;position:absolute;top:0;width:100%;z-index:-1}.admin__addon-prefix,.admin__addon-suffix{border:0;box-sizing:border-box;color:#858585;display:inline-block;font-size:1.4rem;font-weight:400;height:3.2rem;line-height:3.2rem;padding:0}.admin__addon-suffix{-ms-flex-order:3;order:3}.admin__addon-suffix:last-child{padding-right:1rem}.admin__addon-prefix{-ms-flex-order:0;order:0}.ie9 .admin__control-addon:after{clear:both;content:'';display:block;height:0;overflow:hidden}.ie9 .admin__addon{min-width:0;overflow:hidden;text-align:right;white-space:nowrap;width:auto}.ie9 .admin__addon [class*=admin__control-]{display:inline}.ie9 .admin__addon-prefix{float:left}.ie9 .admin__addon-suffix{float:right}.admin__control-collapsible{width:100%}.admin__control-collapsible ._dragged .admin__collapsible-block-wrapper .admin__collapsible-title{background:#d0d0d0}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before,.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{background:#008bdb;content:'';display:block;height:3px;left:0;position:absolute;right:0}.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{top:-3px}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before{bottom:-3px}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper{border:0;margin:0;position:relative}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper .fieldset-wrapper-title{background:#f8f8f8;border:2px solid #ccc}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title{font-size:1.4rem;font-weight:400;line-height:1;padding:1.6rem 4rem 1.6rem 3.8rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title:before{left:1rem;right:auto;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding:0;position:absolute;right:1rem;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before{content:'\e630';font-size:2rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete>span{display:none}.admin__control-collapsible .admin__collapsible-content{background-color:#fff;margin-bottom:1rem}.admin__control-collapsible .admin__collapsible-content>.fieldset-wrapper{border:1px solid #ccc;margin-top:-1px;padding:1rem}.admin__control-collapsible .admin__collapsible-content .admin__fieldset{padding:0}.admin__control-collapsible .admin__collapsible-content .admin__field:last-child{margin-bottom:0}.admin__control-table-wrapper{max-width:100%;overflow-x:auto;overflow-y:hidden}.admin__control-table{width:100%}.admin__control-table thead{background-color:transparent}.admin__control-table tbody td{vertical-align:top}.admin__control-table tfoot th{padding-bottom:1.3rem}.admin__control-table tfoot th.validation{padding-bottom:0;padding-top:0}.admin__control-table tfoot td{border-top:1px solid #fff}.admin__control-table tfoot .admin__control-table-pagination{float:right;padding-bottom:0}.admin__control-table tfoot .action-previous{margin-right:.5rem}.admin__control-table tfoot .action-next{margin-left:.9rem}.admin__control-table tr:last-child td{border-bottom:none}.admin__control-table tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.admin__control-table tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.admin__control-table tr._dragged td,.admin__control-table tr._dragged th{background:#d0d0d0}.admin__control-table td,.admin__control-table th{background-color:#efefef;border:0;border-bottom:1px solid #fff;padding:1.3rem 1rem 1.3rem 0;text-align:left;vertical-align:top}.admin__control-table td:first-child,.admin__control-table th:first-child{padding-left:1rem}.admin__control-table td>.admin__control-select,.admin__control-table td>.admin__control-text,.admin__control-table th>.admin__control-select,.admin__control-table th>.admin__control-text{width:100%}.admin__control-table td._hidden,.admin__control-table th._hidden{display:none}.admin__control-table td._fit,.admin__control-table th._fit{width:1px}.admin__control-table th{color:#303030;font-size:1.4rem;font-weight:600;vertical-align:bottom}.admin__control-table th._required span:after{color:#eb5202;content:'*'}.admin__control-table .control-table-actions-th{white-space:nowrap}.admin__control-table .control-table-actions-cell{padding-top:1.8rem;text-align:center;width:1%}.admin__control-table .control-table-options-th{text-align:center;width:10rem}.admin__control-table .control-table-options-cell{text-align:center}.admin__control-table .control-table-text{line-height:3.2rem}.admin__control-table .col-draggable{padding-top:2.2rem;width:1%}.admin__control-table .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.admin__control-table .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-table .action-delete:before{content:'\e630';font-size:2rem}.admin__control-table .action-delete>span{display:none}.admin__control-table .draggable-handle{padding:0}.admin__control-table._dragged{outline:#007bdb solid 1px}.admin__control-table-action{background-color:#efefef;border-top:1px solid #fff;padding:1.3rem 1rem}.admin__dynamic-rows._dragged{opacity:.95;position:absolute;z-index:999}.admin__dynamic-rows.admin__control-table .admin__control-fields>.admin__field{border:0;padding:0}.admin__dynamic-rows td>.admin__field{border:0;margin:0;padding:0}.admin__control-table-pagination{padding-bottom:1rem}.admin__control-table-pagination .admin__data-grid-pager{float:right}.admin__field-tooltip{display:inline-block;margin-top:.5rem;max-width:45px;overflow:visible;vertical-align:top;width:0}.admin__field-tooltip:hover{position:relative;z-index:500}.admin__field-option .admin__field-tooltip{margin-top:.5rem}.admin__field-tooltip .admin__field-tooltip-action{margin-left:2rem;position:relative;z-index:2;display:inline-block;text-decoration:none}.admin__field-tooltip .admin__field-tooltip-action:before{-webkit-font-smoothing:antialiased;font-size:2.2rem;line-height:1;color:#514943;content:'\e633';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.admin__field-tooltip .admin__control-text:focus+.admin__field-tooltip-content,.admin__field-tooltip:hover .admin__field-tooltip-content{display:block}.admin__field-tooltip .admin__field-tooltip-content{bottom:3.8rem;display:none;right:-2.3rem}.admin__field-tooltip .admin__field-tooltip-content:after,.admin__field-tooltip .admin__field-tooltip-content:before{border:1.6rem solid transparent;height:0;width:0;border-top-color:#afadac;content:'';display:block;position:absolute;right:2rem;top:100%;z-index:3}.admin__field-tooltip .admin__field-tooltip-content:after{border-top-color:#fffbbb;margin-top:-1px;z-index:4}.abs-admin__field-tooltip-content,.admin__field-tooltip .admin__field-tooltip-content{box-shadow:0 2px 8px 0 rgba(0,0,0,.3);background:#fffbbb;border:1px solid #afadac;border-radius:1px;padding:1.5rem 2.5rem;position:absolute;width:32rem;z-index:1}.admin__field-fallback-reset{font-size:1.25rem;white-space:nowrap;width:30px}.admin__field-fallback-reset>span{margin-left:.5rem;position:relative}.admin__field-fallback-reset:active{-ms-transform:scale(0.98);transform:scale(0.98)}.admin__field-fallback-reset:before{transition:color .1s linear;content:'\e642';font-size:1.3rem;margin-left:.5rem}.admin__field-fallback-reset:hover{cursor:pointer;text-decoration:none}.admin__field-fallback-reset:focus{background:0 0}.abs-field-size-x-small,.abs-field-sizes.admin__field-x-small>.admin__field-control,.admin__field.admin__field-x-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-x-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-x-small>.admin__field-control{width:8rem}.abs-field-size-small,.abs-field-sizes.admin__field-small>.admin__field-control,.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control,.admin__field.admin__field-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-small>.admin__field-control{width:15rem}.abs-field-size-medium,.abs-field-sizes.admin__field-medium>.admin__field-control,.admin__field.admin__field-medium>.admin__field-control,.admin__fieldset>.admin__field.admin__field-medium>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-medium>.admin__field-control{width:34rem}.abs-field-size-large,.abs-field-sizes.admin__field-large>.admin__field-control,.admin__field.admin__field-large>.admin__field-control,.admin__fieldset>.admin__field.admin__field-large>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-large>.admin__field-control{width:64rem}.abs-field-no-label,.admin__field-group-additional,.admin__field-no-label,.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-control{margin-left:calc((100%) * .25 + 30px)}.admin__fieldset{border:0;margin:0;min-width:0;padding:0}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title{padding-left:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title strong{font-size:1.7rem;font-weight:600}.admin__fieldset .fieldset-wrapper.admin__fieldset-section .admin__fieldset-wrapper-content>.admin__fieldset{padding-top:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section:last-child .admin__fieldset-wrapper-content>.admin__fieldset{padding-bottom:0}.admin__fieldset>.admin__field{border:0;margin:0 0 0 -30px;padding:0}.admin__fieldset>.admin__field:after{clear:both;content:'';display:table}.admin__fieldset>.admin__field>.admin__field-control{width:calc((100%) * .5 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-label{display:none}.admin__fieldset>.admin__field+.admin__field._empty._no-header{margin-top:-3rem}.admin__fieldset-product-websites{position:relative;z-index:300}.admin__fieldset-note{margin-bottom:2rem}.admin__form-field{border:0;margin:0;padding:0}.admin__field-control .admin__control-text,.admin__field-control .admin__control-textarea,.admin__form-field-control .admin__control-text,.admin__form-field-control .admin__control-textarea{width:100%}.admin__field-label{color:#303030;cursor:pointer;margin:0;text-align:right}.admin__field-label+br{display:none}.admin__field:not(.admin__field-option)>.admin__field-label{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:3.2rem;padding:0;white-space:nowrap}.admin__field:not(.admin__field-option)>.admin__field-label:before{opacity:0;visibility:hidden;content:'.';margin-left:-7px;overflow:hidden}.admin__field:not(.admin__field-option)>.admin__field-label span{display:inline-block;line-height:1.2;vertical-align:middle;white-space:normal}.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]{position:relative}._required>.admin__field-label>span:after,.required>.admin__field-label>span:after{color:#eb5202;content:'*';display:inline-block;font-size:1.6rem;font-weight:500;line-height:1;margin-left:10px;margin-top:.2rem;position:absolute;z-index:1}._disabled>.admin__field-label{color:#999;cursor:default}.admin__field{margin-bottom:0}.admin__field+.admin__field{margin-top:1.5rem}.admin__field:not(.admin__field-option)~.admin__field-option{margin-top:.5rem}.admin__field.admin__field-option~.admin__field-option{margin-top:.9rem}.admin__field~.admin__field-option:last-child{margin-bottom:.8rem}.admin__fieldset>.admin__field{margin-bottom:3rem;position:relative}.admin__field legend.admin__field-label{opacity:0}.admin__field[data-config-scope]:before{color:gray;content:attr(data-config-scope);display:inline-block;font-size:1.2rem;left:calc((100%) * .75 - 30px);line-height:3.2rem;margin-left:60px;position:absolute;width:calc((100%) * .25 - 30px)}.admin__field-control .admin__field[data-config-scope]:nth-child(n+2):before{content:''}.admin__field._error .admin__field-control [class*=admin__addon-]:before,.admin__field._error .admin__field-control [class*=admin__control-] [class*=admin__addon-]:before,.admin__field._error .admin__field-control>[class*=admin__control-]{border-color:#e22626}.admin__field._disabled,.admin__field._disabled:hover{box-shadow:inherit;cursor:inherit;opacity:1;outline:inherit}.admin__field._hidden{display:none}.admin__field-control+.admin__field-control{margin-top:1.5rem}.admin__field-control._with-tooltip>.admin__control-addon,.admin__field-control._with-tooltip>.admin__control-select,.admin__field-control._with-tooltip>.admin__control-text,.admin__field-control._with-tooltip>.admin__control-textarea,.admin__field-control._with-tooltip>.admin__field-option{max-width:calc(100% - 45px - 4px)}.admin__field-control._with-tooltip .admin__field-tooltip{width:auto}.admin__field-control._with-tooltip .admin__field-option{display:inline-block}.admin__field-control._with-reset>.admin__control-addon,.admin__field-control._with-reset>.admin__control-text,.admin__field-control._with-reset>.admin__control-textarea{width:calc(100% - 30px - .5rem - 4px)}.admin__field-control._with-reset .admin__field-fallback-reset{margin-left:.5rem;margin-top:1rem;vertical-align:top}.admin__field-control._with-reset._with-tooltip>.admin__control-addon,.admin__field-control._with-reset._with-tooltip>.admin__control-text,.admin__field-control._with-reset._with-tooltip>.admin__control-textarea{width:calc(100% - 30px - .5rem - 45px - 8px)}.admin__fieldset>.admin__field-collapsible{margin-bottom:0}.admin__fieldset>.admin__field-collapsible .admin__field-control{border-top:1px solid #ccc;display:block;font-size:1.7rem;font-weight:700;padding:1.7rem 0;width:calc(97%)}.admin__fieldset>.admin__field-collapsible .admin__field-option{padding-top:0}.admin__field-collapsible+div{margin-top:2.5rem}.admin__field-collapsible .admin__control-radio+label:before{height:1.8rem;width:1.8rem}.admin__field-collapsible .admin__control-radio:checked+label:after{left:4px;top:5px}.admin__field-error{background:#fffbbb;border:1px solid #ee7d7d;box-sizing:border-box;color:#555;display:block;font-size:1.2rem;font-weight:400;line-height:1.2;margin:.2rem 0 0;padding:.8rem 1rem .9rem}.admin__field-note{color:#303030;font-size:1.2rem;margin:10px 0 0;padding:0}.admin__additional-info{padding-top:1rem}.admin__field-option{padding-top:.7rem}.admin__field-option .admin__field-label{text-align:left}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2),.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1){display:inline-block}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option{display:inline-block;margin-left:41px;margin-top:0}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option:before,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option:before{background:#cacaca;content:'';display:inline-block;height:20px;margin-left:-20px;position:absolute;width:1px}.admin__field-value{display:inline-block;padding-top:.7rem}.admin__field-service{padding-top:1rem}.admin__control-fields>.admin__field:first-child,[class*=admin__control-grouped]>.admin__field:first-child{position:static}.admin__control-fields>.admin__field:first-child>.admin__field-label,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px;background:#fff;cursor:pointer;left:0;position:absolute;top:0}.admin__control-fields>.admin__field:first-child>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label span:before{display:block}.admin__control-fields>.admin__field._disabled>.admin__field-label,[class*=admin__control-grouped]>.admin__field._disabled>.admin__field-label{cursor:default}.admin__control-fields>.admin__field>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field>.admin__field-label span:before{display:none}.admin__control-fields .admin__field-label~.admin__field-control{width:100%}.admin__control-fields .admin__field-option{padding-top:0}[class*=admin__control-grouped]{box-sizing:border-box;display:table;width:100%}[class*=admin__control-grouped]>.admin__field{display:table-cell;vertical-align:top}[class*=admin__control-grouped]>.admin__field>.admin__field-control{float:none;width:100%}[class*=admin__control-grouped]>.admin__field.admin__field-default,[class*=admin__control-grouped]>.admin__field.admin__field-large,[class*=admin__control-grouped]>.admin__field.admin__field-medium,[class*=admin__control-grouped]>.admin__field.admin__field-small,[class*=admin__control-grouped]>.admin__field.admin__field-x-small{width:1px}[class*=admin__control-grouped]>.admin__field.admin__field-default+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-large+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-medium+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-small+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-x-small+.admin__field:last-child{width:auto}[class*=admin__control-grouped]>.admin__field:nth-child(n+2){padding-left:20px}.admin__control-group-equal{table-layout:fixed}.admin__control-group-equal>.admin__field{width:50%}.admin__field-control-group{margin-top:.8rem}.admin__field-control-group>.admin__field{padding:0}.admin__control-grouped-date>.admin__field-date{white-space:nowrap;width:1px}.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control{float:left;position:relative}.admin__control-grouped-date>.admin__field-date+.admin__field:last-child{width:auto}.admin__control-grouped-date>.admin__field-date+.admin__field-date>.admin__field-label{float:left;padding-right:20px}.admin__control-grouped-date .ui-datepicker-trigger{left:100%;top:0}.admin__field-group-columns.admin__field-control.admin__control-grouped{width:calc((100%) * 1 - 30px);float:left;margin-left:30px}.admin__field-group-columns>.admin__field:first-child>.admin__field-label{float:none;margin:0;opacity:1;position:static;text-align:left}.admin__field-group-columns .admin__control-select{width:100%}.admin__field-group-additional{clear:both}.admin__field-group-additional .action-advanced{margin-top:1rem}.admin__field-group-additional .action-secondary{width:100%}.admin__field-group-show-label{white-space:nowrap}.admin__field-group-show-label>.admin__field-control,.admin__field-group-show-label>.admin__field-label{display:inline-block;vertical-align:top}.admin__field-group-show-label>.admin__field-label{margin-right:20px}.admin__field-complex{margin:1rem 0 3rem;padding-left:1rem}.admin__field:not(._hidden)+.admin__field-complex{margin-top:3rem}.admin__field-complex .admin__field-complex-title{clear:both;color:#303030;font-size:1.7rem;font-weight:600;letter-spacing:.025em;margin-bottom:1rem}.admin__field-complex .admin__field-complex-elements{float:right;max-width:40%}.admin__field-complex .admin__field-complex-elements button{margin-left:1rem}.admin__field-complex .admin__field-complex-content{max-width:60%;overflow:hidden}.admin__field-complex .admin__field-complex-text{margin-left:-1rem}.admin__field-complex+.admin__field._empty._no-header{margin-top:-3rem}.admin__legend{float:left;position:static;width:100%}.admin__legend+br{clear:left;display:block;height:0;overflow:hidden}.message{margin-bottom:3rem}.message-icon-top:before{margin-top:0;top:1.8rem}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;margin-bottom:3rem;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav .btn-group .btn-wrap .btn,.nav-bar-outer-actions .btn-wrap .btn{padding-left:.5rem;padding-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:1rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before,.nav-bar>li.ui-state-disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after,.nav-bar>li.ui-state-active~li:after{display:none}.nav-bar>li.active~li a:after,.nav-bar>li.ui-state-active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a,.nav-bar>li.ui-state-active a{color:#000}.nav-bar>li.active a:hover,.nav-bar>li.ui-state-active a:hover{cursor:default}.nav-bar>li.active a:after,.nav-bar>li.ui-state-active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:1.5rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:1.5rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.3rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.3rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip p:last-child{margin-bottom:0}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:31rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;clear:left;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{animation:progress-bar-stripes 2s linear infinite}.progress-bar-text-description{margin-bottom:1.6rem}.progress-bar-text-progress{text-align:right}.page-columns .page-inner-sidebar{margin:0 0 3rem}.page-header{margin-bottom:2.7rem;padding-bottom:2rem;position:relative}.page-header:before{border-bottom:1px solid #e3e3e3;bottom:0;content:'';display:block;height:1px;left:3rem;position:absolute;right:3rem}.container .page-header:before{content:normal}.page-header .message{margin-bottom:1.8rem}.page-header .message+.message{margin-top:-1.5rem}.page-header .admin__action-dropdown,.page-header .search-global-input{transition:none}.container .page-header{margin-bottom:0}.page-title-wrapper{margin-top:1.1rem}.container .page-title-wrapper{background:url(../../pub/images/logo.svg) no-repeat;min-height:41px;padding:4px 0 0 45px}.admin__menu .level-0:first-child>a{margin-top:1.6rem}.admin__menu .level-0:first-child>a:after{top:-1.6rem}.admin__menu .level-0:first-child._active>a:after{display:block}.admin__menu .level-0>a{padding-bottom:1.3rem;padding-top:1.3rem}.admin__menu .level-0>a:before{margin-bottom:.7rem}.admin__menu .item-home>a:before{content:'\e611';font-size:2.3rem;padding-top:-.1rem}.admin__menu .item-component>a:before{content:'\e612'}.admin__menu .item-extension>a:before{content:'\e647'}.admin__menu .item-upgrade>a:before{content:'\e614'}.admin__menu .item-system-config>a:before{content:'\e610'}.admin__menu .item-tools>a:before{content:'\e613'}.modal-sub-title{font-size:1.7rem;font-weight:600}.modal-connect-signin .modal-inner-wrap{max-width:80rem}@keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}.ngdialog{-webkit-overflow-scrolling:touch;bottom:0;box-sizing:border-box;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:999}.ngdialog *,.ngdialog:after,.ngdialog:before{box-sizing:inherit}.ngdialog.ngdialog-disabled-animation *{animation:none!important}.ngdialog.ngdialog-closing .ngdialog-content,.ngdialog.ngdialog-closing .ngdialog-overlay{-webkit-animation:ngdialog-fadeout .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadeout .5s}.ngdialog-overlay{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s;background:rgba(0,0,0,.4);bottom:0;left:0;position:fixed;right:0;top:0}.ngdialog-content{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s}body.ngdialog-open{overflow:hidden}.component-indicator{border-radius:50%;cursor:help;display:inline-block;height:16px;text-align:center;vertical-align:middle;width:16px}.component-indicator::after,.component-indicator::before{background:#fff;display:block;opacity:0;position:absolute;transition:opacity .2s linear .1s;visibility:hidden}.component-indicator::before{border:1px solid #adadad;border-radius:1px;box-shadow:0 0 2px rgba(0,0,0,.4);content:attr(data-label);font-size:1.2rem;margin:30px 0 0 -10px;min-width:50px;padding:4px 5px}.component-indicator::after{border-color:#999;border-style:solid;border-width:1px 0 0 1px;box-shadow:-1px -1px 1px rgba(0,0,0,.1);content:'';height:10px;margin:9px 0 0 5px;-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.component-indicator:hover::after,.component-indicator:hover::before{opacity:1;transition:opacity .2s linear;visibility:visible}.component-indicator span{display:block;height:16px;overflow:hidden;width:16px}.component-indicator span:before{content:'';display:block;font-family:Icons;font-size:16px;height:100%;line-height:16px;width:100%}.component-indicator._on{background:#79a22e}.component-indicator._off{background:#e22626}.component-indicator._off span:before{background:#fff;height:4px;margin:8px auto 20px;width:12px}.component-indicator._info{background:0 0}.component-indicator._info span{width:21px}.component-indicator._info span:before{color:#008bdb;content:'\e648';font-family:Icons;font-size:16px}.component-indicator._tooltip{background:0 0;margin:0 0 8px 5px}.component-indicator._tooltip a{width:21px}.component-indicator._tooltip a:hover{text-decoration:none}.component-indicator._tooltip a:before{color:#514943;content:'\e633';font-family:Icons;font-size:16px}.col-manager-item-name .data-grid-data{padding-left:5px}.col-manager-item-name .ng-hide+.data-grid-data{padding-left:24px}.col-manager-item-name ._hide-dependencies,.col-manager-item-name ._show-dependencies{cursor:pointer;padding-left:24px;position:relative}.col-manager-item-name ._hide-dependencies:before,.col-manager-item-name ._show-dependencies:before{display:block;font-family:Icons;font-size:12px;left:0;position:absolute;top:1px}.col-manager-item-name ._show-dependencies:before{content:'\e62b'}.col-manager-item-name ._hide-dependencies:before{content:'\e628'}.col-manager-item-name ._no-dependencies{padding-left:24px}.product-modules-block{font-size:1.2rem;padding:15px 0 0}.col-manager-item-name .product-modules-block{padding-left:1rem}.product-modules-descriprion,.product-modules-title{font-weight:700;margin:0 0 7px}.product-modules-list{font-size:1.1rem;list-style:none;margin:0}.col-manager-item-name .product-modules-list{margin-left:15px}.col-manager-item-name .product-modules-list li{padding:0 0 0 15px;position:relative}.product-modules-list li{margin:0 0 .5rem}.product-modules-list .component-indicator{height:10px;left:0;position:absolute;top:3px;width:10px}.module-summary{white-space:nowrap}.module-summary-title{font-size:2.1rem;margin-right:1rem}.app-updater .nav{display:block;margin-bottom:3.1rem;margin-top:-2.8rem}.app-updater .nav-bar-outer-actions{margin-top:1rem;padding-right:0}.app-updater .nav-bar-outer-actions .btn-wrap-cancel{margin-right:2.6rem}.main{padding-bottom:2rem;padding-top:3rem}.menu-wrapper .logo-static{pointer-events:none}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;line-height:1.4;margin:2.5rem 0 3.5rem 5rem}.page-title{margin-bottom:1rem}.page-sub-title{font-size:2rem}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.spinner.side{float:left;font-size:2.4rem;margin-left:2rem;margin-top:-5px}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit,.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.readiness-check-item{margin-bottom:4rem;min-height:2.5rem}.readiness-check-item .spinner{float:left;font-size:2.5rem;margin:-.4rem 0 0 1.7rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:5.7rem}.readiness-check-content{margin-left:5.7rem;margin-right:22rem;position:relative}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.readiness-check-side{left:100%;padding-left:2.4rem;position:absolute;top:0;width:22rem}.readiness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:1.7rem;margin-top:.3rem}.extensions-information{margin-bottom:5rem}.extensions-information h3{font-size:1.4rem;margin-bottom:1.3rem}.extensions-information .message{margin-bottom:2.5rem}.extensions-information .message:before{margin-top:0;top:1.8rem}.extensions-information .extensions-container{padding:0 2rem}.extensions-information .list{margin-bottom:1rem}.extensions-information .list select{cursor:pointer}.extensions-information .list select:disabled{background:#ccc;cursor:default}.extensions-information .list .extension-delete{font-size:1.7rem;padding-top:0}.delete-modal-wrap{padding:0 4% 4rem}.delete-modal-wrap h3{font-size:3.4rem;display:inline-block;font-weight:300;margin:0 0 2rem;padding:.9rem 0 0;vertical-align:top}.delete-modal-wrap .actions{padding:3rem 0 0}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.customize-your-store .message-error:before{margin-top:0;top:1.8rem}.customize-your-store .message-error a{color:#333;text-decoration:underline}.customize-your-store .message-error .form-label:before{background:#fff}.customize-your-store .customize-database-clean p{margin-top:2.5rem}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;height:20rem;margin:1rem 0 2rem;overflow-y:auto;padding:1.5rem 2rem 2rem;resize:vertical}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}.install-database-clean{margin-top:4rem}.install-database-clean .btn{margin-right:1rem}.page-sub-title{margin-bottom:2.1rem;margin-top:3rem}.multiselect-custom{max-width:71.1rem}.content-install{margin-top:3.7rem}.home-page-inner-wrap{margin:0 auto;max-width:91rem}.setup-home-title{margin-bottom:3.9rem;padding-top:1.8rem;text-align:center}.setup-home-item{background-color:#fafafa;border:1px solid #ccc;color:#333;display:block;margin-bottom:2rem;margin-left:1.3rem;margin-right:1.3rem;min-height:30rem;padding:2rem;text-align:center}.setup-home-item:hover{border-color:#8c8c8c;color:#333;text-decoration:none;transition:border-color .1s linear}.setup-home-item:active{-ms-transform:scale(0.99);transform:scale(0.99)}.setup-home-item:before{display:block;font-size:7rem;margin-bottom:3.3rem;margin-top:4rem}.setup-home-item-component:before,.setup-home-item-extension:before{content:'\e612'}.setup-home-item-module:before{content:'\e647'}.setup-home-item-upgrade:before{content:'\e614'}.setup-home-item-configuration:before{content:'\e610'}.setup-home-item-title{display:block;font-size:1.8rem;letter-spacing:.025em;margin-bottom:1rem}.setup-home-item-description{display:block}.extension-manager-wrap{border:1px solid #bbb;margin:0 0 4rem}.extension-manager-account{font-size:2.1rem;display:inline-block;font-weight:400}.extension-manager-title{font-size:3.2rem;background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;color:#41362f;font-weight:600;line-height:1.2;padding:2rem}.extension-manager-content{padding:2.5rem 2rem 2rem}.extension-manager-items{list-style:none;margin:0;text-align:center}.extension-manager-items .btn{border:1px solid #adadad;display:block;margin:1rem auto 0}.extension-manager-items .item-title{font-size:2.1rem;display:inline-block;text-align:left}.extension-manager-items .item-number{font-size:4.1rem;display:inline-block;line-height:.8;margin:0 5px 1.5rem 0;vertical-align:top}.extension-manager-items .item-date{font-size:2.6rem;margin-top:1px}.extension-manager-items .item-date-title{font-size:1.5rem}.extension-manager-items .item-install{margin:0 0 2rem}.sync-login-wrap{padding:0 10% 4rem}.sync-login-wrap .legend{font-size:2.6rem;color:#eb5202;float:left;font-weight:300;line-height:1.2;margin:-1rem 0 2.5rem;position:static;width:100%}.sync-login-wrap .legend._hidden{display:none}.sync-login-wrap .login-header{font-size:3.4rem;font-weight:300;margin:0 0 2rem}.sync-login-wrap .login-header span{display:inline-block;padding:.9rem 0 0;vertical-align:top}.sync-login-wrap h4{font-size:1.4rem;margin:0 0 2rem}.sync-login-wrap .sync-login-steps{margin:0 0 2rem 1.5rem}.sync-login-wrap .sync-login-steps li{padding:0 0 0 1rem}.sync-login-wrap .form-row .form-label{display:inline-block}.sync-login-wrap .form-row .form-label.required{padding-left:1.5rem}.sync-login-wrap .form-row .form-label.required:after{left:0;position:absolute;right:auto}.sync-login-wrap .form-row{max-width:28rem}.sync-login-wrap .form-actions{display:table;margin-top:-1.3rem}.sync-login-wrap .form-actions .links{display:table-header-group}.sync-login-wrap .form-actions .actions{padding:3rem 0 0}@media all and (max-width:1047px){.admin__menu .submenu li{min-width:19.8rem}.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}.app-updater .nav{padding-bottom:1.7rem}.app-updater .nav-bar-outer-actions{margin-top:2rem}}@media all and (min-width:768px){.page-layout-admin-2columns-left .page-columns{margin-left:-30px}.page-layout-admin-2columns-left .page-columns:after{clear:both;content:'';display:table}.page-layout-admin-2columns-left .page-columns .main-col{width:calc((100%) * .75 - 30px);float:right}.page-layout-admin-2columns-left .page-columns .side-col{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}.page-columns{margin-left:-30px}.page-columns:after{clear:both;content:'';display:table}.page-columns .page-inner-content{width:calc((100%) * .75 - 30px);float:right}.page-columns .page-inner-sidebar{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.abs-clearer-mobile:after,.nav-bar:after{clear:both;content:'';display:table}.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.readiness-check-side{padding:2rem 0;position:static}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}}
\ No newline at end of file
diff --git a/setup/src/Magento/Setup/Controller/InstallExtensionGrid.php b/setup/src/Magento/Setup/Controller/InstallExtensionGrid.php
index a3f5a9992a35f029f765788075eae2585b73b278..0821b6ab2ffd74b412daa1f1e0f67cbe5bdacb12 100644
--- a/setup/src/Magento/Setup/Controller/InstallExtensionGrid.php
+++ b/setup/src/Magento/Setup/Controller/InstallExtensionGrid.php
@@ -10,7 +10,6 @@ use Zend\Mvc\Controller\AbstractActionController;
 use Zend\View\Model\JsonModel;
 use Zend\View\Model\ViewModel;
 use Magento\Setup\Model\PackagesData;
-use \Magento\Setup\Model\Grid\TypeMapper;
 
 /**
  * Controller for extensions grid tasks
@@ -22,21 +21,13 @@ class InstallExtensionGrid extends AbstractActionController
      */
     private $packagesData;
 
-    /**
-     * @var TypeMapper
-     */
-    private $typeMapper;
-
     /**
      * @param PackagesData $packagesData
-     * @param TypeMapper $typeMapper
      */
     public function __construct(
-        PackagesData $packagesData,
-        TypeMapper $typeMapper
+        PackagesData $packagesData
     ) {
         $this->packagesData = $packagesData;
-        $this->typeMapper = $typeMapper;
     }
 
     /**
@@ -60,10 +51,7 @@ class InstallExtensionGrid extends AbstractActionController
     {
         $extensions = $this->packagesData->getPackagesForInstall();
         $packages = isset($extensions['packages']) ? $extensions['packages'] : [];
-        array_walk($packages, function (&$package) {
-            $package['vendor'] = ucfirst($package['vendor']);
-            $package['type'] =  $this->typeMapper->map($package['name'], $package['type']);
-        });
+        $packages = $this->formatPackageList($packages);
 
         return new JsonModel(
             [
@@ -73,4 +61,19 @@ class InstallExtensionGrid extends AbstractActionController
             ]
         );
     }
+
+    /**
+     * Format package list
+     *
+     * @param array $packages
+     * @return array
+     */
+    private function formatPackageList(array $packages)
+    {
+        array_walk($packages, function (&$package) {
+            $package['vendor'] = ucfirst($package['vendor']);
+        });
+
+        return $packages;
+    }
 }
diff --git a/setup/src/Magento/Setup/Model/Grid/Extension.php b/setup/src/Magento/Setup/Model/Grid/Extension.php
index 8ac59a5244d921e23ab82bcf9f211e5030cb3e7f..d46a112cc8be4e06b8b3fa8e7185a012fea0df02 100644
--- a/setup/src/Magento/Setup/Model/Grid/Extension.php
+++ b/setup/src/Magento/Setup/Model/Grid/Extension.php
@@ -18,11 +18,6 @@ class Extension
      */
     private $composerInformation;
 
-    /**
-     * @var TypeMapper
-     */
-    private $typeMapper;
-
     /**
      * @var PackagesData
      */
@@ -31,16 +26,13 @@ class Extension
     /**
      * @param ComposerInformation $composerInformation
      * @param PackagesData $packagesData
-     * @param TypeMapper $typeMapper
      */
     public function __construct(
         ComposerInformation $composerInformation,
-        PackagesData $packagesData,
-        TypeMapper $typeMapper
+        PackagesData $packagesData
     ) {
         $this->composerInformation = $composerInformation;
         $this->packagesData = $packagesData;
-        $this->typeMapper = $typeMapper;
     }
 
     /**
@@ -89,7 +81,6 @@ class Extension
     {
         foreach ($extensions as &$extension) {
             $extension['vendor'] = ucfirst(current(explode('/', $extension['name'])));
-            $extension['type'] = $this->typeMapper->map($extension['name'], $extension['type']);
         }
         return array_values($extensions);
     }
diff --git a/setup/src/Magento/Setup/Model/Grid/Module.php b/setup/src/Magento/Setup/Model/Grid/Module.php
index 269367779e7f133e46c87896038b2d80bb5e413e..bda7e001d6ad0ea896b8bd7738bd58313fe2cb9f 100644
--- a/setup/src/Magento/Setup/Model/Grid/Module.php
+++ b/setup/src/Magento/Setup/Model/Grid/Module.php
@@ -3,10 +3,12 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Setup\Model\Grid;
 
 use Magento\Framework\Composer\ComposerInformation;
+use Magento\Framework\Module\ModuleList;
+use Magento\Framework\Module\PackageInfoFactory;
+use Magento\Setup\Model\PackagesData;
 
 /**
  * Module grid
@@ -46,41 +48,33 @@ class Module
     /**
      * Module info
      *
-     * @var \Magento\Framework\Module\ModuleList
+     * @var ModuleList
      */
     private $moduleList;
 
     /**
-     * @var TypeMapper
-     */
-    private $typeMapper;
-
-    /**
-     * @var \Magento\Setup\Model\PackagesData
+     * @var PackagesData
      */
     private $packagesData;
 
     /**
      * @param ComposerInformation $composerInformation
      * @param \Magento\Framework\Module\FullModuleList $fullModuleList
-     * @param \Magento\Framework\Module\ModuleList $moduleList
+     * @param ModuleList $moduleList
      * @param \Magento\Setup\Model\ObjectManagerProvider $objectManagerProvider
-     * @param TypeMapper $typeMapper
-     * @param \Magento\Setup\Model\PackagesData $packagesData
+     * @param PackagesData $packagesData
      */
     public function __construct(
         ComposerInformation $composerInformation,
         \Magento\Framework\Module\FullModuleList $fullModuleList,
-        \Magento\Framework\Module\ModuleList $moduleList,
+        ModuleList $moduleList,
         \Magento\Setup\Model\ObjectManagerProvider $objectManagerProvider,
-        TypeMapper $typeMapper,
-        \Magento\Setup\Model\PackagesData $packagesData
+        PackagesData $packagesData
     ) {
         $this->composerInformation = $composerInformation;
         $this->fullModuleList = $fullModuleList;
         $this->moduleList = $moduleList;
         $this->objectManagerProvider = $objectManagerProvider;
-        $this->typeMapper = $typeMapper;
         $this->packagesData = $packagesData;
     }
 
@@ -92,46 +86,82 @@ class Module
     public function getList()
     {
         $this->packageInfo = $this->objectManagerProvider->get()
-            ->get(\Magento\Framework\Module\PackageInfoFactory::class)
+            ->get(PackageInfoFactory::class)
             ->create();
 
         $items = array_replace_recursive(
+            $this->getModuleListFromComposer(),
+            $this->getFullModuleList()
+        );
+
+        $items = $this->addRequiredBy($this->addGeneralInfo($items));
+
+        return $items;
+    }
+
+    /**
+     * Get module list from composer
+     *
+     * @return array
+     */
+    private function getModuleListFromComposer()
+    {
+        return array_filter(
             $this->composerInformation->getInstalledMagentoPackages(),
-            $this->getInstalledModules()
+            function ($item) {
+                return $item['type'] === ComposerInformation::MODULE_PACKAGE_TYPE;
+            }
         );
+    }
 
-        $items = array_filter($items, function ($item) {
-            return $item['type'] === ComposerInformation::MODULE_PACKAGE_TYPE;
-        });
+    /**
+     * Get full module list
+     *
+     * @return array
+     */
+    private function getFullModuleList()
+    {
+        return $this->getModulesInfo(
+            $this->fullModuleList->getNames()
+        );
+    }
 
-        array_walk($items, function (&$module, $name) {
-            $module['moduleName'] = $module['moduleName'] ?: $this->packageInfo->getModuleName($name);
-            $module['enable'] = $this->moduleList->has($module['moduleName']);
-            $module['vendor'] = ucfirst(current(preg_split('%[/_]%', $name)));
-            $module['type'] = $this->typeMapper->map($name, $module['type']);
-            $module['requiredBy'] = $this->getModuleRequiredBy($name);
-        });
+    /**
+     * Add all modules, extensions, metapackages a module required by
+     *
+     * @param array $items
+     * @return array
+     */
+    private function addRequiredBy(array $items)
+    {
+        foreach ($items as $key => $item) {
+            $items[$key]['requiredBy'] = $item['name'] != self::UNKNOWN_PACKAGE_NAME ?
+                $this->addGeneralInfo(
+                    $this->getModulesInfo(
+                        $this->packageInfo->getRequiredBy($item['name'])
+                    )
+                ) : [];
+        }
 
-        return array_values($items);
+        return $items;
     }
 
     /**
-     * Get all modules, extensions, metapackages a module required by
-     * 
-     * @param string $name Module name
+     * Get modules info
+     *
+     * @param array $moduleList
      * @return array
      */
-    private function getModuleRequiredBy($name)
+    private function getModulesInfo(array $moduleList)
     {
         $result = [];
-        $modules = $this->packageInfo->getRequiredBy($name);
-        foreach ($modules as $moduleName) {
+        foreach ($moduleList as $moduleName) {
             $packageName = $this->packageInfo->getPackageName($moduleName);
-            $result[] = [
+            $key = $packageName ?: $moduleName;
+            $result[$key] = [
                 'name' => $packageName ?: self::UNKNOWN_PACKAGE_NAME,
                 'moduleName' => $moduleName,
-                'type' => $this->typeMapper->map($packageName, ComposerInformation::MODULE_PACKAGE_TYPE),
-                'enable' => $this->moduleList->has($moduleName),
+                'type' => ComposerInformation::MODULE_PACKAGE_TYPE,
                 'version' => $this->packageInfo->getVersion($moduleName) ?: self::UNKNOWN_VERSION,
             ];
         }
@@ -140,23 +170,21 @@ class Module
     }
 
     /**
-     * Get full list of installed modules
+     * Add general info to result array
      *
+     * @param array $items
      * @return array
      */
-    private function getInstalledModules()
+    private function addGeneralInfo(array $items)
     {
-        $modules = [];
-        $allModules = $this->fullModuleList->getNames();
-        foreach ($allModules as $module) {
-            $packageName = $this->packageInfo->getPackageName($module);
-            $name = $packageName ?: $module;
-            $modules[$name]['name'] = $packageName ?: self::UNKNOWN_PACKAGE_NAME;
-            $modules[$name]['moduleName'] = $module;
-            $modules[$name]['type'] = ComposerInformation::MODULE_PACKAGE_TYPE;
-            $modules[$name]['version'] = $this->packageInfo->getVersion($module) ?: self::UNKNOWN_VERSION;
+        foreach ($items as &$item) {
+            $item['moduleName'] = $item['moduleName'] ?: $this->packageInfo->getModuleName($item['name']);
+            $item['enable'] = $this->moduleList->has($item['moduleName']);
+            $vendorSource = $item['name'] == self::UNKNOWN_PACKAGE_NAME ? $item['moduleName'] : $item['name'];
+            $item['vendor'] = ucfirst(current(preg_split('%[/_]%', $vendorSource)));
+            $item = $this->packagesData->addPackageExtraInfo($item);
         }
 
-        return $modules;
+        return array_values($items);
     }
 }
diff --git a/setup/src/Magento/Setup/Model/Grid/TypeMapper.php b/setup/src/Magento/Setup/Model/Grid/TypeMapper.php
index 962baa79f2435f76387b1d56fa0c4214db9f09b1..5c31c9a183d12409cde5faa19acfc352121a9cfe 100644
--- a/setup/src/Magento/Setup/Model/Grid/TypeMapper.php
+++ b/setup/src/Magento/Setup/Model/Grid/TypeMapper.php
@@ -17,65 +17,34 @@ class TypeMapper
      */
     const UNDEFINED_PACKAGE_TYPE = 'Undefined';
     const EXTENSION_PACKAGE_TYPE = 'Extension';
+    const THEME_PACKAGE_TYPE = 'Theme';
+    const MODULE_PACKAGE_TYPE = 'Module';
+    const LANGUAGE_PACKAGE_TYPE = 'Language';
+    const METAPACKAGE_PACKAGE_TYPE = 'Metapackage';
+    const COMPONENT_PACKAGE_TYPE = 'Component';
+    const LIBRARY_PACKAGE_TYPE = 'Library';
     /**#@-*/
-    
-    /**
-     * @var ComposerInformation
-     */
-    private $composerInformation;
-
-    /**
-     * @var array
-     */
-    private $rootRequires;
 
     /** @var array */
     private $packageTypesMap = [
-        ComposerInformation::THEME_PACKAGE_TYPE => 'Theme',
-        ComposerInformation::LANGUAGE_PACKAGE_TYPE => 'Language',
-        ComposerInformation::MODULE_PACKAGE_TYPE => 'Module',
-        ComposerInformation::METAPACKAGE_PACKAGE_TYPE => 'Metapackage',
-        ComposerInformation::COMPONENT_PACKAGE_TYPE => 'Component',
-        ComposerInformation::LIBRARY_PACKAGE_TYPE => 'Library'
+        ComposerInformation::THEME_PACKAGE_TYPE => self::THEME_PACKAGE_TYPE,
+        ComposerInformation::LANGUAGE_PACKAGE_TYPE => self::LANGUAGE_PACKAGE_TYPE,
+        ComposerInformation::MODULE_PACKAGE_TYPE => self::MODULE_PACKAGE_TYPE,
+        ComposerInformation::METAPACKAGE_PACKAGE_TYPE => self::METAPACKAGE_PACKAGE_TYPE,
+        ComposerInformation::COMPONENT_PACKAGE_TYPE => self::COMPONENT_PACKAGE_TYPE,
+        ComposerInformation::LIBRARY_PACKAGE_TYPE => self::LIBRARY_PACKAGE_TYPE
     ];
 
-    /**
-     * TypeMapper constructor.
-     * @param ComposerInformation $composerInformation
-     */
-    public function __construct(
-        ComposerInformation $composerInformation
-    ) {
-        $this->composerInformation = $composerInformation;
-    }
-
     /**
      * Retrieve package type for a grid.
      *
-     * @param string $packageName
      * @param string $packageType
      * @return string
+     * @internal param string $packageName
      */
-    public function map($packageName, $packageType)
+    public function map($packageType)
     {
-        if (in_array($packageName, $this->getRootRequires())
-            && $packageType == ComposerInformation::MODULE_PACKAGE_TYPE
-        ) {
-            return self::EXTENSION_PACKAGE_TYPE;
-        }
-
         return isset($this->packageTypesMap[$packageType]) ?
             $this->packageTypesMap[$packageType] : self::UNDEFINED_PACKAGE_TYPE;
     }
-
-    /**
-     * @return array
-     */
-    private function getRootRequires()
-    {
-        if ($this->rootRequires === null) {
-            $this->rootRequires = array_keys($this->composerInformation->getRootPackage()->getRequires());
-        }
-        return $this->rootRequires;
-    }
 }
diff --git a/setup/src/Magento/Setup/Model/PackagesData.php b/setup/src/Magento/Setup/Model/PackagesData.php
index 0138212ef39b0137bf3649a42e219d49c1a7b535..701393fd9666102147c5921ad1831a69488ba8fb 100644
--- a/setup/src/Magento/Setup/Model/PackagesData.php
+++ b/setup/src/Magento/Setup/Model/PackagesData.php
@@ -5,10 +5,9 @@
  */
 namespace Magento\Setup\Model;
 
-use Magento\Framework\Composer\ComposerInformation;
-
 /**
  * Class PackagesData returns system packages and available for update versions
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class PackagesData
 {
@@ -22,7 +21,7 @@ class PackagesData
     /**#@-*/
 
     /**
-     * @var ComposerInformation
+     * @var \Magento\Framework\Composer\ComposerInformation
      */
     private $composerInformation;
 
@@ -64,24 +63,27 @@ class PackagesData
     /**
      * PackagesData constructor.
      *
-     * @param ComposerInformation $composerInformation,
-     * @param \Magento\Setup\Model\DateTime\TimeZoneProvider $timeZoneProvider,
-     * @param \Magento\Setup\Model\PackagesAuth $packagesAuth,
-     * @param \Magento\Framework\Filesystem $filesystem,
+     * @param \Magento\Framework\Composer\ComposerInformation $composerInformation ,
+     * @param \Magento\Setup\Model\DateTime\TimeZoneProvider $timeZoneProvider ,
+     * @param \Magento\Setup\Model\PackagesAuth $packagesAuth ,
+     * @param \Magento\Framework\Filesystem $filesystem ,
      * @param \Magento\Setup\Model\ObjectManagerProvider $objectManagerProvider
+     * @param TypeMapper $typeMapper
      */
     public function __construct(
-        ComposerInformation $composerInformation,
+        \Magento\Framework\Composer\ComposerInformation $composerInformation,
         \Magento\Setup\Model\DateTime\TimeZoneProvider $timeZoneProvider,
         \Magento\Setup\Model\PackagesAuth $packagesAuth,
         \Magento\Framework\Filesystem $filesystem,
-        \Magento\Setup\Model\ObjectManagerProvider $objectManagerProvider
+        \Magento\Setup\Model\ObjectManagerProvider $objectManagerProvider,
+        \Magento\Setup\Model\Grid\TypeMapper $typeMapper
     ) {
         $this->objectManagerProvider = $objectManagerProvider;
         $this->composerInformation = $composerInformation;
         $this->timeZoneProvider = $timeZoneProvider;
         $this->packagesAuth = $packagesAuth;
         $this->filesystem = $filesystem;
+        $this->typeMapper = $typeMapper;
     }
 
     /**
@@ -174,10 +176,16 @@ class PackagesData
      */
     public function getInstalledPackages()
     {
-        return array_intersect_key(
+        $installedPackages = array_intersect_key(
             $this->composerInformation->getInstalledMagentoPackages(),
             $this->composerInformation->getRootPackage()->getRequires()
         );
+
+        foreach ($installedPackages as &$package) {
+            $package = $this->addPackageExtraInfo($package);
+        }
+
+        return $this->filterPackagesList($installedPackages);
     }
 
     /**
@@ -273,22 +281,57 @@ class PackagesData
                     ksort($package);
                     $packageValues = array_values($package);
                     if ($this->isNewUserPackage($packageValues[0], $packageNames)) {
-                        $versions = array_reverse(array_keys($package));
+                        uksort($package, 'version_compare');
                         $installPackage = $packageValues[0];
-                        $installPackage['versions'] = $versions;
+                        $installPackage['versions'] = array_reverse(array_keys($package));
                         $installPackage['name'] = $packageName;
                         $installPackage['vendor'] = explode('/', $packageName)[0];
-                        $installPackages[$packageName] = $installPackage;
+                        $installPackages[$packageName] = $this->addPackageExtraInfo($installPackage);
                     }
                 }
             }
-            $packagesForInstall['packages'] = $installPackages;
+            $packagesForInstall['packages'] = $this->filterPackagesList($installPackages);
             return $packagesForInstall;
         } catch (\Exception $e) {
             throw new \RuntimeException('Error in syncing packages for Install');
         }
     }
 
+    /**
+     * Get package extra info
+     *
+     * @param string $packageName
+     * @param string $packageVersion
+     * @return array
+     */
+    private function getPackageExtraInfo($packageName, $packageVersion)
+    {
+        $packagesJson = $this->getPackagesJson();
+
+        return isset($packagesJson[$packageName][$packageVersion]['extra']) ?
+            $packagesJson[$packageName][$packageVersion]['extra'] : [] ;
+    }
+
+    /**
+     * Add package extra info
+     *
+     * @param array $package
+     * @return array
+     */
+    public function addPackageExtraInfo(array $package)
+    {
+        $extraInfo = $this->getPackageExtraInfo($package['name'], $package['version']);
+
+        $package['package_title'] =  isset($extraInfo['x-magento-ext-title']) ?
+            $extraInfo['x-magento-ext-title'] : $package['name'];
+        $package['package_type'] = isset($extraInfo['x-magento-ext-type']) ? $extraInfo['x-magento-ext-type'] :
+            $this->typeMapper->map($package['type']);
+        $package['package_link'] = isset($extraInfo['x-magento-ext-package-link']) ?
+            $extraInfo['x-magento-ext-package-link'] : '';
+
+        return $package;
+    }
+
     /**
      * Check if this new user package
      *
@@ -353,6 +396,31 @@ class PackagesData
     }
 
     /**
+     * Filter packages by allowed types
+     *
+     * @param array $packages
+     * @return array
+     */
+    private function filterPackagesList(array $packages)
+    {
+        return array_filter(
+            $packages,
+            function ($item) {
+                return in_array(
+                    $item['package_type'],
+                    [
+                        \Magento\Setup\Model\Grid\TypeMapper::MODULE_PACKAGE_TYPE,
+                        \Magento\Setup\Model\Grid\TypeMapper::EXTENSION_PACKAGE_TYPE,
+                        \Magento\Setup\Model\Grid\TypeMapper::THEME_PACKAGE_TYPE,
+                        \Magento\Setup\Model\Grid\TypeMapper::METAPACKAGE_PACKAGE_TYPE
+                    ]
+                );
+            }
+        );
+    }
+
+    /**
+     * Get MetaPackage for package
      *
      * @param array $packages
      * @return array
@@ -361,7 +429,7 @@ class PackagesData
     {
         $result = [];
         foreach ($packages as $package) {
-            if ($package['type'] == ComposerInformation::METAPACKAGE_PACKAGE_TYPE) {
+            if ($package['type'] == \Magento\Framework\Composer\ComposerInformation::METAPACKAGE_PACKAGE_TYPE) {
                 if (isset($package['require'])) {
                     foreach ($package['require'] as $key => $requirePackage) {
                         $result[$key] = $package['name'];
@@ -385,7 +453,7 @@ class PackagesData
             $packages = $this->getPackagesJson();
             array_walk($packages, function ($packageVersions) {
                 $package = array_shift($packageVersions);
-                if ($package['type'] == ComposerInformation::METAPACKAGE_PACKAGE_TYPE
+                if ($package['type'] == \Magento\Framework\Composer\ComposerInformation::METAPACKAGE_PACKAGE_TYPE
                     && isset($package['require'])
                 ) {
                     foreach (array_keys($package['require']) as $key) {
diff --git a/setup/src/Magento/Setup/Test/Unit/Controller/InstallExtensionGridTest.php b/setup/src/Magento/Setup/Test/Unit/Controller/InstallExtensionGridTest.php
index 9b091b0bc1203c140cfdc7e83f0371fcb4009b5c..166942a695db12fd1e912a44aaff15278fd56f5e 100644
--- a/setup/src/Magento/Setup/Test/Unit/Controller/InstallExtensionGridTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Controller/InstallExtensionGridTest.php
@@ -7,8 +7,8 @@
 namespace Magento\Setup\Test\Unit\Controller;
 
 use Magento\Setup\Controller\InstallExtensionGrid;
-use Magento\Setup\Model\Grid\TypeMapper;
 use Magento\Setup\Model\PackagesData;
+use Magento\Framework\Composer\ComposerInformation;
 
 class InstallExtensionGridTest extends \PHPUnit_Framework_TestCase
 {
@@ -24,23 +24,14 @@ class InstallExtensionGridTest extends \PHPUnit_Framework_TestCase
      */
     private $packagesData;
 
-    /**
-     * @var TypeMapper|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $typeMapperMock;
-
     public function setUp()
     {
         $this->packagesData = $this->getMockBuilder(PackagesData::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->typeMapperMock = $this->getMockBuilder(TypeMapper::class)
-            ->disableOriginalConstructor()
-            ->getMock();
 
         $this->controller = new InstallExtensionGrid(
-            $this->packagesData,
-            $this->typeMapperMock
+            $this->packagesData
         );
     }
 
@@ -63,9 +54,6 @@ class InstallExtensionGridTest extends \PHPUnit_Framework_TestCase
         $this->packagesData->expects(static::once())
             ->method('getPackagesForInstall')
             ->willReturn($extensions);
-        $this->typeMapperMock->expects(static::exactly(4))
-            ->method('map')
-            ->willReturn($extensions);
 
         $jsonModel = $this->controller->extensionsAction();
         static::assertInstanceOf(\Zend\View\Model\JsonModel::class, $jsonModel);
@@ -84,25 +72,25 @@ class InstallExtensionGridTest extends \PHPUnit_Framework_TestCase
         $extensions['packages'] = [
             'magento/testing-extension' => [
                 'name' => 'magento/testing-extension',
-                'type' => 'module',
+                'type' => ComposerInformation::MODULE_PACKAGE_TYPE,
                 'vendor' => 'magento',
                 'version' => '2.2.2',
                 'author' => 'magento'],
             'magento/my-first-module' => [
                 'name' => 'magento/my-first-module',
-                'type' => 'module',
+                'type' => ComposerInformation::MODULE_PACKAGE_TYPE,
                 'vendor' => 'magento',
                 'version' => '2.0.0',
                 'author' => 'magento'],
             'magento/last-extension' => [
-                'name' => 'magento/last-extension',
-                'type' => 'module',
+                'name' => 'magento/theme',
+                'type' => ComposerInformation::THEME_PACKAGE_TYPE,
                 'vendor' => 'magento',
                 'version' => '2.1.1',
                 'author' => 'magento'],
             'magento/magento-second-module' => [
                 'name' => 'magento/magento-second-module',
-                'type' => 'module',
+                'type' => ComposerInformation::COMPONENT_PACKAGE_TYPE,
                 'vendor' => 'magento',
                 'version' => '2.0.0',
                 'author' => 'magento']
diff --git a/setup/src/Magento/Setup/Test/Unit/Controller/UpdateExtensionGridTest.php b/setup/src/Magento/Setup/Test/Unit/Controller/UpdateExtensionGridTest.php
index a76e9bca63c46dd067a074082ff8c8449aa38f4b..d67f923b27ef53a1ff870b8df559709b5fddd156 100644
--- a/setup/src/Magento/Setup/Test/Unit/Controller/UpdateExtensionGridTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Controller/UpdateExtensionGridTest.php
@@ -50,6 +50,7 @@ class UpdateExtensionGridTest extends \PHPUnit_Framework_TestCase
         $extensionData = [
             [
                 'name' => 'magento-package-1',
+                'product_name' => 'magento/package-1',
                 'type' => 'magento2-module',
                 'version' => '1.0.0',
                 'latestVersion' => '2.0.5',
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/Grid/ExtensionTest.php b/setup/src/Magento/Setup/Test/Unit/Model/Grid/ExtensionTest.php
index 6e2963fd063d13dcf6ca204f64c3b6d6aa5dda4d..b80423718e0b6a286f0ea91a86cb9013fca4931a 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/Grid/ExtensionTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Model/Grid/ExtensionTest.php
@@ -5,10 +5,8 @@
  */
 namespace Magento\Setup\Test\Unit\Model\Grid;
 
-use Composer\Package\RootPackage;
 use Magento\Framework\Composer\ComposerInformation;
 use Magento\Setup\Model\Grid\Extension;
-use Magento\Setup\Model\Grid\TypeMapper;
 use Magento\Setup\Model\PackagesData;
 use PHPUnit_Framework_MockObject_MockObject as MockObject;
 
@@ -22,11 +20,6 @@ class ExtensionTest extends \PHPUnit_Framework_TestCase
      */
     private $composerInformationMock;
 
-    /**
-     * @var TypeMapper|MockObject
-     */
-    private $typeMapperMock;
-
     /**
      * @var PackagesData|MockObject
      */
@@ -44,17 +37,13 @@ class ExtensionTest extends \PHPUnit_Framework_TestCase
         $this->composerInformationMock =  $this->getMockBuilder(ComposerInformation::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->typeMapperMock = $this->getMockBuilder(TypeMapper::class)
-            ->disableOriginalConstructor()
-            ->getMock();
         $this->packagesDataMock = $this->getMockBuilder(PackagesData::class)
             ->disableOriginalConstructor()
             ->getMock();
 
         $this->model = new Extension(
             $this->composerInformationMock,
-            $this->packagesDataMock,
-            $this->typeMapperMock
+            $this->packagesDataMock
         );
     }
 
@@ -63,9 +52,6 @@ class ExtensionTest extends \PHPUnit_Framework_TestCase
         $this->composerInformationMock->expects($this->any())
             ->method('isPackageInComposerJson')
             ->willReturn(true);
-        $this->typeMapperMock->expects($this->any())
-            ->method('map')
-            ->willReturn('Extension');
         $this->packagesDataMock->expects($this->once())
             ->method('getInstalledPackages')
             ->willReturn(
@@ -73,11 +59,17 @@ class ExtensionTest extends \PHPUnit_Framework_TestCase
                     'magento/package-1' => [
                         'name' => 'magento/package-1',
                         'type' => 'magento2-module',
+                        'package_title' => 'packageTitle',
+                        'package_type' => 'packageType',
+                        'package_link' => 'http://example.com',
                         'version' => '1.0.0'
                     ],
                     'magento/package-2' => [
                         'name' => 'magento/package-2',
                         'type' => 'magento2-module',
+                        'package_title' => 'packageTitle',
+                        'package_type' => 'packageType',
+                        'package_link' => 'http://example.com',
                         'version' => '1.0.1'
                     ],
                 ]
@@ -93,19 +85,25 @@ class ExtensionTest extends \PHPUnit_Framework_TestCase
         $expected = [
             [
                 'name' => 'magento/package-1',
-                'type' => 'Extension',
+                'type' => 'magento2-module',
+                'package_title' => 'packageTitle',
+                'package_type' => 'packageType',
                 'version' => '1.0.0',
                 'update' => true,
                 'uninstall' => true,
                 'vendor' => 'Magento',
+                'package_link' => 'http://example.com'
             ],
             [
                 'name' => 'magento/package-2',
-                'type' => 'Extension',
+                'type' => 'magento2-module',
+                'package_title' => 'packageTitle',
+                'package_type' => 'packageType',
                 'version' => '1.0.1',
                 'update' => false,
                 'uninstall' => true,
                 'vendor' => 'Magento',
+                'package_link' => 'http://example.com'
             ],
         ];
 
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/Grid/ModuleTest.php b/setup/src/Magento/Setup/Test/Unit/Model/Grid/ModuleTest.php
index 26df267532f0b6befec6d691a2de71aa47101779..3d85b2168c57556de4c74ce5a8486fc729592167 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/Grid/ModuleTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Model/Grid/ModuleTest.php
@@ -13,7 +13,6 @@ use Magento\Framework\Module\PackageInfo;
 use Magento\Framework\Module\PackageInfoFactory;
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Setup\Model\Grid\Module;
-use Magento\Setup\Model\Grid\TypeMapper;
 use Magento\Setup\Model\ObjectManagerProvider;
 use Magento\Setup\Model\PackagesData;
 
@@ -55,11 +54,6 @@ class ModuleTest extends \PHPUnit_Framework_TestCase
      */
     private $objectManagerProvider;
 
-    /**
-     * @var TypeMapper|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $typeMapperMock;
-
     /**
      * @var PackagesData|\PHPUnit_Framework_MockObject_MockObject
      */
@@ -119,10 +113,6 @@ class ModuleTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $this->typeMapperMock = $this->getMockBuilder(TypeMapper::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
         $this->packagesDataMock = $this->getMockBuilder(PackagesData::class)
             ->disableOriginalConstructor()
             ->getMock();
@@ -132,7 +122,6 @@ class ModuleTest extends \PHPUnit_Framework_TestCase
             $this->fullModuleListMock,
             $this->moduleListMock,
             $this->objectManagerProvider,
-            $this->typeMapperMock,
             $this->packagesDataMock
         );
     }
@@ -155,14 +144,7 @@ class ModuleTest extends \PHPUnit_Framework_TestCase
         $this->packageInfoMock->expects(static::never())
             ->method('getModuleName');
 
-        $this->typeMapperMock->expects(static::exactly(2))
-            ->method('map')
-            ->willReturnMap([
-                ['magento/sample-module-one', 'magento2-module', 'Module'],
-                ['Sample_ModuleTwo', 'magento2-module', 'Module'],
-            ]);
-
-        $this->packageInfoMock->expects(static::exactly(2))
+        $this->packageInfoMock->expects(static::once())
             ->method('getRequiredBy')
             ->willReturn([]);
         $this->packageInfoMock->expects(static::exactly(2))
@@ -177,6 +159,17 @@ class ModuleTest extends \PHPUnit_Framework_TestCase
                 ['Sample_ModuleOne', '1.0.0'],
                 ['Sample_ModuleTwo', ''],
             ]);
+
+        $this->packagesDataMock->expects(static::exactly(2))
+            ->method('addPackageExtraInfo')
+            ->will(
+                $this->returnCallback(function ($package) {
+                    $package['package_title'] = 'packageTitle';
+                    $package['package_type'] = 'packageType';
+                    return $package;
+                })
+            );
+
         $this->moduleListMock->expects(static::exactly(2))
             ->method('has')
             ->willReturn(true);
@@ -187,20 +180,24 @@ class ModuleTest extends \PHPUnit_Framework_TestCase
         $expected = [
             [
                 'name' => 'magento/sample-module-one',
-                'type' => 'Module',
+                'type' => 'magento2-module',
                 'version' => '1.0.0',
                 'vendor' => 'Magento',
                 'moduleName' => 'Sample_ModuleOne',
                 'enable' => true,
+                'package_title' => 'packageTitle',
+                'package_type' => 'packageType',
                 'requiredBy' => [],
             ],
             [
                 'name' => Module::UNKNOWN_PACKAGE_NAME,
-                'type' => 'Module',
+                'type' => 'magento2-module',
                 'version' => Module::UNKNOWN_VERSION,
                 'vendor' => 'Sample',
                 'moduleName' => 'Sample_ModuleTwo',
                 'enable' => true,
+                'package_title' => 'packageTitle',
+                'package_type' => 'packageType',
                 'requiredBy' => [],
             ],
         ];
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/Grid/TypeMapperTest.php b/setup/src/Magento/Setup/Test/Unit/Model/Grid/TypeMapperTest.php
index 63bcb4f1de0dfefbe8edc06657728f02d40628e7..92d7df7973d5673f2fa060b4b7fb4be739949a44 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/Grid/TypeMapperTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Model/Grid/TypeMapperTest.php
@@ -8,18 +8,12 @@ namespace Magento\Setup\Test\Unit\Model\Grid;
 
 use Magento\Framework\Composer\ComposerInformation;
 use Magento\Setup\Model\Grid\TypeMapper;
-use Composer\Package\RootPackageInterface;
 
 /**
  * Class TypeMapperTest
  */
 class TypeMapperTest extends \PHPUnit_Framework_TestCase
 {
-    /**
-     * @var ComposerInformation|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $composerInformationMock;
-
     /**
      * Model
      *
@@ -29,50 +23,28 @@ class TypeMapperTest extends \PHPUnit_Framework_TestCase
 
     public function setUp()
     {
-        $this->composerInformationMock = $this->getMockBuilder(ComposerInformation::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $this->typeMapperMock = $this->getMockBuilder(TypeMapper::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $this->model = new TypeMapper(
-            $this->composerInformationMock
-        );
+        $this->model = new TypeMapper();
     }
 
     /**
-     * @param string $packageName
      * @param string $packageType
      * @param string $expected
      * @dataProvider mapDataProvider
      */
-    public function testMap($packageName, $packageType, $expected)
+    public function testMap($packageType, $expected)
     {
-        $rootPackageMock = $this->getMock(RootPackageInterface::class);
-        $rootPackageMock->expects(static::once())
-            ->method('getRequires')
-            ->willReturn(
-                ['magento/sample-module-one' => '']
-            );
-
-        $this->composerInformationMock->expects(static::once())
-            ->method('getRootPackage')
-            ->willReturn($rootPackageMock);
-
         static::assertEquals(
             $expected,
-            $this->model->map($packageName, $packageType)
+            $this->model->map($packageType)
         );
     }
 
     public function mapDataProvider()
     {
         return [
-            ['magento/sample-module-one', ComposerInformation::MODULE_PACKAGE_TYPE, TypeMapper::EXTENSION_PACKAGE_TYPE],
-            ['magento/sample-module-two', ComposerInformation::MODULE_PACKAGE_TYPE, 'Module'],
-            ['magento/sample-module-two', 'undefined', TypeMapper::UNDEFINED_PACKAGE_TYPE]
+            [ComposerInformation::THEME_PACKAGE_TYPE, TypeMapper::THEME_PACKAGE_TYPE],
+            [ComposerInformation::MODULE_PACKAGE_TYPE, TypeMapper::MODULE_PACKAGE_TYPE],
+            ['undefined', TypeMapper::UNDEFINED_PACKAGE_TYPE]
         ];
     }
 }
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/PackagesDataTest.php b/setup/src/Magento/Setup/Test/Unit/Model/PackagesDataTest.php
index 35491d3967fafac942a52ba293973579e3a74aec..5a7ead384665446fa7fb3dc82dff33d4b9777133 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/PackagesDataTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Model/PackagesDataTest.php
@@ -13,6 +13,7 @@ use PHPUnit_Framework_MockObject_MockObject as MockObject;
 
 /**
  * Tests Magento\Setup\Model\PackagesData
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class PackagesDataTest extends \PHPUnit_Framework_TestCase
 {
@@ -21,44 +22,9 @@ class PackagesDataTest extends \PHPUnit_Framework_TestCase
      */
     private $packagesData;
 
-    /**
-     * @var ComposerInformation|MockObject
-     */
-    private $composerInformation;
-
     public function setUp()
     {
-        $this->composerInformation = $this->getMock(ComposerInformation::class, [], [], '', false);
-        $this->composerInformation->expects($this->any())->method('getInstalledMagentoPackages')->willReturn(
-            [
-                'magento/package-1' => [
-                    'name' => 'magento/package-1',
-                    'type' => 'magento2-module',
-                    'version'=> '1.0.0'
-                ],
-                'magento/package-2' => [
-                    'name' => 'magento/package-2',
-                    'type' => 'magento2-module',
-                    'version'=> '1.0.1'
-                ]
-            ]
-        );
-
-        $this->composerInformation->expects($this->any())->method('getRootRepositories')
-            ->willReturn(['repo1', 'repo2']);
-        $this->composerInformation->expects($this->any())->method('getPackagesTypes')
-            ->willReturn(['magento2-module']);
-        $rootPackage = $this->getMock(RootPackage::class, [], ['magento/project', '2.1.0', '2']);
-        $rootPackage->expects($this->any())
-            ->method('getRequires')
-            ->willReturn([
-                'magento/package-1' => '1.0.0',
-                'magento/package-2' => '1.0.1'
-            ]);
-        $this->composerInformation
-            ->expects($this->any())
-            ->method('getRootPackage')
-            ->willReturn($rootPackage);
+        $composerInformation = $this->getComposerInformation();
         $timeZoneProvider = $this->getMock(\Magento\Setup\Model\DateTime\TimeZoneProvider::class, [], [], '', false);
         $timeZone = $this->getMock(\Magento\Framework\Stdlib\DateTime\Timezone::class, [], [], '', false);
         $timeZoneProvider->expects($this->any())->method('get')->willReturn($timeZone);
@@ -110,19 +76,69 @@ class PackagesDataTest extends \PHPUnit_Framework_TestCase
                 . '}, "magento\/package-3":{'
                 . '"1.0.0":{"name":"magento\/package-3","version":"1.0.0","vendor":"test","type":"magento2-module"},'
                 . '"1.0.1":{"name":"magento\/package-3","version":"1.0.1","vendor":"test","type":"magento2-module"},'
-                . '"1.0.2":{"name":"magento\/package-3","version":"1.0.2","vendor":"test","type":"magento2-module"}'
+                . '"1.0.2":{"name":"magento\/package-3","version":"1.0.2","vendor":"test","type":"magento2-module",'
+                . '"extra":{"x-magento-ext-title":"Package 3 title", "x-magento-ext-type":"Extension"}}'
                 . '}}}'
             );
 
+        $typeMapper = $this->getMockBuilder(\Magento\Setup\Model\Grid\TypeMapper::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $typeMapper->expects(static::any())
+            ->method('map')
+            ->willReturnMap([
+                [ComposerInformation::MODULE_PACKAGE_TYPE, \Magento\Setup\Model\Grid\TypeMapper::MODULE_PACKAGE_TYPE],
+            ]);
+
         $this->packagesData = new PackagesData(
-            $this->composerInformation,
+            $composerInformation,
             $timeZoneProvider,
             $packagesAuth,
             $filesystem,
-            $objectManagerProvider
+            $objectManagerProvider,
+            $typeMapper
         );
     }
 
+    /**
+     * @return ComposerInformation|MockObject
+     */
+    private function getComposerInformation()
+    {
+        $composerInformation = $this->getMock(ComposerInformation::class, [], [], '', false);
+        $composerInformation->expects($this->any())->method('getInstalledMagentoPackages')->willReturn(
+            [
+                'magento/package-1' => [
+                    'name' => 'magento/package-1',
+                    'type' => 'magento2-module',
+                    'version'=> '1.0.0'
+                ],
+                'magento/package-2' => [
+                    'name' => 'magento/package-2',
+                    'type' => 'magento2-module',
+                    'version'=> '1.0.1'
+                ]
+            ]
+        );
+
+        $composerInformation->expects($this->any())->method('getRootRepositories')
+            ->willReturn(['repo1', 'repo2']);
+        $composerInformation->expects($this->any())->method('getPackagesTypes')
+            ->willReturn(['magento2-module']);
+        $rootPackage = $this->getMock(RootPackage::class, [], ['magento/project', '2.1.0', '2']);
+        $rootPackage->expects($this->any())
+            ->method('getRequires')
+            ->willReturn([
+                'magento/package-1' => '1.0.0',
+                'magento/package-2' => '1.0.1'
+            ]);
+        $composerInformation->expects($this->any())
+            ->method('getRootPackage')
+            ->willReturn($rootPackage);
+
+        return $composerInformation;
+    }
+
     public function testSyncPackagesData()
     {
         $latestData = $this->packagesData->syncPackagesData();
@@ -163,4 +179,18 @@ class PackagesDataTest extends \PHPUnit_Framework_TestCase
             $this->packagesData->getMetaPackagesMap()
         );
     }
+
+    public function testAddPackageExtraInfo()
+    {
+        static::assertEquals(
+            [
+                'package_title' => 'Package 3 title',
+                'package_type' => 'Extension',
+                'name' => 'magento/package-3',
+                'version' => '1.0.2',
+                'package_link' => ''
+            ],
+            $this->packagesData->addPackageExtraInfo(['name' => 'magento/package-3', 'version' => '1.0.2'])
+        );
+    }
 }
diff --git a/setup/view/layout/layout.phtml b/setup/view/layout/layout.phtml
index f4f137c226301ef3535c3a9f5e824d78ffcde5df..591da1f16f94b555f072601db84803e873c9e92e 100644
--- a/setup/view/layout/layout.phtml
+++ b/setup/view/layout/layout.phtml
@@ -45,6 +45,7 @@
         ->appendFile($this->basePath() . '/pub/magento/setup/select-version.js')
         ->appendFile($this->basePath() . '/pub/magento/setup/home.js')
         ->appendFile($this->basePath() . '/pub/magento/setup/auth-dialog.js')
+        ->appendFile($this->basePath() . '/pub/magento/setup/remove-dialog.js')
         ->appendFile($this->basePath() . '/pub/magento/setup/system-config.js')
         ->appendFile($this->basePath() . '/pub/magento/setup/marketplace-credentials.js')
         ->appendFile($this->basePath() . '/pub/magento/setup/install-extension-grid.js')
diff --git a/setup/view/magento/setup/extension-grid.phtml b/setup/view/magento/setup/extension-grid.phtml
index 1b181c5bc9bb36b2434b81b2666262b3841bc425..1096adca720433301b350d5d78d960d3c276af5c 100644
--- a/setup/view/magento/setup/extension-grid.phtml
+++ b/setup/view/magento/setup/extension-grid.phtml
@@ -24,14 +24,14 @@
                 <div class="item-number">{{countOfUpdate}}</div>
                 <div class="item-title">Updates<br />Available</div>
                 <button ui-sref="root.update" href="#update-extension-grid"
-                        ng-class="{'disabled' : !countOfUpdate}"
+                        ng-class="{'disabled' : !countOfUpdate, 'goUpdate' : countOfUpdate}"
                         type="button" class="btn">
                     Review Updates
                 </button>
             </li>
             <li class="item col-m-4">
                 <div class="item-number">{{countOfInstall}}</div>
-                <div class="item-title">Products<br />Ready to Install</div>
+                <div class="item-title">Extensions<br />Ready to Install</div>
                 <div class="item-install">
                     <button ui-sref="root.install" href="#install-extension-grid"
                             ng-class="{'disabled' : !enabledInstall, 'goInstall' : enabledInstall}"
@@ -77,8 +77,8 @@
     <div class="admin__data-grid-header">
         <div class="admin__data-grid-header-row row row-gutter">
             <div class="col-xs-3 module-summary">
-                <span class="module-summary-title">Installed Products</span>
-                <span class="module-summary-count">{{total}} products</span>
+                <span class="module-summary-title">Installed Extensions</span>
+                <span class="module-summary-count">{{total}} extensions</span>
             </div>
             <div class="col-xs-9 admin__data-grid-pager-wrap"
                  ng-include="'<?php echo $this->basePath();?>/pub/magento/setup/view/pagination.html'">
@@ -93,7 +93,7 @@
                     ng-class="{'_ascend' : predicate === 'name' && !reverse,
                                '_descend' : predicate === 'name' && reverse}"
                     class="data-grid-th _sortable">
-                    <span>Product Name</span>
+                    <span>Extension Name</span>
                 </th>
                 <th ng-click="order('type')"
                     ng-class="{'_ascend' : predicate === 'type' && !reverse,
@@ -130,10 +130,10 @@
                           data-label="{{getIndicatorInfo(extension, 'label')}}"
                     ><span>{{getIndicatorInfo(extension, 'label')}}</span>
                     </span>
-                    <span class="data-grid-data">{{extension.name}}</span>
+                    <span class="data-grid-data">{{extension.package_title}}</span>
                 </td>
                 <td>
-                    <span class="data-grid-data">{{extension.type}}</span>
+                    <span class="data-grid-data">{{extension.package_type}}</span>
                 </td>
                 <td>
                     <span class="data-grid-data" data-type="version">{{extension.version}}</span>
diff --git a/setup/view/magento/setup/install-extension-grid.phtml b/setup/view/magento/setup/install-extension-grid.phtml
index 04dc349937152090aa940f9ce79fd884f0e232c0..e2bcbf9a777c853fb203dab92309d7acae212fb5 100644
--- a/setup/view/magento/setup/install-extension-grid.phtml
+++ b/setup/view/magento/setup/install-extension-grid.phtml
@@ -19,7 +19,7 @@
             <div class="col-xs-3">
                 <button type="button" class="btn" ng-click="installAll()">Install</button>
                 <div class="admin__control-support-text">
-                    <span>{{total}}</span> products
+                    <span>{{total}}</span> extensions
                 </div>
             </div>
             <div class="col-xs-9 admin__data-grid-pager-wrap"
@@ -33,28 +33,31 @@
             <tr>
                 <th class="data-grid-multicheck-cell">
                     <div class="action-multicheck-wrap"
-                         ng-class="{'_active':isNewExtensionsMenuVisible}"
-                         click-out="hideNewExtensionsMenu()"
+                         ng-class="{'_active':multipleChoiceService.isNewExtensionsMenuVisible}"
+                         click-out="multipleChoiceService.hideNewExtensionsMenu()"
                     >
                         <input type="checkbox"
                                style="visibility: hidden;"
                                class="admin__control-checkbox"
-                               ng-class="{'_indeterminate':someExtensionsSelected}"
-                               ng-checked="allExtensionsSelected"
+                               ng-class="{'_indeterminate':multipleChoiceService.someExtensionsSelected}"
+                               ng-checked="multipleChoiceService.allExtensionsSelected"
                         >
                         <label></label>
                         <button class="action-multicheck-toggle"
-                                ng-class="{'_active':isNewExtensionsMenuVisible}"
-                                ng-click="toggleNewExtensionsMenu()"
+                                ng-class="{'_active':multipleChoiceService.isNewExtensionsMenuVisible}"
+                                ng-click="multipleChoiceService.toggleNewExtensionsMenu()"
                         >
                             <span>Options</span>
                         </button>
                         <ul class="action-menu">
-                            <li ng-show="!allExtensionsSelected" ng-click="selectAllExtensions()">
+                            <li ng-show="!multipleChoiceService.allExtensionsSelected"
+                                ng-click="multipleChoiceService.selectAllExtensions()"
+                            >
                                 <span class="action-menu-item">Select all</span>
                             </li>
-                            <li ng-show="allExtensionsSelected || someExtensionsSelected"
-                                ng-click="deselectAllExtensions()">
+                            <li ng-show="multipleChoiceService.allExtensionsSelected
+                                        || multipleChoiceService.someExtensionsSelected"
+                                ng-click="multipleChoiceService.deselectAllExtensions()">
                                 <span class="action-menu-item">Deselect all</span>
                             </li>
                         </ul>
@@ -62,7 +65,7 @@
                 </th>
                 <th ng-click="order('name')" ng-class="{'_ascend' : predicate === 'name'
                 && !reverse,'_descend' : predicate === 'name' && reverse}" class="data-grid-th _sortable">
-                    <span>Product Name</span>
+                    <span>Extension Name</span>
                 </th>
                 <th ng-click="order('type')" ng-class="{'_ascend' : predicate === 'type' &&
                 !reverse,'_descend' : predicate === 'type' && reverse}" class="data-grid-th _sortable">
@@ -89,17 +92,18 @@
                     <label class="data-grid-checkbox-cell-inner">
                         <input type="checkbox"
                                class="admin__control-checkbox"
-                               ng-checked="selectedExtensions.hasOwnProperty(extension.name)"
-                               ng-click="updateSelectedExtensions($event, extension.name, extension.version)"
+                               ng-checked="multipleChoiceService.selectedExtensions.hasOwnProperty(extension.name)"
+                               ng-click="multipleChoiceService.updateSelectedExtensions($event, extension.name,
+                                        extension.version)"
                         >
                         <label></label>
                     </label>
                 </td>
                 <td>
-                    <span class="data-grid-data">{{extension.name}}</span>
+                    <span class="data-grid-data">{{extension.package_title}}</span>
                 </td>
                 <td>
-                    <span class="data-grid-data">{{extension.type}}</span>
+                    <span class="data-grid-data">{{extension.package_type}}</span>
                 </td>
                 <td>
                     <span class="data-grid-data">{{extension.vendor}}</span>
@@ -111,6 +115,11 @@
                                     value="{{version}}">Version {{version}}</option>
                         </select>
                     </span>
+                    <span class="component-indicator _tooltip"
+                          ng-show="extension.package_link"
+                          data-label="View info on Marketplace"
+                    ><a href="{{extension.package_link}}" target="_blank"></a>
+                    </span>
                 </td>
                 <td class="data-grid-data">
                     <div class="action-wrap" ng-class="_active">
diff --git a/setup/view/magento/setup/module-grid.phtml b/setup/view/magento/setup/module-grid.phtml
index f6b3e6ae5d7e7e506b34e87b9ed0f6f471a7e96f..3f4f755ae3f6db038aca4157b17bcca594e353c0 100644
--- a/setup/view/magento/setup/module-grid.phtml
+++ b/setup/view/magento/setup/module-grid.phtml
@@ -78,14 +78,14 @@
                           ng-class="{'_show-dependencies': item.requiredBy.length > 0 && showDependencies,
                                      '_hide-dependencies': item.requiredBy.length > 0 && !showDependencies,
                                      '_no-dependencies': item.requiredBy.length == 0}">
-                        {{item.name}}
+                        {{item.package_title}}
                     </div>
                     <div class="product-modules-block" ng-show="item.requiredBy.length > 0 && showDependencies">
                         <div class="product-modules-title">
-                            Products currently using module
+                            Packages currently using module
                         </div>
                         <div class="product-modules-descriprion">
-                            Product Name
+                            Module Name
                         </div>
                         <ul class="product-modules-list">
                             <li ng-repeat="product in item.requiredBy">
@@ -94,7 +94,7 @@
                                       data-label="{{getIndicatorInfo(product, 'label')}}">
                                     <span>{{getIndicatorInfo(product, 'label')}}</span>
                                 </span>
-                                {{product.name}}
+                                {{product.package_title}}
                             </li>
                         </ul>
                     </div>
@@ -106,11 +106,11 @@
                             &nbsp;
                         </div>
                         <div class="product-modules-descriprion">
-                            Product Type
+                            Package Type
                         </div>
                         <ul class="product-modules-list">
                             <li ng-repeat="product in item.requiredBy">
-                                {{product.type}}
+                                {{product.package_type}}
                             </li>
                         </ul>
                     </div>
diff --git a/setup/view/magento/setup/readiness-check.phtml b/setup/view/magento/setup/readiness-check.phtml
index 7a228ff7e9a756dc4f4b2798fb971c52c94cf05b..2aaf4de649bf06a0984bf4eb049a1541bd937e34 100644
--- a/setup/view/magento/setup/readiness-check.phtml
+++ b/setup/view/magento/setup/readiness-check.phtml
@@ -11,7 +11,7 @@
                 type="button"
                 class="btn btn-prime"
                 ng-click="nextState()"
-                ng-disabled="checkingInProgress() || hasErrors"
+                ng-disabled="needReCheck || checkingInProgress() || hasErrors"
                 >Next</button>
         </div>
         <div class="btn-wrap btn-wrap-triangle-left btn-wrap-prev">
diff --git a/setup/view/magento/setup/readiness-check/progress.phtml b/setup/view/magento/setup/readiness-check/progress.phtml
index 3b7c7a38cc89eef989fe82b3094cf903143e2801..6719d825dfcde53a8f958ec1108a23a823146e24 100755
--- a/setup/view/magento/setup/readiness-check/progress.phtml
+++ b/setup/view/magento/setup/readiness-check/progress.phtml
@@ -30,11 +30,56 @@
             <span></span><span></span><span></span><span></span>
             <span></span><span></span><span></span><span></span>
         </span>
-        <span class="message-text">{{wordingOfReadinessCheckAction()}}.</span>
+        <span class="message-text" ng-bind-html="wordingOfReadinessCheckAction()"></span>
     </div>
 
 </div>
 
+<div class="extensions-information" ng-if="$state.current.type == 'update' && getObjectSize(getExtensionsList()) > 0">
+    <div class="message message-warning"
+         ng-show="componentDependency.processed && componentDependency.responseType != 'success'"
+    >
+        We found some extensions with available version updates. We recommend that you update to the recommended
+        versions or remove these extensions from the installation process. We found some extensions with available
+        version updates. We recommend that you update to the recommended versions or remove these extensions from
+        the installation process.
+    </div>
+    <div class="extensions-container">
+        <h3>Update these extension(s)</h3>
+        <ul class="list">
+            <li ng-repeat="extension in getExtensionsList()">
+                {{extension.name}} {{getCurrentVersion(extension.name)}} to
+                <select ng-change="versionChanged()"
+                        ng-model="extension.version"
+                        ng-disabled="checkingInProgress()"
+                >
+                    <option ng-repeat="version in getVersionsList(extension.name)"
+                            ng-selected="version == extension.version"
+                            value="{{version}}"
+                    >Version {{version}}</option>
+                </select>
+                <button class="extension-delete"
+                        title="Delete"
+                        ng-click="openDialog(extension.name)"
+                        ng-show="!checkingInProgress() && getObjectSize(getExtensionsList()) > 1">
+                    <span>Delete</span>
+                </button>
+            </li>
+        </ul>
+
+        <div ng-show="(needReCheck || hasErrors) && !checkingInProgress()">
+            <button ng-click="$state.forceReload()" class="btn btn-medium btn-secondary">
+                <span>Try Again</span>
+            </button>
+        </div>
+        <div ng-show="!needReCheck && !checkingInProgress() && !hasErrors">
+            <button ng-click="nextState()" class="btn btn-medium btn-prime">
+                <span>Update</span>
+            </button>
+        </div>
+    </div>
+</div>
+
 <div id="updater-application" class="readiness-check-item" ng-show="updater.visible">
     <div ng-hide="updater.processed">
         <span class="spinner side">
@@ -496,3 +541,42 @@
 <div class="readiness-check-item" id="warning-message" ng-show="true">
     * - In some cases, you might have two PHP configuration files: one for the PHP command line and for the web server. If so, make the change in both php.ini files. For details, see the <a href="http://php.net/manual/en/configuration.file.php">php.ini reference</a>.
 </div>
+
+<script type="text/ng-template" id="removeDialog">
+    <div class="modals-wrapper">
+        <aside class="modal-popup modal-connect-signin _show" data-role="modal">
+            <div class="modal-inner-wrap">
+                <header class="modal-header">
+                    <button ng-click="closeThisDialog()"
+                            title="Close"
+                            class="action-close"
+                            data-role="closeBtn"
+                            type="button">
+                        <span>Close</span>
+                    </button>
+                </header>
+                <div class="modal-content" data-role="content">
+                    <div class="delete-modal-wrap">
+                        <h3>Remove Extension</h3>
+
+                        <p>Are you sure you want to remove “{{extensionToRemove}}” from
+                            the list?</p>
+                        <p>
+                            Please be aware that removing this extension will remove it from the current
+                            update wizard flow. You can update this extension at a later time by selecting
+                            the extension in the update grid.
+                        </p>
+                        <div class="actions">
+                            <button ng-click="removeExtension(extensionToRemove)" class="btn btn-large btn-prime">
+                                <span>Remove</span>
+                            </button>
+                            <button ng-click="closeThisDialog()" class="btn btn-large btn-secondary">
+                                <span>Cancel</span>
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </aside>
+    </div>
+</script>
diff --git a/setup/view/magento/setup/update-extension-grid.phtml b/setup/view/magento/setup/update-extension-grid.phtml
index 2c8625a82ed74152f6e83eedb0e8bfbf3c57c9d8..62c9b1217f2a5404f3aa72968a2d1b145bff2b04 100644
--- a/setup/view/magento/setup/update-extension-grid.phtml
+++ b/setup/view/magento/setup/update-extension-grid.phtml
@@ -13,12 +13,13 @@
         </span>
     </div>
 </div>
-<div class="admin__data-grid-outer-wrap">
+<div class="admin__data-grid-outer-wrap" id="updateExtensionGrid">
     <div class="admin__data-grid-header">
         <div class="admin__data-grid-header-row row row-gutter">
             <div class="col-xs-3">
+                <button type="button" class="btn" ng-click="updateAll()">Update</button>
                 <div class="admin__control-support-text">
-                    <span>{{total}}</span> products
+                    <span>{{total}}</span> extensions
                 </div>
             </div>
             <div class="col-xs-9 admin__data-grid-pager-wrap"
@@ -30,9 +31,42 @@
         <table class="data-grid">
             <thead data-part="head">
             <tr>
+                <th class="data-grid-multicheck-cell">
+                    <div class="action-multicheck-wrap"
+                         ng-class="{'_active':multipleChoiceService.isNewExtensionsMenuVisible}"
+                         click-out="multipleChoiceService.hideNewExtensionsMenu()"
+                    >
+                        <input type="checkbox"
+                               style="visibility: hidden;"
+                               class="admin__control-checkbox"
+                               ng-class="{'_indeterminate':multipleChoiceService.someExtensionsSelected}"
+                               ng-checked="multipleChoiceService.allExtensionsSelected"
+                        >
+                        <label></label>
+                        <button class="action-multicheck-toggle"
+                                ng-class="{'_active':multipleChoiceService.isNewExtensionsMenuVisible}"
+                                ng-click="multipleChoiceService.toggleNewExtensionsMenu()"
+                        >
+                            <span>Options</span>
+                        </button>
+                        <ul class="action-menu">
+                            <li ng-show="!multipleChoiceService.allExtensionsSelected"
+                                ng-click="multipleChoiceService.selectAllExtensions()"
+                            >
+                                <span class="action-menu-item">Select all</span>
+                            </li>
+                            <li ng-show="multipleChoiceService.allExtensionsSelected
+                                        || multipleChoiceService.someExtensionsSelected"
+                                ng-click="multipleChoiceService.deselectAllExtensions()"
+                            >
+                                <span class="action-menu-item">Deselect all</span>
+                            </li>
+                        </ul>
+                    </div>
+                </th>
                 <th ng-click="order('name')" ng-class="{'_ascend' : predicate === 'name'
                 && !reverse,'_descend' : predicate === 'name' && reverse}" class="data-grid-th _sortable">
-                    <span>Product Name</span>
+                    <span>Extension Name</span>
                 </th>
                 <th ng-click="order('type')" ng-class="{'_ascend' : predicate === 'type' &&
                 !reverse,'_descend' : predicate === 'type' && reverse}" class="data-grid-th _sortable">
@@ -58,11 +92,22 @@
             <tr ng-repeat="extension in extensions | orderBy:predicate:reverse
                 | startFrom:(currentPage - 1) * rowLimit | limitTo:rowLimit"
             >
+                <td class="data-grid-checkbox-cell">
+                    <label class="data-grid-checkbox-cell-inner">
+                        <input type="checkbox"
+                               class="admin__control-checkbox"
+                               ng-checked="multipleChoiceService.selectedExtensions.hasOwnProperty(extension.name)"
+                               ng-click="multipleChoiceService.updateSelectedExtensions($event, extension.name,
+                                        extension.latestVersion)"
+                        >
+                        <label></label>
+                    </label>
+                </td>
                 <td>
-                    <span class="data-grid-data">{{extension.name}}</span>
+                    <span class="data-grid-data">{{extension.package_title}}</span>
                 </td>
                 <td>
-                    <span class="data-grid-data">{{extension.type}}</span>
+                    <span class="data-grid-data">{{extension.package_type}}</span>
                 </td>
                 <td>
                     <span class="data-grid-data">{{extension.vendor}}</span>
@@ -78,6 +123,11 @@
                             >Version {{version}}</option>
                         </select>
                     </span>
+                    <span class="component-indicator _tooltip"
+                          ng-show="extension.package_link"
+                          data-label="View info on Marketplace"
+                    ><a href="{{extension.package_link}}" target="_blank"></a>
+                    </span>
                 </td>
                 <td class="data-grid-data">
                     <div class="action-wrap" ng-class="_active">