diff --git a/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php b/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
index 18cf0bdec693cf4913c73285185bd01933ed40e6..6fddee979e07f89879312fa6ed317acff6acba27 100644
--- a/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
+++ b/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
@@ -72,10 +72,4 @@ interface ProductRepositoryInterface
      * @return \Magento\Catalog\Api\Data\ProductSearchResultsInterface
      */
     public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria);
-
-    /**
-     * @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria
-     * @return \Magento\Framework\Api\Search\SearchResultInterface
-     */
-    public function search(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria);
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php
index 4ff34b45814607a812e60d48202115cb5a1a5ee6..56631b4a8faf65ffa2a0b6360ced631e2098ab59 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php
@@ -432,4 +432,14 @@ abstract class AbstractGroupPrice extends Price
 
         return $data;
     }
+
+    /**
+     * Get resource model instance
+     *
+     * @return \Magento\Catalog\Model\Resource\Product\Attribute\Backend\GroupPrice
+     */
+    public function getResource()
+    {
+        return $this->_getResource();
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index 9f753c5810db359a80941645ad0332290c13ff4c..28e8e25dfaa6b8273b50b984f0d0ec265a21aa34 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -135,25 +135,6 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      */
     protected $extensionAttributesJoinProcessor;
 
-    /**
-     * @var \Magento\Framework\Search\Request\Builder
-     */
-    private $requestBuilder;
-
-    /**
-     * @var \Magento\Framework\Search\SearchEngineInterface
-     */
-    private $searchEngine;
-
-    /**
-     * @var SearchResponseBuilder
-     */
-    private $searchResponseBuilder;
-    /**
-     * @var \Magento\Framework\App\Config\ScopeConfigInterface
-     */
-    private $scopeConfig;
-
     /**
      * @param ProductFactory $productFactory
      * @param \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $initializationHelper
@@ -176,10 +157,6 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param ImageProcessorInterface $imageProcessor
      * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
-     * @param \Magento\Framework\Search\Request\Builder $requestBuilder
-     * @param \Magento\Framework\Search\SearchEngineInterface $searchEngine
-     * @param SearchResponseBuilder $searchResponseBuilder
-     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -202,11 +179,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         ImageContentInterfaceFactory $contentFactory,
         MimeTypeExtensionMap $mimeTypeExtensionMap,
         ImageProcessorInterface $imageProcessor,
-        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor,
-        \Magento\Framework\Search\Request\Builder $requestBuilder,
-        \Magento\Framework\Search\SearchEngineInterface $searchEngine,
-        SearchResponseBuilder $searchResponseBuilder,
-        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
+        \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
     ) {
         $this->productFactory = $productFactory;
         $this->collectionFactory = $collectionFactory;
@@ -228,10 +201,6 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         $this->mimeTypeExtensionMap = $mimeTypeExtensionMap;
         $this->imageProcessor = $imageProcessor;
         $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
-        $this->requestBuilder = $requestBuilder;
-        $this->searchEngine = $searchEngine;
-        $this->searchResponseBuilder = $searchResponseBuilder;
-        $this->scopeConfig = $scopeConfig;
     }
 
     /**
@@ -703,45 +672,6 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         return $searchResult;
     }
 
-    /**
-     * @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria
-     * @return \Magento\Framework\Api\Search\SearchResultInterface
-     */
-    public function search(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria)
-    {
-        $this->requestBuilder->setRequestName($searchCriteria->getRequestName());
-
-        $searchTerm = $searchCriteria->getSearchTerm();
-        if (!empty($searchTerm)) {
-            $this->requestBuilder->bind('search_term', $searchTerm);
-        }
-
-        $storeId = $this->storeManager->getStore(true)->getId();
-        $this->requestBuilder->bindDimension('scope', $storeId);
-
-        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
-            foreach ($filterGroup->getFilters() as $filter) {
-                $this->addFieldToFilter($filter->getField(), $filter->getValue());
-            }
-        }
-
-        $priceRangeCalculation = $this->scopeConfig->getValue(
-            \Magento\Catalog\Model\Layer\Filter\Dynamic\AlgorithmFactory::XML_PATH_RANGE_CALCULATION,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
-        );
-        if ($priceRangeCalculation) {
-            $this->requestBuilder->bind('price_dynamic_algorithm', $priceRangeCalculation);
-        }
-
-        $this->requestBuilder->setFrom($searchCriteria->getCurrentPage() * $searchCriteria->getPageSize());
-        $this->requestBuilder->setSize($searchCriteria->getPageSize());
-        $request = $this->requestBuilder->create();
-        $searchResponse = $this->searchEngine->search($request);
-
-        return $this->searchResponseBuilder->build($searchResponse)
-            ->setSearchCriteria($searchCriteria);
-    }
-
     /**
      * Helper function that adds a FilterGroup to the collection.
      *
@@ -762,26 +692,4 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
             $collection->addFieldToFilter($fields);
         }
     }
-
-    /**
-     * Apply attribute filter to facet collection
-     *
-     * @param string $field
-     * @param null $condition
-     * @return $this
-     */
-    private function addFieldToFilter($field, $condition = null)
-    {
-        if (!is_array($condition) || !in_array(key($condition), ['from', 'to'])) {
-            $this->requestBuilder->bind($field, $condition);
-        } else {
-            if (!empty($condition['from'])) {
-                $this->requestBuilder->bind("{$field}.from", $condition['from']);
-            }
-            if (!empty($condition['to'])) {
-                $this->requestBuilder->bind("{$field}.to", $condition['to']);
-            }
-        }
-        return $this;
-    }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
index 76c6c1ddabf2ee69134219feca9b0183acbc22a5..ad8341e86cfdd703d5379a82366c40fd386afef0 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
@@ -130,26 +130,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $objectManager;
 
