diff --git a/app/code/Magento/Catalog/Model/Category/Attribute/Source/Page.php b/app/code/Magento/Catalog/Model/Category/Attribute/Source/Page.php
index a62537b88cc8707f2de132e3063d4a0bc3140b74..3cff2cc0941a3b7b0ee6febfa0c6fc4ebb3ca88b 100644
--- a/app/code/Magento/Catalog/Model/Category/Attribute/Source/Page.php
+++ b/app/code/Magento/Catalog/Model/Category/Attribute/Source/Page.php
@@ -5,7 +5,7 @@
  */
 namespace Magento\Catalog\Model\Category\Attribute\Source;
 
-use Magento\Cms\Model\Resource\Block\Grid\CollectionFactory;
+use Magento\Cms\Model\Resource\Block\CollectionFactory;
 
 /**
  * Catalog category landing page attribute source
diff --git a/app/code/Magento/Catalog/Model/Resource/Category/Attribute/Source/Page.php b/app/code/Magento/Catalog/Model/Resource/Category/Attribute/Source/Page.php
index 10c44850e0f7c4e3ceda09b1fabee2f8fe564651..6e6b4406d71d4ac4d6d1fcd8f71a97bd32b8f0b7 100644
--- a/app/code/Magento/Catalog/Model/Resource/Category/Attribute/Source/Page.php
+++ b/app/code/Magento/Catalog/Model/Resource/Category/Attribute/Source/Page.php
@@ -15,16 +15,16 @@ class Page extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
     /**
      * Block collection factory
      *
-     * @var \Magento\Cms\Model\Resource\Block\Grid\CollectionFactory
+     * @var \Magento\Cms\Model\Resource\Block\CollectionFactory
      */
     protected $_blockCollectionFactory;
 
     /**
      * Construct
      *
-     * @param \Magento\Cms\Model\Resource\Block\Grid\CollectionFactory $blockCollectionFactory
+     * @param \Magento\Cms\Model\Resource\Block\CollectionFactory $blockCollectionFactory
      */
-    public function __construct(\Magento\Cms\Model\Resource\Block\Grid\CollectionFactory $blockCollectionFactory)
+    public function __construct(\Magento\Cms\Model\Resource\Block\CollectionFactory $blockCollectionFactory)
     {
         $this->_blockCollectionFactory = $blockCollectionFactory;
     }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Category/Attribute/Source/PageTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Category/Attribute/Source/PageTest.php