-    /**
-     * @var \Magento\Framework\Search\Request\Builder|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $requestBuilder;
-
-    /**
-     * @var \Magento\Search\Model\SearchEngine|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $searchEngine;
-
-    /**
-     * @var \Magento\Catalog\Model\SearchResponseBuilder|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $searchResponseBuilder;
-
-    /**
-     * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $scopeConfig;
-
     /**
      * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
@@ -241,22 +221,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
             ['getLinkTypes'], [], '', false);
         $this->imageProcessorMock = $this->getMock('Magento\Framework\Api\ImageProcessorInterface', [], [], '', false);
 
-        $this->requestBuilder = $this->getMockBuilder('Magento\Framework\Search\Request\Builder')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $this->searchEngine = $this->getMockBuilder('Magento\Search\Model\SearchEngine')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $this->searchResponseBuilder = $this->getMockBuilder('Magento\Catalog\Model\SearchResponseBuilder')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $this->scopeConfig = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface')
-            ->disableOriginalConstructor()
-            ->getMockForAbstractClass();
-
         $this->storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface')
             ->disableOriginalConstructor()
             ->getMockForAbstractClass();
@@ -280,10 +244,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
                 'mimeTypeExtensionMap' => $this->mimeTypeExtensionMapMock,
                 'linkTypeProvider' => $this->linkTypeProviderMock,
                 'imageProcessor' => $this->imageProcessorMock,
-                'requestBuilder' => $this->requestBuilder,
-                'searchEngine' => $this->searchEngine,
-                'searchResponseBuilder' => $this->searchResponseBuilder,
-                'scopeConfig' => $this->scopeConfig,
                 'storeManager' => $this->storeManager,
             ]
         );
@@ -1236,98 +1196,4 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->model->save($this->productMock);
         $this->assertEquals($expectedResult, $this->initializedProductMock->getMediaGallery('images'));
     }
-
-    public function testSearch()
-    {
-        $requestName = 'requestName';
-        $searchTerm = 'searchTerm';
-        $storeId = 333;
-        $filterField = 'filterField';
-        $filterValue = 'filterValue';
-        $priceRangeCalculation = 'auto';
-
-        $filter = $this->getMockBuilder('Magento\Framework\Api\Filter')
-            ->disableOriginalConstructor()
-            ->getMock();
-        $filter->expects($this->once())
-            ->method('getField')
-            ->willReturn($filterField);
-        $filter->expects($this->once())
-            ->method('getValue')
-            ->willReturn($filterValue);
-
-        $filterGroup = $this->getMockBuilder('Magento\Framework\Api\Search\FilterGroup')
-            ->disableOriginalConstructor()
-            ->getMock();
-        $filterGroup->expects($this->once())
-            ->method('getFilters')
-            ->willReturn([$filter]);
-
-        $searchCriteria = $this->getMockBuilder('Magento\Framework\Api\Search\SearchCriteriaInterface')
-            ->disableOriginalConstructor()
-            ->getMockForAbstractClass();
-        $searchCriteria->expects($this->once())
-            ->method('getRequestName')
-            ->willReturn($requestName);
-        $searchCriteria->expects($this->once())
-            ->method('getSearchTerm')
-            ->willReturn($searchTerm);
-        $searchCriteria->expects($this->once())
-            ->method('getFilterGroups')
-            ->willReturn([$filterGroup]);
-
-        $store = $this->getMockBuilder('Magento\Store\Model\Store')
-            ->disableOriginalConstructor()
-            ->getMock();
-        $store->expects($this->once())
-            ->method('getId')
-            ->willReturn($storeId);
-
-        $searchResult = $this->getMockBuilder('Magento\Framework\Api\Search\SearchResult')
-            ->disableOriginalConstructor()
-            ->getMockForAbstractClass();
-
-        $request = $this->getMockBuilder('Magento\Framework\Search\RequestInterface')
-            ->disableOriginalConstructor()
-            ->getMockForAbstractClass();
-
-        $response = $this->getMockBuilder('Magento\Framework\Search\ResponseInterface')
-            ->disableOriginalConstructor()
-            ->getMockForAbstractClass();
-
-        $this->requestBuilder->expects($this->once())
-            ->method('setRequestName')
-            ->with($requestName);
-        $this->requestBuilder->expects($this->once())
-            ->method('bindDimension')
-            ->with('scope', $storeId);
-        $this->requestBuilder->expects($this->any())
-            ->method('bind');;
-        $this->requestBuilder->expects($this->once())
-            ->method('create')
-            ->willReturn($request);
-
-        $this->searchEngine->expects($this->once())
-            ->method('search')
-            ->with($request)
-            ->willReturn($response);
-
-        $this->searchResponseBuilder->expects($this->once())
-            ->method('build')
-            ->with($response)
-            ->willReturn($searchResult);
-
-        $this->storeManager->expects($this->once())
-            ->method('getStore')
-            ->willReturn($store);
-
-        $this->scopeConfig->expects($this->once())
-            ->method('getValue')
-            ->with(AlgorithmFactory::XML_PATH_RANGE_CALCULATION, ScopeInterface::SCOPE_STORE)
-            ->willReturn($priceRangeCalculation);
-
-        $searchResult = $this->model->search($searchCriteria);
-
-        $this->assertInstanceOf('Magento\Framework\Api\Search\SearchResultInterface', $searchResult);
-    }
 }
diff --git a/app/code/Magento/Catalog/etc/webapi.xml b/app/code/Magento/Catalog/etc/webapi.xml
index 8ba7b4635b30aad4fd4c94e9e1229b602468c25d..ec8458cd8c9a7ebeda59b7dfdbde2fbb77b05bf6 100644
--- a/app/code/Magento/Catalog/etc/webapi.xml
+++ b/app/code/Magento/Catalog/etc/webapi.xml
@@ -39,12 +39,6 @@
             <resource ref="anonymous" />
         </resources>
     </route>
-    <route url="/V1/products/search" method="GET">
-        <service class="Magento\Catalog\Api\ProductRepositoryInterface" method="search"/>
-        <resources>
-            <resource ref="anonymous" />
-        </resources>
-    </route>
 
     <route url="/V1/products/attributes/types" method="GET">
         <service class="Magento\Catalog\Api\ProductAttributeTypesListInterface" method="getItems"/>
diff --git a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php
index cef79f4f73706fba4969a990a42bc5836f244701..ef70bb6fc518f2f6c8d0319b75721350d6b60e3b 100755
--- a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php
+++ b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php
@@ -612,6 +612,17 @@ class IndexBuilder
             $select->where('rp.product_id=?', $productId);
         }
 
+        /**
+         * Join group price to result
+         */
+        $groupPriceAttr = $this->eavConfig->getAttribute(Product::ENTITY, 'group_price');
+        $select->joinLeft(
+            ['gp' => $groupPriceAttr->getBackend()->getResource()->getMainTable()],
+            'gp.entity_id=rp.product_id AND gp.customer_group_id=rp.customer_group_id AND '
+            . $this->getReadAdapter()->getCheckSql('gp.website_id=0', 'TRUE', 'gp.website_id=rp.website_id'),
+            'value'
+        );
+
         /**
          * Join default price and websites prices to result
          */
@@ -653,7 +664,10 @@ class IndexBuilder
             []
         );
         $select->columns([
-            'default_price' => $this->getReadAdapter()->getIfNullSql($tableAlias . '.value', 'pp_default.value'),
+            'default_price' => $this->getReadAdapter()->getIfNullSql(
+                'gp.value',
+                $this->getReadAdapter()->getIfNullSql($tableAlias . '.value', 'pp_default.value')
+            ),
         ]);
 
         return $read->query($select);
diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php
index 8c41a3c24276dcad12e5733216b5eb2a21cc3640..3687d55d4710fba30b24b144e14c0691e972730f 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php
@@ -148,7 +148,7 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase
         $this->priceCurrency = $this->getMock('Magento\Framework\Pricing\PriceCurrencyInterface');
         $this->dateFormat = $this->getMock('Magento\Framework\Stdlib\DateTime', [], [], '', false);
         $this->dateTime = $this->getMock('Magento\Framework\Stdlib\DateTime\DateTime', [], [], '', false);
-        $this->eavConfig = $this->getMock('Magento\Eav\Model\Config', [], [], '', false);
+        $this->eavConfig = $this->getMock('Magento\Eav\Model\Config', ['getAttribute'], [], '', false);
         $this->product = $this->getMock('Magento\Catalog\Model\Product', [], [], '', false);
         $this->productFactory = $this->getMock('Magento\Catalog\Model\ProductFactory', ['create'], [], '', false);
 
@@ -182,7 +182,6 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase
 
         $this->combine->expects($this->any())->method('validate')->will($this->returnValue(true));
         $this->attribute->expects($this->any())->method('getBackend')->will($this->returnValue($this->backend));
-        $this->eavConfig->expects($this->any())->method('getAttribute')->will($this->returnValue($this->attribute));
         $this->productFactory->expects($this->any())->method('create')->will($this->returnValue($this->product));
 
         $this->indexBuilder = new \Magento\CatalogRule\Model\Indexer\IndexBuilder(
@@ -206,6 +205,45 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase
      */
     public function testUpdateCatalogRuleGroupWebsiteData()
     {
+        $groupPriceAttrMock = $this->getMock(
+            'Magento\Catalog\Model\Entity\Attribute',
+            ['getBackend'],
+            [],
+            '',
+            false
+        );
+        $backendModelMock = $this->getMock(
+            'Magento\Catalog\Model\Product\Attribute\Backend\GroupPrice',
+            ['getResource'],
+            [],
+            '',
+            false
+        );
+        $resourceMock = $this->getMock(
+            'Magento\Catalog\Model\Resource\Product\Attribute\Backend\GroupPrice',
+            ['getMainTable'],
+            [],
+            '',
+            false
+        );
+        $resourceMock->expects($this->once())
+            ->method('getMainTable')
+            ->will($this->returnValue('catalog_product_entity_group_price'));
+        $backendModelMock->expects($this->once())
+            ->method('getResource')
+            ->will($this->returnValue($resourceMock));
+        $groupPriceAttrMock->expects($this->once())
+            ->method('getBackend')
+            ->will($this->returnValue($backendModelMock));
+        $this->eavConfig->expects($this->at(0))
+            ->method('getAttribute')
+            ->with(\Magento\Catalog\Model\Product::ENTITY, 'group_price')
+            ->will($this->returnValue($groupPriceAttrMock));
+        $this->eavConfig->expects($this->at(1))
+            ->method('getAttribute')
+            ->with(\Magento\Catalog\Model\Product::ENTITY, 'price')
+            ->will($this->returnValue($this->attribute));
+
         $this->select->expects($this->once())->method('insertFromSelect')->with('catalogrule_group_website');
         
         $this->indexBuilder->reindexByIds([1]);
diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/IndexStructure.php b/app/code/Magento/CatalogSearch/Model/Indexer/IndexStructure.php
index 2f3320648ad62b043412713649868ec794284d71..4c0166ea9c0fb4bff54aa8456c62d41c6b9ea8b5 100644
--- a/app/code/Magento/CatalogSearch/Model/Indexer/IndexStructure.php
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/IndexStructure.php
@@ -10,7 +10,7 @@ use Magento\Framework\App\Resource;
 use Magento\Framework\DB\Adapter\AdapterInterface;
 use Magento\Framework\DB\Ddl\Table;
 use Magento\Framework\Search\Request\Dimension;
-use Magento\Search\Model\ScopeResolver\IndexScopeResolver;
+use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver;
 
 class IndexStructure
 {
diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/IndexerHandler.php b/app/code/Magento/CatalogSearch/Model/Indexer/IndexerHandler.php
index 47d49900ef231036e3f0406bda471f8d4f513fe5..cbaeb578ac1220fb02fb443ddc6bd43bbb3ea748 100644
--- a/app/code/Magento/CatalogSearch/Model/Indexer/IndexerHandler.php
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/IndexerHandler.php
@@ -12,7 +12,7 @@ use Magento\Framework\IndexerInterface;
 use Magento\Framework\Search\Request\Dimension;
 use Magento\Framework\Search\Request\IndexScopeResolverInterface;
 use Magento\Indexer\Model\SaveHandler\Batch;
-use Magento\Search\Model\ScopeResolver\IndexScopeResolver;
+use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver;
 
 class IndexerHandler implements IndexerInterface
 {
@@ -61,7 +61,7 @@ class IndexerHandler implements IndexerInterface
      * @param Resource|Resource $resource
      * @param Config $eavConfig
      * @param Batch $batch
-     * @param IndexScopeResolver $indexScopeResolver
+     * @param \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver
      * @param array $data
      * @param int $batchSize
      */
diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/Mview/Action.php b/app/code/Magento/CatalogSearch/Model/Indexer/Mview/Action.php
new file mode 100644
index 0000000000000000000000000000000000000000..03f0fb14eadced11386b44cf80806db7afe29e3f
--- /dev/null
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/Mview/Action.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogSearch\Model\Indexer\Mview;
+
+
+use Magento\CatalogSearch\Model\Indexer\Fulltext;
+use Magento\Framework\Mview\ActionInterface;
+use Magento\Indexer\Model\IndexerInterfaceFactory;
+
+class Action implements ActionInterface
+{
+    /**
+     * @var IndexerInterfaceFactory
+     */
+    private $indexerFactory;
+
+    /**
+     * @param IndexerInterfaceFactory $indexerFactory
+     */
+    public function __construct(IndexerInterfaceFactory $indexerFactory)
+    {
+        $this->indexerFactory = $indexerFactory;
+    }
+
+    /**
+     * Execute materialization on ids entities
+     *
+     * @param int[] $ids
+     * @return void
+     * @api
+     */
+    public function execute($ids)
+    {
+        /** @var \Magento\Indexer\Model\IndexerInterface $indexer */
+        $indexer = $this->indexerFactory->create()->load(Fulltext::INDEXER_ID);
+        $indexer->reindexList($ids);
+    }
+}
diff --git a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php
index 74c767a5ab9942454d18f89f666acf2ab80c38d7..a3c39528a1d0f16a8e65b3cac43a0e5b94339725 100644
--- a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php
+++ b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php
@@ -27,7 +27,7 @@ class Engine implements EngineInterface
     protected $catalogProductVisibility;
 
     /**
-     * @var \Magento\Search\Model\ScopeResolver\IndexScopeResolver
+     * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver
      */
     private $indexScopeResolver;
 
@@ -35,11 +35,11 @@ class Engine implements EngineInterface
      * Construct
      *
      * @param \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility
-     * @param \Magento\Search\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver
+     * @param \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver
      */
     public function __construct(
         \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
-        \Magento\Search\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver
+        \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver
     ) {
         $this->catalogProductVisibility = $catalogProductVisibility;
         $this->indexScopeResolver = $indexScopeResolver;
diff --git a/app/code/Magento/CatalogSearch/Model/Search/IndexBuilder.php b/app/code/Magento/CatalogSearch/Model/Search/IndexBuilder.php
index 4e6648b6f5c0805fa270b1ba20a4c1e862a6ee20..6ae4e1ba0cf88ac0a3a9f747c83ae6e1f57f7fa8 100644
--- a/app/code/Magento/CatalogSearch/Model/Search/IndexBuilder.php
+++ b/app/code/Magento/CatalogSearch/Model/Search/IndexBuilder.php
@@ -12,11 +12,10 @@ use Magento\Framework\DB\Select;
 use Magento\Framework\Search\Adapter\Mysql\ConditionManager;
 use Magento\Framework\Search\Adapter\Mysql\IndexBuilderInterface;
 use Magento\Framework\Search\Request\Dimension;
-use Magento\Framework\Search\Request\Query\Bool;
 use Magento\Framework\Search\Request\QueryInterface;
 use Magento\Framework\Search\Request\QueryInterface as RequestQueryInterface;
 use Magento\Framework\Search\RequestInterface;
-use Magento\Search\Model\ScopeResolver\IndexScopeResolver;
+use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver;
 use Magento\Store\Model\ScopeInterface;
 use Magento\Store\Model\StoreManagerInterface;
 
diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/IndexBuilderTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/IndexBuilderTest.php
index 33ca04f2b95d2d435131ae19b30cba5676eaabb4..5e93d20132e38849d704ccd9d48dc58b83563659 100644
--- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/IndexBuilderTest.php
+++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/IndexBuilderTest.php
@@ -84,7 +84,7 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase
 
         $this->storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface')->getMock();
 
-        $this->scopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\IndexScopeResolver')
+        $this->scopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\IndexScopeResolver')
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/Indexer/IndexStructureTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/Indexer/IndexStructureTest.php
index a589de77d66c63b267260970eba6c4898a6ef8d3..1acbcbc51d1e93e6f8c4e8bcca1960cc0abd9f42 100644
--- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/Indexer/IndexStructureTest.php
+++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/Indexer/IndexStructureTest.php
@@ -16,7 +16,7 @@ use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 class IndexStructureTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Search\Model\ScopeResolver\IndexScopeResolver|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver|\PHPUnit_Framework_MockObject_MockObject
      */
     private $indexScopeResolver;
     /**
@@ -46,11 +46,11 @@ class IndexStructureTest extends \PHPUnit_Framework_TestCase
             ->method('getConnection')
             ->with(\Magento\Framework\App\Resource::DEFAULT_WRITE_RESOURCE)
             ->willReturn($this->adapter);
-        $this->indexScopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\IndexScopeResolver')
+        $this->indexScopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\IndexScopeResolver')
             ->setMethods(['resolve'])
             ->disableOriginalConstructor()
             ->getMock();
-        $this->flatScopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\FlatScopeResolver')
+        $this->flatScopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\FlatScopeResolver')
             ->setMethods(['resolve'])
             ->disableOriginalConstructor()
             ->getMock();
diff --git a/app/code/Magento/CatalogSearch/etc/mview.xml b/app/code/Magento/CatalogSearch/etc/mview.xml
index dac32882981e509d2df360180f9754f818352fa6..8e9fb605186ddb7392a5d87ff38efac9df69f7f4 100644
--- a/app/code/Magento/CatalogSearch/etc/mview.xml
+++ b/app/code/Magento/CatalogSearch/etc/mview.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Mview/etc/mview.xsd">
-    <view id="catalogsearch_fulltext" class="Magento\CatalogSearch\Model\Indexer\Fulltext" group="indexer">
+    <view id="catalogsearch_fulltext" class="\Magento\CatalogSearch\Model\Indexer\Mview\Action" group="indexer">
         <subscriptions>
             <table name="catalog_product_entity" entity_column="entity_id" />
             <table name="catalog_product_entity_int" entity_column="entity_id" />
diff --git a/app/code/Magento/Indexer/Model/IndexStructure.php b/app/code/Magento/Indexer/Model/IndexStructure.php
index d7c673cf504654d05eae352fb49e2d67d19cf887..0443b6deecd771009f0905145464c067c71bf34d 100644
--- a/app/code/Magento/Indexer/Model/IndexStructure.php
+++ b/app/code/Magento/Indexer/Model/IndexStructure.php
@@ -11,8 +11,8 @@ use Magento\Framework\App\Resource;
 use Magento\Framework\DB\Adapter\AdapterInterface;
 use Magento\Framework\DB\Ddl\Table;
 use Magento\Framework\Search\Request\Dimension;
-use Magento\Search\Model\ScopeResolver\FlatScopeResolver;
-use Magento\Search\Model\ScopeResolver\IndexScopeResolver;
+use Magento\Indexer\Model\ScopeResolver\FlatScopeResolver;
+use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver;
 
 class IndexStructure
 {
@@ -21,7 +21,7 @@ class IndexStructure
      */
     private $resource;
     /**
-     * @var IndexScopeResolver
+     * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver
      */
     private $indexScopeResolver;
     /**
@@ -41,7 +41,7 @@ class IndexStructure
     /**
      * @param Resource|Resource $resource
      * @param IndexScopeResolver $indexScopeResolver
-     * @param FlatScopeResolver $flatScopeResolver
+     * @param \Magento\Indexer\Model\ScopeResolver\FlatScopeResolver $flatScopeResolver
      * @param array $columnTypesMap
      */
     public function __construct(
diff --git a/app/code/Magento/Indexer/Model/SaveHandler/IndexerHandler.php b/app/code/Magento/Indexer/Model/SaveHandler/IndexerHandler.php
index 9059a96aadf5659a1e227e336bd85c7a550c318f..37257f1f560714816e3b61637141ad44a4c65c89 100644
--- a/app/code/Magento/Indexer/Model/SaveHandler/IndexerHandler.php
+++ b/app/code/Magento/Indexer/Model/SaveHandler/IndexerHandler.php
@@ -11,8 +11,8 @@ use Magento\Framework\IndexerInterface;
 use Magento\Indexer\Model\IndexStructure;
 use Magento\Framework\Search\Request\Dimension;
 use Magento\Framework\Search\Request\IndexScopeResolverInterface;
-use Magento\Search\Model\ScopeResolver\FlatScopeResolver;
-use Magento\Search\Model\ScopeResolver\IndexScopeResolver;
+use Magento\Indexer\Model\ScopeResolver\FlatScopeResolver;
+use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver;
 
 class IndexerHandler implements IndexerInterface
 {
@@ -60,8 +60,8 @@ class IndexerHandler implements IndexerInterface
      * @param IndexStructure $indexStructure
      * @param Resource $resource
      * @param Batch $batch
-     * @param IndexScopeResolver $indexScopeResolver
-     * @param FlatScopeResolver $flatScopeResolver
+     * @param \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver
+     * @param \Magento\Indexer\Model\ScopeResolver\FlatScopeResolver $flatScopeResolver
      * @param array $data
      * @param int $batchSize
      */
diff --git a/app/code/Magento/Search/Model/ScopeResolver/FlatScopeResolver.php b/app/code/Magento/Indexer/Model/ScopeResolver/FlatScopeResolver.php
similarity index 89%
rename from app/code/Magento/Search/Model/ScopeResolver/FlatScopeResolver.php
rename to app/code/Magento/Indexer/Model/ScopeResolver/FlatScopeResolver.php
index 98241dae0b2e6ccb8715c84cf16c9ab6827b14c5..8e415be17131e8340e5ccbc0b30722469dc825ca 100644
--- a/app/code/Magento/Search/Model/ScopeResolver/FlatScopeResolver.php
+++ b/app/code/Magento/Indexer/Model/ScopeResolver/FlatScopeResolver.php
@@ -4,10 +4,11 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Search\Model\ScopeResolver;
+namespace Magento\Indexer\Model\ScopeResolver;
 
 use Magento\Framework\Search\Request\Dimension;
 use Magento\Framework\Search\Request\IndexScopeResolverInterface;
+use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver;
 
 class FlatScopeResolver implements IndexScopeResolverInterface
 {
diff --git a/app/code/Magento/Search/Model/ScopeResolver/IndexScopeResolver.php b/app/code/Magento/Indexer/Model/ScopeResolver/IndexScopeResolver.php
similarity index 97%
rename from app/code/Magento/Search/Model/ScopeResolver/IndexScopeResolver.php
rename to app/code/Magento/Indexer/Model/ScopeResolver/IndexScopeResolver.php
index 381f20c79ed97310fb9afb2c3ba3cf0954f2e428..696d6af0041b2dd1695b56b5a49c08a7f21ca7ce 100644
--- a/app/code/Magento/Search/Model/ScopeResolver/IndexScopeResolver.php
+++ b/app/code/Magento/Indexer/Model/ScopeResolver/IndexScopeResolver.php
@@ -4,7 +4,7 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Search\Model\ScopeResolver;
+namespace Magento\Indexer\Model\ScopeResolver;
 
 
 use Magento\Framework\App\Resource;
diff --git a/app/code/Magento/Indexer/Test/Unit/Model/IndexStructureTest.php b/app/code/Magento/Indexer/Test/Unit/Model/IndexStructureTest.php
index a6884d22d03bf136b28200a0df6e8ace767bf9a3..aa002ea18a56c384eccbf2c121d2e4e691a6cd79 100644
--- a/app/code/Magento/Indexer/Test/Unit/Model/IndexStructureTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Model/IndexStructureTest.php
@@ -16,12 +16,12 @@ use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 class IndexStructureTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Search\Model\ScopeResolver\IndexScopeResolver|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver|\PHPUnit_Framework_MockObject_MockObject
      */
     private $indexScopeResolver;
 
     /**
-     * @var \Magento\Search\Model\ScopeResolver\FlatScopeResolver|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Indexer\Model\ScopeResolver\FlatScopeResolver|\PHPUnit_Framework_MockObject_MockObject
      */
     private $flatScopeResolver;
 
@@ -53,11 +53,11 @@ class IndexStructureTest extends \PHPUnit_Framework_TestCase
             ->method('getConnection')
             ->with('write')
             ->willReturn($this->adapter);
-        $this->indexScopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\IndexScopeResolver')
+        $this->indexScopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\IndexScopeResolver')
             ->setMethods(['resolve'])
             ->disableOriginalConstructor()
             ->getMock();
-        $this->flatScopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\FlatScopeResolver')
+        $this->flatScopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\FlatScopeResolver')
             ->setMethods(['resolve'])
             ->disableOriginalConstructor()
             ->getMock();
diff --git a/app/code/Magento/Search/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php b/app/code/Magento/Indexer/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php
similarity index 93%
rename from app/code/Magento/Search/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php
rename to app/code/Magento/Indexer/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php
index 9c3dc151b999884c0348e29d5d9b3c90029955d3..a64005d658ebac18cc46d6cdaf3f1b300c44c54e 100644
--- a/app/code/Magento/Search/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php
@@ -4,13 +4,13 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Search\Test\Unit\Model\ScopeResolver;
+namespace Magento\Indexer\Test\Unit\Model\ScopeResolver;
 
 use Magento\Framework\Search\Request\Dimension;
 use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 
 /**
- * Test for \Magento\Search\Model\ScopeResolver\IndexScopeResolver
+ * Test for \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver
  */
 class IndexScopeResolverTest extends \PHPUnit_Framework_TestCase
 {
@@ -25,7 +25,7 @@ class IndexScopeResolverTest extends \PHPUnit_Framework_TestCase
     private $resource;
 
     /**
-     * @var \Magento\Search\Model\ScopeResolver\IndexScopeResolver
+     * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver
      */
     private $target;
 
@@ -45,7 +45,7 @@ class IndexScopeResolverTest extends \PHPUnit_Framework_TestCase
         $objectManager = new ObjectManager($this);
 
         $this->target = $objectManager->getObject(
-            '\Magento\Search\Model\ScopeResolver\IndexScopeResolver',
+            '\Magento\Indexer\Model\ScopeResolver\IndexScopeResolver',
             [
                 'resource' => $this->resource,
                 'scopeResolver' => $this->scopeResolver
diff --git a/app/code/Magento/Indexer/composer.json b/app/code/Magento/Indexer/composer.json
index b3d895056ef1cdccd1e683a3d5477c78a2fb738a..b7f27e0e6bf74fb4f9739d465afb670ca251651c 100644
--- a/app/code/Magento/Indexer/composer.json
+++ b/app/code/Magento/Indexer/composer.json
@@ -5,7 +5,6 @@
         "php": "~5.5.0|~5.6.0",
         "magento/module-store": "0.74.0-beta16",
         "magento/module-backend": "0.74.0-beta16",
-        "magento/module-search": "0.74.0-beta16",
         "magento/module-page-cache": "0.74.0-beta16",
         "magento/framework": "0.74.0-beta16",
         "magento/magento-composer-installer": "*"
diff --git a/app/code/Magento/Indexer/etc/module.xml b/app/code/Magento/Indexer/etc/module.xml
index 3eb6e8433c1cee29f3f4d8e46ab94bb28196ca64..f03aca19f0cc4ce32b6ce1b4b168d3d1ab391c37 100644
--- a/app/code/Magento/Indexer/etc/module.xml
+++ b/app/code/Magento/Indexer/etc/module.xml
@@ -9,7 +9,6 @@
     <module name="Magento_Indexer" setup_version="2.0.0">
         <sequence>
             <module name="Magento_Store"/>
-            <module name="Magento_Search"/>
         </sequence>
     </module>
 </config>
diff --git a/app/code/Magento/Search/Api/SearchInterface.php b/app/code/Magento/Search/Api/SearchInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e53ba17fde129c834b3f319c96c3fc14494440f
--- /dev/null
+++ b/app/code/Magento/Search/Api/SearchInterface.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Search\Api;
+
+/**
+ * @api
+ */
+interface SearchInterface
+{
+    /**
+     * Make Full Text Search and return found Documents
+     *
+     * @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria
+     * @return \Magento\Framework\Api\Search\SearchResultInterface
+     */
+    public function search(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria);
+}
diff --git a/app/code/Magento/Search/Model/Search.php b/app/code/Magento/Search/Model/Search.php
new file mode 100644
index 0000000000000000000000000000000000000000..58f6d2a6c39d48e5d8fa0e8390875a091d62877c
--- /dev/null
+++ b/app/code/Magento/Search/Model/Search.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Search\Model;
+
+use Magento\Framework\Api\Search\SearchCriteriaInterface;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\Search\Request\Builder;
+use Magento\Framework\Search\SearchEngineInterface;
+use Magento\Search\Api\SearchInterface;
+use Magento\Store\Model\ScopeInterface;
+use Magento\Store\Model\StoreManagerInterface;
+
+class Search implements SearchInterface
+{
+    /**
+     * @var Builder
+     */
+    private $requestBuilder;
+
+    /**
+     * @var StoreManagerInterface
+     */
+    private $storeManager;
+
+    /**
+     * @var SearchEngineInterface
+     */
+    private $searchEngine;
+
+    /**
+     * @var SearchResponseBuilder
+     */
+    private $searchResponseBuilder;
+
+    /**
+     * @param Builder $requestBuilder
+     * @param StoreManagerInterface $storeManager
+     * @param SearchEngineInterface $searchEngine
+     * @param SearchResponseBuilder $searchResponseBuilder
+     */
+    public function __construct(
+        Builder $requestBuilder,
+        StoreManagerInterface $storeManager,
+        SearchEngineInterface $searchEngine,
+        SearchResponseBuilder $searchResponseBuilder
+    ) {
+        $this->requestBuilder = $requestBuilder;
+        $this->storeManager = $storeManager;
+        $this->searchEngine = $searchEngine;
+        $this->searchResponseBuilder = $searchResponseBuilder;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function search(SearchCriteriaInterface $searchCriteria)
+    {
+        $this->requestBuilder->setRequestName($searchCriteria->getRequestName());
+
+        $storeId = $this->storeManager->getStore(true)->getId();
+        $this->requestBuilder->bindDimension('scope', $storeId);
+
+        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
+            foreach ($filterGroup->getFilters() as $filter) {
+                $this->addFieldToFilter($filter->getField(), $filter->getValue());
+            }
+        }
+
+        $this->requestBuilder->setFrom($searchCriteria->getCurrentPage() * $searchCriteria->getPageSize());
+        $this->requestBuilder->setSize($searchCriteria->getPageSize());
+        $request = $this->requestBuilder->create();
+        $searchResponse = $this->searchEngine->search($request);
+
+        return $this->searchResponseBuilder->build($searchResponse)
+            ->setSearchCriteria($searchCriteria);
+    }
+
+    /**
+     * Apply attribute filter to facet collection
+     *
+     * @param string $field
+     * @param null $condition
+     * @return $this
+     */
+    private function addFieldToFilter($field, $condition = null)
+    {
+        if (!is_array($condition) || !in_array(key($condition), ['from', 'to'])) {
+            $this->requestBuilder->bind($field, $condition);
+        } else {
+            if (!empty($condition['from'])) {
+                $this->requestBuilder->bind("{$field}.from", $condition['from']);
+            }
+            if (!empty($condition['to'])) {
+                $this->requestBuilder->bind("{$field}.to", $condition['to']);
+            }
+        }
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/SearchResponseBuilder.php b/app/code/Magento/Search/Model/SearchResponseBuilder.php
similarity index 98%
rename from app/code/Magento/Catalog/Model/SearchResponseBuilder.php
rename to app/code/Magento/Search/Model/SearchResponseBuilder.php
index 36e552b32409e908a1a71e79902a26582f7aeeb7..bf827763ebb6987848f82b772fe2c1747f8ea543 100644
--- a/app/code/Magento/Catalog/Model/SearchResponseBuilder.php
+++ b/app/code/Magento/Search/Model/SearchResponseBuilder.php
@@ -3,7 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Catalog\Model;
+namespace Magento\Search\Model;
 
 use Magento\Framework\Api\Search\SearchResultInterface;
 use Magento\Framework\Api\Search\DocumentFactory;
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/SearchResponseBuilderTest.php b/app/code/Magento/Search/Test/Unit/Model/SearchResponseBuilderTest.php
similarity index 96%
rename from app/code/Magento/Catalog/Test/Unit/Model/SearchResponseBuilderTest.php
rename to app/code/Magento/Search/Test/Unit/Model/SearchResponseBuilderTest.php
index 72021021884e68fbe193b6eb6177b2608742d558..d0e3b7f183d0c8be2f540144826fe02b5ce25206 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/SearchResponseBuilderTest.php
+++ b/app/code/Magento/Search/Test/Unit/Model/SearchResponseBuilderTest.php
@@ -3,7 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Catalog\Test\Unit\Model;
+namespace Magento\Search\Test\Unit\Model;
 
 use Magento\Framework\Api\Search\SearchResultInterface;
 use Magento\Framework\Search\Response\QueryResponse;
@@ -12,7 +12,7 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 class SearchResponseBuilderTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Catalog\Model\SearchResponseBuilder
+     * @var \Magento\Search\Model\SearchResponseBuilder
      */
     private $model;
 
@@ -36,7 +36,7 @@ class SearchResponseBuilderTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $this->model = (new ObjectManager($this))->getObject('Magento\Catalog\Model\SearchResponseBuilder', [
+        $this->model = (new ObjectManager($this))->getObject('Magento\Search\Model\SearchResponseBuilder', [
             'documentFactory' => $this->documentFactory,
             'searchResultFactory' => $this->searchResultFactory,
         ]);
diff --git a/app/code/Magento/Search/Test/Unit/Model/SearchTest.php b/app/code/Magento/Search/Test/Unit/Model/SearchTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..02af8490fcc954117b6b555f3573a0a2ee9859ec
--- /dev/null
+++ b/app/code/Magento/Search/Test/Unit/Model/SearchTest.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Search\Test\Unit\Model;
+
+use Magento\Catalog\Model\Layer\Filter\Dynamic\AlgorithmFactory;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Store\Model\ScopeInterface;
+
+class SearchTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Search\Model\Search
+     */
+    protected $model;
+
+    /**
+     * @var \Magento\Framework\Search\Request\Builder|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $requestBuilder;
+
+    /**
+     * @var \Magento\Search\Model\SearchEngine|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $searchEngine;
+
+    /**
+     * @var \Magento\Search\Model\SearchResponseBuilder|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $searchResponseBuilder;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManager;
+
+    protected function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+
+        $this->requestBuilder = $this->getMockBuilder('Magento\Framework\Search\Request\Builder')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->searchEngine = $this->getMockBuilder('Magento\Search\Model\SearchEngine')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->searchResponseBuilder = $this->getMockBuilder('Magento\Search\Model\SearchResponseBuilder')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $this->model = $objectManager->getObject('Magento\Search\Model\Search', [
+            'requestBuilder' => $this->requestBuilder,
+            'searchEngine' => $this->searchEngine,
+            'searchResponseBuilder' => $this->searchResponseBuilder,
+            'storeManager' => $this->storeManager,
+        ]);
+    }
+
+    public function testSearch()
+    {
+        $requestName = 'requestName';
+        $storeId = 333;
+        $filterField = 'filterField';
+        $filterValue = 'filterValue';
+
+        $filter = $this->getMockBuilder('Magento\Framework\Api\Filter')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filter->expects($this->once())
+            ->method('getField')
+            ->willReturn($filterField);
+        $filter->expects($this->once())
+            ->method('getValue')
+            ->willReturn($filterValue);
+
+        $filterGroup = $this->getMockBuilder('Magento\Framework\Api\Search\FilterGroup')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $filterGroup->expects($this->once())
+            ->method('getFilters')
+            ->willReturn([$filter]);
+
+        $searchCriteria = $this->getMockBuilder('Magento\Framework\Api\Search\SearchCriteriaInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $searchCriteria->expects($this->once())
+            ->method('getRequestName')
+            ->willReturn($requestName);
+        $searchCriteria->expects($this->once())
+            ->method('getFilterGroups')
+            ->willReturn([$filterGroup]);
+
+        $store = $this->getMockBuilder('Magento\Store\Model\Store')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $store->expects($this->once())
+            ->method('getId')
+            ->willReturn($storeId);
+
+        $searchResult = $this->getMockBuilder('Magento\Framework\Api\Search\SearchResult')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $request = $this->getMockBuilder('Magento\Framework\Search\RequestInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $response = $this->getMockBuilder('Magento\Framework\Search\ResponseInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $this->requestBuilder->expects($this->once())
+            ->method('setRequestName')
+            ->with($requestName);
+        $this->requestBuilder->expects($this->once())
+            ->method('bindDimension')
+            ->with('scope', $storeId);
+        $this->requestBuilder->expects($this->any())
+            ->method('bind');
+        $this->requestBuilder->expects($this->once())
+            ->method('create')
+            ->willReturn($request);
+
+        $this->searchEngine->expects($this->once())
+            ->method('search')
+            ->with($request)
+            ->willReturn($response);
+
+        $this->searchResponseBuilder->expects($this->once())
+            ->method('build')
+            ->with($response)
+            ->willReturn($searchResult);
+
+        $this->storeManager->expects($this->once())
+            ->method('getStore')
+            ->willReturn($store);
+
+        $searchResult = $this->model->search($searchCriteria);
+
+        $this->assertInstanceOf('Magento\Framework\Api\Search\SearchResultInterface', $searchResult);
+    }
+}
diff --git a/app/code/Magento/Search/etc/di.xml b/app/code/Magento/Search/etc/di.xml
index a8b7dfd5bc687879ef00d13673fae36764758d81..26f8d94c1a502521dd3787da8069527f823471cd 100644
--- a/app/code/Magento/Search/etc/di.xml
+++ b/app/code/Magento/Search/etc/di.xml
@@ -7,6 +7,7 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+    <preference for="Magento\Search\Api\SearchInterface" type="Magento\Search\Model\Search"/>
     <type name="Magento\Framework\Module\Setup\Migration">
         <arguments>
             <argument name="compositeModules" xsi:type="array">
diff --git a/app/code/Magento/Search/etc/webapi.xml b/app/code/Magento/Search/etc/webapi.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d06beccfa8d80ad2d498bbbaaaa41047d800e3a5
--- /dev/null
+++ b/app/code/Magento/Search/etc/webapi.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
+
+    <route url="/V1/search" method="GET">
+        <service class="Magento\Search\Api\SearchInterface" method="search"/>
+        <resources>
+            <resource ref="anonymous" />
+        </resources>
+    </route>
+
+</routes>
diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a69f64be343ee3f155b2862cc2f227b5ad3b1b5
--- /dev/null
+++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Theme\Test\Unit\Controller\Adminhtml\System\Design\Wysiwyg\Files;
+
+class DeleteFilesTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files */
+    protected $controller;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject|\PHPUnit_Framework_MockObject_MockObject*/
+    protected $objectManager;
+
+    /** @var \Magento\Theme\Helper\Storage|\PHPUnit_Framework_MockObject_MockObject */
+    protected $storage;
+
+    /** @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $request;
+
+    /** @var \Magento\Framework\App\Response\Http|\PHPUnit_Framework_MockObject_MockObject */
+    protected $response;
+
+    public function setUp()
+    {
+        $this->objectManager = $this->getMock('Magento\Framework\ObjectManagerInterface');
+        $this->storage = $this->getMock('Magento\Theme\Model\Wysiwyg\Storage', [], [], '', false);
+        $this->response = $this->getMock('Magento\Framework\App\Response\Http', [], [], '', false);
+        $this->request = $this->getMockForAbstractClass(
+            'Magento\Framework\App\RequestInterface',
+            [],
+            '',
+            false,
+            false,
+            true,
+            ['isPost', 'getParam']
+        );
+
+        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->controller = $helper->getObject(
+            'Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files\DeleteFiles',
+            [
+                'objectManager' => $this->objectManager,
+                'request' => $this->request,
+                'response' => $this->response,
+            ]
+        );
+    }
+
+    public function testExecuteWithWrongRequest()
+    {
+        $this->request->expects($this->once())
+            ->method('isPost')
+            ->willReturn(false);
+
+        $jsonData = $this->getMock('Magento\Framework\Json\Helper\Data', [], [], '', false);
+        $jsonData->expects($this->once())
+            ->method('jsonEncode')
+            ->with(['error' => true, 'message' => 'Wrong request'])
+            ->willReturn('{"error":"true","message":"Wrong request"}');
+
+        $this->objectManager->expects($this->once())
+            ->method('get')
+            ->with('Magento\Framework\Json\Helper\Data')
+            ->willReturn($jsonData);
+
+        $this->response->expects($this->once())
+            ->method('representJson')
+            ->with('{"error":"true","message":"Wrong request"}');
+
+        $this->controller->execute();
+    }
+
+    public function testExecute()
+    {
+        $this->request->expects($this->once())
+            ->method('isPost')
+            ->willReturn(true);
+        $this->request->expects($this->once())
+            ->method('getParam')
+            ->with('files')
+            ->willReturn('{"files":"file"}');
+
+        $jsonData = $this->getMock('Magento\Framework\Json\Helper\Data', [], [], '', false);
+        $jsonData->expects($this->once())
+            ->method('jsonDecode')
+            ->with('{"files":"file"}')
+            ->willReturn(['files' => 'file']);
+        $this->objectManager->expects($this->at(0))
+            ->method('get')
+            ->with('Magento\Framework\Json\Helper\Data')
+            ->willReturn($jsonData);
+        $this->objectManager->expects($this->at(1))
+            ->method('get')
+            ->with('Magento\Theme\Model\Wysiwyg\Storage')
+            ->willReturn($this->storage);
+        $this->storage->expects($this->once())
+            ->method('deleteFile')
+            ->with('file');
+
+        $this->controller->execute();
+    }
+}
diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bd042cfe2e5864a6f86e5afa848ad63b9ca1a79
--- /dev/null
+++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Theme\Test\Unit\Controller\Adminhtml\System\Design\Wysiwyg\Files;
+
+class DeleteFolderTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files */
+    protected $controller;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject|\PHPUnit_Framework_MockObject_MockObject*/
+    protected $objectManager;
+
+    /** @var \Magento\Framework\App\Response\Http|\PHPUnit_Framework_MockObject_MockObject */
+    protected $response;
+
+    /** @var \Magento\Theme\Helper\Storage|\PHPUnit_Framework_MockObject_MockObject */
+    protected $storage;
+
+    /** @var \Magento\Theme\Helper\Storage|\PHPUnit_Framework_MockObject_MockObject */
+    protected $storageHelper;
+
+    public function setUp()
+    {
+        $this->objectManager = $this->getMock('Magento\Framework\ObjectManagerInterface');
+        $this->response = $this->getMock('Magento\Framework\App\Response\Http', [], [], '', false);
+        $this->storage = $this->getMock('Magento\Theme\Model\Wysiwyg\Storage', [], [], '', false);
+        $this->storageHelper = $this->getMock('Magento\Theme\Helper\Storage', [], [], '', false);
+
+        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->controller = $helper->getObject(
+            'Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files\DeleteFolder',
+            [
+                'objectManager' => $this->objectManager,
+                'response' => $this->response,
+                'storage' => $this->storageHelper
+            ]
+        );
+    }
+
+    public function testExecute()
+    {
+        $this->storageHelper->expects($this->once())
+            ->method('getCurrentPath')
+            ->willReturn('/current/path/');
+
+        $this->objectManager->expects($this->at(0))
+            ->method('get')
+            ->with('Magento\Theme\Model\Wysiwyg\Storage')
+            ->willReturn($this->storage);
+        $this->storage->expects($this->once())
+            ->method('deleteDirectory')
+            ->with('/current/path/')
+            ->willThrowException(new \Exception('Message'));
+
+        $jsonData = $this->getMock('Magento\Framework\Json\Helper\Data', [], [], '', false);
+        $jsonData->expects($this->once())
+            ->method('jsonEncode')
+            ->with(['error' => true, 'message' => 'Message'])
+            ->willReturn('{"error":"true","message":"Message"}');
+
+        $this->objectManager->expects($this->at(1))
+            ->method('get')
+            ->with('Magento\Framework\Json\Helper\Data')
+            ->willReturn($jsonData);
+
+        $this->controller->execute();
+    }
+}
diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..63884649f39f4baf66a5886619757abb381a529a
--- /dev/null
+++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Theme\Test\Unit\Controller\Adminhtml\System\Design\Wysiwyg\Files;
+
+class IndexTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files */
+    protected $controller;
+
+    /** @var \Magento\Framework\App\ViewInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $view;
+
+    public function setUp()
+    {
+        $this->view = $this->getMock('\Magento\Framework\App\ViewInterface', [], [], '', false);
+
+        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->controller = $helper->getObject(
+            'Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files\Index',
+            [
+                'view' => $this->view,
+            ]
+        );
+    }
+
+    public function testExecute()
+    {
+        $this->view ->expects($this->once())
+            ->method('loadLayout')
+            ->with('overlay_popup');
+        $this->view ->expects($this->once())
+            ->method('renderLayout');
+
+        $this->controller->execute();
+    }
+}
diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0061013ed728c00cc216b889f9dcd4ec2b4e28c4
--- /dev/null
+++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Theme\Test\Unit\Controller\Adminhtml\System\Design\Wysiwyg\Files;
+
+class OnInsertTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files */
+    protected $controller;
+
+    /** @var \Magento\Framework\App\ViewInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $view;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject|\PHPUnit_Framework_MockObject_MockObject */
+    protected $objectManager;
+
+    /** @var \Magento\Theme\Helper\Storage|\PHPUnit_Framework_MockObject_MockObject */
+    protected $storageHelper;
+
+    /** @var \Magento\Framework\App\Response\Http|\PHPUnit_Framework_MockObject_MockObject */
+    protected $response;
+
+    public function setUp()
+    {
+        $this->objectManager = $this->getMock('Magento\Framework\ObjectManagerInterface');
+        $this->view = $this->getMock('\Magento\Framework\App\ViewInterface', [], [], '', false);
+        $this->storageHelper = $this->getMock('Magento\Theme\Helper\Storage', [], [], '', false);
+        $this->response = $this->getMock('Magento\Framework\App\Response\Http', ['setBody'], [], '', false);
+
+        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->controller = $helper->getObject(
+            'Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files\OnInsert',
+            [
+                'objectManager' => $this->objectManager,
+                'view' => $this->view,
+                'response' => $this->response
+            ]
+        );
+    }
+
+    public function testExecute()
+    {
+        $this->objectManager->expects($this->once())
+            ->method('get')
+            ->with('Magento\Theme\Helper\Storage')
+            ->willReturn($this->storageHelper);
+        $this->storageHelper
+            ->expects($this->once())
+            ->method('getRelativeUrl')
+            ->willReturn('http://relative.url/');
+        $this->response->expects($this->once())
+            ->method('setBody')
+            ->with('http://relative.url/');
+
+        $this->controller->execute();
+    }
+}
diff --git a/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php b/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php
index 76b46f13538da68b31514bce752b669cda2b9194..f31a0ced59d6143fc7f1db6a97f1f3d6338f2423 100644
--- a/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php
+++ b/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php
@@ -165,7 +165,7 @@ class ItemTest extends \PHPUnit_Framework_TestCase
         $this->model->addOption($option);
         $this->assertEquals(1, count($this->model->getOptions()));
         $this->model->removeOption($code);
-        $actualOptions  = $this->model->getOptions();
+        $actualOptions = $this->model->getOptions();
         $actualOption = array_pop($actualOptions);
         $this->assertTrue($actualOption->isDeleted());
     }
@@ -185,7 +185,7 @@ class ItemTest extends \PHPUnit_Framework_TestCase
             ->getMock();
         return [
             ['first_key', ['code' => 'first_key', 'value' => 'first_data']],
-            ['second_key',$optionMock],
+            ['second_key', $optionMock],
             ['third_key', new \Magento\Framework\Object(['code' => 'third_key', 'product' => $productMock])],
         ];
     }
@@ -262,4 +262,63 @@ class ItemTest extends \PHPUnit_Framework_TestCase
 
         $this->assertFalse($result);
     }
+
+    public function testSetAndSaveItemOptions()
+    {
+        $this->assertEmpty($this->model->getOptions());
+        $firstOptionMock = $this->getMockBuilder('Magento\Wishlist\Model\Item\Option')
+            ->disableOriginalConstructor()
+            ->setMethods(['getCode', 'isDeleted', 'delete', '__wakeup'])
+            ->getMock();
+        $firstOptionMock->expects($this->any())
+            ->method('getCode')
+            ->willReturn('first_code');
+        $firstOptionMock->expects($this->any())
+            ->method('isDeleted')
+            ->willReturn(true);
+        $firstOptionMock->expects($this->once())
+            ->method('delete');
+
+        $secondOptionMock = $this->getMockBuilder('Magento\Wishlist\Model\Item\Option')
+            ->disableOriginalConstructor()
+            ->setMethods(['getCode', 'save', '__wakeup'])
+            ->getMock();
+        $secondOptionMock->expects($this->any())
+            ->method('getCode')
+            ->willReturn('second_code');
+        $secondOptionMock->expects($this->once())
+            ->method('save');
+
+        $this->model->setOptions([$firstOptionMock, $secondOptionMock]);
+        $this->assertNull($this->model->isOptionsSaved());
+        $this->model->saveItemOptions();
+        $this->assertTrue($this->model->isOptionsSaved());
+    }
+
+    public function testGetProductWithException()
+    {
+        $this->setExpectedException('Magento\Framework\Exception\LocalizedException', __('Cannot specify product.'));
+        $this->model->getProduct();
+    }
+
+    public function testGetProduct()
+    {
+        $productId = 1;
+        $storeId = 0;
+        $this->model->setData('product_id', $productId);
+        $this->model->setData('store_id', $storeId);
+        $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $productMock->expects($this->any())
+            ->method('setFinalPrice')
+            ->with(null);
+        $productMock->expects($this->any())
+            ->method('setCustomOprtions')
+            ->with([]);
+        $this->productRepository->expects($this->once())
+            ->method('getById')
+            ->willReturn($productMock);
+        $this->assertEquals($productMock, $this->model->getProduct());
+    }
 }
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 8adda8f9d9b7322f3683bf5aba9bc6d56219b0c1..d33e1456bc363e80830d3d1a32229fbccaaebc69 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
@@ -36,48 +36,6 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract
         ],
     ];
 
-    /**
-     * @magentoApiDataFixture Magento/Catalog/_files/product_simple.php
-     */
-    public function testSearch()
-    {
-        $searchCriteria = [
-            'searchCriteria' => [
-                'search_term' => 'simple',
-                'request_name' => 'quick_search_container',
-                'filter_groups' => [],
-                'page_size' => 20000000000000,
-                'current_page' => 1,
-            ],
-        ];
-
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($searchCriteria),
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
-            ],
-            'soap' => [
-                'service' => self::SERVICE_NAME,
-                'serviceVersion' => self::SERVICE_VERSION,
-                'operation' => self::SERVICE_NAME . 'Search',
-            ],
-        ];
-
-        $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);
-
-        $this->assertNotNull($response['items'][0]['id']);
-        $this->assertEquals('relevance', $response['items'][0]['custom_attributes'][0]['attribute_code']);
-        $this->assertTrue($response['items'][0]['custom_attributes'][0]['value'] > 0);
-    }
-
     /**
      * @magentoApiDataFixture Magento/Catalog/_files/products_related.php
      */
diff --git a/dev/tests/api-functional/testsuite/Magento/Search/Api/SearchTest.php b/dev/tests/api-functional/testsuite/Magento/Search/Api/SearchTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae6fd1cfc39eb5b9577675a77ff15dd5a24cd802
--- /dev/null
+++ b/dev/tests/api-functional/testsuite/Magento/Search/Api/SearchTest.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Search\Api;
+
+use Magento\TestFramework\TestCase\WebapiAbstract;
+
+class SearchTest extends WebapiAbstract
+{
+    const SERVICE_NAME = 'searchV1';
+    const SERVICE_VERSION = 'V1';
+    const RESOURCE_PATH = '/V1/search';
+
+    /**
+     * @magentoApiDataFixture Magento/Catalog/_files/product_simple.php
+     * @covers \Magento\Search\Model\Search::search
+     */
+    public function testCatalogSearch()
+    {
+        $searchCriteria = [
+            'searchCriteria' => [
+                'request_name' => 'quick_search_container',
+                'filter_groups' => [
+                    [
+                        'filters' => [
+                            [
+                                'field' => 'search_term',
+                                'value' => 'simple',
+                            ],
+                            [
+                                'field' => 'price_dynamic_algorithm',
+                                'value' => 'auto',
+                            ]
+                        ]
+                    ]
+                ],
+                'page_size' => 20000000000000,
+                'current_page' => 1,
+            ],
+        ];
+
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($searchCriteria),
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
+            ],
+            'soap' => [
+                'service' => self::SERVICE_NAME,
+                'serviceVersion' => self::SERVICE_VERSION,
+                'operation' => self::SERVICE_NAME . 'Search',
+            ],
+        ];
+
+        $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);
+
+        $this->assertNotNull($response['items'][0]['id']);
+        $this->assertEquals('relevance', $response['items'][0]['custom_attributes'][0]['attribute_code']);
+        $this->assertTrue($response['items'][0]['custom_attributes'][0]['value'] > 0);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/Search/SearchCriteria.php b/lib/internal/Magento/Framework/Api/Search/SearchCriteria.php
index 626e830864d9f4e6296f567f96a648e509f4d8b2..dece9d9876bade3198f2915607385994f21b552d 100644
--- a/lib/internal/Magento/Framework/Api/Search/SearchCriteria.php
+++ b/lib/internal/Magento/Framework/Api/Search/SearchCriteria.php
@@ -10,25 +10,8 @@ use Magento\Framework\Api\Search\SearchCriteriaInterface;
 
 class SearchCriteria extends BaseSearchCriteria implements SearchCriteriaInterface
 {
-    const SEARCH_TERM = 'search_term';
     const REQUEST_NAME = 'request_name';
 
-    /**
-     * {@inheritdoc}
-     */
-    public function getSearchTerm()
-    {
-        return $this->_get(self::SEARCH_TERM);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function setSearchTerm($searchTerm)
-    {
-        return $this->setData(self::SEARCH_TERM, $searchTerm);
-    }
-
     /**
      * {@inheritdoc}
      */
diff --git a/lib/internal/Magento/Framework/Api/Search/SearchCriteriaInterface.php b/lib/internal/Magento/Framework/Api/Search/SearchCriteriaInterface.php
index e952763d3fd93ca208a02325ac106ebbce01277c..1c8fe9772fb403957a06945e7e72938b300e9ef3 100644
--- a/lib/internal/Magento/Framework/Api/Search/SearchCriteriaInterface.php
+++ b/lib/internal/Magento/Framework/Api/Search/SearchCriteriaInterface.php
@@ -9,17 +9,6 @@ use Magento\Framework\Api\SearchCriteriaInterface as BaseSearchCriteriaInterface
 
 interface SearchCriteriaInterface extends BaseSearchCriteriaInterface
 {
-    /**
-     * @return string
-     */
-    public function getSearchTerm();
-
-    /**
-     * @param string $searchTerm
-     * @return $this
-     */
-    public function setSearchTerm($searchTerm);
-
     /**
      * @return string
      */