index b55a39bce8812111d551e0833f73aa4adab27485..1086b9a0c28a189006cc0f248931ffc26c45917f 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Category/Attribute/Source/PageTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Category/Attribute/Source/PageTest.php
@@ -45,7 +45,7 @@ class PageTest extends \PHPUnit_Framework_TestCase
     {
         $mockedCollection = $this->getMockedCollection();
 
-        $mockBuilder = $this->getMockBuilder('Magento\Cms\Model\Resource\Block\Grid\CollectionFactory');
+        $mockBuilder = $this->getMockBuilder('Magento\Cms\Model\Resource\Block\CollectionFactory');
         $mock = $mockBuilder->setMethods(['create'])
             ->disableOriginalConstructor()
             ->getMock();
diff --git a/app/code/Magento/Cms/Api/BlockRepositoryInterface.php b/app/code/Magento/Cms/Api/BlockRepositoryInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..e9834b821a66be6531ecfcce99fe1800a38f62f7
--- /dev/null
+++ b/app/code/Magento/Cms/Api/BlockRepositoryInterface.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Api;
+
+use Magento\Framework\Api\SearchCriteriaInterface;
+
+/**
+ * CMS block CRUD interface.
+ */
+interface BlockRepositoryInterface
+{
+    /**
+     * Save block.
+     *
+     * @param Data\BlockInterface $block
+     * @return Data\BlockInterface
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function save(Data\BlockInterface $block);
+
+    /**
+     * Retrieve block.
+     *
+     * @param int $blockId
+     * @return Data\BlockInterface
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function getById($blockId);
+
+    /**
+     * Retrieve blocks matching the specified criteria.
+     *
+     * @param SearchCriteriaInterface $searchCriteria
+     * @return \Magento\Framework\Api\SearchResultsInterface
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function getList(SearchCriteriaInterface $searchCriteria);
+
+    /**
+     * Delete block.
+     *
+     * @param Data\BlockInterface $block
+     * @return bool true on success
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function delete(Data\BlockInterface $block);
+
+    /**
+     * Delete block by ID.
+     *
+     * @param int $blockId
+     * @return bool true on success
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function deleteById($blockId);
+}
diff --git a/app/code/Magento/Cms/Api/Data/BlockInterface.php b/app/code/Magento/Cms/Api/Data/BlockInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..d26f46cda2fb2cfe337413133be03785dfbbbbfa
--- /dev/null
+++ b/app/code/Magento/Cms/Api/Data/BlockInterface.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Api\Data;
+
+/**
+ * CMS block interface.
+ */
+interface BlockInterface
+{
+    /**#@+
+     * Constants for keys of data array. Identical to the name of the getter in snake case
+     */
+    const BLOCK_ID      = 'block_id';
+    const IDENTIFIER    = 'identifier';
+    const TITLE         = 'title';
+    const CONTENT       = 'content';
+    const CREATION_TIME = 'creation_time';
+    const UPDATE_TIME   = 'update_time';
+    const IS_ACTIVE     = 'is_active';
+    /**#@-*/
+
+    /**
+     * Get ID
+     *
+     * @return int
+     */
+    public function getId();
+
+    /**
+     * Get identifier
+     *
+     * @return string
+     */
+    public function getIdentifier();
+
+    /**
+     * Get title
+     *
+     * @return string
+     */
+    public function getTitle();
+
+    /**
+     * Get content
+     *
+     * @return string
+     */
+    public function getContent();
+
+    /**
+     * Get creation time
+     *
+     * @return string
+     */
+    public function getCreationTime();
+
+    /**
+     * Get update time
+     *
+     * @return string
+     */
+    public function getUpdateTime();
+
+    /**
+     * Is active
+     *
+     * @return bool
+     */
+    public function isActive();
+
+    /**
+     * Set ID
+     *
+     * @param int $id
+     * @return BlockInterface
+     */
+    public function setId($id);
+
+    /**
+     * Set identifier
+     *
+     * @param string $identifier
+     * @return BlockInterface
+     */
+    public function setIdentifier($identifier);
+
+    /**
+     * Set title
+     *
+     * @param string $title
+     * @return BlockInterface
+     */
+    public function setTitle($title);
+
+    /**
+     * Set content
+     *
+     * @param string $content
+     * @return BlockInterface
+     */
+    public function setContent($content);
+
+    /**
+     * Set creation time
+     *
+     * @param string $creationTime
+     * @return BlockInterface
+     */
+    public function setCreationTime($creationTime);
+
+    /**
+     * Set update time
+     *
+     * @param string $updateTime
+     * @return BlockInterface
+     */
+    public function setUpdateTime($updateTime);
+
+    /**
+     * Set is active
+     *
+     * @param bool|int $isActive
+     * @return BlockInterface
+     */
+    public function setIsActive($isActive);
+}
diff --git a/app/code/Magento/Cms/Api/Data/BlockSearchResultsInterface.php b/app/code/Magento/Cms/Api/Data/BlockSearchResultsInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..715790c17343691226d8020f45ae896aee4eb5df
--- /dev/null
+++ b/app/code/Magento/Cms/Api/Data/BlockSearchResultsInterface.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Api\Data;
+
+use Magento\Framework\Api\SearchResultsInterface;
+
+/**
+ * Interface for cms block search results.
+ */
+interface BlockSearchResultsInterface extends SearchResultsInterface
+{
+    /**
+     * Get blocks list.
+     *
+     * @return \Magento\Cms\Api\Data\BlockInterface[]
+     */
+    public function getItems();
+
+    /**
+     * Set blocks list.
+     *
+     * @param \Magento\Cms\Api\Data\BlockInterface[] $items
+     * @return $this
+     */
+    public function setItems(array $items = null);
+}
diff --git a/app/code/Magento/Cms/Api/Data/PageInterface.php b/app/code/Magento/Cms/Api/Data/PageInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e03d0ed1ffde5e14a18ae2effb77062b508ffcf
--- /dev/null
+++ b/app/code/Magento/Cms/Api/Data/PageInterface.php
@@ -0,0 +1,305 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Api\Data;
+
+/**
+ * CMS page interface.
+ */
+interface PageInterface
+{
+    /**#@+
+     * Constants for keys of data array. Identical to the name of the getter in snake case
+     */
+    const PAGE_ID                  = 'page_id';
+    const IDENTIFIER               = 'identifier';
+    const TITLE                    = 'title';
+    const PAGE_LAYOUT              = 'page_layout';
+    const META_KEYWORDS            = 'meta_keywords';
+    const META_DESCRIPTION         = 'meta_description';
+    const CONTENT_HEADING          = 'content_heading';
+    const CONTENT                  = 'content';
+    const CREATION_TIME            = 'creation_time';
+    const UPDATE_TIME              = 'update_time';
+    const SORT_ORDER               = 'sort_order';
+    const LAYOUT_UPDATE_XML        = 'layout_update_xml';
+    const CUSTOM_THEME             = 'custom_theme';
+    const CUSTOM_ROOT_TEMPLATE     = 'custom_root_template';
+    const CUSTOM_LAYOUT_UPDATE_XML = 'custom_layout_update_xml';
+    const CUSTOM_THEME_FROM        = 'custom_theme_from';
+    const CUSTOM_THEME_TO          = 'custom_theme_to';
+    const IS_ACTIVE                = 'is_active';
+    /**#@-*/
+
+    /**
+     * Get ID
+     *
+     * @return int
+     */
+    public function getId();
+
+    /**
+     * Get identifier
+     *
+     * @return string
+     */
+    public function getIdentifier();
+
+    /**
+     * Get title
+     *
+     * @return string
+     */
+    public function getTitle();
+
+    /**
+     * Get page layout
+     *
+     * @return string
+     */
+    public function getPageLayout();
+
+    /**
+     * Get meta keywords
+     *
+     * @return string
+     */
+    public function getMetaKeywords();
+
+    /**
+     * Get meta description
+     *
+     * @return string
+     */
+    public function getMetaDescription();
+
+    /**
+     * Get content heading
+     *
+     * @return string
+     */
+    public function getContentHeading();
+
+    /**
+     * Get content
+     *
+     * @return string
+     */
+    public function getContent();
+
+    /**
+     * Get creation time
+     *
+     * @return string
+     */
+    public function getCreationTime();
+
+    /**
+     * Get update time
+     *
+     * @return string
+     */
+    public function getUpdateTime();
+
+    /**
+     * Get sort order
+     *
+     * @return string
+     */
+    public function getSortOrder();
+
+    /**
+     * Get layout update xml
+     *
+     * @return string
+     */
+    public function getLayoutUpdateXml();
+
+    /**
+     * Get custom theme
+     *
+     * @return string
+     */
+    public function getCustomTheme();
+
+    /**
+     * Get custom root template
+     *
+     * @return string
+     */
+    public function getCustomRootTemplate();
+
+    /**
+     * Get custom layout update xml
+     *
+     * @return string
+     */
+    public function getCustomLayoutUpdateXml();
+
+    /**
+     * Get custom theme from
+     *
+     * @return string
+     */
+    public function getCustomThemeFrom();
+
+    /**
+     * Get custom theme to
+     *
+     * @return string
+     */
+    public function getCustomThemeTo();
+
+    /**
+     * Is active
+     *
+     * @return bool
+     */
+    public function isActive();
+
+    /**
+     * Set ID
+     *
+     * @param int $id
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setId($id);
+
+    /**
+     * Set identifier
+     *
+     * @param string $identifier
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setIdentifier($identifier);
+
+    /**
+     * Set title
+     *
+     * @param string $title
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setTitle($title);
+
+    /**
+     * Set page layout
+     *
+     * @param string $pageLayout
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setPageLayout($pageLayout);
+
+    /**
+     * Set meta keywords
+     *
+     * @param string $metaKeywords
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setMetaKeywords($metaKeywords);
+
+    /**
+     * Set meta description
+     *
+     * @param string $metaDescription
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setMetaDescription($metaDescription);
+
+    /**
+     * Set content heading
+     *
+     * @param string $contentHeading
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setContentHeading($contentHeading);
+
+    /**
+     * Set content
+     *
+     * @param string $content
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setContent($content);
+
+    /**
+     * Set creation time
+     *
+     * @param string $creationTime
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCreationTime($creationTime);
+
+    /**
+     * Set update time
+     *
+     * @param string $updateTime
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setUpdateTime($updateTime);
+
+    /**
+     * Set sort order
+     *
+     * @param string $sortOrder
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setSortOrder($sortOrder);
+
+    /**
+     * Set layout update xml
+     *
+     * @param string $layoutUpdateXml
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setLayoutUpdateXml($layoutUpdateXml);
+
+    /**
+     * Set custom theme
+     *
+     * @param string $customTheme
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomTheme($customTheme);
+
+    /**
+     * Set custom root template
+     *
+     * @param string $customRootTemplate
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomRootTemplate($customRootTemplate);
+
+    /**
+     * Set custom layout update xml
+     *
+     * @param string $customLayoutUpdateXml
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomLayoutUpdateXml($customLayoutUpdateXml);
+
+    /**
+     * Set custom theme from
+     *
+     * @param string $customThemeFrom
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomThemeFrom($customThemeFrom);
+
+    /**
+     * Set custom theme to
+     *
+     * @param string $customThemeTo
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomThemeTo($customThemeTo);
+
+    /**
+     * Set is active
+     *
+     * @param int|bool $isActive
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setIsActive($isActive);
+}
diff --git a/app/code/Magento/Cms/Api/Data/PageSearchResultsInterface.php b/app/code/Magento/Cms/Api/Data/PageSearchResultsInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..160d93d172c214ecba5dd13e4e482cc4754772c6
--- /dev/null
+++ b/app/code/Magento/Cms/Api/Data/PageSearchResultsInterface.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Api\Data;
+
+use Magento\Framework\Api\SearchResultsInterface;
+
+/**
+ * Interface for cms page search results.
+ */
+interface PageSearchResultsInterface extends SearchResultsInterface
+{
+    /**
+     * Get pages list.
+     *
+     * @return \Magento\Cms\Api\Data\PageInterface[]
+     */
+    public function getItems();
+
+    /**
+     * Set pages list.
+     *
+     * @param \Magento\Cms\Api\Data\PageInterface[] $items
+     * @return $this
+     */
+    public function setItems(array $items = null);
+}
diff --git a/app/code/Magento/Cms/Api/PageRepositoryInterface.php b/app/code/Magento/Cms/Api/PageRepositoryInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..9dcf95d572fd533036999b4863bd1240ed7ad30e
--- /dev/null
+++ b/app/code/Magento/Cms/Api/PageRepositoryInterface.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Api;
+
+use Magento\Framework\Api\SearchCriteriaInterface;
+
+/**
+ * CMS page CRUD interface.
+ */
+interface PageRepositoryInterface
+{
+    /**
+     * Save page.
+     *
+     * @param Data\PageInterface $page
+     * @return Data\PageInterface
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function save(Data\PageInterface $page);
+
+    /**
+     * Retrieve page.
+     *
+     * @param int $pageId
+     * @return Data\PageInterface
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function getById($pageId);
+
+    /**
+     * Retrieve pages matching the specified criteria.
+     *
+     * @param SearchCriteriaInterface $searchCriteria
+     * @return \Magento\Framework\Api\SearchResultsInterface
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function getList(SearchCriteriaInterface $searchCriteria);
+
+    /**
+     * Delete page.
+     *
+     * @param Data\PageInterface $page
+     * @return bool true on success
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function delete(Data\PageInterface $page);
+
+    /**
+     * Delete page by ID.
+     *
+     * @param int $pageId
+     * @return bool true on success
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Framework\Exception\LocalizedException
+     */
+    public function deleteById($pageId);
+}
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Block/Widget/Chooser.php b/app/code/Magento/Cms/Block/Adminhtml/Block/Widget/Chooser.php
index 93f8f338149a480ebb4502291daaa7a538263099..fed2f67da6f177806559e463deb8fda56a2fbb3f 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Block/Widget/Chooser.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Block/Widget/Chooser.php
@@ -16,7 +16,7 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
     protected $_blockFactory;
 
     /**
-     * @var \Magento\Cms\Model\Resource\Block\Grid\CollectionFactory
+     * @var \Magento\Cms\Model\Resource\Block\CollectionFactory
      */
     protected $_collectionFactory;
 
@@ -24,14 +24,14 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Backend\Helper\Data $backendHelper
      * @param \Magento\Cms\Model\BlockFactory $blockFactory
-     * @param \Magento\Cms\Model\Resource\Block\Grid\CollectionFactory $collectionFactory
+     * @param \Magento\Cms\Model\Resource\Block\CollectionFactory $collectionFactory
      * @param array $data
      */
     public function __construct(
         \Magento\Backend\Block\Template\Context $context,
         \Magento\Backend\Helper\Data $backendHelper,
         \Magento\Cms\Model\BlockFactory $blockFactory,
-        \Magento\Cms\Model\Resource\Block\Grid\CollectionFactory $collectionFactory,
+        \Magento\Cms\Model\Resource\Block\CollectionFactory $collectionFactory,
         array $data = []
     ) {
         $this->_blockFactory = $blockFactory;
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Grid.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Grid.php
index 0580ceeaeb0d16706547ec6831b197c142e1cd27..af9f8d533c2d87e95e8fbcbd8a205f2dcec7e873 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Grid.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Grid.php
@@ -11,7 +11,7 @@ namespace Magento\Cms\Block\Adminhtml\Page;
 class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
 {
     /**
-     * @var \Magento\Cms\Model\Resource\Page\Grid\CollectionFactory
+     * @var \Magento\Cms\Model\Resource\Page\CollectionFactory
      */
     protected $_collectionFactory;
 
@@ -29,7 +29,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Backend\Helper\Data $backendHelper
      * @param \Magento\Cms\Model\Page $cmsPage
-     * @param \Magento\Cms\Model\Resource\Page\Grid\CollectionFactory $collectionFactory
+     * @param \Magento\Cms\Model\Resource\Page\CollectionFactory $collectionFactory
      * @param \Magento\Framework\View\Model\PageLayout\Config\BuilderInterface $pageLayoutBuilder
      * @param array $data
      */
@@ -37,7 +37,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
         \Magento\Backend\Block\Template\Context $context,
         \Magento\Backend\Helper\Data $backendHelper,
         \Magento\Cms\Model\Page $cmsPage,
-        \Magento\Cms\Model\Resource\Page\Grid\CollectionFactory $collectionFactory,
+        \Magento\Cms\Model\Resource\Page\CollectionFactory $collectionFactory,
         \Magento\Framework\View\Model\PageLayout\Config\BuilderInterface $pageLayoutBuilder,
         array $data = []
     ) {
@@ -66,7 +66,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
     protected function _prepareCollection()
     {
         $collection = $this->_collectionFactory->create();
-        /* @var $collection \Magento\Cms\Model\Resource\Page\Grid\Collection */
+        /* @var $collection \Magento\Cms\Model\Resource\Page\Collection */
         $collection->setFirstStoreFlag(true);
         $this->setCollection($collection);
 
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Widget/Chooser.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Widget/Chooser.php
index f6efab805aa28ef9fd36d9bf5eca387adf8914df..addaf3f4926b8e05f48833b16e540eb73ad295ef 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Widget/Chooser.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Widget/Chooser.php
@@ -23,7 +23,7 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
     protected $_pageFactory;
 
     /**
-     * @var \Magento\Cms\Model\Resource\Page\Grid\CollectionFactory
+     * @var \Magento\Cms\Model\Resource\Page\CollectionFactory
      */
     protected $_collectionFactory;
 
@@ -37,7 +37,7 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
      * @param \Magento\Backend\Helper\Data $backendHelper
      * @param \Magento\Cms\Model\Page $cmsPage
      * @param \Magento\Cms\Model\PageFactory $pageFactory
-     * @param \Magento\Cms\Model\Resource\Page\Grid\CollectionFactory $collectionFactory
+     * @param \Magento\Cms\Model\Resource\Page\CollectionFactory $collectionFactory
      * @param \Magento\Framework\View\Model\PageLayout\Config\BuilderInterface $pageLayoutBuilder
      * @param array $data
      */
@@ -46,7 +46,7 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
         \Magento\Backend\Helper\Data $backendHelper,
         \Magento\Cms\Model\Page $cmsPage,
         \Magento\Cms\Model\PageFactory $pageFactory,
-        \Magento\Cms\Model\Resource\Page\Grid\CollectionFactory $collectionFactory,
+        \Magento\Cms\Model\Resource\Page\CollectionFactory $collectionFactory,
         \Magento\Framework\View\Model\PageLayout\Config\BuilderInterface $pageLayoutBuilder,
         array $data = []
     ) {
@@ -141,7 +141,7 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
     protected function _prepareCollection()
     {
         $collection = $this->_collectionFactory->create();
-        /* @var $collection \Magento\Cms\Model\Resource\Page\Grid\CollectionFactory */
+        /* @var $collection \Magento\Cms\Model\Resource\Page\CollectionFactory */
         $collection->setFirstStoreFlag(true);
         $this->setCollection($collection);
 
diff --git a/app/code/Magento/Cms/Block/Block.php b/app/code/Magento/Cms/Block/Block.php
index 2f8f28e4334fc17c2f112217efbb9aad8c4f3cf0..707dbbe40d754d3708cd3c13a284e13fe5720a58 100644
--- a/app/code/Magento/Cms/Block/Block.php
+++ b/app/code/Magento/Cms/Block/Block.php
@@ -68,7 +68,7 @@ class Block extends \Magento\Framework\View\Element\AbstractBlock implements \Ma
             /** @var \Magento\Cms\Model\Block $block */
             $block = $this->_blockFactory->create();
             $block->setStoreId($storeId)->load($blockId);
-            if ($block->getIsActive()) {
+            if ($block->isActive()) {
                 $html = $this->_filterProvider->getBlockFilter()->setStoreId($storeId)->filter($block->getContent());
             }
         }
diff --git a/app/code/Magento/Cms/Block/Widget/Block.php b/app/code/Magento/Cms/Block/Widget/Block.php
index 66f31639c36f1bb13a97f460f89a324f28895eac..7c83169d945f128d2d10380664f80a7f82123a7a 100644
--- a/app/code/Magento/Cms/Block/Widget/Block.php
+++ b/app/code/Magento/Cms/Block/Widget/Block.php
@@ -70,7 +70,7 @@ class Block extends \Magento\Framework\View\Element\Template implements \Magento
             /** @var \Magento\Cms\Model\Block $block */
             $block = $this->_blockFactory->create();
             $block->setStoreId($storeId)->load($blockId);
-            if ($block->getIsActive()) {
+            if ($block->isActive()) {
                 $this->setText(
                     $this->_filterProvider->getBlockFilter()->setStoreId($storeId)->filter($block->getContent())
                 );
diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDelete.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDelete.php
index 95ec6e5169e34519a92e893e5f3bc26e76a99e95..a87024f3ea1e622f46e7f1d540e5f9081932bcaf 100644
--- a/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDelete.php
+++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDelete.php
@@ -23,7 +23,7 @@ class MassDelete extends AbstractMassDelete
      *
      * @var string
      */
-    protected $collection = 'Magento\Cms\Model\Resource\Page\Grid\Collection';
+    protected $collection = 'Magento\Cms\Model\Resource\Page\Collection';
 
     /**
      * Page model
diff --git a/app/code/Magento/Cms/Model/Block.php b/app/code/Magento/Cms/Model/Block.php
index 14227352f81bb7575785bfb46af36585111ed1ab..8fd712570825f235b4959b353906974eefb69a46 100644
--- a/app/code/Magento/Cms/Model/Block.php
+++ b/app/code/Magento/Cms/Model/Block.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Cms\Model;
 
+use Magento\Cms\Api\Data\BlockInterface;
 use Magento\Framework\Object\IdentityInterface;
 
 /**
@@ -12,28 +13,14 @@ use Magento\Framework\Object\IdentityInterface;
  *
  * @method \Magento\Cms\Model\Resource\Block _getResource()
  * @method \Magento\Cms\Model\Resource\Block getResource()
- * @method \Magento\Cms\Model\Block setTitle(string $value)
- * @method \Magento\Cms\Model\Block setIdentifier(string $value)
- * @method \Magento\Cms\Model\Block setContent(string $value)
- * @method \Magento\Cms\Model\Block setCreationTime(string $value)
- * @method \Magento\Cms\Model\Block setUpdateTime(string $value)
- * @method \Magento\Cms\Model\Block setIsActive(int $value)
  */
-class Block extends \Magento\Framework\Model\AbstractModel implements IdentityInterface
+class Block extends \Magento\Framework\Model\AbstractModel implements BlockInterface, IdentityInterface
 {
     /**
      * CMS block cache tag
      */
     const CACHE_TAG = 'cms_block';
 
-    const ID = 'block_id';
-    const IDENTIFIER = 'identifier';
-    const TITLE = 'title';
-    const CONTENT = 'content';
-    const CREATION_TIME = 'creation_time';
-    const UPDATE_TIME ='update_time';
-    const IS_ACTIVE ='is_active';
-
     /**
      * @var string
      */
@@ -88,7 +75,7 @@ class Block extends \Magento\Framework\Model\AbstractModel implements IdentityIn
      */
     public function getId()
     {
-        return $this->_getData(self::ID);
+        return $this->getData(self::BLOCK_ID);
     }
 
     /**
@@ -98,7 +85,7 @@ class Block extends \Magento\Framework\Model\AbstractModel implements IdentityIn
      */
     public function getIdentifier()
     {
-        return (string) $this->_getData(self::IDENTIFIER);
+        return (string)$this->getData(self::IDENTIFIER);
     }
 
     /**
@@ -108,7 +95,7 @@ class Block extends \Magento\Framework\Model\AbstractModel implements IdentityIn
      */
     public function getTitle()
     {
-        return $this->_getData(self::TITLE);
+        return $this->getData(self::TITLE);
     }
 
     /**
@@ -118,7 +105,7 @@ class Block extends \Magento\Framework\Model\AbstractModel implements IdentityIn
      */
     public function getContent()
     {
-        return $this->_getData(self::CONTENT);
+        return $this->getData(self::CONTENT);
     }
 
     /**
@@ -128,7 +115,7 @@ class Block extends \Magento\Framework\Model\AbstractModel implements IdentityIn
      */
     public function getCreationTime()
     {
-        return $this->_getData(self::CREATION_TIME);
+        return $this->getData(self::CREATION_TIME);
     }
 
     /**
@@ -138,16 +125,93 @@ class Block extends \Magento\Framework\Model\AbstractModel implements IdentityIn
      */
     public function getUpdateTime()
     {
-        return $this->_getData(self::UPDATE_TIME);
+        return $this->getData(self::UPDATE_TIME);
     }
 
     /**
-     * Retrieve block status
+     * Is active
      *
-     * @return int
+     * @return bool
+     */
+    public function isActive()
+    {
+        return (bool)$this->getData(self::IS_ACTIVE);
+    }
+
+    /**
+     * Set ID
+     *
+     * @param int $id
+     * @return BlockInterface
+     */
+    public function setId($id)
+    {
+        return $this->setData(self::BLOCK_ID, $id);
+    }
+
+    /**
+     * Set identifier
+     *
+     * @param string $identifier
+     * @return BlockInterface
+     */
+    public function setIdentifier($identifier)
+    {
+        return $this->setData(self::IDENTIFIER, $identifier);
+    }
+
+    /**
+     * Set title
+     *
+     * @param string $title
+     * @return BlockInterface
+     */
+    public function setTitle($title)
+    {
+        return $this->setData(self::TITLE, $title);
+    }
+
+    /**
+     * Set content
+     *
+     * @param string $content
+     * @return BlockInterface
+     */
+    public function setContent($content)
+    {
+        return $this->setData(self::CONTENT, $content);
+    }
+
+    /**
+     * Set creation time
+     *
+     * @param string $creationTime
+     * @return BlockInterface
+     */
+    public function setCreationTime($creationTime)
+    {
+        return $this->setData(self::CREATION_TIME, $creationTime);
+    }
+
+    /**
+     * Set update time
+     *
+     * @param string $updateTime
+     * @return BlockInterface
+     */
+    public function setUpdateTime($updateTime)
+    {
+        return $this->setData(self::UPDATE_TIME, $updateTime);
+    }
+
+    /**
+     * Set is active
+     *
+     * @param bool|int $isActive
+     * @return BlockInterface
      */
-    public function getIsActive()
+    public function setIsActive($isActive)
     {
-        return $this->_getData(self::IS_ACTIVE);
+        return $this->setData(self::IS_ACTIVE, $isActive);
     }
 }
diff --git a/app/code/Magento/Cms/Model/BlockCriteriaInterface.php b/app/code/Magento/Cms/Model/BlockCriteriaInterface.php
deleted file mode 100644
index 358551b163cdcfa6be96d49b4c2c007c31525f1a..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/BlockCriteriaInterface.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model;
-
-/**
- * Interface BlockCriteriaInterface
- */
-interface BlockCriteriaInterface extends \Magento\Framework\Api\CriteriaInterface
-{
-    /**
-     * Set first store flag
-     *
-     * @param bool $flag
-     * @return void
-     */
-    public function setFirstStoreFlag($flag = false);
-
-    /**
-     * Add filter by store
-     *
-     * @param int $storeId
-     * @param bool $withAdmin
-     * @return void
-     */
-    public function addStoreFilter($storeId, $withAdmin = true);
-}
diff --git a/app/code/Magento/Cms/Model/BlockRepository.php b/app/code/Magento/Cms/Model/BlockRepository.php
index 520add71eb28b864280d9cc2979859400fb04c6f..be1498fc8667553ba1f4ad4f8ccd93ac61d57b97 100644
--- a/app/code/Magento/Cms/Model/BlockRepository.php
+++ b/app/code/Magento/Cms/Model/BlockRepository.php
@@ -5,70 +5,82 @@
  */
 namespace Magento\Cms\Model;
 
+use Magento\Cms\Api\Data;
+use Magento\Cms\Api\BlockRepositoryInterface;
+use Magento\Framework\Api\DataObjectHelper;
+use Magento\Framework\Api\SearchCriteriaInterface;
 use Magento\Framework\Exception\CouldNotDeleteException;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\NoSuchEntityException;
 
 /**
  * Class BlockRepository
- * @api
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
-class BlockRepository
+class BlockRepository implements BlockRepositoryInterface
 {
     /**
-     * @var \Magento\Cms\Model\Resource\Block
+     * @var Resource\Block
      */
     protected $resource;
 
     /**
-     * @var \Magento\Cms\Model\BlockFactory
+     * @var BlockFactory
      */
     protected $blockFactory;
 
     /**
-     * @var \Magento\Cms\Model\Resource\Block\CollectionFactory
+     * @var Resource\Block\CollectionFactory
      */
     protected $blockCollectionFactory;
 
     /**
-     * @var \Magento\Framework\DB\QueryBuilderFactory
+     * @var Data\BlockSearchResultsInterfaceFactory
      */
-    protected $queryBuilderFactory;
+    protected $searchResultsFactory;
 
     /**
-     * @var \Magento\Framework\DB\MapperFactory
+     * @var DataObjectHelper
      */
-    protected $mapperFactory;
+    protected $dataObjectHelper;
 
     /**
-     * @param \Magento\Cms\Model\Resource\Block $resource
-     * @param \Magento\Cms\Model\BlockFactory $blockFactory
-     * @param \Magento\Cms\Model\Resource\Block\CollectionFactory $blockCollectionFactory
-     * @param \Magento\Framework\DB\QueryBuilderFactory $queryBuilderFactory
-     * @param \Magento\Framework\DB\MapperFactory $mapperFactory
+     * @var Data\BlockInterfaceFactory
+     */
+    protected $dataBlockFactory;
+
+    /**
+     * @param Resource\Block $resource
+     * @param BlockFactory $blockFactory
+     * @param Data\BlockInterfaceFactory $dataBlockFactory
+     * @param Resource\Block\CollectionFactory $blockCollectionFactory
+     * @param Data\BlockSearchResultsInterfaceFactory $searchResultsFactory
+     * @param DataObjectHelper $dataObjectHelper
      */
     public function __construct(
-        \Magento\Cms\Model\Resource\Block $resource,
-        \Magento\Cms\Model\BlockFactory $blockFactory,
-        \Magento\Cms\Model\Resource\Block\CollectionFactory $blockCollectionFactory,
-        \Magento\Framework\DB\QueryBuilderFactory $queryBuilderFactory,
-        \Magento\Framework\DB\MapperFactory $mapperFactory
+        Resource\Block $resource,
+        BlockFactory $blockFactory,
+        Data\BlockInterfaceFactory $dataBlockFactory,
+        Resource\Block\CollectionFactory $blockCollectionFactory,
+        Data\BlockSearchResultsInterfaceFactory $searchResultsFactory,
+        DataObjectHelper $dataObjectHelper
     ) {
         $this->resource = $resource;
         $this->blockFactory = $blockFactory;
         $this->blockCollectionFactory = $blockCollectionFactory;
-        $this->queryBuilderFactory = $queryBuilderFactory;
-        $this->mapperFactory = $mapperFactory;
+        $this->searchResultsFactory = $searchResultsFactory;
+        $this->dataObjectHelper = $dataObjectHelper;
+        $this->dataBlockFactory = $dataBlockFactory;
     }
 
     /**
      * Save Block data
      *
-     * @param \Magento\Cms\Model\Block $block
-     * @return \Magento\Cms\Model\Block
+     * @param Data\BlockInterface $block
+     * @return Block
      * @throws CouldNotSaveException
      */
-    public function save(\Magento\Cms\Model\Block $block)
+    public function save(Data\BlockInterface $block)
     {
         try {
             $this->resource->save($block);
@@ -82,10 +94,10 @@ class BlockRepository
      * Load Block data by given Block Identity
      *
      * @param string $blockId
-     * @return \Magento\Cms\Model\Block
+     * @return Block
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
-    public function get($blockId)
+    public function getById($blockId)
     {
         $block = $this->blockFactory->create();
         $this->resource->load($block, $blockId);
@@ -98,27 +110,65 @@ class BlockRepository
     /**
      * Load Block data collection by given search criteria
      *
-     * @param \Magento\Cms\Model\BlockCriteriaInterface $criteria
-     * @return \Magento\Cms\Model\Resource\Block\Collection
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     * @param SearchCriteriaInterface $criteria
+     * @return Resource\Block\Collection
      */
-    public function getList(\Magento\Cms\Model\BlockCriteriaInterface $criteria)
+    public function getList(SearchCriteriaInterface $criteria)
     {
-        $queryBuilder = $this->queryBuilderFactory->create();
-        $queryBuilder->setCriteria($criteria);
-        $queryBuilder->setResource($this->resource);
-        $query = $queryBuilder->create();
-        $collection = $this->blockCollectionFactory->create(['query' => $query]);
-        return $collection;
+        $searchResults = $this->searchResultsFactory->create();
+        $searchResults->setSearchCriteria($criteria);
+
+        $collection = $this->blockCollectionFactory->create();
+        foreach ($criteria->getFilterGroups() as $filterGroup) {
+            $fields = [];
+            $conditions = [];
+            foreach ($filterGroup->getFilters() as $filter) {
+                if ($filter->getField() === 'store_id') {
+                    $collection->addStoreFilter($filter->getValue(), false);
+                    continue;
+                }
+                $condition = $filter->getConditionType() ?: 'eq';
+                $fields[] = ['attribute' => $filter->getField(), $condition => $filter->getValue()];
+            }
+            if ($fields) {
+                $collection->addFieldToFilter($fields, $conditions);
+            }
+        }
+        $searchResults->setTotalCount($collection->getSize());
+        $sortOrders = $criteria->getSortOrders();
+        if ($sortOrders) {
+            foreach ($sortOrders as $sortOrder) {
+                $collection->addOrder(
+                    $sortOrder->getField(),
+                    ($sortOrder->getDirection() == SearchCriteriaInterface::SORT_ASC) ? 'ASC' : 'DESC'
+                );
+            }
+        }
+        $collection->setCurPage($criteria->getCurrentPage());
+        $collection->setPageSize($criteria->getPageSize());
+        $blocks = [];
+        /** @var Block $blockModel */
+        foreach ($collection as $blockModel) {
+            $blocks[] = $this->dataObjectHelper->populateWithArray(
+                $this->dataBlockFactory->create(),
+                $blockModel->getData(),
+                'Magento\Cms\Api\Data\BlockInterface'
+            );
+        }
+        $searchResults->setItems($blocks);
+        return $searchResults;
     }
 
     /**
      * Delete Block
      *
-     * @param \Magento\Cms\Model\Block $block
+     * @param Data\BlockInterface $block
      * @return bool
-     * @throws \Magento\Framework\Exception\CouldNotDeleteException
+     * @throws CouldNotDeleteException
      */
-    public function delete(\Magento\Cms\Model\Block $block)
+    public function delete(Data\BlockInterface $block)
     {
         try {
             $this->resource->delete($block);
@@ -133,11 +183,11 @@ class BlockRepository
      *
      * @param string $blockId
      * @return bool
-     * @throws \Magento\Framework\Exception\CouldNotDeleteException
-     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws CouldNotDeleteException
+     * @throws NoSuchEntityException
      */
     public function deleteById($blockId)
     {
-        return $this->delete($this->get($blockId));
+        return $this->delete($this->getById($blockId));
     }
 }
diff --git a/app/code/Magento/Cms/Model/Config/Source/Page.php b/app/code/Magento/Cms/Model/Config/Source/Page.php
index 4ed69001f1f9e0d0a747bcb7962f0a33b9c87a4a..6d0d87680ef5a386c7fde21be6a542beb1335793 100644
--- a/app/code/Magento/Cms/Model/Config/Source/Page.php
+++ b/app/code/Magento/Cms/Model/Config/Source/Page.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\Cms\Model\Config\Source;
 
+use Magento\Cms\Model\Resource\Page\CollectionFactory;
+
 /**
  * Class Page
  */
@@ -16,25 +18,17 @@ class Page implements \Magento\Framework\Option\ArrayInterface
     protected $options;
 
     /**
-     * @var \Magento\Cms\Model\PageRepository
-     */
-    protected $pageRepository;
-
-    /**
-     * @var \Magento\Cms\Model\Resource\PageCriteria
+     * @var CollectionFactory
      */
-    protected $pageCriteriaFactory;
+    protected $collectionFactory;
 
     /**
-     * @param \Magento\Cms\Model\PageRepository $pageRepository
-     * @param \Magento\Cms\Model\Resource\PageCriteriaFactory $pageCriteriaFactory
+     * @param CollectionFactory $collectionFactory
      */
     public function __construct(
-        \Magento\Cms\Model\PageRepository $pageRepository,
-        \Magento\Cms\Model\Resource\PageCriteriaFactory $pageCriteriaFactory
+        CollectionFactory $collectionFactory
     ) {
-        $this->pageRepository = $pageRepository;
-        $this->pageCriteriaFactory = $pageCriteriaFactory;
+        $this->collectionFactory = $collectionFactory;
     }
 
     /**
@@ -45,7 +39,7 @@ class Page implements \Magento\Framework\Option\ArrayInterface
     public function toOptionArray()
     {
         if (!$this->options) {
-            $this->options = $this->pageRepository->getList($this->pageCriteriaFactory->create())->toOptionIdArray();
+            $this->options = $this->collectionFactory->create()->toOptionIdArray();
         }
         return $this->options;
     }
diff --git a/app/code/Magento/Cms/Model/DataSource/BlockCollection.php b/app/code/Magento/Cms/Model/DataSource/BlockCollection.php
deleted file mode 100644
index b63c604fcd6865a88fcb7d0fadc1a578ce59e163..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/DataSource/BlockCollection.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\DataSource;
-
-use Magento\Framework\Data\CollectionDataSourceInterface;
-use Magento\Cms\Model\Resource\BlockCriteria;
-use Magento\Cms\Model\BlockRepository;
-
-/**
- * CMS block collection data source
- *
- * Class BlockCollection
- */
-class BlockCollection extends BlockCriteria implements CollectionDataSourceInterface
-{
-    /**
-     * @var BlockRepository
-     */
-    protected $repository;
-
-    /**
-     * @param BlockRepository $repository
-     * @param string $mapper
-     */
-    public function __construct(BlockRepository $repository, $mapper = '')
-    {
-        $this->repository = $repository;
-        $this->setFirstStoreFlag(true);
-        parent::__construct($mapper);
-    }
-
-    /**
-     * @inheritdoc
-     */
-    public function addFilter($name, $field, $condition = null, $type = 'public')
-    {
-        if ($field === 'store_id') {
-            $this->addStoreFilter($condition, false);
-        } else {
-            parent::addFilter($name, $field, $condition, $type);
-        }
-    }
-
-    /**
-     * @return \Magento\Cms\Model\Resource\Block\Collection
-     */
-    public function getResultCollection()
-    {
-        return $this->repository->getList($this);
-    }
-}
diff --git a/app/code/Magento/Cms/Model/DataSource/PageCollection.php b/app/code/Magento/Cms/Model/DataSource/PageCollection.php
deleted file mode 100644
index 74491d38aea4c6a72e70e6bba56596dba579103b..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/DataSource/PageCollection.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\DataSource;
-
-use Magento\Cms\Model\Resource\PageCriteria;
-use Magento\Framework\Data\CollectionDataSourceInterface;
-
-/**
- * CMS page collection data source
- *
- * Class PageCollection
- */
-class PageCollection extends PageCriteria implements CollectionDataSourceInterface
-{
-    /**
-     * @var \Magento\Cms\Model\PageRepository
-     */
-    protected $repository;
-
-    /**
-     * @param \Magento\Cms\Model\PageRepository $repository
-     * @param string $mapper
-     */
-    public function __construct(\Magento\Cms\Model\PageRepository $repository, $mapper = '')
-    {
-        $this->repository = $repository;
-        $this->setFirstStoreFlag(true);
-        parent::__construct($mapper);
-    }
-
-    /**
-     * @inheritdoc
-     */
-    public function addFilter($name, $field, $condition = null, $type = 'public')
-    {
-        if ($field === 'store_id') {
-            $this->addStoreFilter($condition, false);
-        } else {
-            parent::addFilter($name, $field, $condition, $type);
-        }
-    }
-
-    /**
-     * @return \Magento\Cms\Model\Resource\Page\Collection
-     */
-    public function getResultCollection()
-    {
-        return $this->repository->getList($this);
-    }
-
-    /**
-     * Add Criteria object
-     *
-     * @param \Magento\Cms\Model\Resource\PageCriteria $criteria
-     * @return void
-     */
-    public function addCriteria(\Magento\Cms\Model\Resource\PageCriteria $criteria)
-    {
-        $this->data[self::PART_CRITERIA_LIST]['list'][] = $criteria;
-    }
-}
diff --git a/app/code/Magento/Cms/Model/Page.php b/app/code/Magento/Cms/Model/Page.php
index d1693facd3e2180a190c88961455eb3dbe4f8ff8..fca4ecc84aa66052fc48af15edf6d9fac83aeb41 100644
--- a/app/code/Magento/Cms/Model/Page.php
+++ b/app/code/Magento/Cms/Model/Page.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Cms\Model;
 
+use Magento\Cms\Api\Data\PageInterface;
 use Magento\Framework\Object\IdentityInterface;
 
 /**
@@ -12,41 +13,9 @@ use Magento\Framework\Object\IdentityInterface;
  *
  * @method \Magento\Cms\Model\Resource\Page _getResource()
  * @method \Magento\Cms\Model\Resource\Page getResource()
- * @method \Magento\Cms\Model\Page setTitle(string $value)
- * @method string getPageLayout()
- * @method \Magento\Cms\Model\Page setPageLayout(string $value)
- * @method string getMetaKeywords()
- * @method \Magento\Cms\Model\Page setMetaKeywords(string $value)
- * @method string getMetaDescription()
- * @method \Magento\Cms\Model\Page setMetaDescription(string $value)
- * @method \Magento\Cms\Model\Page setIdentifier(string $value)
- * @method string getContentHeading()
- * @method \Magento\Cms\Model\Page setContentHeading(string $value)
- * @method string getContent()
- * @method \Magento\Cms\Model\Page setContent(string $value)
- * @method string getCreationTime()
- * @method \Magento\Cms\Model\Page setCreationTime(string $value)
- * @method string getUpdateTime()
- * @method \Magento\Cms\Model\Page setUpdateTime(string $value)
- * @method int getIsActive()
- * @method \Magento\Cms\Model\Page setIsActive(int $value)
- * @method int getSortOrder()
- * @method \Magento\Cms\Model\Page setSortOrder(int $value)
- * @method string getLayoutUpdateXml()
- * @method \Magento\Cms\Model\Page setLayoutUpdateXml(string $value)
- * @method string getCustomTheme()
- * @method \Magento\Cms\Model\Page setCustomTheme(string $value)
- * @method string getCustomPageLayout()
- * @method \Magento\Cms\Model\Page setCustomPageLayout(string $value)
- * @method string getCustomLayoutUpdateXml()
- * @method \Magento\Cms\Model\Page setCustomLayoutUpdateXml(string $value)
- * @method string getCustomThemeFrom()
- * @method \Magento\Cms\Model\Page setCustomThemeFrom(string $value)
- * @method string getCustomThemeTo()
- * @method \Magento\Cms\Model\Page setCustomThemeTo(string $value)
  * @method int[] getStores()
  */
-class Page extends \Magento\Framework\Model\AbstractModel implements IdentityInterface
+class Page extends \Magento\Framework\Model\AbstractModel implements PageInterface, IdentityInterface
 {
     /**
      * No route page id
@@ -60,14 +29,6 @@ class Page extends \Magento\Framework\Model\AbstractModel implements IdentityInt
     const STATUS_DISABLED = 0;
     /**#@-*/
 
-    /**#@+
-     * Data object constants
-     */
-    const PAGE_ID = 'page_id';
-    const IDENTIFIER = 'identifier';
-    const TITLE = 'title';
-    /**#@-*/
-
     /**
      * CMS page cache tag
      */
@@ -95,30 +56,6 @@ class Page extends \Magento\Framework\Model\AbstractModel implements IdentityInt
         $this->_init('Magento\Cms\Model\Resource\Page');
     }
 
-    /**
-     * @return int
-     */
-    public function getId()
-    {
-        return $this->_getData(self::PAGE_ID);
-    }
-
-    /**
-     * @return string
-     */
-    public function getIdentifier()
-    {
-        return (string) $this->_getData(self::IDENTIFIER);
-    }
-
-    /**
-     * @return string
-     */
-    public function getTitle()
-    {
-        return $this->_getData(self::TITLE);
-    }
-
     /**
      * Load object data
      *
@@ -177,4 +114,382 @@ class Page extends \Magento\Framework\Model\AbstractModel implements IdentityInt
     {
         return [self::CACHE_TAG . '_' . $this->getId()];
     }
+
+    /**
+     * Get ID
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return parent::getData(self::PAGE_ID);
+    }
+
+    /**
+     * Get identifier
+     *
+     * @return string
+     */
+    public function getIdentifier()
+    {
+        return $this->getData(self::IDENTIFIER);
+    }
+
+    /**
+     * Get title
+     *
+     * @return string
+     */
+    public function getTitle()
+    {
+        return $this->getData(self::TITLE);
+    }
+
+    /**
+     * Get page layout
+     *
+     * @return string
+     */
+    public function getPageLayout()
+    {
+        return $this->getData(self::PAGE_LAYOUT);
+    }
+
+    /**
+     * Get meta keywords
+     *
+     * @return string
+     */
+    public function getMetaKeywords()
+    {
+        return $this->getData(self::META_KEYWORDS);
+    }
+
+    /**
+     * Get meta description
+     *
+     * @return string
+     */
+    public function getMetaDescription()
+    {
+        return $this->getData(self::META_DESCRIPTION);
+    }
+
+    /**
+     * Get content heading
+     *
+     * @return string
+     */
+    public function getContentHeading()
+    {
+        return $this->getData(self::CONTENT_HEADING);
+    }
+
+    /**
+     * Get content
+     *
+     * @return string
+     */
+    public function getContent()
+    {
+        return $this->getData(self::CONTENT);
+    }
+
+    /**
+     * Get creation time
+     *
+     * @return string
+     */
+    public function getCreationTime()
+    {
+        return $this->getData(self::CREATION_TIME);
+    }
+
+    /**
+     * Get update time
+     *
+     * @return string
+     */
+    public function getUpdateTime()
+    {
+        return $this->getData(self::UPDATE_TIME);
+    }
+
+    /**
+     * Get sort order
+     *
+     * @return string
+     */
+    public function getSortOrder()
+    {
+        return $this->getData(self::SORT_ORDER);
+    }
+
+    /**
+     * Get layout update xml
+     *
+     * @return string
+     */
+    public function getLayoutUpdateXml()
+    {
+        return $this->getData(self::LAYOUT_UPDATE_XML);
+    }
+
+    /**
+     * Get custom theme
+     *
+     * @return string
+     */
+    public function getCustomTheme()
+    {
+        return $this->getData(self::CUSTOM_THEME);
+    }
+
+    /**
+     * Get custom root template
+     *
+     * @return string
+     */
+    public function getCustomRootTemplate()
+    {
+        return $this->getData(self::CUSTOM_ROOT_TEMPLATE);
+    }
+
+    /**
+     * Get custom layout update xml
+     *
+     * @return string
+     */
+    public function getCustomLayoutUpdateXml()
+    {
+        return $this->getData(self::CUSTOM_LAYOUT_UPDATE_XML);
+    }
+
+    /**
+     * Get custom theme from
+     *
+     * @return string
+     */
+    public function getCustomThemeFrom()
+    {
+        return $this->getData(self::CUSTOM_THEME_FROM);
+    }
+
+    /**
+     * Get custom theme to
+     *
+     * @return string
+     */
+    public function getCustomThemeTo()
+    {
+        return $this->getData(self::CUSTOM_THEME_TO);
+    }
+
+    /**
+     * Is active
+     *
+     * @return bool
+     */
+    public function isActive()
+    {
+        return (bool)$this->getData(self::IS_ACTIVE);
+    }
+
+    /**
+     * Set ID
+     *
+     * @param int $id
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setId($id)
+    {
+        return $this->setData(self::PAGE_ID, $id);
+    }
+
+    /**
+     * Set identifier
+     *
+     * @param string $identifier
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setIdentifier($identifier)
+    {
+        return $this->setData(self::IDENTIFIER, $identifier);
+    }
+
+    /**
+     * Set title
+     *
+     * @param string $title
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setTitle($title)
+    {
+        return $this->setData(self::TITLE, $title);
+    }
+
+    /**
+     * Set page layout
+     *
+     * @param string $pageLayout
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setPageLayout($pageLayout)
+    {
+        return $this->setData(self::PAGE_LAYOUT, $pageLayout);
+    }
+
+    /**
+     * Set meta keywords
+     *
+     * @param string $metaKeywords
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setMetaKeywords($metaKeywords)
+    {
+        return $this->setData(self::META_KEYWORDS, $metaKeywords);
+    }
+
+    /**
+     * Set meta description
+     *
+     * @param string $metaDescription
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setMetaDescription($metaDescription)
+    {
+        return $this->setData(self::META_DESCRIPTION, $metaDescription);
+    }
+
+    /**
+     * Set content heading
+     *
+     * @param string $contentHeading
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setContentHeading($contentHeading)
+    {
+        return $this->setData(self::CONTENT_HEADING, $contentHeading);
+    }
+
+    /**
+     * Set content
+     *
+     * @param string $content
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setContent($content)
+    {
+        return $this->setData(self::CONTENT, $content);
+    }
+
+    /**
+     * Set creation time
+     *
+     * @param string $creationTime
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCreationTime($creationTime)
+    {
+        return $this->setData(self::CREATION_TIME, $creationTime);
+    }
+
+    /**
+     * Set update time
+     *
+     * @param string $updateTime
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setUpdateTime($updateTime)
+    {
+        return $this->setData(self::UPDATE_TIME, $updateTime);
+    }
+
+    /**
+     * Set sort order
+     *
+     * @param string $sortOrder
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setSortOrder($sortOrder)
+    {
+        return $this->setData(self::SORT_ORDER, $sortOrder);
+    }
+
+    /**
+     * Set layout update xml
+     *
+     * @param string $layoutUpdateXml
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setLayoutUpdateXml($layoutUpdateXml)
+    {
+        return $this->setData(self::LAYOUT_UPDATE_XML, $layoutUpdateXml);
+    }
+
+    /**
+     * Set custom theme
+     *
+     * @param string $customTheme
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomTheme($customTheme)
+    {
+        return $this->setData(self::CUSTOM_THEME, $customTheme);
+    }
+
+    /**
+     * Set custom root template
+     *
+     * @param string $customRootTemplate
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomRootTemplate($customRootTemplate)
+    {
+        return $this->setData(self::CUSTOM_ROOT_TEMPLATE, $customRootTemplate);
+    }
+
+    /**
+     * Set custom layout update xml
+     *
+     * @param string $customLayoutUpdateXml
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomLayoutUpdateXml($customLayoutUpdateXml)
+    {
+        return $this->setData(self::CUSTOM_LAYOUT_UPDATE_XML, $customLayoutUpdateXml);
+    }
+
+    /**
+     * Set custom theme from
+     *
+     * @param string $customThemeFrom
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomThemeFrom($customThemeFrom)
+    {
+        return $this->setData(self::CUSTOM_THEME_FROM, $customThemeFrom);
+    }
+
+    /**
+     * Set custom theme to
+     *
+     * @param string $customThemeTo
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setCustomThemeTo($customThemeTo)
+    {
+        return $this->setData(self::CUSTOM_THEME_TO, $customThemeTo);
+    }
+
+    /**
+     * Set is active
+     *
+     * @param int|bool $isActive
+     * @return \Magento\Cms\Api\Data\PageInterface
+     */
+    public function setIsActive($isActive)
+    {
+        return $this->setData(self::IS_ACTIVE, $isActive);
+    }
 }
diff --git a/app/code/Magento/Cms/Model/PageCriteriaInterface.php b/app/code/Magento/Cms/Model/PageCriteriaInterface.php
deleted file mode 100644
index 692fb97988f222d119b02fcf536bc01b656b3e21..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/PageCriteriaInterface.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model;
-
-/**
- * Interface PageCriteriaInterface
- */
-interface PageCriteriaInterface extends \Magento\Framework\Api\CriteriaInterface
-{
-    /**
-     * Set first store flag
-     *
-     * @param bool $flag
-     * @return void
-     */
-    public function setFirstStoreFlag($flag = false);
-
-    /**
-     * Add filter by store
-     *
-     * @param int|\Magento\Store\Model\Store $store
-     * @param bool $withAdmin
-     * @return void
-     */
-    public function addStoreFilter($store, $withAdmin = true);
-}
diff --git a/app/code/Magento/Cms/Model/PageRepository.php b/app/code/Magento/Cms/Model/PageRepository.php
index 67815ec24adb01de14531640a2cdbeec49f2a471..82fbba3748d12cdb9dd26ec4dd0d62c9f6c50455 100644
--- a/app/code/Magento/Cms/Model/PageRepository.php
+++ b/app/code/Magento/Cms/Model/PageRepository.php
@@ -5,69 +5,82 @@
  */
 namespace Magento\Cms\Model;
 
+use Magento\Cms\Api\Data;
+use Magento\Cms\Api\PageRepositoryInterface;
+use Magento\Framework\Api\DataObjectHelper;
+use Magento\Framework\Api\SearchCriteriaInterface;
 use Magento\Framework\Exception\CouldNotDeleteException;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\NoSuchEntityException;
 
 /**
  * Class PageRepository
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
-class PageRepository
+class PageRepository implements PageRepositoryInterface
 {
     /**
-     * @var \Magento\Cms\Model\Resource\Page
+     * @var Resource\Page
      */
     protected $resource;
 
     /**
-     * @var \Magento\Cms\Model\PageFactory
+     * @var PageFactory
      */
     protected $pageFactory;
 
     /**
-     * @var \Magento\Cms\Model\Resource\Page\CollectionFactory
+     * @var Resource\Page\CollectionFactory
      */
     protected $pageCollectionFactory;
 
     /**
-     * @var \Magento\Framework\DB\QueryBuilderFactory
+     * @var Data\PageSearchResultsInterfaceFactory
      */
-    protected $queryBuilderFactory;
+    protected $searchResultsFactory;
 
     /**
-     * @var \Magento\Framework\DB\MapperFactory
+     * @var DataObjectHelper
      */
-    protected $mapperFactory;
+    protected $dataObjectHelper;
+
+    /**
+     * @var Data\PageInterfaceFactory
+     */
+    protected $dataPageFactory;
 
     /**
      * @param Resource\Page $resource
-     * @param \Magento\Cms\Model\PageFactory $pageFactory
-     * @param \Magento\Cms\Model\Resource\Page\CollectionFactory $pageCollectionFactory
-     * @param \Magento\Framework\DB\QueryBuilderFactory $queryBuilderFactory
-     * @param \Magento\Framework\DB\MapperFactory $mapperFactory
+     * @param PageFactory $pageFactory
+     * @param Data\PageInterfaceFactory $dataPageFactory
+     * @param Resource\Page\CollectionFactory $pageCollectionFactory
+     * @param Data\PageSearchResultsInterfaceFactory $searchResultsFactory
+     * @param DataObjectHelper $dataObjectHelper
      */
     public function __construct(
-        \Magento\Cms\Model\Resource\Page $resource,
-        \Magento\Cms\Model\PageFactory $pageFactory,
-        \Magento\Cms\Model\Resource\Page\CollectionFactory $pageCollectionFactory,
-        \Magento\Framework\DB\QueryBuilderFactory $queryBuilderFactory,
-        \Magento\Framework\DB\MapperFactory $mapperFactory
+        Resource\Page $resource,
+        PageFactory $pageFactory,
+        Data\PageInterfaceFactory $dataPageFactory,
+        Resource\Page\CollectionFactory $pageCollectionFactory,
+        Data\PageSearchResultsInterfaceFactory $searchResultsFactory,
+        DataObjectHelper $dataObjectHelper
     ) {
         $this->resource = $resource;
         $this->pageFactory = $pageFactory;
         $this->pageCollectionFactory = $pageCollectionFactory;
-        $this->queryBuilderFactory = $queryBuilderFactory;
-        $this->mapperFactory = $mapperFactory;
+        $this->searchResultsFactory = $searchResultsFactory;
+        $this->dataObjectHelper = $dataObjectHelper;
+        $this->dataPageFactory = $dataPageFactory;
     }
 
     /**
      * Save Page data
      *
-     * @param \Magento\Cms\Model\Page $page
-     * @return \Magento\Cms\Model\Page
+     * @param Data\PageInterface $page
+     * @return Page
      * @throws CouldNotSaveException
      */
-    public function save(\Magento\Cms\Model\Page $page)
+    public function save(Data\PageInterface $page)
     {
         try {
             $this->resource->save($page);
@@ -81,10 +94,10 @@ class PageRepository
      * Load Page data by given Page Identity
      *
      * @param string $pageId
-     * @return \Magento\Cms\Model\Page
+     * @return Page
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
-    public function get($pageId)
+    public function getById($pageId)
     {
         $page = $this->pageFactory->create();
         $this->resource->load($page, $pageId);
@@ -97,27 +110,65 @@ class PageRepository
     /**
      * Load Page data collection by given search criteria
      *
-     * @param \Magento\Cms\Model\PageCriteriaInterface $criteria
-     * @return \Magento\Cms\Model\Resource\Page\Collection
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     * @param SearchCriteriaInterface $criteria
+     * @return Resource\Page\Collection
      */
-    public function getList(\Magento\Cms\Model\PageCriteriaInterface $criteria)
+    public function getList(SearchCriteriaInterface $criteria)
     {
-        $queryBuilder = $this->queryBuilderFactory->create();
-        $queryBuilder->setCriteria($criteria);
-        $queryBuilder->setResource($this->resource);
-        $query = $queryBuilder->create();
-        $collection = $this->pageCollectionFactory->create(['query' => $query]);
-        return $collection;
+        $searchResults = $this->searchResultsFactory->create();
+        $searchResults->setSearchCriteria($criteria);
+
+        $collection = $this->pageCollectionFactory->create();
+        foreach ($criteria->getFilterGroups() as $filterGroup) {
+            $fields = [];
+            $conditions = [];
+            foreach ($filterGroup->getFilters() as $filter) {
+                if ($filter->getField() === 'store_id') {
+                    $collection->addStoreFilter($filter->getValue(), false);
+                    continue;
+                }
+                $condition = $filter->getConditionType() ?: 'eq';
+                $fields[] = ['attribute' => $filter->getField(), $condition => $filter->getValue()];
+            }
+            if ($fields) {
+                $collection->addFieldToFilter($fields, $conditions);
+            }
+        }
+        $searchResults->setTotalCount($collection->getSize());
+        $sortOrders = $criteria->getSortOrders();
+        if ($sortOrders) {
+            foreach ($sortOrders as $sortOrder) {
+                $collection->addOrder(
+                    $sortOrder->getField(),
+                    ($sortOrder->getDirection() == SearchCriteriaInterface::SORT_ASC) ? 'ASC' : 'DESC'
+                );
+            }
+        }
+        $collection->setCurPage($criteria->getCurrentPage());
+        $collection->setPageSize($criteria->getPageSize());
+        $pages = [];
+        /** @var Page $pageModel */
+        foreach ($collection as $pageModel) {
+            $pages[] = $this->dataObjectHelper->populateWithArray(
+                $this->dataPageFactory->create(),
+                $pageModel->getData(),
+                'Magento\Cms\Api\Data\PageInterface'
+            );
+        }
+        $searchResults->setItems($pages);
+        return $searchResults;
     }
 
     /**
      * Delete Page
      *
-     * @param \Magento\Cms\Model\Page $page
+     * @param Data\PageInterface $page
      * @return bool
-     * @throws \Magento\Framework\Exception\CouldNotDeleteException
+     * @throws CouldNotDeleteException
      */
-    public function delete(\Magento\Cms\Model\Page $page)
+    public function delete(Data\PageInterface $page)
     {
         try {
             $this->resource->delete($page);
@@ -132,11 +183,11 @@ class PageRepository
      *
      * @param string $pageId
      * @return bool
-     * @throws \Magento\Framework\Exception\CouldNotDeleteException
-     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws CouldNotDeleteException
+     * @throws NoSuchEntityException
      */
     public function deleteById($pageId)
     {
-        return $this->delete($this->get($pageId));
+        return $this->delete($this->getById($pageId));
     }
 }
diff --git a/app/code/Magento/Cms/Model/Resource/Block/Collection.php b/app/code/Magento/Cms/Model/Resource/Block/Collection.php
index b6e0b2db406ee0cfd33a7fffe3b5494c21f4d508..3898607f31ed81b2ebe958e33eb56eeb243660df 100644
--- a/app/code/Magento/Cms/Model/Resource/Block/Collection.php
+++ b/app/code/Magento/Cms/Model/Resource/Block/Collection.php
@@ -1,27 +1,117 @@
 <?php
 /**
+ * Cms block grid collection
+ *
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Cms\Model\Resource\Block;
 
-use Magento\Cms\Model\Resource\AbstractCollection;
-
 /**
- * CMS block collection
- *
  * Class Collection
  */
-class Collection extends AbstractCollection
+class Collection extends \Magento\Framework\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
+     * @return \Magento\Cms\Model\Resource\Block\Collection
+     */
+    protected function _afterLoad()
+    {
+        $this->walk('afterLoad');
+        parent::_afterLoad();
+    }
+
+    /**
+     * @param string|array $field
+     * @param string|int|array|null $condition
+     * @return \Magento\Cms\Model\Resource\Block\Collection
+     */
+    public function addFieldToFilter($field, $condition = null)
+    {
+        if ($field == 'store_id') {
+            return $this->addStoreFilter($condition, false);
+        }
+        return parent::addFieldToFilter($field, $condition);
+    }
+
+    /**
+     * Define resource model
+     *
+     * @return void
+     */
+    protected function _construct()
+    {
+        $this->_init('Magento\Cms\Model\Block', 'Magento\Cms\Model\Resource\Block');
+        $this->_map['fields']['store'] = 'store_table.store_id';
+    }
+
+    /**
+     * Returns pairs block_id - title
+     *
+     * @return array
+     */
+    public function toOptionArray()
+    {
+        return $this->_toOptionArray('block_id', 'title');
+    }
+
+    /**
+     * Add filter by store
+     *
+     * @param int|\Magento\Store\Model\Store $store
+     * @param bool $withAdmin
+     * @return $this
+     */
+    public function addStoreFilter($store, $withAdmin = true)
+    {
+        if ($store instanceof \Magento\Store\Model\Store) {
+            $store = [$store->getId()];
+        }
+
+        if (!is_array($store)) {
+            $store = [$store];
+        }
+
+        if ($withAdmin) {
+            $store[] = \Magento\Store\Model\Store::DEFAULT_STORE_ID;
+        }
+
+        $this->addFilter('store', ['in' => $store], 'public');
+
+        return $this;
+    }
+
+    /**
+     * Get SQL for get record count.
+     * Extra GROUP BY strip added.
+     *
+     * @return \Magento\Framework\DB\Select
+     */
+    public function getSelectCountSql()
+    {
+        $countSelect = parent::getSelectCountSql();
+
+        $countSelect->reset(\Zend_Db_Select::GROUP);
+
+        return $countSelect;
+    }
+
+    /**
+     * Join store relation table if there is store filter
+     *
      * @return void
      */
-    protected function init()
+    protected function _renderFiltersBefore()
     {
-        $this->setDataInterfaceName('Magento\Cms\Model\Block');
-        $this->storeTableName = 'cms_block_store';
-        $this->linkFieldName = 'block_id';
-        parent::init();
+        if ($this->getFilter('store')) {
+            $this->getSelect()->join(
+                ['store_table' => $this->getTable('cms_block_store')],
+                'main_table.block_id = store_table.block_id',
+                []
+            )->group(
+                'main_table.block_id'
+            );
+        }
+        parent::_renderFiltersBefore();
     }
 }
diff --git a/app/code/Magento/Cms/Model/Resource/Block/Grid/Collection.php b/app/code/Magento/Cms/Model/Resource/Block/Grid/Collection.php
deleted file mode 100644
index 50b5433e4fc9dc0a2b83e4cbd93ce89b3ab450e7..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/Resource/Block/Grid/Collection.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-/**
- * Cms block grid collection
- *
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\Resource\Block\Grid;
-
-/**
- * Class Collection
- */
-class Collection extends \Magento\Framework\Model\Resource\Db\Collection\AbstractCollection
-{
-    /**
-     * @return \Magento\Cms\Model\Resource\Block\Grid\Collection
-     */
-    protected function _afterLoad()
-    {
-        $this->walk('afterLoad');
-        parent::_afterLoad();
-    }
-
-    /**
-     * @param string|array $field
-     * @param string|int|array|null $condition
-     * @return \Magento\Cms\Model\Resource\Block\Grid\Collection
-     */
-    public function addFieldToFilter($field, $condition = null)
-    {
-        if ($field == 'store_id') {
-            return $this->addStoreFilter($condition, false);
-        }
-        return parent::addFieldToFilter($field, $condition);
-    }
-
-    /**
-     * Define resource model
-     *
-     * @return void
-     */
-    protected function _construct()
-    {
-        $this->_init('Magento\Cms\Model\Block', 'Magento\Cms\Model\Resource\Block');
-        $this->_map['fields']['store'] = 'store_table.store_id';
-    }
-
-    /**
-     * Returns pairs block_id - title
-     *
-     * @return array
-     */
-    public function toOptionArray()
-    {
-        return $this->_toOptionArray('block_id', 'title');
-    }
-
-    /**
-     * Add filter by store
-     *
-     * @param int|\Magento\Store\Model\Store $store
-     * @param bool $withAdmin
-     * @return $this
-     */
-    public function addStoreFilter($store, $withAdmin = true)
-    {
-        if ($store instanceof \Magento\Store\Model\Store) {
-            $store = [$store->getId()];
-        }
-
-        if (!is_array($store)) {
-            $store = [$store];
-        }
-
-        if ($withAdmin) {
-            $store[] = \Magento\Store\Model\Store::DEFAULT_STORE_ID;
-        }
-
-        $this->addFilter('store', ['in' => $store], 'public');
-
-        return $this;
-    }
-
-    /**
-     * Get SQL for get record count.
-     * Extra GROUP BY strip added.
-     *
-     * @return \Magento\Framework\DB\Select
-     */
-    public function getSelectCountSql()
-    {
-        $countSelect = parent::getSelectCountSql();
-
-        $countSelect->reset(\Zend_Db_Select::GROUP);
-
-        return $countSelect;
-    }
-
-    /**
-     * Join store relation table if there is store filter
-     *
-     * @return void
-     */
-    protected function _renderFiltersBefore()
-    {
-        if ($this->getFilter('store')) {
-            $this->getSelect()->join(
-                ['store_table' => $this->getTable('cms_block_store')],
-                'main_table.block_id = store_table.block_id',
-                []
-            )->group(
-                'main_table.block_id'
-            );
-        }
-        parent::_renderFiltersBefore();
-    }
-}
diff --git a/app/code/Magento/Cms/Model/Resource/BlockCriteria.php b/app/code/Magento/Cms/Model/Resource/BlockCriteria.php
deleted file mode 100644
index e10c0c0c15d612b6b15e20e6ddc7a194e3b9bbfa..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/Resource/BlockCriteria.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\Resource;
-
-use Magento\Cms\Model\BlockCriteriaInterface;
-
-/**
- * Class BlockCriteria
- */
-class BlockCriteria extends CmsAbstractCriteria implements BlockCriteriaInterface
-{
-    /**
-     * @param string $mapper
-     */
-    public function __construct($mapper = '')
-    {
-        $this->mapperInterfaceName = $mapper ?: 'Magento\Cms\Model\Resource\BlockCriteriaMapper';
-    }
-}
diff --git a/app/code/Magento/Cms/Model/Resource/BlockCriteriaMapper.php b/app/code/Magento/Cms/Model/Resource/BlockCriteriaMapper.php
deleted file mode 100644
index cfa339ad26232172404adb67094aa1ba90010b58..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/Resource/BlockCriteriaMapper.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\Resource;
-
-/**
- * Class BlockCriteriaMapper
- */
-class BlockCriteriaMapper extends CmsCriteriaMapper
-{
-    /**
-     * @inheritdoc
-     */
-    protected function init()
-    {
-        $this->storeTableName = 'cms_block_store';
-        $this->linkFieldName = 'block_id';
-        $this->initResource('Magento\Cms\Model\Resource\Block');
-        parent::init();
-    }
-}
diff --git a/app/code/Magento/Cms/Model/Resource/CmsAbstractCriteria.php b/app/code/Magento/Cms/Model/Resource/CmsAbstractCriteria.php
deleted file mode 100644
index 88068299f8b9b9b68db949d2de672268827f35b6..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/Resource/CmsAbstractCriteria.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\Resource;
-
-use Magento\Framework\Data\AbstractCriteria;
-
-/**
- * Class CmsAbstractCriteria
- */
-class CmsAbstractCriteria extends AbstractCriteria
-{
-    /**
-     * @inheritdoc
-     */
-    public function setFirstStoreFlag($flag = false)
-    {
-        $this->data['first_store_flag'] = $flag;
-    }
-
-    /**
-     * @inheritdoc
-     */
-    public function addStoreFilter($store, $withAdmin = true)
-    {
-        $this->data['store_filter'] = [$store, $withAdmin];
-    }
-}
diff --git a/app/code/Magento/Cms/Model/Resource/CmsCriteriaMapper.php b/app/code/Magento/Cms/Model/Resource/CmsCriteriaMapper.php
deleted file mode 100644
index ffac24c942d62253aed5c41b61564ef26d0fdc3e..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/Resource/CmsCriteriaMapper.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\Resource;
-
-use Magento\Framework\DB\GenericMapper;
-
-/**
- * Class CmsCriteriaMapper
- */
-class CmsCriteriaMapper extends GenericMapper
-{
-    /**
-     * Table which links CMS entity to stores
-     *
-     * @var string
-     */
-    protected $storeTableName;
-
-    /**
-     * @var string
-     */
-    protected $linkFieldName;
-
-    /**
-     * @inheritdoc
-     */
-    protected function init()
-    {
-        $this->map['fields']['store'] = 'store_table.store_id';
-        $this->map['fields']['store_id'] = 'store_table.store_id';
-    }
-
-    /**
-     * Set first store flag
-     *
-     * @param bool $flag
-     * @return void
-     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
-     */
-    public function mapFirstStoreFlag($flag)
-    {
-        // do nothing since handled in collection afterLoad
-    }
-
-    /**
-     * Add filter by store
-     *
-     * @param int|\Magento\Store\Model\Store $store
-     * @param bool $withAdmin
-     * @return void
-     */
-    public function mapStoreFilter($store, $withAdmin)
-    {
-        $this->getSelect()->join(
-            ['store_table' => $this->getTable($this->storeTableName)],
-            "main_table.{$this->linkFieldName} = store_table.{$this->linkFieldName}",
-            []
-        )->group("main_table.{$this->linkFieldName}");
-        if (!is_array($store)) {
-            if ($store instanceof \Magento\Store\Model\Store) {
-                $store = [$store->getId()];
-            } else {
-                $store = [$store];
-            }
-        }
-        if ($withAdmin) {
-            $store[] = \Magento\Store\Model\Store::DEFAULT_STORE_ID;
-        }
-        $field = $this->getMappedField('store');
-        $this->select->where(
-            $this->getConditionSql($field, ['in' => $store]),
-            null,
-            \Magento\Framework\DB\Select::TYPE_CONDITION
-        );
-    }
-}
diff --git a/app/code/Magento/Cms/Model/Resource/Page/Collection.php b/app/code/Magento/Cms/Model/Resource/Page/Collection.php
index 69dc4cfd7558d53b761aa54b03781bac30a3a666..2b8943acb57a50f1e1dba0c87c6f44649d71ebca 100644
--- a/app/code/Magento/Cms/Model/Resource/Page/Collection.php
+++ b/app/code/Magento/Cms/Model/Resource/Page/Collection.php
@@ -5,131 +5,212 @@
  */
 namespace Magento\Cms\Model\Resource\Page;
 
-use Magento\Framework\Data\AbstractSearchResult;
-use Magento\Framework\Data\Collection\EntityFactoryInterface;
-use Magento\Framework\Data\SearchResultIteratorFactory;
-use Magento\Framework\DB\QueryInterface;
-use Magento\Framework\Event\ManagerInterface;
-use Magento\Store\Model\StoreManagerInterface;
-use Magento\Framework\Data\SearchResultProcessorFactory;
-use Magento\Framework\Data\SearchResultProcessor;
-
 /**
  * CMS page collection
+ *
+ * Class Collection
  */
-class Collection extends AbstractSearchResult
+class Collection extends \Magento\Framework\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
-     * @var StoreManagerInterface
+     * Load data for preview flag
+     *
+     * @var bool
      */
-    protected $storeManager;
+    protected $_previewFlag;
 
     /**
-     * @var SearchResultProcessor
+     * Store manager
+     *
+     * @var \Magento\Store\Model\StoreManagerInterface
      */
-    protected $searchResultProcessor;
+    protected $_storeManager;
 
     /**
-     * @param QueryInterface $query
-     * @param EntityFactoryInterface $entityFactory
-     * @param ManagerInterface $eventManager
-     * @param SearchResultIteratorFactory $resultIteratorFactory
+     * @param \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory
+     * @param \Psr\Log\LoggerInterface $logger
+     * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
+     * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param SearchResultProcessorFactory $searchResultProcessorFactory
+     * @param mixed $connection
+     * @param \Magento\Framework\Model\Resource\Db\AbstractDb $resource
      */
     public function __construct(
-        QueryInterface $query,
-        EntityFactoryInterface $entityFactory,
-        ManagerInterface $eventManager,
-        SearchResultIteratorFactory $resultIteratorFactory,
-        StoreManagerInterface $storeManager,
-        SearchResultProcessorFactory $searchResultProcessorFactory
+        \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
+        \Psr\Log\LoggerInterface $logger,
+        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
+        \Magento\Framework\Event\ManagerInterface $eventManager,
+        \Magento\Store\Model\StoreManagerInterface $storeManager,
+        $connection = null,
+        \Magento\Framework\Model\Resource\Db\AbstractDb $resource = null
     ) {
-        $this->storeManager = $storeManager;
-        $this->searchResultProcessor = $searchResultProcessorFactory->create($this);
-        parent::__construct($query, $entityFactory, $eventManager, $resultIteratorFactory);
+        parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
+        $this->_storeManager = $storeManager;
     }
 
     /**
+     * Define resource model
+     *
      * @return void
      */
-    protected function init()
+    protected function _construct()
     {
-        $this->setDataInterfaceName('Magento\Cms\Model\Page');
-        $this->query->addCountSqlSkipPart(\Zend_Db_Select::GROUP, true);
-        $this->storeTableName = 'cms_page_store';
-        $this->linkFieldName = 'page_id';
+        $this->_init('Magento\Cms\Model\Page', 'Magento\Cms\Model\Resource\Page');
+        $this->_map['fields']['page_id'] = 'main_table.page_id';
+        $this->_map['fields']['store'] = 'store_table.store_id';
     }
 
     /**
+     * Returns pairs identifier - title for unique identifiers
+     * and pairs identifier|page_id - title for non-unique after first
+     *
      * @return array
      */
     public function toOptionIdArray()
     {
         $res = [];
         $existingIdentifiers = [];
-        foreach ($this->getItems() as $item) {
-            /** @var PageInterface $item */
-            $identifier = $item->getIdentifier();
+        foreach ($this as $item) {
+            $identifier = $item->getData('identifier');
 
             $data['value'] = $identifier;
-            $data['label'] = $item->getTitle();
+            $data['label'] = $item->getData('title');
 
             if (in_array($identifier, $existingIdentifiers)) {
-                $data['value'] .= '|' . $item->getPageId();
+                $data['value'] .= '|' . $item->getData('page_id');
             } else {
                 $existingIdentifiers[] = $identifier;
             }
+
             $res[] = $data;
         }
+
         return $res;
     }
 
     /**
-     * @deprecated
-     * @return void
+     * Set first store flag
+     *
+     * @param bool $flag
+     * @return $this
+     */
+    public function setFirstStoreFlag($flag = false)
+    {
+        $this->_previewFlag = $flag;
+        return $this;
+    }
+
+    /**
+     * Add field filter to collection
+     *
+     * @param string|array $field
+     * @param string|int|array|null $condition
+     * @return \Magento\Cms\Model\Resource\Block\Collection
+     */
+    public function addFieldToFilter($field, $condition = null)
+    {
+        if ($field === 'store_id') {
+            return $this->addStoreFilter($condition, false);
+        }
+
+        return parent::addFieldToFilter($field, $condition);
+    }
+
+    /**
+     * Add filter by store
+     *
+     * @param int|\Magento\Store\Model\Store $store
+     * @param bool $withAdmin
+     * @return $this
      */
-    public function addStoreFilter()
+    public function addStoreFilter($store, $withAdmin = true)
     {
-        //
+        if (!$this->getFlag('store_filter_added')) {
+            if ($store instanceof \Magento\Store\Model\Store) {
+                $store = [$store->getId()];
+            }
+
+            if (!is_array($store)) {
+                $store = [$store];
+            }
+
+            if ($withAdmin) {
+                $store[] = \Magento\Store\Model\Store::DEFAULT_STORE_ID;
+            }
+
+            $this->addFilter('store', ['in' => $store], 'public');
+        }
+        return $this;
     }
 
     /**
      * Perform operations after collection load
      *
-     * @return void
+     * @return $this
      */
-    protected function afterLoad()
+    protected function _afterLoad()
     {
-        if ($this->getSearchCriteria()->getPart('first_store_flag')) {
-            $items = $this->searchResultProcessor->getColumnValues('page_id');
-
-            $connection = $this->getQuery()->getConnection();
-            $resource = $this->getQuery()->getResource();
-            if (count($items)) {
-                $select = $connection->select()->from(['cps' => $resource->getTable('cms_page_store')])
-                    ->where('cps.page_id IN (?)', $items);
-                if ($result = $connection->fetchPairs($select)) {
-                    foreach ($this->getItems() as $item) {
-                        /** @var PageInterface $item */
-                        if (!isset($result[$item->getPageId()])) {
-                            continue;
-                        }
-                        if ($result[$item->getPageId()] == 0) {
-                            $stores = $this->storeManager->getStores(false, true);
-                            $storeId = current($stores)->getId();
-                            $storeCode = key($stores);
-                        } else {
-                            $storeId = $result[$item->getPageId()];
-                            $storeCode = $this->storeManager->getStore($storeId)->getCode();
-                        }
-                        $item->setData('_first_store_id', $storeId);
-                        $item->setData('store_code', $storeCode);
-                        $item->setData('store_id', [$result[$item->getPageId()]]);
+        $items = $this->getColumnValues('page_id');
+        if (count($items)) {
+            $connection = $this->getConnection();
+            $select = $connection->select()->from(['cps' => $this->getTable('cms_page_store')])
+                ->where('cps.page_id IN (?)', $items);
+            $result = $connection->fetchPairs($select);
+            if ($result) {
+                foreach ($this as $item) {
+                    $pageId = $item->getData('page_id');
+                    if (!isset($result[$pageId])) {
+                        continue;
+                    }
+                    if ($result[$pageId] == 0) {
+                        $stores = $this->_storeManager->getStores(false, true);
+                        $storeId = current($stores)->getId();
+                        $storeCode = key($stores);
+                    } else {
+                        $storeId = $result[$item->getData('page_id')];
+                        $storeCode = $this->_storeManager->getStore($storeId)->getCode();
                     }
+                    $item->setData('_first_store_id', $storeId);
+                    $item->setData('store_code', $storeCode);
+                    $item->setData('store_id', [$result[$pageId]]);
                 }
             }
         }
-        parent::afterLoad();
+
+        $this->_previewFlag = false;
+        return parent::_afterLoad();
+    }
+
+    /**
+     * Join store relation table if there is store filter
+     *
+     * @return void
+     */
+    protected function _renderFiltersBefore()
+    {
+        if ($this->getFilter('store')) {
+            $this->getSelect()->join(
+                ['store_table' => $this->getTable('cms_page_store')],
+                'main_table.page_id = store_table.page_id',
+                []
+            )->group(
+                'main_table.page_id'
+            );
+        }
+        parent::_renderFiltersBefore();
+    }
+
+    /**
+     * Get SQL for get record count.
+     * Extra GROUP BY strip added.
+     *
+     * @return \Magento\Framework\DB\Select
+     */
+    public function getSelectCountSql()
+    {
+        $countSelect = parent::getSelectCountSql();
+        $countSelect->reset(\Zend_Db_Select::GROUP);
+
+        return $countSelect;
     }
 }
diff --git a/app/code/Magento/Cms/Model/Resource/Page/Grid/Collection.php b/app/code/Magento/Cms/Model/Resource/Page/Grid/Collection.php
deleted file mode 100644
index 41402e0ed343f197fa58b3f10d6bf55bf302fcdc..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/Resource/Page/Grid/Collection.php
+++ /dev/null
@@ -1,216 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\Resource\Page\Grid;
-
-/**
- * CMS page collection
- *
- * Class Collection
- */
-class Collection extends \Magento\Framework\Model\Resource\Db\Collection\AbstractCollection
-{
-    /**
-     * Load data for preview flag
-     *
-     * @var bool
-     */
-    protected $_previewFlag;
-
-    /**
-     * Store manager
-     *
-     * @var \Magento\Store\Model\StoreManagerInterface
-     */
-    protected $_storeManager;
-
-    /**
-     * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
-     * @param \Psr\Log\LoggerInterface $logger
-     * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
-     * @param \Magento\Framework\Event\ManagerInterface $eventManager
-     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param mixed $connection
-     * @param \Magento\Framework\Model\Resource\Db\AbstractDb $resource
-     */
-    public function __construct(
-        \Magento\Framework\Data\Collection\EntityFactory $entityFactory,
-        \Psr\Log\LoggerInterface $logger,
-        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
-        \Magento\Framework\Event\ManagerInterface $eventManager,
-        \Magento\Store\Model\StoreManagerInterface $storeManager,
-        $connection = null,
-        \Magento\Framework\Model\Resource\Db\AbstractDb $resource = null
-    ) {
-        parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
-        $this->_storeManager = $storeManager;
-    }
-
-    /**
-     * Define resource model
-     *
-     * @return void
-     */
-    protected function _construct()
-    {
-        $this->_init('Magento\Cms\Model\Page', 'Magento\Cms\Model\Resource\Page');
-        $this->_map['fields']['page_id'] = 'main_table.page_id';
-        $this->_map['fields']['store'] = 'store_table.store_id';
-    }
-
-    /**
-     * Returns pairs identifier - title for unique identifiers
-     * and pairs identifier|page_id - title for non-unique after first
-     *
-     * @return array
-     */
-    public function toOptionIdArray()
-    {
-        $res = [];
-        $existingIdentifiers = [];
-        foreach ($this as $item) {
-            $identifier = $item->getData('identifier');
-
-            $data['value'] = $identifier;
-            $data['label'] = $item->getData('title');
-
-            if (in_array($identifier, $existingIdentifiers)) {
-                $data['value'] .= '|' . $item->getData('page_id');
-            } else {
-                $existingIdentifiers[] = $identifier;
-            }
-
-            $res[] = $data;
-        }
-
-        return $res;
-    }
-
-    /**
-     * Set first store flag
-     *
-     * @param bool $flag
-     * @return $this
-     */
-    public function setFirstStoreFlag($flag = false)
-    {
-        $this->_previewFlag = $flag;
-        return $this;
-    }
-
-    /**
-     * Add field filter to collection
-     *
-     * @param string|array $field
-     * @param string|int|array|null $condition
-     * @return \Magento\Cms\Model\Resource\Block\Grid\Collection
-     */
-    public function addFieldToFilter($field, $condition = null)
-    {
-        if ($field === 'store_id') {
-            return $this->addStoreFilter($condition, false);
-        }
-
-        return parent::addFieldToFilter($field, $condition);
-    }
-
-    /**
-     * Add filter by store
-     *
-     * @param int|\Magento\Store\Model\Store $store
-     * @param bool $withAdmin
-     * @return $this
-     */
-    public function addStoreFilter($store, $withAdmin = true)
-    {
-        if (!$this->getFlag('store_filter_added')) {
-            if ($store instanceof \Magento\Store\Model\Store) {
-                $store = [$store->getId()];
-            }
-
-            if (!is_array($store)) {
-                $store = [$store];
-            }
-
-            if ($withAdmin) {
-                $store[] = \Magento\Store\Model\Store::DEFAULT_STORE_ID;
-            }
-
-            $this->addFilter('store', ['in' => $store], 'public');
-        }
-        return $this;
-    }
-
-    /**
-     * Perform operations after collection load
-     *
-     * @return $this
-     */
-    protected function _afterLoad()
-    {
-        $items = $this->getColumnValues('page_id');
-        if (count($items)) {
-            $connection = $this->getConnection();
-            $select = $connection->select()->from(['cps' => $this->getTable('cms_page_store')])
-                ->where('cps.page_id IN (?)', $items);
-            $result = $connection->fetchPairs($select);
-            if ($result) {
-                foreach ($this as $item) {
-                    $pageId = $item->getData('page_id');
-                    if (!isset($result[$pageId])) {
-                        continue;
-                    }
-                    if ($result[$pageId] == 0) {
-                        $stores = $this->_storeManager->getStores(false, true);
-                        $storeId = current($stores)->getId();
-                        $storeCode = key($stores);
-                    } else {
-                        $storeId = $result[$item->getData('page_id')];
-                        $storeCode = $this->_storeManager->getStore($storeId)->getCode();
-                    }
-                    $item->setData('_first_store_id', $storeId);
-                    $item->setData('store_code', $storeCode);
-                    $item->setData('store_id', [$result[$pageId]]);
-                }
-            }
-        }
-
-        $this->_previewFlag = false;
-        return parent::_afterLoad();
-    }
-
-    /**
-     * Join store relation table if there is store filter
-     *
-     * @return void
-     */
-    protected function _renderFiltersBefore()
-    {
-        if ($this->getFilter('store')) {
-            $this->getSelect()->join(
-                ['store_table' => $this->getTable('cms_page_store')],
-                'main_table.page_id = store_table.page_id',
-                []
-            )->group(
-                'main_table.page_id'
-            );
-        }
-        parent::_renderFiltersBefore();
-    }
-
-    /**
-     * Get SQL for get record count.
-     * Extra GROUP BY strip added.
-     *
-     * @return \Magento\Framework\DB\Select
-     */
-    public function getSelectCountSql()
-    {
-        $countSelect = parent::getSelectCountSql();
-        $countSelect->reset(\Zend_Db_Select::GROUP);
-
-        return $countSelect;
-    }
-}
diff --git a/app/code/Magento/Cms/Model/Resource/PageCriteria.php b/app/code/Magento/Cms/Model/Resource/PageCriteria.php
deleted file mode 100644
index 87cf04da8372198db34367c3f06424ac7b045efc..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/Resource/PageCriteria.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\Resource;
-
-use Magento\Cms\Model\PageCriteriaInterface;
-
-/**
- * Class PageCriteria
- */
-class PageCriteria extends CmsAbstractCriteria implements PageCriteriaInterface
-{
-    /**
-     * @param string $mapper
-     */
-    public function __construct($mapper = '')
-    {
-        $this->mapperInterfaceName = $mapper ?: 'Magento\Cms\Model\Resource\PageCriteriaMapper';
-    }
-
-    /**
-     * @inheritdoc
-     */
-    public function setFirstStoreFlag($flag = false)
-    {
-        $this->data['first_store_flag'] = $flag;
-        return true;
-    }
-
-    /**
-     * @inheritdoc
-     */
-    public function addStoreFilter($store, $withAdmin = true)
-    {
-        $this->data['store_filter'] = [$store, $withAdmin];
-        return true;
-    }
-
-    /**
-     * Add Criteria object
-     *
-     * @param \Magento\Cms\Model\Resource\PageCriteria $criteria
-     * @return bool
-     */
-    public function addCriteria(\Magento\Cms\Model\Resource\PageCriteria $criteria)
-    {
-        $this->data[self::PART_CRITERIA_LIST]['list'][] = $criteria;
-        return true;
-    }
-}
diff --git a/app/code/Magento/Cms/Model/Resource/PageCriteriaMapper.php b/app/code/Magento/Cms/Model/Resource/PageCriteriaMapper.php
deleted file mode 100644
index 2c1aa20b396eacf22c2fdc10224e1e97ccccd8a6..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Model/Resource/PageCriteriaMapper.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Model\Resource;
-
-/**
- * Class PageCriteriaMapper
- */
-class PageCriteriaMapper extends CmsCriteriaMapper
-{
-    /**
-     * @inheritdoc
-     */
-    protected function init()
-    {
-        $this->storeTableName = 'cms_page_store';
-        $this->linkFieldName = 'page_id';
-        $this->initResource('Magento\Cms\Model\Resource\Page');
-        parent::init();
-    }
-}
diff --git a/app/code/Magento/Cms/Test/Unit/Model/BlockRepositoryTest.php b/app/code/Magento/Cms/Test/Unit/Model/BlockRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e5c3c9dd155437c9ff54c4a7e3e3312096bfea88
--- /dev/null
+++ b/app/code/Magento/Cms/Test/Unit/Model/BlockRepositoryTest.php
@@ -0,0 +1,300 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Cms\Test\Unit\Model;
+
+use Magento\Cms\Model\BlockRepository;
+use Magento\Framework\Api\SearchCriteriaInterface;
+
+/**
+ * Test for Magento\Cms\Model\BlockRepository
+ */
+class BlockRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var BlockRepository
+     */
+    protected $repository;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\Resource\Block
+     */
+    protected $blockResource;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\Block
+     */
+    protected $block;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Api\Data\BlockInterface
+     */
+    protected $blockData;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Api\Data\BlockSearchResultsInterface
+     */
+    protected $blockSearchResult;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Api\DataObjectHelper
+     */
+    protected $dataHelper;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\Resource\Block\Collection
+     */
+    protected $collection;
+
+    /**
+     * Initialize repository
+     */
+    public function setUp()
+    {
+        $this->blockResource = $this->getMockBuilder('Magento\Cms\Model\Resource\Block')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $blockFactory = $this->getMockBuilder('Magento\Cms\Model\BlockFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $blockDataFactory = $this->getMockBuilder('Magento\Cms\Api\Data\BlockInterfaceFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $blockSearchResultFactory = $this->getMockBuilder('Magento\Cms\Api\Data\BlockSearchResultsInterfaceFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $collectionFactory = $this->getMockBuilder('Magento\Cms\Model\Resource\Block\CollectionFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+
+        $this->block = $this->getMockBuilder('Magento\Cms\Model\Block')->disableOriginalConstructor()->getMock();
+        $this->blockData = $this->getMockBuilder('Magento\Cms\Api\Data\BlockInterface')
+            ->getMock();
+        $this->blockSearchResult = $this->getMockBuilder('Magento\Cms\Api\Data\BlockSearchResultsInterface')
+            ->getMock();
+        $this->collection = $this->getMockBuilder('Magento\Cms\Model\Resource\Block\Collection')
+            ->disableOriginalConstructor()
+            ->setMethods(['addFieldToFilter', 'getSize', 'setCurPage', 'setPageSize', 'load', 'addOrder'])
+            ->getMock();
+
+        $blockFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->block);
+        $blockDataFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->blockData);
+        $blockSearchResultFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->blockSearchResult);
+        $collectionFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->collection);
+        /**
+         * @var \Magento\Cms\Model\BlockFactory $blockFactory
+         * @var \Magento\Cms\Api\Data\BlockInterfaceFactory $blockDataFactory
+         * @var \Magento\Cms\Api\Data\BlockSearchResultsInterfaceFactory $blockSearchResultFactory
+         * @var \Magento\Cms\Model\Resource\Block\CollectionFactory $collectionFactory
+         */
+
+        $this->dataHelper = $this->getMockBuilder('Magento\Framework\Api\DataObjectHelper')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->repository = new BlockRepository(
+            $this->blockResource,
+            $blockFactory,
+            $blockDataFactory,
+            $collectionFactory,
+            $blockSearchResultFactory,
+            $this->dataHelper
+        );
+    }
+
+    /**
+     * @test
+     */
+    public function testSave()
+    {
+        $this->blockResource->expects($this->once())
+            ->method('save')
+            ->with($this->block)
+            ->willReturnSelf();
+        $this->assertEquals($this->block, $this->repository->save($this->block));
+    }
+
+    /**
+     * @test
+     */
+    public function testDeleteById()
+    {
+        $blockId = '123';
+
+        $this->block->expects($this->once())
+            ->method('getId')
+            ->willReturn(true);
+        $this->blockResource->expects($this->once())
+            ->method('load')
+            ->with($this->block, $blockId)
+            ->willReturn($this->block);
+        $this->blockResource->expects($this->once())
+            ->method('delete')
+            ->with($this->block)
+            ->willReturnSelf();
+
+        $this->assertTrue($this->repository->deleteById($blockId));
+    }
+
+    /**
+     * @test
+     *
+     * @expectedException \Magento\Framework\Exception\CouldNotSaveException
+     */
+    public function testSaveException()
+    {
+        $this->blockResource->expects($this->once())
+            ->method('save')
+            ->with($this->block)
+            ->willThrowException(new \Exception());
+        $this->repository->save($this->block);
+    }
+
+    /**
+     * @test
+     *
+     * @expectedException \Magento\Framework\Exception\CouldNotDeleteException
+     */
+    public function testDeleteException()
+    {
+        $this->blockResource->expects($this->once())
+            ->method('delete')
+            ->with($this->block)
+            ->willThrowException(new \Exception());
+        $this->repository->delete($this->block);
+    }
+
+    /**
+     * @test
+     *
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function testGetByIdException()
+    {
+        $blockId = '123';
+
+        $this->block->expects($this->once())
+            ->method('getId')
+            ->willReturn(false);
+        $this->blockResource->expects($this->once())
+            ->method('load')
+            ->with($this->block, $blockId)
+            ->willReturn($this->block);
+        $this->repository->getById($blockId);
+    }
+
+    /**
+     * @test
+     */
+    public function testGetList()
+    {
+        $field = 'name';
+        $value = 'magento';
+        $condition = 'eq';
+        $total = 10;
+        $currentPage = 3;
+        $pageSize = 2;
+        $sortField = 'id';
+
+        $criteria = $this->getMockBuilder('Magento\Framework\Api\SearchCriteriaInterface')->getMock();
+        $filterGroup = $this->getMockBuilder('Magento\Framework\Api\Search\FilterGroup')->getMock();
+        $filter = $this->getMockBuilder('Magento\Framework\Api\Filter')->getMock();
+        $storeFilter = $this->getMockBuilder('Magento\Framework\Api\Filter')->getMock();
+        $sortOrder = $this->getMockBuilder('Magento\Framework\Api\SortOrder')->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(SearchCriteriaInterface::SORT_DESC);
+
+        /** @var \Magento\Framework\Api\SearchCriteriaInterface $criteria */
+
+        $this->collection->addItem($this->block);
+        $this->blockSearchResult->expects($this->once())
+            ->method('setSearchCriteria')
+            ->with($criteria)
+            ->willReturnSelf();
+        $this->collection->expects($this->once())
+            ->method('addFieldToFilter')
+            ->with([['attribute' => $field, $condition => $value]], [])
+            ->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->dataHelper->expects($this->once())
+            ->method('populateWithArray')
+            ->with($this->blockData, ['data'], 'Magento\Cms\Api\Data\BlockInterface')
+            ->willReturn('someData');
+
+        $this->assertEquals($this->blockSearchResult, $this->repository->getList($criteria));
+    }
+}
diff --git a/app/code/Magento/Cms/Test/Unit/Model/Config/Source/PageTest.php b/app/code/Magento/Cms/Test/Unit/Model/Config/Source/PageTest.php
index 234de25b3a6866038240be08d00d6fbc2da77370..a4602ea501dc26e141aa9003b763bd33ac7c745e 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/Config/Source/PageTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/Config/Source/PageTest.php
@@ -11,14 +11,9 @@ namespace Magento\Cms\Test\Unit\Model\Config\Source;
 class PageTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Cms\Model\PageRepository|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Cms\Model\Resource\Page\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $pageRepositoryMock;
-
-    /**
-     * @var \Magento\Cms\Model\Resource\PageCriteria|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $pageCriteriaFactoryMock;
+    protected $collectionFactory;
 
     /**
      * @var \Magento\Cms\Model\Config\Source\Page
@@ -34,15 +29,8 @@ class PageTest extends \PHPUnit_Framework_TestCase
     {
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
 
-        $this->pageRepositoryMock = $this->getMock(
-            'Magento\Cms\Model\PageRepository',
-            [],
-            [],
-            '',
-            false
-        );
-        $this->pageCriteriaFactoryMock = $this->getMock(
-            'Magento\Cms\Model\Resource\PageCriteriaFactory',
+        $this->collectionFactory = $this->getMock(
+            'Magento\Cms\Model\Resource\Page\CollectionFactory',
             ['create'],
             [],
             '',
@@ -52,8 +40,7 @@ class PageTest extends \PHPUnit_Framework_TestCase
         $this->page = $objectManager->getObject(
             'Magento\Cms\Model\Config\Source\Page',
             [
-                'pageRepository' => $this->pageRepositoryMock,
-                'pageCriteriaFactory' => $this->pageCriteriaFactoryMock
+                'collectionFactory' => $this->collectionFactory,
             ]
         );
     }
@@ -72,22 +59,10 @@ class PageTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $pageCriteriaMock = $this->getMock(
-            'Magento\Cms\Model\Resource\PageCriteria',
-            [],
-            [],
-            '',
-            false
-        );
-
-        $this->pageRepositoryMock->expects($this->once())
-            ->method('getList')
-            ->with($pageCriteriaMock)
-            ->will($this->returnValue($pageCollectionMock));
 
-        $this->pageCriteriaFactoryMock->expects($this->once())
+        $this->collectionFactory->expects($this->once())
             ->method('create')
-            ->will($this->returnValue($pageCriteriaMock));
+            ->will($this->returnValue($pageCollectionMock));
 
         $pageCollectionMock->expects($this->once())
             ->method('toOptionIdArray')
diff --git a/app/code/Magento/Cms/Test/Unit/Model/DataSource/PageCollectionTest.php b/app/code/Magento/Cms/Test/Unit/Model/DataSource/PageCollectionTest.php
deleted file mode 100644
index 227a7c2280ccc75e1b0a457fb5f2119b0794072b..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Test/Unit/Model/DataSource/PageCollectionTest.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Test\Unit\Model\DataSource;
-
-/**
- * Class PageCollectionTest
- */
-class PageCollectionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Cms\Model\Resource\PageCriteria|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $criteriaMock;
-
-    /**
-     * @var \Magento\Cms\Model\PageRepository|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $repositoryMock;
-
-    /**
-     * @var \Magento\Cms\Model\DataSource\PageCollection
-     */
-    protected $pageCollection;
-
-    /**
-     * Set up
-     *
-     * @return void
-     */
-    protected function setUp()
-    {
-        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-        $this->repositoryMock = $this->getMock(
-            'Magento\Cms\Model\PageRepository',
-            [],
-            [],
-            '',
-            false
-        );
-
-        $this->pageCollection = $objectManager->getObject(
-            'Magento\Cms\Model\DataSource\PageCollection',
-            [
-                'repository' => $this->repositoryMock,
-                'mapper' => ''
-            ]
-        );
-    }
-
-    /**
-     * Run test addFilter method
-     *
-     * @param string $name
-     * @param string $field
-     * @param mixed $condition
-     * @param string $type
-     * @return void
-     *
-     * @dataProvider dataProviderAddFilter
-     */
-    public function testAddFilter($name, $field, $condition, $type)
-    {
-        $this->pageCollection->addFilter($name, $field, $condition, $type);
-    }
-
-    /**
-     * Run test getResultCollection method
-     *
-     * @return void
-     */
-    public function testGetResultCollection()
-    {
-        $this->repositoryMock->expects($this->once())
-            ->method('getList')
-            ->with($this->pageCollection)
-            ->will($this->returnValue('return-value'));
-
-        $this->assertEquals('return-value', $this->pageCollection->getResultCollection());
-    }
-
-    /**
-     * Data provider for addFilter method
-     *
-     * @return array
-     */
-    public function dataProviderAddFilter()
-    {
-        return [
-            [
-                'name' => 'test-name',
-                'field' => 'store_id',
-                'condition' => null,
-                'type' => 'public',
-            ],
-            [
-                'name' => 'test-name',
-                'field' => 'any_field',
-                'condition' => 10,
-                'type' => 'private'
-            ]
-        ];
-    }
-}
diff --git a/app/code/Magento/Cms/Test/Unit/Model/PageRepositoryTest.php b/app/code/Magento/Cms/Test/Unit/Model/PageRepositoryTest.php
index d300268f7ab044c6228031707df86c8dd1d29f43..a5127dc51823910b45ebcc68d6c1cca26e53541a 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/PageRepositoryTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/PageRepositoryTest.php
@@ -5,261 +5,296 @@
  */
 namespace Magento\Cms\Test\Unit\Model;
 
+use Magento\Cms\Model\PageRepository;
+use Magento\Framework\Api\SearchCriteriaInterface;
+
 /**
- * Class PageRepositoryTest
+ * Test for Magento\Cms\Model\PageRepository
  */
 class PageRepositoryTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Cms\Model\Resource\Page|\PHPUnit_Framework_MockObject_MockObject
+     * @var PageRepository
      */
-    protected $resourceMock;
+    protected $repository;
 
     /**
-     * @var \Magento\Cms\Model\PageFactory|\PHPUnit_Framework_MockObject_MockObject
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\Resource\Page
      */
-    protected $pageFactoryMock;
+    protected $pageResource;
 
     /**
-     * @var \Magento\Cms\Model\Resource\Page\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\Page
      */
-    protected $pageCollectionFactoryMock;
+    protected $page;
 
     /**
-     * @var \Magento\Framework\DB\QueryBuilderFactory|\PHPUnit_Framework_MockObject_MockObject
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Api\Data\PageInterface
      */
-    protected $queryBuilderFactoryMock;
+    protected $pageData;
 
     /**
-     * @var \Magento\Framework\DB\MapperFactory|\PHPUnit_Framework_MockObject_MockObject
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Api\Data\PageSearchResultsInterface
      */
-    protected $mapperFactoryMock;
+    protected $pageSearchResult;
 
     /**
-     * @var \Magento\Cms\Model\PageRepository
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Api\DataObjectHelper
      */
-    protected $pageRepository;
+    protected $dataHelper;
 
     /**
-     * Set up
-     *
-     * @return void
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\Resource\Page\Collection
      */
-    protected function setUp()
+    protected $collection;
+
+    /**
+     * Initialize repository
+     */
+    public function setUp()
     {
-        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->pageResource = $this->getMockBuilder('Magento\Cms\Model\Resource\Page')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $pageFactory = $this->getMockBuilder('Magento\Cms\Model\PageFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $pageDataFactory = $this->getMockBuilder('Magento\Cms\Api\Data\PageInterfaceFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $pageSearchResultFactory = $this->getMockBuilder('Magento\Cms\Api\Data\PageSearchResultsInterfaceFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $collectionFactory = $this->getMockBuilder('Magento\Cms\Model\Resource\Page\CollectionFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
 
-        $this->resourceMock = $this->getMock(
-            'Magento\Cms\Model\Resource\Page',
-            ['save', 'load', 'delete'],
-            [],
-            '',
-            false
-        );
-        $this->pageFactoryMock = $this->getMock(
-            'Magento\Cms\Model\PageFactory',
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->pageCollectionFactoryMock = $this->getMock(
-            'Magento\Cms\Model\Resource\Page\CollectionFactory',
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->queryBuilderFactoryMock = $this->getMock(
-            'Magento\Framework\DB\QueryBuilderFactory',
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->mapperFactoryMock = $this->getMock(
-            'Magento\Framework\DB\MapperFactory',
-            [],
-            [],
-            '',
-            false
-        );
+        $this->page = $this->getMockBuilder('Magento\Cms\Model\Page')->disableOriginalConstructor()->getMock();
+        $this->pageData = $this->getMockBuilder('Magento\Cms\Api\Data\PageInterface')
+            ->getMock();
+        $this->pageSearchResult = $this->getMockBuilder('Magento\Cms\Api\Data\PageSearchResultsInterface')
+            ->getMock();
+        $this->collection = $this->getMockBuilder('Magento\Cms\Model\Resource\Page\Collection')
+            ->disableOriginalConstructor()
+            ->setMethods(['addFieldToFilter', 'getSize', 'setCurPage', 'setPageSize', 'load', 'addOrder'])
+            ->getMock();
+
+        $pageFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->page);
+        $pageDataFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->pageData);
+        $pageSearchResultFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->pageSearchResult);
+        $collectionFactory->expects($this->any())
+            ->method('create')
+            ->willReturn($this->collection);
+        /**
+         * @var \Magento\Cms\Model\PageFactory $pageFactory
+         * @var \Magento\Cms\Api\Data\PageInterfaceFactory $pageDataFactory
+         * @var \Magento\Cms\Api\Data\PageSearchResultsInterfaceFactory $pageSearchResultFactory
+         * @var \Magento\Cms\Model\Resource\Page\CollectionFactory $collectionFactory
+         */
+
+        $this->dataHelper = $this->getMockBuilder('Magento\Framework\Api\DataObjectHelper')
+            ->disableOriginalConstructor()
+            ->getMock();
 
-        $this->pageRepository = $objectManager->getObject(
-            'Magento\Cms\Model\PageRepository',
-            [
-                'resource' => $this->resourceMock,
-                'pageFactory' => $this->pageFactoryMock,
-                'pageCollectionFactory' => $this->pageCollectionFactoryMock,
-                'queryBuilderFactory' => $this->queryBuilderFactoryMock,
-                'mapperFactory' => $this->mapperFactoryMock
-            ]
+        $this->repository = new PageRepository(
+            $this->pageResource,
+            $pageFactory,
+            $pageDataFactory,
+            $collectionFactory,
+            $pageSearchResultFactory,
+            $this->dataHelper
         );
     }
 
     /**
-     * Run test save method
-     *
-     * @return void
+     * @test
      */
     public function testSave()
     {
-        $pageMock = $this->getMock(
-            'Magento\Cms\Model\Page',
-            [],
-            [],
-            '',
-            false
-        );
-
-        $this->resourceMock->expects($this->once())
+        $this->pageResource->expects($this->once())
             ->method('save')
-            ->with($pageMock);
-
-        $this->assertEquals($pageMock, $this->pageRepository->save($pageMock));
+            ->with($this->page)
+            ->willReturnSelf();
+        $this->assertEquals($this->page, $this->repository->save($this->page));
     }
 
     /**
-     * Run test get method
-     *
-     * @return void
+     * @test
      */
-    public function testGet()
+    public function testDeleteById()
     {
-        $id = 20;
-        $pageMock = $this->getMockForAbstractClass(
-            'Magento\Cms\Model\Page',
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['getId']
-        );
+        $pageId = '123';
 
-        $pageMock->expects($this->atLeastOnce())
+        $this->page->expects($this->once())
             ->method('getId')
-            ->will($this->returnValue($id));
-        $this->pageFactoryMock->expects($this->once())
-            ->method('create')
-            ->will($this->returnValue($pageMock));
-        $this->resourceMock->expects($this->once())
+            ->willReturn(true);
+        $this->pageResource->expects($this->once())
             ->method('load')
-            ->with($pageMock, $id);
+            ->with($this->page, $pageId)
+            ->willReturn($this->page);
+        $this->pageResource->expects($this->once())
+            ->method('delete')
+            ->with($this->page)
+            ->willReturnSelf();
 
-        $this->assertEquals($pageMock, $this->pageRepository->get($id));
+        $this->assertTrue($this->repository->deleteById($pageId));
     }
 
     /**
-     * Run test getList method
+     * @test
      *
-     * @return void
+     * @expectedException \Magento\Framework\Exception\CouldNotSaveException
      */
-    public function testGetList()
+    public function testSaveException()
     {
-        $criteriaMock = $this->getMock(
-            'Magento\Cms\Model\Resource\PageCriteria',
-            [],
-            [],
-            '',
-            false
-        );
-        $queryBuilderMock = $this->getMock(
-            'Magento\Framework\DB\QueryBuilder',
-            ['setCriteria', 'setResource', 'create'],
-            [],
-            '',
-            false
-        );
-        $queryMock = $this->getMockForAbstractClass(
-            'Magento\Framework\DB\QueryInterface',
-            [],
-            '',
-            false
-        );
-        $collectionMock = $this->getMock(
-            'Magento\Cms\Model\Resource\Page\Collection',
-            [],
-            [],
-            '',
-            false
-        );
-
-        $this->queryBuilderFactoryMock->expects($this->once())
-            ->method('create')
-            ->will($this->returnValue($queryBuilderMock));
-        $queryBuilderMock->expects($this->once())
-            ->method('setCriteria')
-            ->with($criteriaMock);
-        $queryBuilderMock->expects($this->once())
-            ->method('setResource')
-            ->with($this->resourceMock);
-        $queryBuilderMock->expects($this->once())
-            ->method('create')
-            ->will($this->returnValue($queryMock));
-        $this->pageCollectionFactoryMock->expects($this->once())
-            ->method('create')
-            ->with(['query' => $queryMock])
-            ->will($this->returnValue($collectionMock));
-
-        $this->assertEquals($collectionMock, $this->pageRepository->getList($criteriaMock));
+        $this->pageResource->expects($this->once())
+            ->method('save')
+            ->with($this->page)
+            ->willThrowException(new \Exception());
+        $this->repository->save($this->page);
     }
 
     /**
-     * Run test delete method
+     * @test
      *
-     * @return void
+     * @expectedException \Magento\Framework\Exception\CouldNotDeleteException
      */
-    public function testDelete()
+    public function testDeleteException()
     {
-        $pageMock = $this->getMockForAbstractClass(
-            'Magento\Cms\Model\Page',
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['getPageId']
-        );
-
-        $this->resourceMock->expects($this->once())
+        $this->pageResource->expects($this->once())
             ->method('delete')
-            ->with($pageMock);
-
-        $this->assertTrue($this->pageRepository->delete($pageMock));
+            ->with($this->page)
+            ->willThrowException(new \Exception());
+        $this->repository->delete($this->page);
     }
 
     /**
-     * Run test deleteById method
+     * @test
      *
-     * @return void
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
      */
-    public function testDeleteById()
+    public function testGetByIdException()
     {
-        $id = 20;
-        $pageMock = $this->getMockForAbstractClass(
-            'Magento\Cms\Model\Page',
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['getId']
-        );
+        $pageId = '123';
 
-        $this->pageFactoryMock->expects($this->once())
-            ->method('create')
-            ->will($this->returnValue($pageMock));
-        $this->resourceMock->expects($this->once())
-            ->method('load')
-            ->with($pageMock, $id);
-        $pageMock->expects($this->once())
+        $this->page->expects($this->once())
             ->method('getId')
-            ->will($this->returnValue($id));
-        $this->resourceMock->expects($this->once())
-            ->method('delete')
-            ->with($pageMock);
+            ->willReturn(false);
+        $this->pageResource->expects($this->once())
+            ->method('load')
+            ->with($this->page, $pageId)
+            ->willReturn($this->page);
+        $this->repository->getById($pageId);
+    }
+
+    /**
+     * @test
+     */
+    public function testGetList()
+    {
+        $field = 'name';
+        $value = 'magento';
+        $condition = 'eq';
+        $total = 10;
+        $currentPage = 3;
+        $pageSize = 2;
+        $sortField = 'id';
+
+        $criteria = $this->getMockBuilder('Magento\Framework\Api\SearchCriteriaInterface')->getMock();
+        $filterGroup = $this->getMockBuilder('Magento\Framework\Api\Search\FilterGroup')->getMock();
+        $filter = $this->getMockBuilder('Magento\Framework\Api\Filter')->getMock();
+        $storeFilter = $this->getMockBuilder('Magento\Framework\Api\Filter')->getMock();
+        $sortOrder = $this->getMockBuilder('Magento\Framework\Api\SortOrder')->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(SearchCriteriaInterface::SORT_DESC);
+
+        /** @var \Magento\Framework\Api\SearchCriteriaInterface $criteria */
+
+        $this->collection->addItem($this->page);
+        $this->pageSearchResult->expects($this->once())
+            ->method('setSearchCriteria')
+            ->with($criteria)
+            ->willReturnSelf();
+        $this->collection->expects($this->once())
+            ->method('addFieldToFilter')
+            ->with([['attribute' => $field, $condition => $value]], [])
+            ->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->dataHelper->expects($this->once())
+            ->method('populateWithArray')
+            ->with($this->pageData, ['data'], 'Magento\Cms\Api\Data\PageInterface')
+            ->willReturn('someData');
 
-        $this->assertTrue($this->pageRepository->deleteById($id));
+        $this->assertEquals($this->pageSearchResult, $this->repository->getList($criteria));
     }
 }
diff --git a/app/code/Magento/Cms/Test/Unit/Model/Resource/Block/Grid/CollectionTest.php b/app/code/Magento/Cms/Test/Unit/Model/Resource/Block/Grid/CollectionTest.php
index 9db74457f743fa561510a622b3c439472a819085..5b267bc224b84db9894c9416ecc26deac3f8fb4c 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/Resource/Block/Grid/CollectionTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/Resource/Block/Grid/CollectionTest.php
@@ -5,7 +5,7 @@
  */
 namespace Magento\Cms\Test\Unit\Model\Resource\Block\Grid;
 
-use Magento\Cms\Model\Resource\Block\Grid\Collection;
+use Magento\Cms\Model\Resource\Block\Collection;
 
 class CollectionTest extends \PHPUnit_Framework_TestCase
 {
@@ -42,11 +42,11 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
 
         $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $arguments = $objectManagerHelper->getConstructArguments(
-            'Magento\Cms\Model\Resource\Block\Grid\Collection',
+            'Magento\Cms\Model\Resource\Block\Collection',
             ['resource' => $resource, 'connection' => $connection]
         );
 
-        $this->collection = $this->getMockBuilder('Magento\Cms\Model\Resource\Block\Grid\Collection')
+        $this->collection = $this->getMockBuilder('Magento\Cms\Model\Resource\Block\Collection')
             ->setConstructorArgs($arguments)
             ->setMethods(['addFilter', '_translateCondition', 'getMainTable'])
             ->getMock();
diff --git a/app/code/Magento/Cms/Test/Unit/Model/Resource/Page/CollectionTest.php b/app/code/Magento/Cms/Test/Unit/Model/Resource/Page/CollectionTest.php
deleted file mode 100644
index 2abd96842cf321873d5d6949bcf80f4d1e954d30..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Test/Unit/Model/Resource/Page/CollectionTest.php
+++ /dev/null
@@ -1,278 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Test\Unit\Model\Resource\Page;
-
-/**
- * Class CollectionTest
- */
-class CollectionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $storeManagerMock;
-
-    /**
-     * @var \Magento\Framework\DB\QueryInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $queryMock;
-
-    /**
-     * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $eventManagerMock;
-
-    /**
-     * @var \Magento\Framework\Data\Collection\EntityFactoryInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $entityFactoryMock;
-
-    /**
-     * @var \Magento\Framework\Data\SearchResultIteratorFactory|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $resultIteratorFactoryMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $searchResultProcessorMock;
-
-    /**
-     * @var \Magento\Cms\Model\Resource\Page\Collection
-     */
-    protected $collection;
-
-    /**
-     * Set up
-     *
-     * @return void
-     */
-    protected function setUp()
-    {
-        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-
-        $this->queryMock = $this->getMockForAbstractClass(
-            'Magento\Framework\DB\QueryInterface',
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['fetchAll', 'getIdFieldName', 'getConnection', 'getResource']
-        );
-        $this->entityFactoryMock = $this->getMockForAbstractClass(
-            'Magento\Framework\Data\Collection\EntityFactoryInterface',
-            [],
-            '',
-            false,
-            true,
-            true,
-            []
-        );
-        $this->eventManagerMock = $this->getMockForAbstractClass(
-            'Magento\Framework\Event\ManagerInterface',
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['dispatch']
-        );
-        $this->resultIteratorFactoryMock = $this->getMock(
-            'Magento\Framework\Data\SearchResultIteratorFactory',
-            [],
-            [],
-            '',
-            false
-        );
-        $this->searchResultProcessorMock = $this->getMock(
-            'Magento\Framework\Data\SearchResultProcessor',
-            [],
-            [],
-            '',
-            false
-        );
-        $searchResultProcessorFactoryMock = $this->getMock(
-            'Magento\Framework\Data\SearchResultProcessorFactory',
-            [],
-            [],
-            '',
-            false
-        );
-        $searchResultProcessorFactoryMock->expects($this->any())
-            ->method('create')
-            ->withAnyParameters()
-            ->willReturn($this->searchResultProcessorMock);
-        $this->storeManagerMock = $this->getMockForAbstractClass(
-            'Magento\Store\Model\StoreManagerInterface',
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['getStore']
-        );
-
-        $this->collection = $objectManager->getObject(
-            'Magento\Cms\Model\Resource\Page\Collection',
-            [
-                'query' => $this->queryMock,
-                'entityFactory' => $this->entityFactoryMock,
-                'eventManager' => $this->eventManagerMock,
-                'resultIteratorFactory' => $this->resultIteratorFactoryMock,
-                'storeManager' => $this->storeManagerMock,
-                'searchResultProcessorFactory' => $searchResultProcessorFactoryMock
-            ]
-        );
-    }
-
-    /**
-     * Run test toOptionIdArray method
-     *
-     * @return void
-     *
-     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
-     */
-    public function testToOptionIdArray()
-    {
-        $itemsByPageId = array_fill(0, 4, 123);
-        $data = [
-            'item1' => ['test' => 'test'],
-            'item2' => ['test' => 'test'],
-            'item3' => ['test' => 'test'],
-            'item4' => ['test' => 'test'],
-        ];
-
-        $objectMock = $this->getMock(
-            'Magento\Framework\Object',
-            ['getData', 'getId', 'setData', 'getTitle', 'getIdentifier'],
-            [],
-            '',
-            false
-        );
-        $criteriaMock = $this->getMockForAbstractClass('Magento\Framework\Api\CriteriaInterface');
-        $connectionMock = $this->getMockForAbstractClass('Magento\Framework\DB\Adapter\AdapterInterface');
-        $resourceMock = $this->getMockForAbstractClass(
-            'Magento\Framework\Model\Resource\Db\AbstractDb',
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['getTable']
-        );
-        $selectMock = $this->getMock(
-            'Magento\Framework\DB\Select',
-            ['from', 'where'],
-            [],
-            '',
-            false
-        );
-        $storeMock = $this->getMock(
-            'Magento\Store\Model\Store',
-            ['getCode'],
-            [],
-            '',
-            false
-        );
-
-        $this->queryMock->expects($this->once())
-            ->method('fetchAll')
-            ->will($this->returnValue($data));
-
-        $this->searchResultProcessorMock->expects($this->once())
-            ->method('getColumnValues')
-            ->with('page_id')
-            ->will($this->returnValue($itemsByPageId));
-        $this->queryMock->expects($this->any())
-            ->method('getIdFieldName')
-            ->will($this->returnValue('id_field_name'));
-        $objectMock->expects($this->any())
-            ->method('getData')
-            ->will(
-                $this->returnValueMap(
-                    [
-                        ['id_field_name', null, null],
-                        ['page_id', null, 123],
-                    ]
-                )
-            );
-        $this->entityFactoryMock->expects($this->any())
-            ->method('create')
-            ->with('Magento\Cms\Model\Page', ['data' => ['test' => 'test']])
-            ->will($this->returnValue($objectMock));
-        $this->queryMock->expects($this->once())
-            ->method('getCriteria')
-            ->will($this->returnValue($criteriaMock));
-        $criteriaMock->expects($this->once())
-            ->method('getPart')
-            ->with('first_store_flag')
-            ->will($this->returnValue(true));
-        $this->queryMock->expects($this->once())
-            ->method('getConnection')
-            ->will($this->returnValue($connectionMock));
-        $this->queryMock->expects($this->once())
-            ->method('getResource')
-            ->will($this->returnValue($resourceMock));
-        $connectionMock->expects($this->once())
-            ->method('select')
-            ->will($this->returnValue($selectMock));
-        $selectMock->expects($this->once())
-            ->method('from')
-            ->with(['cps' => 'query_table'])
-            ->will($this->returnSelf());
-        $resourceMock->expects($this->once())
-            ->method('getTable')
-            ->with('cms_page_store')
-            ->will($this->returnValue('query_table'));
-        $selectMock->expects($this->once())
-            ->method('where')
-            ->with('cps.page_id IN (?)', array_fill(0, 4, 123))
-            ->will($this->returnSelf());
-        $connectionMock->expects($this->once())
-            ->method('fetchPairs')
-            ->with($selectMock)
-            ->will($this->returnValue([123 => 999]));
-        $objectMock->expects($this->any())
-            ->method('getId')
-            ->will($this->returnValue(123));
-        $this->storeManagerMock->expects($this->any())
-            ->method('getStore')
-            ->with(999)
-            ->will($this->returnValue($storeMock));
-        $storeMock->expects($this->any())
-            ->method('getCode')
-            ->will($this->returnValue('store_code'));
-        $objectMock->expects($this->any())
-            ->method('setData');
-        $objectMock->expects($this->any())
-            ->method('getTitle')
-            ->will($this->returnValue('item-value'));
-        $objectMock->expects($this->any())
-            ->method('getIdentifier')
-            ->will($this->returnValue('identifier-value'));
-
-        $expected = [
-            [
-                'value' => 'identifier-value',
-                'label' => 'item-value',
-            ],
-            [
-                'value' => 'identifier-value|123',
-                'label' => 'item-value'
-            ],
-            [
-                'value' => 'identifier-value|123',
-                'label' => 'item-value'
-            ],
-            [
-                'value' => 'identifier-value|123',
-                'label' => 'item-value'
-            ],
-        ];
-        $this->assertEquals($expected, $this->collection->toOptionIdArray());
-    }
-}
diff --git a/app/code/Magento/Cms/Test/Unit/Model/Resource/PageCriteriaMapperTest.php b/app/code/Magento/Cms/Test/Unit/Model/Resource/PageCriteriaMapperTest.php
deleted file mode 100644
index 19ac623ed6b10f98e592e6308409c401ea961cda..0000000000000000000000000000000000000000
--- a/app/code/Magento/Cms/Test/Unit/Model/Resource/PageCriteriaMapperTest.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Cms\Test\Unit\Model\Resource;
-
-/**
- * Class PageCriteriaMapperTest
- */
-class PageCriteriaMapperTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $loggerMock;
-
-    /**
-     * @var \Magento\Framework\Data\Collection\Db\FetchStrategyInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $fetchStrategyMock;
-
-    /**
-     * @var \Magento\Framework\Data\ObjectFactory|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $objectFactoryMock;
-
-    /**
-     * @var \Magento\Framework\DB\MapperFactory|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $mapperFactoryMock;
-
-    /**
-     * @var \Magento\Framework\DB\Select|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $selectMock;
-
-    /**
-     * @var \Magento\Cms\Model\Resource\PageCriteriaMapper|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $pageCriteria;
-
-    /**
-     * Set up
-     *
-     * @return void
-     */
-    protected function setUp()
-    {
-        $this->loggerMock = $this->getMock('Psr\Log\LoggerInterface');
-        $this->fetchStrategyMock = $this->getMockForAbstractClass(
-            'Magento\Framework\Data\Collection\Db\FetchStrategyInterface',
-            [],
-            '',
-            false
-        );
-        $this->objectFactoryMock = $this->getMock(
-            'Magento\Framework\Data\ObjectFactory',
-            [],
-            [],
-            '',
-            false
-        );
-        $this->mapperFactoryMock = $this->getMock(
-            'Magento\Framework\DB\MapperFactory',
-            [],
-            [],
-            '',
-            false
-        );
-        $this->selectMock = $this->getMock(
-            'Magento\Framework\DB\Select',
-            ['join', 'group', 'where'],
-            [],
-            '',
-            false
-        );
-
-        $this->pageCriteria = $this->getMockBuilder('Magento\Cms\Model\Resource\PageCriteriaMapper')
-            ->setConstructorArgs(
-                [
-                    'logger' => $this->loggerMock,
-                    'fetchStrategy' => $this->fetchStrategyMock,
-                    'objectFactory' => $this->objectFactoryMock,
-                    'mapperFactory' => $this->mapperFactoryMock,
-                    'select' => $this->selectMock,
-                ]
-            )->setMethods(['init', 'getTable', 'getMappedField', 'getConditionSql'])
-            ->getMock();
-    }
-
-    /**
-     * Run test mapStoreFilter method
-     *
-     * @return void
-     */
-    public function testMapStoreFilter()
-    {
-        $reflection = new \ReflectionClass($this->pageCriteria);
-        $reflectionProperty = $reflection->getProperty('storeTableName');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->pageCriteria, 'cms_page_store');
-        $reflectionProperty = $reflection->getProperty('linkFieldName');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->pageCriteria, 'page_id');
-
-        $this->pageCriteria->expects($this->once())
-            ->method('getTable')
-            ->with('cms_page_store')
-            ->will($this->returnValue('table-name'));
-        $this->pageCriteria->expects($this->once())
-            ->method('getMappedField')
-            ->with('store')
-            ->will($this->returnValue('mapped-field-result'));
-        $this->selectMock->expects($this->once())
-            ->method('join')
-            ->with(
-                ['store_table' => 'table-name'],
-                'main_table.page_id = store_table.page_id',
-                []
-            )->will($this->returnSelf());
-        $this->selectMock->expects($this->once())
-            ->method('group')
-            ->with('main_table.page_id');
-        $this->pageCriteria->expects($this->once())
-            ->method('getConditionSql')
-            ->with('mapped-field-result', ['in' => [1]])
-            ->will($this->returnValue('condition-sql-result'));
-        $this->selectMock->expects($this->once())
-            ->method('where')
-            ->with('condition-sql-result', null, \Magento\Framework\DB\Select::TYPE_CONDITION);
-
-        $this->pageCriteria->mapStoreFilter(1, false);
-    }
-}
diff --git a/app/code/Magento/Cms/etc/di.xml b/app/code/Magento/Cms/etc/di.xml
index 5180d2671ad2e15dab12a891e221812f0665ab74..d25ddfd399e02b299b8cc9be0c901fe03b795f3d 100644
--- a/app/code/Magento/Cms/etc/di.xml
+++ b/app/code/Magento/Cms/etc/di.xml
@@ -6,8 +6,14 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <preference for="Magento\Cms\Model\PageCriteriaInterface" type="Magento\Cms\Model\Resource\PageCriteria" />
-    <preference for="Magento\Cms\Model\BlockCriteriaInterface" type="Magento\Cms\Model\Resource\BlockCriteria" />
+    <preference for="Magento\Cms\Api\Data\PageSearchResultsInterface"
+                type="Magento\Framework\Api\SearchResults" />
+    <preference for="Magento\Cms\Api\Data\BlockSearchResultsInterface"
+                type="Magento\Framework\Api\SearchResults" />
+    <preference for="Magento\Cms\Api\Data\PageInterface" type="Magento\Cms\Model\Page" />
+    <preference for="Magento\Cms\Api\Data\BlockInterface" type="Magento\Cms\Model\Block" />
+    <preference for="Magento\Cms\Api\BlockRepositoryInterface" type="Magento\Cms\Model\BlockRepository" />
+    <preference for="Magento\Cms\Api\PageRepositoryInterface" type="Magento\Cms\Model\PageRepository" />
     <type name="Magento\Cms\Model\Wysiwyg\Config">
         <arguments>
             <argument name="windowSize" xsi:type="array">
diff --git a/app/code/Magento/Cms/view/adminhtml/layout/cms_block_listing.xml b/app/code/Magento/Cms/view/adminhtml/layout/cms_block_listing.xml
index 83f7ab821f23355be1d399dc85244287af31d8bc..6f1975adb97cd11e5032ed1b455183ac0a653f31 100644
--- a/app/code/Magento/Cms/view/adminhtml/layout/cms_block_listing.xml
+++ b/app/code/Magento/Cms/view/adminhtml/layout/cms_block_listing.xml
@@ -10,7 +10,7 @@
         <referenceBlock name="listing">
             <arguments>
                 <argument name="name" xsi:type="string">cms_block_listing</argument>
-                <argument name="dataSource" xsi:type="object">Magento\Cms\Model\DataSource\BlockCollection</argument>
+                <argument name="dataSource" xsi:type="object">Magento\Cms\Model\Resource\Block\Collection</argument>
                 <argument name="save_parameters_in_session" xsi:type="string">1</argument>
                 <argument name="configuration" xsi:type="array">
                     <item name="page_actions" xsi:type="array">
diff --git a/app/code/Magento/Cms/view/adminhtml/layout/cms_page_listing.xml b/app/code/Magento/Cms/view/adminhtml/layout/cms_page_listing.xml
index 48bdecdc6696955d394dc16dc148d4f231b01c6b..bebf23cacd86b98d4f7e4f6c3af734c4cba77515 100644
--- a/app/code/Magento/Cms/view/adminhtml/layout/cms_page_listing.xml
+++ b/app/code/Magento/Cms/view/adminhtml/layout/cms_page_listing.xml
@@ -10,7 +10,7 @@
         <referenceBlock name="listing">
             <arguments>
                 <argument name="name" xsi:type="string">cms_page_listing</argument>
-                <argument name="dataSource" xsi:type="object">Magento\Cms\Model\DataSource\PageCollection</argument>
+                <argument name="dataSource" xsi:type="object">Magento\Cms\Model\Resource\Page\Collection</argument>
                 <argument name="save_parameters_in_session" xsi:type="string">1</argument>
                 <argument name="configuration" xsi:type="array">
                     <item name="page_actions" xsi:type="array">
diff --git a/app/code/Magento/Ui/Component/Listing.php b/app/code/Magento/Ui/Component/Listing.php
index 1cfbaa1acd6f32b74a42ed67eff1b24472b41e80..6d8437a886c5e531522c59fe1fae4e13f7461ab3 100644
--- a/app/code/Magento/Ui/Component/Listing.php
+++ b/app/code/Magento/Ui/Component/Listing.php
@@ -188,7 +188,7 @@ class Listing extends AbstractView
     public function getCollectionItems()
     {
         $items = [];
-        $collection = $this->getDataCollection()->getResultCollection();
+        $collection = $this->getDataCollection();
         foreach ($collection->getItems() as $item) {
             $actualFields = [];
             $itemsData = $this->getDataFromDataProvider($item->getData());
@@ -230,8 +230,8 @@ class Listing extends AbstractView
         );
         $this->renderContext->getStorage()->addGlobalData('dump', ['extenders' => []]);
 
-        $collection = $this->getDataCollection()->getResultCollection();
-        $totalCount = $collection->getTotalCount();
+        $collection = $this->getDataCollection();
+        $totalCount = $collection->count();
         $this->renderContext->getStorage()->addDataSource(
             $this->getName(),
             [
diff --git a/app/code/Magento/Ui/Component/Paging.php b/app/code/Magento/Ui/Component/Paging.php
index 9a8f0a5ddd9b4eaedf2f144b484298eed0d0e301..7c504b74ac8303fff539ffe9671af8a9c68039e7 100644
--- a/app/code/Magento/Ui/Component/Paging.php
+++ b/app/code/Magento/Ui/Component/Paging.php
@@ -37,7 +37,10 @@ class Paging extends AbstractView
         $offset = $this->renderContext->getRequestParam('page', $defaultPage);
         $defaultLimit = $this->config->getData('pageSize');
         $size = $this->renderContext->getRequestParam('limit', $defaultLimit);
-        $this->renderContext->getStorage()->getDataCollection($this->getParentName())->setLimit($offset, $size);
+        $this->renderContext->getStorage()
+            ->getDataCollection($this->getParentName())
+            ->setPageSize($size)
+            ->setCurPage($offset);
     }
 
     /**
diff --git a/app/code/Magento/Ui/Test/Unit/Component/PagingTest.php b/app/code/Magento/Ui/Test/Unit/Component/PagingTest.php
index 68af1081739d613c26815a54088cc6e55a6ed431..e8cd28a27665a09b164e93c2f76c58e72ffd1ed7 100644
--- a/app/code/Magento/Ui/Test/Unit/Component/PagingTest.php
+++ b/app/code/Magento/Ui/Test/Unit/Component/PagingTest.php
@@ -153,7 +153,7 @@ class PagingTest extends \PHPUnit_Framework_TestCase
             false,
             true,
             true,
-            ['setLimit']
+            ['setPageSize', 'setCurPage']
         );
 
         $this->renderContextMock->expects($this->any())->method('getStorage')->willReturn($storageMock);
@@ -173,8 +173,12 @@ class PagingTest extends \PHPUnit_Framework_TestCase
             );
 
         $dataCollectionMock->expects($this->any())
-            ->method('setLimit')
-            ->with($paramsPage, $paramsSize)
+            ->method('setPageSize')
+            ->with($paramsSize)
+            ->willReturnSelf();
+        $dataCollectionMock->expects($this->any())
+            ->method('setCurPage')
+            ->with($paramsPage)
             ->willReturnSelf();
 
         $this->assertNull($this->view->prepare());
diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Fixture/CmsBlock.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/Fixture/CmsBlock.xml
index 36bb9cf39af0421b3a0bc9e6e25115cb312ad55e..506201360d763ba00a5367aef4fa1dd68eb42d0c 100644
--- a/dev/tests/functional/tests/app/Magento/Cms/Test/Fixture/CmsBlock.xml
+++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Fixture/CmsBlock.xml
@@ -6,7 +6,7 @@
  */
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd">
-    <fixture name="cmsBlock" module="Magento_Cms" type="flat" entity_type="cms_block" collection="Magento\Cms\Model\Resource\Block\Grid\Collection" identifier="identifier"
+    <fixture name="cmsBlock" module="Magento_Cms" type="flat" entity_type="cms_block" collection="Magento\Cms\Model\Resource\Block\Collection" identifier="identifier"
              handler_interface="Magento\Cms\Test\Handler\CmsBlock\CmsBlockInterface" class="Magento\Cms\Test\Fixture\CmsBlock">
         <dataset name="default">
             <field name="title" xsi:type="string">block_%isolation%</field>
diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Fixture/CmsPage.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/Fixture/CmsPage.xml
index 149bef091c83163e09710dbaa2cd7f4bc6930058..e08d7c55a59877bf23477ca67e1b44b221fde192 100644
--- a/dev/tests/functional/tests/app/Magento/Cms/Test/Fixture/CmsPage.xml
+++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Fixture/CmsPage.xml
@@ -6,7 +6,7 @@
  */
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd">
-    <fixture name="cmsPage" module="Magento_Cms" type="flat" entity_type="cms_page" collection="Magento\Cms\Model\Resource\Page\Grid\Collection" identifier="identifier"
+    <fixture name="cmsPage" module="Magento_Cms" type="flat" entity_type="cms_page" collection="Magento\Cms\Model\Resource\Page\Collection" identifier="identifier"
              repository_class="Magento\Cms\Test\Repository\CmsPage" handler_interface="Magento\Cms\Test\Handler\CmsPage\CmsPageInterface" class="Magento\Cms\Test\Fixture\CmsPage">
         <dataset name="default">
             <field name="title" xsi:type="string">CMS Page%isolation%</field>
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria.php b/lib/internal/Magento/Framework/Api/SearchCriteria.php
index 727be2cac88b47b98e73fc919a2cb47057997433..b98908fcb85d6756df137cb48d526fed1b3ce184 100644
--- a/lib/internal/Magento/Framework/Api/SearchCriteria.php
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria.php
@@ -15,7 +15,7 @@ class SearchCriteria extends AbstractSimpleObject implements SearchCriteriaInter
     /**#@+
      * Constants for Data Object keys
      */
-    const FILTER_GROUPS = 'filterGroups';
+    const FILTER_GROUPS = 'filter_groups';
     const SORT_ORDERS = 'sort_orders';
     const PAGE_SIZE = 'page_size';
     const CURRENT_PAGE = 'current_page';