diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Export/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Export/AdvancedPricing.php
index 9183e182c29850cd7c99e27217667174611e77fd..5b8d1101a2bc9f3abf05bcbf1b0f8aae8756adc3 100644
--- a/app/code/Magento/AdvancedPricingImportExport/Model/Export/AdvancedPricing.php
+++ b/app/code/Magento/AdvancedPricingImportExport/Model/Export/AdvancedPricing.php
@@ -95,10 +95,10 @@ class AdvancedPricing extends \Magento\CatalogImportExport\Model\Export\Product
      * @param \Magento\CatalogImportExport\Model\Export\Product\Type\Factory $_typeFactory
      * @param \Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider
      * @param \Magento\CatalogImportExport\Model\Export\RowCustomizerInterface $rowCustomizer
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param ImportProduct\StoreResolver $storeResolver
      * @param \Magento\Customer\Api\GroupRepositoryInterface $groupRepository
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @throws \Magento\Framework\Exception\LocalizedException
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
@@ -119,7 +119,7 @@ class AdvancedPricing extends \Magento\CatalogImportExport\Model\Export\Product
         \Magento\CatalogImportExport\Model\Export\Product\Type\Factory $_typeFactory,
         \Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider,
         \Magento\CatalogImportExport\Model\Export\RowCustomizerInterface $rowCustomizer,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver,
         \Magento\Customer\Api\GroupRepositoryInterface $groupRepository
     ) {
diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Export/AdvancedPricingTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Export/AdvancedPricingTest.php
index e974a75f902e90b27e26b8315b34fb676ec6d577..369aa28e49425e2ed8274327b4bcf9b5500632a7 100644
--- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Export/AdvancedPricingTest.php
+++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Export/AdvancedPricingTest.php
@@ -108,7 +108,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase
     protected $groupRepository;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPool;
 
@@ -291,7 +291,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase
             false
         );
         $this->metadataPool = $this->getMock(
-            '\Magento\Framework\Model\Entity\MetadataPool',
+            '\Magento\Framework\EntityManager\MetadataPool',
             [],
             [],
             '',
diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php
index d469af2fb41327a3cf657cda177c867b1b4bd5fe..acf18a4b66bacb40b2d05c3af409084cfb7f1a01 100644
--- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php
+++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php
@@ -985,7 +985,7 @@ class AdvancedPricingTest extends \Magento\ImportExport\Test\Unit\Model\Import\A
     private function getAdvancedPricingMock($methods = [])
     {
         $metadataPoolMock = $this->getMock(
-            \Magento\Framework\Model\Entity\MetadataPool::class,
+            \Magento\Framework\EntityManager\MetadataPool::class,
             [],
             [],
             '',
diff --git a/app/code/Magento/Bundle/Model/LinkManagement.php b/app/code/Magento/Bundle/Model/LinkManagement.php
index be530ee58d6d45d615a898b78f6edd0667964e63..02e7bce37b1002a379e5f262fc80e4be488a8bbf 100644
--- a/app/code/Magento/Bundle/Model/LinkManagement.php
+++ b/app/code/Magento/Bundle/Model/LinkManagement.php
@@ -10,7 +10,7 @@ use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Catalog\Api\ProductRepositoryInterface;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\InputException;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
diff --git a/app/code/Magento/Bundle/Model/OptionRepository.php b/app/code/Magento/Bundle/Model/OptionRepository.php
index 1e163aae767b6e7be55ca174e3bccb678e1bd111..1a8253cf90231d44f335ac64da0b44d937d8ae17 100644
--- a/app/code/Magento/Bundle/Model/OptionRepository.php
+++ b/app/code/Magento/Bundle/Model/OptionRepository.php
@@ -62,7 +62,7 @@ class OptionRepository implements \Magento\Bundle\Api\ProductOptionRepositoryInt
     protected $dataObjectHelper;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -76,7 +76,7 @@ class OptionRepository implements \Magento\Bundle\Api\ProductOptionRepositoryInt
      * @param Product\OptionList $productOptionList
      * @param Product\LinksList $linkList
      * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -89,7 +89,7 @@ class OptionRepository implements \Magento\Bundle\Api\ProductOptionRepositoryInt
         \Magento\Bundle\Model\Product\OptionList $productOptionList,
         \Magento\Bundle\Model\Product\LinksList $linkList,
         \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool
     ) {
         $this->metadataPool = $metadataPool;
         $this->productRepository = $productRepository;
diff --git a/app/code/Magento/Bundle/Model/Product/SaveHandler.php b/app/code/Magento/Bundle/Model/Product/SaveHandler.php
index b8acfabad8b7e95422ebf36b46aa5093663dae6c..b5855b6c433762f023f4904890d46d581122dc67 100644
--- a/app/code/Magento/Bundle/Model/Product/SaveHandler.php
+++ b/app/code/Magento/Bundle/Model/Product/SaveHandler.php
@@ -7,7 +7,7 @@
 namespace Magento\Bundle\Model\Product;
 
 use Magento\Bundle\Api\ProductOptionRepositoryInterface as OptionRepository;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\ResourceModel\Db\ProcessEntityRelationInterface;
 use Magento\Bundle\Api\ProductLinkManagementInterface;
 
diff --git a/app/code/Magento/Bundle/Model/ResourceModel/Option.php b/app/code/Magento/Bundle/Model/ResourceModel/Option.php
index aae17d2670cf9de637d9f517e1d08ad53aa848d1..8f522a048737d06b610e9cfab02a173ac50b99c1 100644
--- a/app/code/Magento/Bundle/Model/ResourceModel/Option.php
+++ b/app/code/Magento/Bundle/Model/ResourceModel/Option.php
@@ -6,7 +6,7 @@
 namespace Magento\Bundle\Model\ResourceModel;
 
 use Magento\Catalog\Api\Data\ProductInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Bundle Option Resource Model
diff --git a/app/code/Magento/Bundle/Model/ResourceModel/Selection.php b/app/code/Magento/Bundle/Model/ResourceModel/Selection.php
index b67f9c0f3143fd19fb2752e9be4618b9bc622ba0..0ddb82979ddc445858cee5f9d1ed5fb8d996dec9 100644
--- a/app/code/Magento/Bundle/Model/ResourceModel/Selection.php
+++ b/app/code/Magento/Bundle/Model/ResourceModel/Selection.php
@@ -6,7 +6,7 @@
 namespace Magento\Bundle\Model\ResourceModel;
 
 use Magento\Catalog\Api\Data\ProductInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\ResourceModel\Db\Context;
 
 /**
diff --git a/app/code/Magento/Bundle/Test/Unit/Model/LinkManagementTest.php b/app/code/Magento/Bundle/Test/Unit/Model/LinkManagementTest.php
index 35cdbd21e46dc3fa5390de8b39c4a0bbe2423b03..284873a762686ad40c828d6754c06bf169e4320a 100644
--- a/app/code/Magento/Bundle/Test/Unit/Model/LinkManagementTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Model/LinkManagementTest.php
@@ -100,7 +100,7 @@ class LinkManagementTest extends \PHPUnit_Framework_TestCase
     protected $dataObjectHelperMock;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPoolMock;
 
@@ -158,7 +158,7 @@ class LinkManagementTest extends \PHPUnit_Framework_TestCase
             '\Magento\Bundle\Model\ResourceModel\Option\CollectionFactory', ['create'], [], '', false
         );
         $this->storeManagerMock = $this->getMock('\Magento\Store\Model\StoreManagerInterface', [], [], '', false);
-        $this->metadataPoolMock = $this->getMockBuilder('\Magento\Framework\Model\Entity\MetadataPool')
+        $this->metadataPoolMock = $this->getMockBuilder('\Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
         $this->metadataMock = $this->getMockBuilder('\Magento\Framework\Model\Entity\EntityMetadata')
diff --git a/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php b/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php
index b53567c1fc090f578a80544c63adaedf9ef1b6a4..55fddb43d985e7c0a2e5bbfeb446875d51e66bf0 100644
--- a/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php
@@ -95,7 +95,7 @@ class OptionRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->linkManagementMock = $this->getMock('\Magento\Bundle\Api\ProductLinkManagementInterface');
         $this->optionListMock = $this->getMock('\Magento\Bundle\Model\Product\OptionList', [], [], '', false);
         $this->linkListMock = $this->getMock('\Magento\Bundle\Model\Product\LinksList', [], [], '', false);
-        $this->metadataPoolMock = $this->getMock('Magento\Framework\Model\Entity\MetadataPool', [], [], '', false);
+        $this->metadataPoolMock = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
 
         $this->model = new \Magento\Bundle\Model\OptionRepository(
             $this->productRepositoryMock,
diff --git a/app/code/Magento/Bundle/etc/di.xml b/app/code/Magento/Bundle/etc/di.xml
index c621c9f78f59d8d24ee730533d88dbdc5e3f9420..489cf98b67e8c80409609b1017109ef5cc6bb5e9 100644
--- a/app/code/Magento/Bundle/etc/di.xml
+++ b/app/code/Magento/Bundle/etc/di.xml
@@ -80,9 +80,9 @@
     <type name="Magento\Catalog\Model\Product">
         <plugin name="bundle" type="Magento\Bundle\Model\Plugin\Product" sortOrder="100" />
     </type>
-    <type name="Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool">
+    <type name="Magento\Framework\EntityManager\Operation\ExtensionPool">
         <arguments>
-            <argument name="relationActions" xsi:type="array">
+            <argument name="extensionActions" xsi:type="array">
                 <item name="Magento\Catalog\Api\Data\ProductInterface" xsi:type="array">
                     <item name="create" xsi:type="array">
                         <item name="create_bundle_options" xsi:type="string">Magento\Bundle\Model\Product\SaveHandler</item>
diff --git a/app/code/Magento/BundleImportExport/Test/Unit/Model/Import/Product/Type/BundleTest.php b/app/code/Magento/BundleImportExport/Test/Unit/Model/Import/Product/Type/BundleTest.php
index 8d88f4bcd54b9c5f4625c63723e9e36e9656895f..533e45afa99ad6bd4f8d75677d808e3281eaaf60 100644
--- a/app/code/Magento/BundleImportExport/Test/Unit/Model/Import/Product/Type/BundleTest.php
+++ b/app/code/Magento/BundleImportExport/Test/Unit/Model/Import/Product/Type/BundleTest.php
@@ -206,7 +206,7 @@ class BundleTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractIm
         $metadataMock->expects($this->any())
             ->method('getLinkField')
             ->willReturn('entity_id');
-        $metadataPoolMock = $this->getMock(\Magento\Framework\Model\Entity\MetadataPool::class, [], [], '', false);
+        $metadataPoolMock = $this->getMock(\Magento\Framework\EntityManager\MetadataPool::class, [], [], '', false);
         $metadataPoolMock->expects($this->any())
             ->method('getMetadata')
             ->with(\Magento\Catalog\Api\Data\ProductInterface::class)
diff --git a/app/code/Magento/Catalog/Console/Command/ProductAttributesCleanUp.php b/app/code/Magento/Catalog/Console/Command/ProductAttributesCleanUp.php
index c21902455e258ae3cdec0a03006890be6f6dfedf..e869e69f69bab1ca9fec1ca34428e08ccaa23f18 100644
--- a/app/code/Magento/Catalog/Console/Command/ProductAttributesCleanUp.php
+++ b/app/code/Magento/Catalog/Console/Command/ProductAttributesCleanUp.php
@@ -46,14 +46,14 @@ class ProductAttributesCleanUp extends \Symfony\Component\Console\Command\Comman
      * @param \Magento\Catalog\Model\ResourceModel\Attribute $attributeResource
      * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
      * @param \Magento\Framework\App\State $appState
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      */
     public function __construct(
         \Magento\Catalog\Api\ProductAttributeRepositoryInterface $productAttributeRepository,
         \Magento\Catalog\Model\ResourceModel\Attribute $attributeResource,
         \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
         \Magento\Framework\App\State $appState,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool
     ) {
         $this->productAttributeRepository = $productAttributeRepository;
         $this->searchCriteriaBuilder = $searchCriteriaBuilder;
diff --git a/app/code/Magento/Catalog/Model/Attribute/ScopeOverriddenValue.php b/app/code/Magento/Catalog/Model/Attribute/ScopeOverriddenValue.php
index 559bf8d6a259661a6120891a05cbcdfcec32595b..af76b2bac6f731ae7f5cc5391a345147bd44f488 100644
--- a/app/code/Magento/Catalog/Model/Attribute/ScopeOverriddenValue.php
+++ b/app/code/Magento/Catalog/Model/Attribute/ScopeOverriddenValue.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Catalog\Model\Attribute;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Eav\Api\AttributeRepositoryInterface as AttributeRepository;
 use Magento\Framework\Api\SearchCriteriaBuilder;
 use Magento\Framework\Api\FilterBuilder;
diff --git a/app/code/Magento/Catalog/Model/CategoryRepository.php b/app/code/Magento/Catalog/Model/CategoryRepository.php
index d9b1cb3fac1c23b3a74b17b602eb43da298c3e66..f9610c98d9bb55ea3e8217a50c52d15987195b44 100644
--- a/app/code/Magento/Catalog/Model/CategoryRepository.php
+++ b/app/code/Magento/Catalog/Model/CategoryRepository.php
@@ -38,7 +38,7 @@ class CategoryRepository implements \Magento\Catalog\Api\CategoryRepositoryInter
     protected $categoryResource;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -58,13 +58,13 @@ class CategoryRepository implements \Magento\Catalog\Api\CategoryRepositoryInter
      * @param \Magento\Catalog\Model\CategoryFactory $categoryFactory
      * @param \Magento\Catalog\Model\ResourceModel\Category $categoryResource
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      */
     public function __construct(
         \Magento\Catalog\Model\CategoryFactory $categoryFactory,
         \Magento\Catalog\Model\ResourceModel\Category $categoryResource,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool
     ) {
         $this->categoryFactory = $categoryFactory;
         $this->categoryResource = $categoryResource;
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
index f0697d95648484f018b74511579f5d36009cebf4..031579e5908b5d803528fe608c72e873a03ef7b8 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
@@ -9,7 +9,7 @@
 namespace Magento\Catalog\Model\Indexer\Category\Flat;
 
 use Magento\Framework\App\ResourceConnection;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class AbstractAction
 {
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php
index 4d5961809e61b44707c09b87bd0a4e92dba1fad6..64012901a6e4d3ee207c00288d25d583ca29938b 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php
@@ -7,7 +7,7 @@ namespace Magento\Catalog\Model\Indexer\Category\Flat\Action;
 
 use Magento\Catalog\Api\CategoryRepositoryInterface;
 use Magento\Framework\Exception\NoSuchEntityException;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class Rows extends \Magento\Catalog\Model\Indexer\Category\Flat\AbstractAction
 {
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
index b764f3d642ba137919bb7f2a92dce4534b249447..245f8f0d359ee29a26efbfb8a47b524903d54793 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
@@ -9,7 +9,7 @@
 namespace Magento\Catalog\Model\Indexer\Category\Product;
 
 use Magento\Framework\App\ResourceConnection;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class AbstractAction
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/AbstractAction.php
index ebb3ce35c03775f551a2002eb0b3f40b783e890d..98e8677c27b2602976f08ca0a26c2ad527219125 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/AbstractAction.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/AbstractAction.php
@@ -7,7 +7,7 @@ namespace Magento\Catalog\Model\Indexer\Product\Flat;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Framework\App\ResourceConnection;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Abstract action reindex class
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Indexer.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Indexer.php
index 1a650d2ea3f281dfacb9a6b5bfdb4ea976442a73..7eff5b5bab4e2a94a30d4d0be75d12107fcd416e 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Indexer.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Indexer.php
@@ -8,7 +8,7 @@ namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Framework\App\ResourceConnection;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class Indexer
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php
index 6f4091b1cc7568b4918cba0a60c2f3e66ef3af4a..e54faf70dfa92790854f410cff17780b8f8af910 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php
@@ -7,7 +7,7 @@ namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
 
 use Magento\Catalog\Model\Indexer\Product\Flat\FlatTableBuilder;
 use Magento\Catalog\Model\Indexer\Product\Flat\TableBuilder;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class Row reindex action
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Rows.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Rows.php
index 3153e2bfd54e62f8704c82d273e8de7f477ae7bd..010a3c8f23ae799c781254e9a7b1c28e4d959c7e 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Rows.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Rows.php
@@ -7,7 +7,7 @@ namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
 
 use Magento\Catalog\Model\Indexer\Product\Flat\FlatTableBuilder;
 use Magento\Catalog\Model\Indexer\Product\Flat\TableBuilder;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class Rows reindex action for mass actions
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/FlatTableBuilder.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/FlatTableBuilder.php
index 91a997486a82c207ca24777b44c42f03566b52d0..c83d07ddfefb325f01c9e314dd08f9c9bd5670fd 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/FlatTableBuilder.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/FlatTableBuilder.php
@@ -7,7 +7,7 @@ namespace Magento\Catalog\Model\Indexer\Product\Flat;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Framework\App\ResourceConnection;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class FlatTableBuilder
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/TableBuilder.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/TableBuilder.php
index ad5583739fd20a32fef36d3c8667a4c53295fe8a..e7f268b82cab717a37b4e2c8e84643c6014e825a 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/TableBuilder.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/TableBuilder.php
@@ -23,7 +23,7 @@ class TableBuilder
     protected $_connection;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -42,12 +42,12 @@ class TableBuilder
     /**
      * @param \Magento\Catalog\Helper\Product\Flat\Indexer $productIndexerHelper
      * @param \Magento\Framework\App\ResourceConnection $resource
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      */
     public function __construct(
         \Magento\Catalog\Helper\Product\Flat\Indexer $productIndexerHelper,
         \Magento\Framework\App\ResourceConnection $resource,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool
     ) {
         $this->_productIndexerHelper = $productIndexerHelper;
         $this->resource = $resource;
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php
index b33f10728a29f9f0527103b908b9abff5fca7e04..9bdcb66d771701e94e91bd10c6d92ace55e40676 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php
@@ -20,7 +20,7 @@ use Magento\Customer\Api\GroupManagementInterface;
 abstract class AbstractGroupPrice extends Price
 {
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -59,7 +59,7 @@ abstract class AbstractGroupPrice extends Price
      * @param \Magento\Framework\Locale\FormatInterface $localeFormat
      * @param \Magento\Catalog\Model\Product\Type $catalogProductType
      * @param GroupManagementInterface $groupManagement
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      */
     public function __construct(
         \Magento\Directory\Model\CurrencyFactory $currencyFactory,
@@ -69,7 +69,7 @@ abstract class AbstractGroupPrice extends Price
         \Magento\Framework\Locale\FormatInterface $localeFormat,
         \Magento\Catalog\Model\Product\Type $catalogProductType,
         GroupManagementInterface $groupManagement,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool
     ) {
         $this->_catalogProductType = $catalogProductType;
         $this->_groupManagement = $groupManagement;
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Tierprice.php b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Tierprice.php
index 385bd154547a47efdaa164d53d525b7f36c28e54..028f6649a6e96caf7eb6f1766d8e313b075b4ed4 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Tierprice.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Tierprice.php
@@ -28,7 +28,7 @@ class Tierprice extends \Magento\Catalog\Model\Product\Attribute\Backend\GroupPr
      * @param \Magento\Framework\Locale\FormatInterface $localeFormat
      * @param \Magento\Catalog\Model\Product\Type $catalogProductType
      * @param \Magento\Customer\Api\GroupManagementInterface $groupManagement
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Tierprice $productAttributeTierprice
      */
     public function __construct(
@@ -39,7 +39,7 @@ class Tierprice extends \Magento\Catalog\Model\Product\Attribute\Backend\GroupPr
         \Magento\Framework\Locale\FormatInterface $localeFormat,
         \Magento\Catalog\Model\Product\Type $catalogProductType,
         \Magento\Customer\Api\GroupManagementInterface $groupManagement,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Tierprice $productAttributeTierprice
     ) {
         $this->_productAttributeBackendTierprice = $productAttributeTierprice;
diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
index 9ae268298c687957e8f0cd266862b259e83c4236..05d879077702571249c7a107e48b5a02fd776501 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
@@ -57,7 +57,7 @@ class CreateHandler
     protected $fileStorageDb;
 
     /**
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository
      * @param \Magento\Catalog\Model\ResourceModel\Product\Gallery $resourceModel
      * @param \Magento\Framework\Json\Helper\Data $jsonHelper
@@ -66,7 +66,7 @@ class CreateHandler
      * @param \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageDb
      */
     public function __construct(
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository,
         \Magento\Catalog\Model\ResourceModel\Product\Gallery $resourceModel,
         \Magento\Framework\Json\Helper\Data $jsonHelper,
diff --git a/app/code/Magento/Catalog/Model/Product/Link/SaveHandler.php b/app/code/Magento/Catalog/Model/Product/Link/SaveHandler.php
index 6c28187c56d3387f6e6898ecc2a979fa148ecace..eca1195726e7e81ee0a48b6fc0d9711a3055d929 100644
--- a/app/code/Magento/Catalog/Model/Product/Link/SaveHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Link/SaveHandler.php
@@ -8,7 +8,7 @@ namespace Magento\Catalog\Model\Product\Link;
 
 use Magento\Catalog\Api\ProductLinkRepositoryInterface;
 use Magento\Catalog\Model\ResourceModel\Product\Link;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class SaveProductLinks
diff --git a/app/code/Magento/Catalog/Model/Product/Option.php b/app/code/Magento/Catalog/Model/Product/Option.php
index 9358afbf7595c935c159856ef6c592d82030f742..96a1cc1f55f442bd2be652d08ade4fc98176f5a8 100644
--- a/app/code/Magento/Catalog/Model/Product/Option.php
+++ b/app/code/Magento/Catalog/Model/Product/Option.php
@@ -15,7 +15,7 @@ use Magento\Catalog\Model\ResourceModel\Product\Option\Value\Collection;
 use Magento\Catalog\Pricing\Price\BasePrice;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Model\AbstractExtensibleModel;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Catalog product option model
diff --git a/app/code/Magento/Catalog/Model/Product/Option/ReadHandler.php b/app/code/Magento/Catalog/Model/Product/Option/ReadHandler.php
index d6b1bb52e2f928677f880f55b1a5b2218f1effe2..b32cce86b818b475136a448c10877fff3ff8beb7 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/ReadHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/ReadHandler.php
@@ -8,7 +8,7 @@ namespace Magento\Catalog\Model\Product\Option;
 
 use Magento\Catalog\Api\ProductCustomOptionRepositoryInterface;
 use Magento\Catalog\Model\Product\OptionFactory;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class ReadHandler
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Repository.php b/app/code/Magento/Catalog/Model/Product/Option/Repository.php
index 27ed79489f1e95ef6c5051b5ee71db78e1025e6e..69b91ba8ccd25f2302c64d796782786233e5c415 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Repository.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Repository.php
@@ -9,7 +9,7 @@ namespace Magento\Catalog\Model\Product\Option;
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\NoSuchEntityException;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class Repository
diff --git a/app/code/Magento/Catalog/Model/Product/Option/SaveHandler.php b/app/code/Magento/Catalog/Model/Product/Option/SaveHandler.php
index 970267e25fb058015b22ee23f83ce65c677acd71..0d416e26313248cf63b53ec4281bc7c2db713e10 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/SaveHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/SaveHandler.php
@@ -7,7 +7,7 @@
 namespace Magento\Catalog\Model\Product\Option;
 
 use Magento\Catalog\Api\ProductCustomOptionRepositoryInterface as OptionRepository;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class SaveHandler
diff --git a/app/code/Magento/Catalog/Model/ProductLink/Repository.php b/app/code/Magento/Catalog/Model/ProductLink/Repository.php
index 41a0d01e1add2d49222758d33a2e7b37742518fb..5f73ff2201eb3973266fb6079cca24552a611751 100644
--- a/app/code/Magento/Catalog/Model/ProductLink/Repository.php
+++ b/app/code/Magento/Catalog/Model/ProductLink/Repository.php
@@ -14,7 +14,7 @@ use Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks as LinksIni
 use Magento\Catalog\Model\Product\LinkTypeProvider;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\NoSuchEntityException;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class Repository
diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index 76d048ebf2e984083e6f2f60788a99f93c280084..f2eea159f98279489f773a8ef3b13c6c54dedd0b 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -487,7 +487,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
             $productLinks = $product->getProductLinks();
         }
         $productDataArray['store_id'] = (int)$this->storeManager->getStore()->getId();
-        $product = $this->initializeProductData($productDataArray, empty($existingProduct));
+//        $product = $this->initializeProductData($productDataArray, empty($existingProduct));
 
         $this->processLinks($product, $productLinks);
         if (isset($productDataArray['media_gallery_entries'])) {
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Attribute.php b/app/code/Magento/Catalog/Model/ResourceModel/Attribute.php
index d94c3122b89eb362b1eb8ded2867cb3e2772d882..27cd0b69affc5e6a81f844e2286418b490d65fe9 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Attribute.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Attribute.php
@@ -28,7 +28,7 @@ class Attribute extends \Magento\Eav\Model\ResourceModel\Entity\Attribute
     protected $attrLockValidator;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -38,7 +38,7 @@ class Attribute extends \Magento\Eav\Model\ResourceModel\Entity\Attribute
      * @param \Magento\Eav\Model\ResourceModel\Entity\Type $eavEntityType
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param LockValidatorInterface $lockValidator
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param string $connectionName
      */
     public function __construct(
@@ -47,7 +47,7 @@ class Attribute extends \Magento\Eav\Model\ResourceModel\Entity\Attribute
         \Magento\Eav\Model\ResourceModel\Entity\Type $eavEntityType,
         \Magento\Eav\Model\Config $eavConfig,
         LockValidatorInterface $lockValidator,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         $connectionName = null
     ) {
         $this->attrLockValidator = $lockValidator;
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Category.php b/app/code/Magento/Catalog/Model/ResourceModel/Category.php
index 81fbdf051f976d543ace8cc9cc19d51742717ad0..c0cb0e65d6cabb1bdb38d186276d48d5fd613de5 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Category.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Category.php
@@ -1000,7 +1000,7 @@ class Category extends AbstractResource
         $this->_attributes = [];
         $this->loadAttributesMetadata($attributes);
         $object = $this->entityManager->load(CategoryInterface::class, $object, $entityId);
-        if (!$this->entityManager->has(\Magento\Catalog\Api\Data\CategoryInterface::class, $entityId)) {
+        if (!$this->entityManager->has(\Magento\Catalog\Api\Data\CategoryInterface::class, $object)) {
             $object->isObjectNew(true);
         }
         return $this;
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Category/Tree.php b/app/code/Magento/Catalog/Model/ResourceModel/Category/Tree.php
index 02abcbd944e6245a080934abff9aad569c1ec968..acb327348b79078f8c890c53bb6ed738c467ef23 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Category/Tree.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Category/Tree.php
@@ -7,7 +7,7 @@ namespace Magento\Catalog\Model\ResourceModel\Category;
 
 use Magento\Framework\Data\Tree\Dbp;
 use Magento\Catalog\Api\Data\CategoryInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php
index 2b6bc4c1ca8065690b60d33ba06f3f063b6851a9..3a9c3b27af87f50881993a3b72844be2975fc2fd 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php
@@ -13,7 +13,7 @@ use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
 use Magento\Customer\Api\GroupManagementInterface;
 use Magento\Framework\DB\Select;
 use Magento\Store\Model\Store;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Catalog\Api\Data\CategoryInterface;
 
 /**
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Gallery.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Gallery.php
index a25332c17e35f81d9b11e8cb3fbf6c819a072152..2e2d0a1d7239df23d776227389dd698690470859 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Gallery.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Gallery.php
@@ -27,12 +27,12 @@ class Gallery extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 
     /**
      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param string $connectionName
      */
     public function __construct(
         \Magento\Framework\Model\ResourceModel\Db\Context $context,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         $connectionName = null
     ) {
         $this->metadata = $metadataPool->getMetadata(
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/AbstractIndexer.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/AbstractIndexer.php
index 93dd5642f135301799fc8f70e90617b4fa568a91..946d5dd0995351a7e16a98b6550345ec1d646a68 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/AbstractIndexer.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/AbstractIndexer.php
@@ -22,7 +22,7 @@ abstract class AbstractIndexer extends \Magento\Indexer\Model\ResourceModel\Abst
     protected $_eavConfig;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -32,14 +32,14 @@ abstract class AbstractIndexer extends \Magento\Indexer\Model\ResourceModel\Abst
      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
      * @param \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy
      * @param \Magento\Eav\Model\Config $eavConfig
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param string $connectionName
      */
     public function __construct(
         \Magento\Framework\Model\ResourceModel\Db\Context $context,
         \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy,
         \Magento\Eav\Model\Config $eavConfig,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         $connectionName = null
     ) {
         $this->_eavConfig = $eavConfig;
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/AbstractEav.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/AbstractEav.php
index ec7982c03b60aed4b487d2766ad3563f485317dd..53067a457b6eb765bcfee0c976a8dca3353b499d 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/AbstractEav.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/AbstractEav.php
@@ -27,7 +27,7 @@ abstract class AbstractEav extends \Magento\Catalog\Model\ResourceModel\Product\
      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
      * @param \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy
      * @param \Magento\Eav\Model\Config $eavConfig
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param string $connectionName
      */
@@ -35,7 +35,7 @@ abstract class AbstractEav extends \Magento\Catalog\Model\ResourceModel\Product\
         \Magento\Framework\Model\ResourceModel\Db\Context $context,
         \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy,
         \Magento\Eav\Model\Config $eavConfig,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Framework\Event\ManagerInterface $eventManager,
         $connectionName = null
     ) {
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/Source.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/Source.php
index a8c1da0403795994145b295c6ea7fb6d09cb40ec..e2e58cb65fa3fde32336bf7651b89d574a2a417c 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/Source.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/Source.php
@@ -29,7 +29,7 @@ class Source extends AbstractEav
      * @param \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper
      * @param string $connectionName
      */
@@ -37,7 +37,7 @@ class Source extends AbstractEav
         \Magento\Framework\Model\ResourceModel\Db\Context $context,
         \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy,
         \Magento\Eav\Model\Config $eavConfig,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Framework\Event\ManagerInterface $eventManager,
         \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper,
         $connectionName = null
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Price/DefaultPrice.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Price/DefaultPrice.php
index 9f1a9d19ea5d26ec1f338ce61f20371919a1d368..b5ce6dd3c5a05ea0d1fb59dc1bcb4b85977d8050 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Price/DefaultPrice.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Price/DefaultPrice.php
@@ -49,7 +49,7 @@ class DefaultPrice extends AbstractIndexer implements PriceInterface
      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
      * @param \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy
      * @param \Magento\Eav\Model\Config $eavConfig
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Framework\Module\Manager $moduleManager
      * @param string $connectionName
@@ -58,7 +58,7 @@ class DefaultPrice extends AbstractIndexer implements PriceInterface
         \Magento\Framework\Model\ResourceModel\Db\Context $context,
         \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy,
         \Magento\Eav\Model\Config $eavConfig,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Framework\Event\ManagerInterface $eventManager,
         \Magento\Framework\Module\Manager $moduleManager,
         $connectionName = null
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/DeleteHandler.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/DeleteHandler.php
index 14917de08c30bf4c71fcbf7c624fa227cac98df1..e0e707fc7478500fbc75e3ad5a57b5893ad50b99 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/DeleteHandler.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/DeleteHandler.php
@@ -10,7 +10,7 @@ use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Catalog\Api\ProductRepositoryInterface;
 use Magento\Catalog\Model\Product\LinkTypeProvider;
 use Magento\Catalog\Model\ResourceModel\Product\Link;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Framework\Exception\CouldNotDeleteException;
 
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php
index 6637d3f508e9f6c5354b2c178fbd6848929fe9a1..1f2c036c13c292c0fa3f9217935f8c338bea0dba 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php
@@ -7,7 +7,7 @@ namespace Magento\Catalog\Model\ResourceModel\Product\Link\Product;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Customer\Api\GroupManagementInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Catalog product linked products collection
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/SaveHandler.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/SaveHandler.php
index 42276130be82d1af22a362cede569d972f03d74b..50cc89a66049fee84876a2b0642878ec9ca5bb0d 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/SaveHandler.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/SaveHandler.php
@@ -10,7 +10,7 @@ use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Catalog\Api\ProductRepositoryInterface;
 use Magento\Catalog\Model\Product\LinkTypeProvider;
 use Magento\Catalog\Model\ResourceModel\Product\Link;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Reflection\DataObjectProcessor;
 use Magento\Framework\Exception\CouldNotSaveException;
 
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Option.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Option.php
index 8bfbda1e4b10ace50225da570e66ea387645d398..79245f340ea0304dbe4918f9dfcb3dee76003765 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Option.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Option.php
@@ -16,7 +16,7 @@ use Magento\Catalog\Api\Data\ProductInterface;
 class Option extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 {
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -48,7 +48,7 @@ class Option extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
      * @param \Magento\Directory\Model\CurrencyFactory $currencyFactory
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $config
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param string $connectionName
      */
     public function __construct(
@@ -56,7 +56,7 @@ class Option extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
         \Magento\Directory\Model\CurrencyFactory $currencyFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Framework\App\Config\ScopeConfigInterface $config,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         $connectionName = null
     ) {
         $this->_currencyFactory = $currencyFactory;
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php
index 97d4ee16c322dba41e2c35a655542cd1bd9bd269..eae8e1a32d348247178ae8e4b28f5feda055bc08 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php
@@ -22,7 +22,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
     protected $joinProcessor;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -47,7 +47,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Catalog\Model\ResourceModel\Product\Option\Value\CollectionFactory $optionValueCollectionFactory
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param JoinProcessorInterface $joinProcessor
      * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
      * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
@@ -60,7 +60,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         \Magento\Framework\Event\ManagerInterface $eventManager,
         \Magento\Catalog\Model\ResourceModel\Product\Option\Value\CollectionFactory $optionValueCollectionFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         JoinProcessorInterface $joinProcessor,
         \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
         \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Url.php b/app/code/Magento/Catalog/Model/ResourceModel/Url.php
index bff384d42defb4c0bfbec3047db67462f1b0db33..8cc19060182cb08c870898441277b6d75c1a7e6e 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Url.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Url.php
@@ -12,7 +12,7 @@ namespace Magento\Catalog\Model\ResourceModel;
  */
 use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
 use Magento\Catalog\Api\Data\CategoryInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class Url
diff --git a/app/code/Magento/Catalog/Setup/Recurring.php b/app/code/Magento/Catalog/Setup/Recurring.php
index c5a3f6972b4192583b4c09a8f42bfbe244dc0fb4..7cdacd5f658069d8e182cfd919c9f3ce207e3ed6 100644
--- a/app/code/Magento/Catalog/Setup/Recurring.php
+++ b/app/code/Magento/Catalog/Setup/Recurring.php
@@ -6,7 +6,7 @@
 namespace Magento\Catalog\Setup;
 
 use Magento\Catalog\Api\Data\CategoryInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Setup\ExternalFKSetup;
 use Magento\Framework\Setup\InstallSchemaInterface;
 use Magento\Framework\Setup\ModuleContextInterface;
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php
index e376be9d1fcfa9531a77b24cec698249c6b647c6..eae842a67d75a611751f96d7193bdee1e807ede9 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php
@@ -38,7 +38,7 @@ class CategoryRepositoryTest extends \PHPUnit_Framework_TestCase
     protected $storeManagerMock;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPoolMock;
 
@@ -77,7 +77,7 @@ class CategoryRepositoryTest extends \PHPUnit_Framework_TestCase
             ->willReturn('entity_id');
 
         $this->metadataPoolMock = $this->getMock(
-            'Magento\Framework\Model\Entity\MetadataPool',
+            'Magento\Framework\EntityManager\MetadataPool',
             [],
             [],
             '',
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Backend/GroupPrice/AbstractTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Backend/GroupPrice/AbstractTest.php
index 6535e5ee73865ff7e8eecf4e6a936d2d7c28941f..85a345ef7f09f2180393a837c8bb95b877d2ab9b 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Backend/GroupPrice/AbstractTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Backend/GroupPrice/AbstractTest.php
@@ -30,7 +30,7 @@ class AbstractTest extends \PHPUnit_Framework_TestCase
         $configMock = $this->getMock('Magento\Framework\App\Config\ScopeConfigInterface');
         $localeFormatMock = $this->getMock('\Magento\Framework\Locale\FormatInterface', [], [], '', false);
         $groupManagement = $this->getMock('Magento\Customer\Api\GroupManagementInterface', [], [], '', false);
-        $metadataPool = $this->getMock('Magento\Framework\Model\Entity\MetadataPool', [], [], '', false);
+        $metadataPool = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
         $this->_model = $this->getMockForAbstractClass(
             'Magento\Catalog\Model\Product\Attribute\Backend\GroupPrice\AbstractGroupPrice',
             [
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Option/RepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Option/RepositoryTest.php
index e95ca147c101c279c952baa1a2072b77a96ca9d3..979d49f723fbbd81e7b49518da9e96599b5f65c4 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Option/RepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Option/RepositoryTest.php
@@ -62,7 +62,7 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $metadataPool = $this->getMockBuilder('Magento\Framework\Model\Entity\MetadataPool')
+        $metadataPool = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
         $metadata = $this->getMockBuilder('Magento\Framework\Model\Entity\EntityMetadata')
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php
index c4b773d53f08fbc17963db4d28891795e3428272..98fd695fad0411094cf83a95dff2726bd2391271 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php
@@ -78,7 +78,7 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
         $this->metadataPoolMock = $this->getMock(
-            'Magento\Framework\Model\Entity\MetadataPool',
+            'Magento\Framework\EntityManager\MetadataPool',
             [],
             [],
             '',
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Category/TreeTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Category/TreeTest.php
index 6073db335fe533c8a442ba7ec9d4debe98cb4b34..952cef1d21c90a6caa9a0954f1f0102d279f8327 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Category/TreeTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Category/TreeTest.php
@@ -10,7 +10,7 @@ namespace Magento\Catalog\Test\Unit\Model\ResourceModel\Category;
 
 use Magento\Catalog\Api\Data\CategoryInterface;
 use Magento\Framework\Model\Entity\EntityMetadata;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class TreeTest extends \PHPUnit_Framework_TestCase
 {
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/GalleryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/GalleryTest.php
index 26e3eec00ebd882b6d5534b7ddf66a42cbc50ee1..ed584f337c41aa08ea5627ae43a9d3cf644e6339 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/GalleryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/GalleryTest.php
@@ -77,7 +77,7 @@ class GalleryTest extends \PHPUnit_Framework_TestCase
             ->willReturn($this->connection);
 
         $metadataPool = $this->getMock(
-            'Magento\Framework\Model\Entity\MetadataPool',
+            'Magento\Framework\EntityManager\MetadataPool',
             [],
             [],
             '',
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Option/CollectionTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Option/CollectionTest.php
index a262e41192a303be2090a91cde49e99c357dc762..e03462e13e23701d50f8d8286bf67562bf062ce3 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Option/CollectionTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Option/CollectionTest.php
@@ -18,7 +18,7 @@ use \Magento\Catalog\Model\ResourceModel\Product\Option\Value;
 class CollectionTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPoolMock;
 
@@ -128,7 +128,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
                 'catalog_product_entity',
                 'catalog_product_entity'
             );
-        $this->metadataPoolMock = $this->getMock('Magento\Framework\Model\Entity\MetadataPool', [], [], '', false);
+        $this->metadataPoolMock = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
         $metadata = $this->getMock('Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
         $metadata->expects($this->any())->method('getLinkField')->willReturn('id');
         $this->metadataPoolMock->expects($this->any())->method('getMetadata')->willReturn($metadata);
diff --git a/app/code/Magento/Catalog/etc/di.xml b/app/code/Magento/Catalog/etc/di.xml
index 0bc3785b6f29c51cbd3b7db0000e3c4489d3c27a..c10916831ca9593bcaa8ae5b76106ce8c3aa7972 100644
--- a/app/code/Magento/Catalog/etc/di.xml
+++ b/app/code/Magento/Catalog/etc/di.xml
@@ -550,19 +550,7 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\OrchestratorPool">
-        <arguments>
-            <argument name="operations" xsi:type="array">
-                <item name="default" xsi:type="array">
-                    <item name="read" xsi:type="string">Magento\Framework\Model\Operation\Read</item>
-                    <item name="create" xsi:type="string">Magento\Framework\Model\Operation\Write\Create</item>
-                    <item name="update" xsi:type="string">Magento\Framework\Model\Operation\Write\Update</item>
-                    <item name="delete" xsi:type="string">Magento\Framework\Model\Operation\Write\Delete</item>
-                </item>
-            </argument>
-        </arguments>
-    </type>
-    <type name="Magento\Framework\Model\Entity\MetadataPool">
+    <type name="Magento\Framework\EntityManager\MetadataPool">
         <arguments>
             <argument name="metadata" xsi:type="array">
                 <item name="Magento\Catalog\Api\Data\ProductInterface" xsi:type="array">
@@ -584,9 +572,9 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool">
+    <type name="Magento\Framework\EntityManager\Operation\ExtensionPool">
         <arguments>
-            <argument name="relationActions" xsi:type="array">
+            <argument name="extensionActions" xsi:type="array">
                 <item name="Magento\Catalog\Api\Data\ProductInterface" xsi:type="array">
                     <item name="read" xsi:type="array">
                         <item name="optionReader" xsi:type="string">Magento\Catalog\Model\Product\Option\ReadHandler</item>
diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
index 2eecefb43346f4b303a7d71c54796bd8db162661..3557f7d52e3eec3030be154691516aaa42ed7923 100644
--- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php
+++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
@@ -311,7 +311,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     ];
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -1343,13 +1343,13 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Get product metadata pool
      *
-     * @return \Magento\Framework\Model\Entity\MetadataPool
+     * @return \Magento\Framework\EntityManager\MetadataPool
      */
     private function getMetadataPool()
     {
         if (!$this->metadataPool) {
             $this->metadataPool = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get(\Magento\Framework\Model\Entity\MetadataPool::class);
+                ->get(\Magento\Framework\EntityManager\MetadataPool::class);
         }
         return $this->metadataPool;
     }
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/SkuProcessor.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/SkuProcessor.php
index 6d5fa576871d2403c4ab55f095b6cdad96fe584c..49bb8dbec0e0ed5c502ecb0aac3d950efc725878 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/SkuProcessor.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/SkuProcessor.php
@@ -39,7 +39,7 @@ class SkuProcessor
     /**
      * Product metadata pool
      *
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     private $metadataPool;
 
@@ -167,13 +167,13 @@ class SkuProcessor
     /**
      * Get product metadata pool
      *
-     * @return \Magento\Framework\Model\Entity\MetadataPool
+     * @return \Magento\Framework\EntityManager\MetadataPool
      */
     private function getMetadataPool()
     {
         if (!$this->metadataPool) {
             $this->metadataPool = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get(\Magento\Framework\Model\Entity\MetadataPool::class);
+                ->get(\Magento\Framework\EntityManager\MetadataPool::class);
         }
         return $this->metadataPool;
     }
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php
index 4e04bf6a257276ece0614f2305c103ebe205607c..c82089097f1c00c17aee985f92be0ead2214dd53 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php
@@ -130,7 +130,7 @@ abstract class AbstractType
     /**
      * Product metadata pool
      *
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -542,13 +542,13 @@ abstract class AbstractType
     /**
      * Get product metadata pool
      *
-     * @return \Magento\Framework\Model\Entity\MetadataPool
+     * @return \Magento\Framework\EntityManager\MetadataPool
      */
     protected function getMetadataPool()
     {
         if (!$this->metadataPool) {
             $this->metadataPool = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get('Magento\Framework\Model\Entity\MetadataPool');
+                ->get('Magento\Framework\EntityManager\MetadataPool');
         }
         return $this->metadataPool;
     }
diff --git a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php
index 0414892ebead74d45a5fb21fa3db316e42f80252..39ef2baa2c08731976810c37af2062d81bd0a438 100644
--- a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php
+++ b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php
@@ -99,7 +99,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
     protected $rowCustomizer;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPool;
 
@@ -276,7 +276,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
             false
         );
         $this->metadataPool = $this->getMock(
-            '\Magento\Framework\Model\Entity\MetadataPool',
+            '\Magento\Framework\EntityManager\MetadataPool',
             [],
             [],
             '',
diff --git a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/Product/Type/OptionTest.php b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/Product/Type/OptionTest.php
index eb822e38b014d5f0ca342c2d72826911dc40faaa..2e4091ac1070d605d8913024bdce8e4b8e4754e9 100644
--- a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/Product/Type/OptionTest.php
+++ b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/Product/Type/OptionTest.php
@@ -209,7 +209,7 @@ class OptionTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractIm
     protected $errorAggregator;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPoolMock;
 
@@ -241,7 +241,7 @@ class OptionTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractIm
         $date = new \DateTime();
         $timezoneInterface->expects($this->any())->method('date')->willReturn($date);
         $this->metadataPoolMock = $this->getMock(
-            \Magento\Framework\Model\Entity\MetadataPool::class,
+            \Magento\Framework\EntityManager\MetadataPool::class,
             [],
             [],
             '',
diff --git a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php
index c19551bfa094bf2627ffa0494565c71c7119ab9f..ca26379eb1910420859455ebce575606f0cf7598 100644
--- a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php
+++ b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php
@@ -167,7 +167,7 @@ class ProductTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractI
     {
         parent::setUp();
 
-        $metadataPoolMock = $this->getMock(\Magento\Framework\Model\Entity\MetadataPool::class, [], [], '', false);
+        $metadataPoolMock = $this->getMock(\Magento\Framework\EntityManager\MetadataPool::class, [], [], '', false);
         $entityMetadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
         $metadataPoolMock->expects($this->any())
             ->method('getMetadata')
diff --git a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php
index a3571b4d81431195b8f5075b70d139c205b4dd86..665b90acf494f1fd43ead56fa557d0e03663e547 100644
--- a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php
+++ b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php
@@ -11,7 +11,7 @@ use Magento\Catalog\Model\Product;
 use Magento\CatalogRule\Model\ResourceModel\Rule\CollectionFactory as RuleCollectionFactory;
 use Magento\CatalogRule\Model\Rule;
 use Magento\Framework\App\ResourceConnection;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Pricing\PriceCurrencyInterface;
 
 /**
@@ -22,7 +22,7 @@ class IndexBuilder
     const SECONDS_IN_DAY = 86400;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -106,7 +106,7 @@ class IndexBuilder
      * @param \Magento\Framework\Stdlib\DateTime\DateTime $dateTime
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
      * @param int $batchCount
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
diff --git a/app/code/Magento/CatalogRule/Model/ResourceModel/ReadHandler.php b/app/code/Magento/CatalogRule/Model/ResourceModel/ReadHandler.php
index f38a0158a71aad398bbfd03430ba15d137d4441d..6701614f33a6671ffb0b60d05c5a93278fe757ed 100644
--- a/app/code/Magento/CatalogRule/Model/ResourceModel/ReadHandler.php
+++ b/app/code/Magento/CatalogRule/Model/ResourceModel/ReadHandler.php
@@ -6,7 +6,7 @@
 namespace Magento\CatalogRule\Model\ResourceModel;
 
 use Magento\CatalogRule\Model\ResourceModel\Rule;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class ReadHandler
 {
diff --git a/app/code/Magento/CatalogRule/Model/ResourceModel/SaveHandler.php b/app/code/Magento/CatalogRule/Model/ResourceModel/SaveHandler.php
index fabb45960109bfc94947c2ba51da840fa69a5579..565650b7718e269dc0a168394581d5432e16ac2c 100644
--- a/app/code/Magento/CatalogRule/Model/ResourceModel/SaveHandler.php
+++ b/app/code/Magento/CatalogRule/Model/ResourceModel/SaveHandler.php
@@ -6,7 +6,7 @@
 namespace Magento\CatalogRule\Model\ResourceModel;
 
 use Magento\CatalogRule\Model\ResourceModel\Rule;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class SaveHandler
 {
diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php
index f315ebf6c2d8661d238a21a8b46a864122aaaf19..8f427583957a00667761f6f5100dd17b46be1a3a 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php
@@ -69,7 +69,7 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase
     protected $connection;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPool;
 
@@ -142,7 +142,7 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase
             false
         );
         $this->select = $this->getMock('Magento\Framework\DB\Select', [], [], '', false);
-        $this->metadataPool = $this->getMock('Magento\Framework\Model\Entity\MetadataPool', [], [], '', false);
+        $this->metadataPool = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
         $metadata = $this->getMockBuilder('Magento\Framework\Model\Entity\EntityMetadata')
             ->disableOriginalConstructor()
             ->getMock();
diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
index b6be4762de6da49aad08f041ab936a94fb9e7983..33e553927f583809292b416aa93e366d70350c27 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
@@ -25,7 +25,7 @@ class ReadHandlerTest extends \PHPUnit_Framework_TestCase
     protected function setUp()
     {
         $this->resourceMock = $this->getMock('\Magento\CatalogRule\Model\ResourceModel\Rule', [], [], '', false);
-        $this->metadataMock = $this->getMock('\Magento\Framework\Model\Entity\MetadataPool', [], [], '', false);
+        $this->metadataMock = $this->getMock('\Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
         $this->subject = new \Magento\CatalogRule\Model\ResourceModel\ReadHandler(
             $this->resourceMock,
             $this->metadataMock
diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
index e108d1103be4be62995269c72bdb1e4b572588dd..29317f665c810f31bd027e527dd17801406cc1f6 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
@@ -25,7 +25,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
     protected function setUp()
     {
         $this->resourceMock = $this->getMock('\Magento\CatalogRule\Model\ResourceModel\Rule', [], [], '', false);
-        $this->metadataMock = $this->getMock('\Magento\Framework\Model\Entity\MetadataPool', [], [], '', false);
+        $this->metadataMock = $this->getMock('\Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
         $this->subject = new \Magento\CatalogRule\Model\ResourceModel\SaveHandler(
             $this->resourceMock,
             $this->metadataMock
diff --git a/app/code/Magento/CatalogRule/etc/di.xml b/app/code/Magento/CatalogRule/etc/di.xml
index cf0657e61702188b72ceb449835a8d117ec2f829..829b67319b8eaac87fc163e5866052c35cfdba2a 100644
--- a/app/code/Magento/CatalogRule/etc/di.xml
+++ b/app/code/Magento/CatalogRule/etc/di.xml
@@ -62,7 +62,7 @@
     </virtualType>
     <preference for="Magento\CatalogRule\Api\Data\RuleInterface" type="Magento\CatalogRule\Model\Rule" />
     <preference for="Magento\CatalogRule\Api\CatalogRuleRepositoryInterface" type="Magento\CatalogRule\Model\CatalogRuleRepository" />
-    <type name="Magento\Framework\Model\Entity\MetadataPool">
+    <type name="Magento\Framework\EntityManager\MetadataPool">
         <arguments>
             <argument name="metadata" xsi:type="array">
                 <item name="Magento\CatalogRule\Api\Data\RuleInterface" xsi:type="array">
@@ -75,11 +75,11 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\OrchestratorPool">
+    <type name="Magento\Framework\EntityManager\OperationPool">
         <arguments>
             <argument name="operations" xsi:type="array">
                 <item name="default" xsi:type="array">
-                    <item name="read" xsi:type="string">Magento\Framework\Model\Operation\Read</item>
+                    <item name="read" xsi:type="string">Magento\Framework\EntityManager\Operation\Read</item>
                     <item name="create" xsi:type="string">Magento\Framework\Model\Operation\Write\Create</item>
                     <item name="update" xsi:type="string">Magento\Framework\Model\Operation\Write\Update</item>
                     <item name="delete" xsi:type="string">Magento\Framework\Model\Operation\Write\Delete</item>
@@ -87,7 +87,7 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\ResourceModel\Db\ExtensionPool">
+    <type name="Magento\Framework\EntityManager\Operation\AttributePool">
         <arguments>
             <argument name="extensionActions" xsi:type="array">
                 <item name="catalogRule" xsi:type="array">
diff --git a/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Filter/Preprocessor.php b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Filter/Preprocessor.php
index f9622ecc715fbf3b54453c80a44c00b59cd6a7cf..f75cf0b520ff3630abe88702706007df8f3af218 100644
--- a/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Filter/Preprocessor.php
+++ b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Filter/Preprocessor.php
@@ -13,7 +13,7 @@ use Magento\Eav\Model\Config;
 use Magento\Framework\App\ResourceConnection;
 use Magento\Framework\App\ScopeResolverInterface;
 use Magento\Framework\DB\Adapter\AdapterInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Search\Adapter\Mysql\ConditionManager;
 use Magento\Framework\Search\Adapter\Mysql\Filter\PreprocessorInterface;
 use Magento\Framework\Search\Request\FilterInterface;
diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php
index 7d6370a2ca341a20241eb713ed35f0067f088e3a..c540daaf455566c546cf86ebd56609ac816ff224 100644
--- a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php
@@ -102,7 +102,7 @@ class DataProvider
      * @param \Magento\CatalogSearch\Model\ResourceModel\EngineProvider $engineProvider
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      */
     public function __construct(
         ResourceConnection $resource,
@@ -112,7 +112,7 @@ class DataProvider
         \Magento\CatalogSearch\Model\ResourceModel\EngineProvider $engineProvider,
         \Magento\Framework\Event\ManagerInterface $eventManager,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool
     ) {
         $this->resource = $resource;
         $this->connection = $resource->getConnection();
diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Filter/PreprocessorTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Filter/PreprocessorTest.php
index d298f619328bab3cff01849a1c6d83c7a6200462..b009d3a8299313d8e50a50e2bfd1b96df375d57a 100644
--- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Filter/PreprocessorTest.php
+++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Filter/PreprocessorTest.php
@@ -143,7 +143,7 @@ class PreprocessorTest extends \PHPUnit_Framework_TestCase
         $this->tableMapper = $this->getMockBuilder('\Magento\CatalogSearch\Model\Search\TableMapper')
             ->disableOriginalConstructor()
             ->getMock();
-        $this->metadataPoolMock = $this->getMockBuilder(\Magento\Framework\Model\Entity\MetadataPool::class)
+        $this->metadataPoolMock = $this->getMockBuilder(\Magento\Framework\EntityManager\MetadataPool::class)
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/app/code/Magento/CatalogUrlRewrite/Service/V1/StoreViewService.php b/app/code/Magento/CatalogUrlRewrite/Service/V1/StoreViewService.php
index b36b3e9a7263dabdf8d25043763d52e33777e2f8..0520bb62326d2bb4bc13fc2fcc4b82ff84c141aa 100644
--- a/app/code/Magento/CatalogUrlRewrite/Service/V1/StoreViewService.php
+++ b/app/code/Magento/CatalogUrlRewrite/Service/V1/StoreViewService.php
@@ -7,7 +7,7 @@ namespace Magento\CatalogUrlRewrite\Service\V1;
 
 use Magento\Eav\Model\Config;
 use Magento\Framework\App\ResourceConnection;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Catalog\Api\Data\ProductInterface;
 
 /**
diff --git a/app/code/Magento/CatalogUrlRewrite/Setup/Recurring.php b/app/code/Magento/CatalogUrlRewrite/Setup/Recurring.php
index 1fc00f70d08b60a0674890557e53cbe7d43e9c57..d50a59f322504f3a3f51227a986eb0ddbf3214c4 100644
--- a/app/code/Magento/CatalogUrlRewrite/Setup/Recurring.php
+++ b/app/code/Magento/CatalogUrlRewrite/Setup/Recurring.php
@@ -7,7 +7,7 @@ namespace Magento\CatalogUrlRewrite\Setup;
 
 use Magento\Catalog\Api\Data\CategoryInterface;
 use Magento\CatalogUrlRewrite\Model\ResourceModel\Category\Product as ResourceProduct;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Setup\ExternalFKSetup;
 use Magento\Framework\Setup\InstallSchemaInterface;
 use Magento\Framework\Setup\ModuleContextInterface;
diff --git a/app/code/Magento/Cms/Model/ResourceModel/AbstractCollection.php b/app/code/Magento/Cms/Model/ResourceModel/AbstractCollection.php
index b9f0f8006be30116de989ddd68da468686f38182..908556eae95280277c3d15003ffe876eb32e3f9e 100644
--- a/app/code/Magento/Cms/Model/ResourceModel/AbstractCollection.php
+++ b/app/code/Magento/Cms/Model/ResourceModel/AbstractCollection.php
@@ -18,7 +18,7 @@ abstract class AbstractCollection extends \Magento\Framework\Model\ResourceModel
     protected $storeManager;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -28,7 +28,7 @@ abstract class AbstractCollection extends \Magento\Framework\Model\ResourceModel
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
      * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb|null $resource
      */
@@ -38,7 +38,7 @@ abstract class AbstractCollection extends \Magento\Framework\Model\ResourceModel
         \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
         \Magento\Framework\Event\ManagerInterface $eventManager,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
         \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
     ) {
diff --git a/app/code/Magento/Cms/Model/ResourceModel/Block.php b/app/code/Magento/Cms/Model/ResourceModel/Block.php
index 76b04d1858e9c938e0defc5333553f34c7fe3e3f..7beea73451f9c6ad748cd5d806fb96bd3a98f3ad 100644
--- a/app/code/Magento/Cms/Model/ResourceModel/Block.php
+++ b/app/code/Magento/Cms/Model/ResourceModel/Block.php
@@ -9,7 +9,7 @@ use Magento\Cms\Api\Data\BlockInterface;
 use Magento\Framework\DB\Select;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Model\AbstractModel;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\EntityManager;
 use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
 use Magento\Framework\Model\ResourceModel\Db\Context;
diff --git a/app/code/Magento/Cms/Model/ResourceModel/Block/Grid/Collection.php b/app/code/Magento/Cms/Model/ResourceModel/Block/Grid/Collection.php
index d6cc7dc45bd37ec8729cc869638179d35284952f..0707d32f6b45d03d3aa8756b0286491f492bfd0e 100644
--- a/app/code/Magento/Cms/Model/ResourceModel/Block/Grid/Collection.php
+++ b/app/code/Magento/Cms/Model/ResourceModel/Block/Grid/Collection.php
@@ -25,7 +25,7 @@ class Collection extends BlockCollection implements SearchResultInterface
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param string $mainTable
      * @param string $eventPrefix
      * @param string $eventObject
@@ -42,7 +42,7 @@ class Collection extends BlockCollection implements SearchResultInterface
         \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
         \Magento\Framework\Event\ManagerInterface $eventManager,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         $mainTable,
         $eventPrefix,
         $eventObject,
diff --git a/app/code/Magento/Cms/Model/ResourceModel/Block/Relation/Store/ReadHandler.php b/app/code/Magento/Cms/Model/ResourceModel/Block/Relation/Store/ReadHandler.php
index 32e7ccd5452b02e7fcdca9de65eefe651fe53913..e34ed2e60e2a0030db026607f1733f4b3a0cb1e0 100644
--- a/app/code/Magento/Cms/Model/ResourceModel/Block/Relation/Store/ReadHandler.php
+++ b/app/code/Magento/Cms/Model/ResourceModel/Block/Relation/Store/ReadHandler.php
@@ -6,7 +6,7 @@
 namespace Magento\Cms\Model\ResourceModel\Block\Relation\Store;
 
 use Magento\Cms\Model\ResourceModel\Block;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class ReadHandler
 {
diff --git a/app/code/Magento/Cms/Model/ResourceModel/Block/Relation/Store/SaveHandler.php b/app/code/Magento/Cms/Model/ResourceModel/Block/Relation/Store/SaveHandler.php
index 0c5f11785dd2f23e92251a332a82639897ac8ba9..7fc60e7b79d87c7a49813e43727dd37477f4e460 100644
--- a/app/code/Magento/Cms/Model/ResourceModel/Block/Relation/Store/SaveHandler.php
+++ b/app/code/Magento/Cms/Model/ResourceModel/Block/Relation/Store/SaveHandler.php
@@ -6,7 +6,7 @@
 namespace Magento\Cms\Model\ResourceModel\Block\Relation\Store;
 
 use Magento\Cms\Model\ResourceModel\Block;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class SaveHandler
 {
diff --git a/app/code/Magento/Cms/Model/ResourceModel/Page.php b/app/code/Magento/Cms/Model/ResourceModel/Page.php
index 1b47bd8a909193aa24ed675e0d50918de31ebdeb..3e7ddd3d5d954b366b008177c51922282e50370d 100644
--- a/app/code/Magento/Cms/Model/ResourceModel/Page.php
+++ b/app/code/Magento/Cms/Model/ResourceModel/Page.php
@@ -10,7 +10,7 @@ use Magento\Cms\Model\Page as CmsPage;
 use Magento\Framework\DB\Select;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Model\AbstractModel;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
 use Magento\Framework\Model\ResourceModel\Db\Context;
 use Magento\Framework\Stdlib\DateTime;
diff --git a/app/code/Magento/Cms/Model/ResourceModel/Page/Grid/Collection.php b/app/code/Magento/Cms/Model/ResourceModel/Page/Grid/Collection.php
index 7dac815ba58b3320f33195df7b0dc09e633a67ab..422472be661d9f9d6e17db04cc1cafca403a3594 100644
--- a/app/code/Magento/Cms/Model/ResourceModel/Page/Grid/Collection.php
+++ b/app/code/Magento/Cms/Model/ResourceModel/Page/Grid/Collection.php
@@ -31,7 +31,7 @@ class Collection extends PageCollection implements SearchResultInterface
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param mixed|null $mainTable
      * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $eventPrefix
      * @param mixed $eventObject
@@ -48,7 +48,7 @@ class Collection extends PageCollection implements SearchResultInterface
         \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
         \Magento\Framework\Event\ManagerInterface $eventManager,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         $mainTable,
         $eventPrefix,
         $eventObject,
diff --git a/app/code/Magento/Cms/Model/ResourceModel/Page/Relation/Store/ReadHandler.php b/app/code/Magento/Cms/Model/ResourceModel/Page/Relation/Store/ReadHandler.php
index cc3edd8a98d03d62933bf6d51fcaf4c701ef819b..e9f4cc1584194a383afd2cc4bd53f98fedeaed62 100644
--- a/app/code/Magento/Cms/Model/ResourceModel/Page/Relation/Store/ReadHandler.php
+++ b/app/code/Magento/Cms/Model/ResourceModel/Page/Relation/Store/ReadHandler.php
@@ -6,7 +6,7 @@
 namespace Magento\Cms\Model\ResourceModel\Page\Relation\Store;
 
 use Magento\Cms\Model\ResourceModel\Page;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class ReadHandler
 {
diff --git a/app/code/Magento/Cms/Model/ResourceModel/Page/Relation/Store/SaveHandler.php b/app/code/Magento/Cms/Model/ResourceModel/Page/Relation/Store/SaveHandler.php
index 7bf832fdbc453fdefa1bb9242e57f7e4b5735f3e..e0f23d782880b50c4590129114c0d5ddb73a88e6 100644
--- a/app/code/Magento/Cms/Model/ResourceModel/Page/Relation/Store/SaveHandler.php
+++ b/app/code/Magento/Cms/Model/ResourceModel/Page/Relation/Store/SaveHandler.php
@@ -6,7 +6,7 @@
 namespace Magento\Cms\Model\ResourceModel\Page\Relation\Store;
 
 use Magento\Cms\Model\ResourceModel\Page;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class SaveHandler
 {
diff --git a/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Block/Relation/Store/ReadHandlerTest.php b/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Block/Relation/Store/ReadHandlerTest.php
index 724c01bd7c23f5653f5fb27f802f8fc8e576d435..f2275bd204c4ddd52c65ccb5a39ac1da64e364e5 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Block/Relation/Store/ReadHandlerTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Block/Relation/Store/ReadHandlerTest.php
@@ -7,7 +7,7 @@ namespace Magento\Cms\Test\Unit\Model\ResourceModel\Block\Relation\Store;
 
 use Magento\Cms\Model\ResourceModel\Block;
 use Magento\Cms\Model\ResourceModel\Block\Relation\Store\ReadHandler;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class ReadHandlerTest extends \PHPUnit_Framework_TestCase
 {
@@ -28,7 +28,7 @@ class ReadHandlerTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->metadataPool = $this->getMockBuilder('Magento\Framework\Model\Entity\MetadataPool')
+        $this->metadataPool = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Block/Relation/Store/SaveHandlerTest.php b/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Block/Relation/Store/SaveHandlerTest.php
index 704eed3984615cf803af4aad8511783e7eaaef12..8d3280ae262c7627f35b1a678c2d60591dcc9900 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Block/Relation/Store/SaveHandlerTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Block/Relation/Store/SaveHandlerTest.php
@@ -7,7 +7,7 @@ namespace Magento\Cms\Test\Unit\Model\ResourceModel\Block\Relation\Store;
 
 use Magento\Cms\Model\ResourceModel\Block;
 use Magento\Cms\Model\ResourceModel\Block\Relation\Store\SaveHandler;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class SaveHandlerTest extends \PHPUnit_Framework_TestCase
 {
@@ -28,7 +28,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->metadataPool = $this->getMockBuilder('Magento\Framework\Model\Entity\MetadataPool')
+        $this->metadataPool = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Page/Relation/Store/ReadHandlerTest.php b/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Page/Relation/Store/ReadHandlerTest.php
index 7e32e6f1c8a59ac2923791042362f13fd8cbb4fd..1159d7608634051fee29a7370dc18ea052270973 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Page/Relation/Store/ReadHandlerTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Page/Relation/Store/ReadHandlerTest.php
@@ -7,7 +7,7 @@ namespace Magento\Cms\Test\Unit\Model\ResourceModel\Page\Relation\Store;
 
 use Magento\Cms\Model\ResourceModel\Page;
 use Magento\Cms\Model\ResourceModel\Page\Relation\Store\ReadHandler;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class ReadHandlerTest extends \PHPUnit_Framework_TestCase
 {
@@ -28,7 +28,7 @@ class ReadHandlerTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->metadataPool = $this->getMockBuilder('Magento\Framework\Model\Entity\MetadataPool')
+        $this->metadataPool = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Page/Relation/Store/SaveHandlerTest.php b/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Page/Relation/Store/SaveHandlerTest.php
index 1a7a486d2530b41751941636b168cda706316b63..e948a67ec8176273c45daf8a4d874c505e9717f4 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Page/Relation/Store/SaveHandlerTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/ResourceModel/Page/Relation/Store/SaveHandlerTest.php
@@ -7,7 +7,7 @@ namespace Magento\Cms\Test\Unit\Model\ResourceModel\Page\Relation\Store;
 
 use Magento\Cms\Model\ResourceModel\Page;
 use Magento\Cms\Model\ResourceModel\Page\Relation\Store\SaveHandler;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class SaveHandlerTest extends \PHPUnit_Framework_TestCase
 {
@@ -28,7 +28,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->metadataPool = $this->getMockBuilder('Magento\Framework\Model\Entity\MetadataPool')
+        $this->metadataPool = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/app/code/Magento/Cms/etc/di.xml b/app/code/Magento/Cms/etc/di.xml
index d475a5833c1dd374510866f7428e6fdc221bd586..0cbc1b9c354dbbe04694092a452d2a868a5fb952 100644
--- a/app/code/Magento/Cms/etc/di.xml
+++ b/app/code/Magento/Cms/etc/di.xml
@@ -88,7 +88,7 @@
             </argument>
         </arguments>
     </virtualType>
-    <type name="Magento\Framework\Model\Entity\MetadataPool">
+    <type name="Magento\Framework\EntityManager\MetadataPool">
         <arguments>
             <argument name="metadata" xsi:type="array">
                 <item name="Magento\Cms\Api\Data\PageInterface" xsi:type="array">
@@ -102,9 +102,9 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool">
+    <type name="Magento\Framework\EntityManager\Operation\ExtensionPool">
         <arguments>
-            <argument name="relationActions" xsi:type="array">
+            <argument name="extensionActions" xsi:type="array">
                 <item name="Magento\Cms\Api\Data\PageInterface" xsi:type="array">
                     <item name="read" xsi:type="array">
                         <item name="storeReader" xsi:type="string">Magento\Cms\Model\ResourceModel\Page\Relation\Store\ReadHandler</item>
diff --git a/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php b/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php
index ec788551207522ccfc180f1f6fe94804b00954e1..d9b0cbb3e5325cd6e3685790b7b7d9bf6ae86a22 100644
--- a/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php
+++ b/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php
@@ -292,7 +292,7 @@ class ConfigurableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst
             'testattr3v3' => '6',
         ]));
 
-        $metadataPoolMock = $this->getMock(\Magento\Framework\Model\Entity\MetadataPool::class, [], [], '', false);
+        $metadataPoolMock = $this->getMock(\Magento\Framework\EntityManager\MetadataPool::class, [], [], '', false);
         $entityMetadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
         $metadataPoolMock->expects($this->any())
             ->method('getMetadata')
diff --git a/app/code/Magento/ConfigurableProduct/Model/Attribute/LockValidator.php b/app/code/Magento/ConfigurableProduct/Model/Attribute/LockValidator.php
index 4b086658d70f9af8bf9cd7b84417c76eec65478f..55b1c3ef5dbf8656a973d550316e36b7ea386ed4 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Attribute/LockValidator.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Attribute/LockValidator.php
@@ -7,7 +7,7 @@ namespace Magento\ConfigurableProduct\Model\Attribute;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Framework\App\ResourceConnection;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Catalog\Model\Attribute\LockValidatorInterface;
 
 /**
diff --git a/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php b/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php
index 27470ce03797b16d5bc20b35b2da892195fb321c..714a3a46c1b6b2ea4aaa3081c9ca1e07e3d5ebbb 100644
--- a/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php
+++ b/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php
@@ -17,7 +17,7 @@ use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\ConfigurableProduct\Model\Product\Type\Configurable as ConfigurableType;
 use Magento\Catalog\Model\Product\Type as ProductType;
 use Magento\Store\Model\Store;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
index b7c4a060bf7e4e685bec38bebe36d657662f130c..95816b7ee05cd64c217796241a2ac3c04e862730 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
@@ -6,7 +6,7 @@
 namespace Magento\ConfigurableProduct\Model\Product\Type;
 
 use Magento\Catalog\Api\Data\ProductInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Catalog\Api\ProductRepositoryInterface;
 
 /**
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
index 2afb897268a1b4f9fb466df0f7a382050acd2669..fa8c942639469ea574db385526a2277b954e3419 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
@@ -8,7 +8,7 @@
 namespace Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 
 use Magento\Framework\Api\AttributeValueFactory;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Catalog\Api\Data\ProductInterface;
 
 /**
diff --git a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable.php
index 1cdd974ef0b054d99929d0f3bb6c5189848ad91f..d32c610e2c0e75b96023b84e4e32d7e23142eea7 100644
--- a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable.php
@@ -22,7 +22,7 @@ class Configurable extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
     /**
      * Product metadata pool
      *
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     private $metadataPool;
 
@@ -256,13 +256,13 @@ class Configurable extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
     /**
      * Get product metadata pool
      *
-     * @return \Magento\Framework\Model\Entity\MetadataPool
+     * @return \Magento\Framework\EntityManager\MetadataPool
      */
     private function getMetadataPool()
     {
         if (!$this->metadataPool) {
             $this->metadataPool = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get(\Magento\Framework\Model\Entity\MetadataPool::class);
+                ->get(\Magento\Framework\EntityManager\MetadataPool::class);
         }
         return $this->metadataPool;
     }
diff --git a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php
index a88f34db5fe07dad06bb2503807ae27d9c9289ce..a6d9fdb9911f4d1800719e256af05eb57c21ffaa 100644
--- a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php
+++ b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php
@@ -8,7 +8,7 @@
 namespace Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Product;
 
 use Magento\Customer\Api\GroupManagementInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Catalog\Api\Data\ProductInterface;
 
 /**
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Attribute/LockValidatorTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Attribute/LockValidatorTest.php
index c5b30adcb606b49d8364b60b7963027d069568ce..65efeeca6467b7d951353aef5cd878cbafa8e4b1 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Attribute/LockValidatorTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Attribute/LockValidatorTest.php
@@ -8,7 +8,7 @@ namespace Magento\ConfigurableProduct\Test\Unit\Model\Attribute;
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Framework\App\ResourceConnection;
 use Magento\Framework\Model\Entity\EntityMetadata;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 
 class LockValidatorTest extends \PHPUnit_Framework_TestCase
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php
index 9c2bf6575f683682be8e4d2ee5ac98c57eaf3945..b45395e69cfe3f84be47c5f136ce093eac020409 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php
@@ -12,7 +12,7 @@ use Magento\Catalog\Api\Data\ProductExtensionInterface;
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 use Magento\Framework\Model\Entity\EntityMetadata;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class \Magento\ConfigurableProduct\Test\Unit\Model\Product\Type\ConfigurableTest
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/ResourceModel/Product/Type/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/ResourceModel/Product/Type/ConfigurableTest.php
index d12980c40aed3b9152a3534e6e36cbd9d93812eb..382ca5cc2ec28a20312da9f4fac445f8024af415 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/ResourceModel/Product/Type/ConfigurableTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/ResourceModel/Product/Type/ConfigurableTest.php
@@ -36,7 +36,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
     protected $relation;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPoolMock;
 
@@ -59,7 +59,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
         );
         $this->metadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
         $this->metadataPoolMock = $this->getMock(
-            \Magento\Framework\Model\Entity\MetadataPool::class,
+            \Magento\Framework\EntityManager\MetadataPool::class,
             [],
             [],
             '',
diff --git a/app/code/Magento/ConfigurableProduct/etc/di.xml b/app/code/Magento/ConfigurableProduct/etc/di.xml
index b3bfa1fb3111afb44d1a332a9323ec563ae8ad82..a87784da2f0b469dee50a682f93892d0d1aad47a 100644
--- a/app/code/Magento/ConfigurableProduct/etc/di.xml
+++ b/app/code/Magento/ConfigurableProduct/etc/di.xml
@@ -65,9 +65,9 @@
     <type name="Magento\Catalog\Model\Product\Type">
         <plugin name="configurable_output" type="Magento\ConfigurableProduct\Model\Product\Type\Plugin" />
     </type>
-    <type name="Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool">
+    <type name="Magento\Framework\EntityManager\Operation\ExtensionPool">
         <arguments>
-            <argument name="relationActions" xsi:type="array">
+            <argument name="extensionActions" xsi:type="array">
                 <item name="Magento\Catalog\Api\Data\ProductInterface" xsi:type="array">
                     <item name="create" xsi:type="array">
                         <item name="create_configurable_options" xsi:type="string">Magento\ConfigurableProduct\Model\Product\SaveHandler</item>
diff --git a/app/code/Magento/Downloadable/Model/LinkRepository.php b/app/code/Magento/Downloadable/Model/LinkRepository.php
index 1fb2f3276018c5148058755766a0e318e19d1d9c..ab06d3c4a6749c0c3e16deb03c481466cb94c0a5 100644
--- a/app/code/Magento/Downloadable/Model/LinkRepository.php
+++ b/app/code/Magento/Downloadable/Model/LinkRepository.php
@@ -13,7 +13,7 @@ use \Magento\Downloadable\Model\Product\Type as DownloadableType;
 use Magento\Downloadable\Model\Link\ContentValidator;
 use Magento\Downloadable\Helper\File;
 use Magento\Framework\Json\Helper\Data as JsonHelper;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Downloadable\Model\ResourceModel\Link as LinkResource;
 use Magento\Framework\Exception\InputException;
 use Magento\Framework\Exception\NoSuchEntityException;
diff --git a/app/code/Magento/Downloadable/Model/Product/TypeHandler/AbstractTypeHandler.php b/app/code/Magento/Downloadable/Model/Product/TypeHandler/AbstractTypeHandler.php
index ee8a4dbd104571f894b94a80c2b3d53f885738a8..fa1305dfef87684059810ae5a02a0534a06d72de 100644
--- a/app/code/Magento/Downloadable/Model/Product/TypeHandler/AbstractTypeHandler.php
+++ b/app/code/Magento/Downloadable/Model/Product/TypeHandler/AbstractTypeHandler.php
@@ -10,7 +10,7 @@ use Magento\Catalog\Model\Product;
 use Magento\Downloadable\Helper\File;
 use Magento\Downloadable\Model\ComponentInterface;
 use Magento\Framework\Json\Helper\Data;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class AbstractTypeHandler
diff --git a/app/code/Magento/Downloadable/Model/Product/TypeHandler/Link.php b/app/code/Magento/Downloadable/Model/Product/TypeHandler/Link.php
index 4e7ed29ad2cc5ae3cf0a691e96e0fdd7c380f6b5..ef48f4e81eb4e1330fe7d4146659a37b5c82d871 100644
--- a/app/code/Magento/Downloadable/Model/Product/TypeHandler/Link.php
+++ b/app/code/Magento/Downloadable/Model/Product/TypeHandler/Link.php
@@ -32,14 +32,14 @@ class Link extends AbstractTypeHandler
     /**
      * @param \Magento\Framework\Json\Helper\Data $jsonHelper
      * @param \Magento\Downloadable\Helper\File $downloadableFile
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Downloadable\Model\LinkFactory $linkFactory
      * @param \Magento\Downloadable\Model\ResourceModel\Link $linkResource
      */
     public function __construct(
         \Magento\Framework\Json\Helper\Data $jsonHelper,
         \Magento\Downloadable\Helper\File $downloadableFile,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Downloadable\Model\LinkFactory $linkFactory,
         \Magento\Downloadable\Model\ResourceModel\Link $linkResource
     ) {
diff --git a/app/code/Magento/Downloadable/Model/Product/TypeHandler/Sample.php b/app/code/Magento/Downloadable/Model/Product/TypeHandler/Sample.php
index 98d9135208fd59ef937baef1deda7e0c88da41b2..50fdc93ca47d8cbe28b534c50777c32f95be5c36 100644
--- a/app/code/Magento/Downloadable/Model/Product/TypeHandler/Sample.php
+++ b/app/code/Magento/Downloadable/Model/Product/TypeHandler/Sample.php
@@ -29,14 +29,14 @@ class Sample extends AbstractTypeHandler
     /**
      * @param \Magento\Framework\Json\Helper\Data $jsonHelper
      * @param \Magento\Downloadable\Helper\File $downloadableFile
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Downloadable\Model\SampleFactory $sampleFactory
      * @param \Magento\Downloadable\Model\ResourceModel\SampleFactory $sampleResourceFactory
      */
     public function __construct(
         \Magento\Framework\Json\Helper\Data $jsonHelper,
         \Magento\Downloadable\Helper\File $downloadableFile,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Downloadable\Model\SampleFactory $sampleFactory,
         \Magento\Downloadable\Model\ResourceModel\SampleFactory $sampleResourceFactory
     ) {
diff --git a/app/code/Magento/Downloadable/Model/ResourceModel/Link.php b/app/code/Magento/Downloadable/Model/ResourceModel/Link.php
index 720a9cc6bf28c1eee598a401108b16cdd24636a3..2572b5dc158c7ed631dc35219fe8562e91ee12c0 100644
--- a/app/code/Magento/Downloadable/Model/ResourceModel/Link.php
+++ b/app/code/Magento/Downloadable/Model/ResourceModel/Link.php
@@ -15,7 +15,7 @@ use Magento\Catalog\Api\Data\ProductInterface;
 class Link extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 {
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -47,7 +47,7 @@ class Link extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $configuration
      * @param \Magento\Directory\Model\CurrencyFactory $currencyFactory
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param string $connectionName
      */
     public function __construct(
@@ -56,7 +56,7 @@ class Link extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
         \Magento\Framework\App\Config\ScopeConfigInterface $configuration,
         \Magento\Directory\Model\CurrencyFactory $currencyFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         $connectionName = null
     ) {
         $this->_catalogData = $catalogData;
diff --git a/app/code/Magento/Downloadable/Model/ResourceModel/Link/Collection.php b/app/code/Magento/Downloadable/Model/ResourceModel/Link/Collection.php
index 65b37d621140a09188bc3eef9286b3b20ac14279..23ac9e620398cddb7055636c33a915f331535759 100644
--- a/app/code/Magento/Downloadable/Model/ResourceModel/Link/Collection.php
+++ b/app/code/Magento/Downloadable/Model/ResourceModel/Link/Collection.php
@@ -15,7 +15,7 @@ use Magento\Catalog\Api\Data\ProductInterface;
 class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
 {
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -24,7 +24,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
      * @param \Psr\Log\LoggerInterface $logger
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
      * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb|null $resource
      */
@@ -33,7 +33,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         \Psr\Log\LoggerInterface $logger,
         \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
         \Magento\Framework\Event\ManagerInterface $eventManager,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
         \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
     ) {
diff --git a/app/code/Magento/Downloadable/Model/ResourceModel/Sample.php b/app/code/Magento/Downloadable/Model/ResourceModel/Sample.php
index a3b538e45954c6974a894644472cf34d1695e8b7..f49b3e68c54a32deca623f32b2f692ab95a5f469 100644
--- a/app/code/Magento/Downloadable/Model/ResourceModel/Sample.php
+++ b/app/code/Magento/Downloadable/Model/ResourceModel/Sample.php
@@ -15,18 +15,18 @@ use Magento\Catalog\Api\Data\ProductInterface;
 class Sample extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 {
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
     /**
      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param null $connectionName
      */
     public function __construct(
         \Magento\Framework\Model\ResourceModel\Db\Context $context,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         $connectionName = null
     ) {
         $this->metadataPool = $metadataPool;
diff --git a/app/code/Magento/Downloadable/Model/ResourceModel/Sample/Collection.php b/app/code/Magento/Downloadable/Model/ResourceModel/Sample/Collection.php
index faa4e94a598020ae54ba6006818a7f5f6683a57d..c2c6def6c46a355576580f80300dd7fa4582e515 100644
--- a/app/code/Magento/Downloadable/Model/ResourceModel/Sample/Collection.php
+++ b/app/code/Magento/Downloadable/Model/ResourceModel/Sample/Collection.php
@@ -15,7 +15,7 @@ use Magento\Catalog\Api\Data\ProductInterface;
 class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
 {
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -24,7 +24,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
      * @param \Psr\Log\LoggerInterface $logger
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
      * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb|null $resource
      */
@@ -33,7 +33,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         \Psr\Log\LoggerInterface $logger,
         \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
         \Magento\Framework\Event\ManagerInterface $eventManager,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
         \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
     ) {
diff --git a/app/code/Magento/Downloadable/Model/SampleRepository.php b/app/code/Magento/Downloadable/Model/SampleRepository.php
index c0703d9c78b7830146bd9f41dcaadc96c548050e..6470bfbb964233a29ea64ccaa18f98e3851b8b28 100644
--- a/app/code/Magento/Downloadable/Model/SampleRepository.php
+++ b/app/code/Magento/Downloadable/Model/SampleRepository.php
@@ -11,7 +11,7 @@ use Magento\Downloadable\Api\Data\SampleInterfaceFactory;
 use Magento\Downloadable\Api\Data\SampleInterface;
 use Magento\Downloadable\Model\Product\Type;
 use Magento\Downloadable\Model\Sample\ContentValidator;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Downloadable\Model\ResourceModel\Sample as ResourceModel;
 use Magento\Framework\Json\Helper\Data as JsonHelper;
 use Magento\Downloadable\Helper\File;
diff --git a/app/code/Magento/Downloadable/Test/Unit/Model/LinkRepositoryTest.php b/app/code/Magento/Downloadable/Test/Unit/Model/LinkRepositoryTest.php
index 2a8a06408440f65d03ab3d21aff9f4ac79597073..45b10339d9ee3315abb8765cebf4a9642eb6fbf5 100644
--- a/app/code/Magento/Downloadable/Test/Unit/Model/LinkRepositoryTest.php
+++ b/app/code/Magento/Downloadable/Test/Unit/Model/LinkRepositoryTest.php
@@ -11,7 +11,7 @@ use Magento\Framework\DataObject;
 class LinkRepositoryTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Model\Entity\MetadataPool
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPoolMock;
 
@@ -62,7 +62,7 @@ class LinkRepositoryTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->metadataPoolMock = $this->getMock('Magento\Framework\Model\Entity\MetadataPool', [], [], '', false);
+        $this->metadataPoolMock = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
         $this->repositoryMock = $this->getMock('\Magento\Catalog\Api\ProductRepositoryInterface', [], [], '', false);
         $this->productTypeMock = $this->getMock('\Magento\Downloadable\Model\Product\Type', [], [], '', false);
         $this->linkResourceMock = $this->getMock('Magento\Downloadable\Model\ResourceModel\Link', [], [], '', false);
diff --git a/app/code/Magento/Downloadable/Test/Unit/Model/Product/TypeHandler/LinkTest.php b/app/code/Magento/Downloadable/Test/Unit/Model/Product/TypeHandler/LinkTest.php
index a9dce851e2812219a1b1cc0a179cea2a762d96cc..7724635694089119977ba004e32b2666653a0065 100644
--- a/app/code/Magento/Downloadable/Test/Unit/Model/Product/TypeHandler/LinkTest.php
+++ b/app/code/Magento/Downloadable/Test/Unit/Model/Product/TypeHandler/LinkTest.php
@@ -48,7 +48,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->setMethods(['deleteItems'])
             ->getMock();
-        $this->metadataPoolMock = $this->getMockBuilder('Magento\Framework\Model\Entity\MetadataPool')
+        $this->metadataPoolMock = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
         $this->metadataMock = $this->getMock('Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
diff --git a/app/code/Magento/Downloadable/Test/Unit/Model/Product/TypeHandler/SampleTest.php b/app/code/Magento/Downloadable/Test/Unit/Model/Product/TypeHandler/SampleTest.php
index 3480bb6cd98189e26b47839dc9b3839baa04e6cc..4ed1940552a9590786868d0e60c50d130eb84d24 100644
--- a/app/code/Magento/Downloadable/Test/Unit/Model/Product/TypeHandler/SampleTest.php
+++ b/app/code/Magento/Downloadable/Test/Unit/Model/Product/TypeHandler/SampleTest.php
@@ -55,7 +55,7 @@ class SampleTest extends \PHPUnit_Framework_TestCase
         $sampleResourceFactory->expects($this->any())
             ->method('create')
             ->will($this->returnValue($this->sampleResource));
-        $this->metadataPoolMock = $this->getMockBuilder('Magento\Framework\Model\Entity\MetadataPool')
+        $this->metadataPoolMock = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
         $this->metadataMock = $this->getMock('Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
diff --git a/app/code/Magento/Downloadable/Test/Unit/Model/SampleRepositoryTest.php b/app/code/Magento/Downloadable/Test/Unit/Model/SampleRepositoryTest.php
index 66bb28030a8bec359eacca891bd96003e1ce0ea8..dad67ea42e4fba96e546f6ee5bb6046f6e5a94b4 100644
--- a/app/code/Magento/Downloadable/Test/Unit/Model/SampleRepositoryTest.php
+++ b/app/code/Magento/Downloadable/Test/Unit/Model/SampleRepositoryTest.php
@@ -16,7 +16,7 @@ class SampleRepositoryTest extends \PHPUnit_Framework_TestCase
     protected $service;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Model\Entity\MetadataPool
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPoolMock;
 
@@ -62,7 +62,7 @@ class SampleRepositoryTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->metadataPoolMock = $this->getMock('Magento\Framework\Model\Entity\MetadataPool', [], [], '', false);
+        $this->metadataPoolMock = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
         $this->repositoryMock = $this->getMock('\Magento\Catalog\Api\ProductRepositoryInterface', [], [], '', false);
         $this->productTypeMock = $this->getMock('\Magento\Downloadable\Model\Product\Type', [], [], '', false);
         $this->sampleResourceMock = $this->getMock(
diff --git a/app/code/Magento/Downloadable/etc/di.xml b/app/code/Magento/Downloadable/etc/di.xml
index e2c04429616d06e19a58089bdf6bc88a5a3f196c..890a14f89c6473da6fc78c96eedbf82254892ae2 100644
--- a/app/code/Magento/Downloadable/etc/di.xml
+++ b/app/code/Magento/Downloadable/etc/di.xml
@@ -75,9 +75,9 @@
     <preference for="\Magento\Downloadable\Api\Data\File\ContentUploaderInterface" type="\Magento\Downloadable\Model\File\ContentUploader" />
     <preference for="\Magento\Downloadable\Model\Product\TypeHandler\TypeHandlerInterface" type="\Magento\Downloadable\Model\Product\TypeHandler\TypeHandler" />
     <preference for="\Magento\Downloadable\Api\Data\DownloadableOptionInterface" type="\Magento\Downloadable\Model\DownloadableOption" />
-    <type name="Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool">
+    <type name="Magento\Framework\EntityManager\Operation\ExtensionPool">
         <arguments>
-            <argument name="relationActions" xsi:type="array">
+            <argument name="extensionActions" xsi:type="array">
                 <item name="Magento\Catalog\Api\Data\ProductInterface" xsi:type="array">
                     <item name="read" xsi:type="array">
                         <item name="downloadable_link_read" xsi:type="string">Magento\Downloadable\Model\Link\ReadHandler</item>
@@ -99,7 +99,7 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\Entity\MetadataPool">
+    <type name="Magento\Framework\EntityManager\MetadataPool">
         <arguments>
             <argument name="metadata" xsi:type="array">
                 <item name="Magento\Downloadable\Api\Data\LinkInterface" xsi:type="array">
diff --git a/app/code/Magento/Eav/Model/AttributeProvider.php b/app/code/Magento/Eav/Model/AttributeProvider.php
index 56eb5b46a5ba891741790c0bf9fab0a0e477a963..5e21b58531f454aa12c0df6e74f33f087f2c57e4 100644
--- a/app/code/Magento/Eav/Model/AttributeProvider.php
+++ b/app/code/Magento/Eav/Model/AttributeProvider.php
@@ -7,7 +7,7 @@
 namespace Magento\Eav\Model;
 
 use Magento\Framework\Model\EntitySnapshot\AttributeProviderInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Eav\Api\AttributeRepositoryInterface;
 use Magento\Framework\Api\SearchCriteriaBuilder;
 
diff --git a/app/code/Magento/Eav/Model/ResourceModel/AttributePersistor.php b/app/code/Magento/Eav/Model/ResourceModel/AttributePersistor.php
index edc1340dce18e536aa1b53a5fdb1f8f80bd842e1..b5d9989b61e5f586a9f7c079a61bf4dc4ac482f6 100644
--- a/app/code/Magento/Eav/Model/ResourceModel/AttributePersistor.php
+++ b/app/code/Magento/Eav/Model/ResourceModel/AttributePersistor.php
@@ -12,7 +12,7 @@ use Magento\Catalog\Api\ProductRepositoryInterface;
 use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
 use Magento\Store\Model\StoreManagerInterface;
 use Magento\Framework\Locale\FormatInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class AttributePersistor
diff --git a/app/code/Magento/Eav/Model/ResourceModel/CreateHandler.php b/app/code/Magento/Eav/Model/ResourceModel/CreateHandler.php
index 74f45ef68a9ccb29c662daa01337c4bb8a9b80bf..4c82f1cbf2a79d742f8ce30a4b133b746d35e1a4 100644
--- a/app/code/Magento/Eav/Model/ResourceModel/CreateHandler.php
+++ b/app/code/Magento/Eav/Model/ResourceModel/CreateHandler.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Eav\Model\ResourceModel;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Eav\Api\AttributeRepositoryInterface as AttributeRepository;
 use Magento\Framework\Api\SearchCriteriaBuilder;
 use Magento\Framework\Model\Entity\ScopeResolver;
diff --git a/app/code/Magento/Eav/Model/ResourceModel/ReadHandler.php b/app/code/Magento/Eav/Model/ResourceModel/ReadHandler.php
index 1a311ab2b1c8bfdafea81b5e8a5b463e65145323..b3e5f10fff238481ee4dff610f5958a43634a1c8 100644
--- a/app/code/Magento/Eav/Model/ResourceModel/ReadHandler.php
+++ b/app/code/Magento/Eav/Model/ResourceModel/ReadHandler.php
@@ -7,7 +7,7 @@
 namespace Magento\Eav\Model\ResourceModel;
 
 use Magento\Eav\Api\AttributeRepositoryInterface as AttributeRepository;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Api\SearchCriteriaBuilder;
 use Magento\Framework\App\ResourceConnection as AppResource;
 use Magento\Framework\Model\Entity\ScopeResolver;
diff --git a/app/code/Magento/Eav/Model/ResourceModel/UpdateHandler.php b/app/code/Magento/Eav/Model/ResourceModel/UpdateHandler.php
index 5818165dc5b0bceadfdaccd4478eb48d78b50301..46446dc168591fa417b7bd5646f45e2df24eebe9 100644
--- a/app/code/Magento/Eav/Model/ResourceModel/UpdateHandler.php
+++ b/app/code/Magento/Eav/Model/ResourceModel/UpdateHandler.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Eav\Model\ResourceModel;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Eav\Api\AttributeRepositoryInterface as AttributeRepository;
 use Magento\Framework\Api\SearchCriteriaBuilder;
 use Magento\Framework\Model\Entity\ScopeResolver;
diff --git a/app/code/Magento/Eav/etc/di.xml b/app/code/Magento/Eav/etc/di.xml
index 809829ce6df0bc8e659988844ff6f853910b3862..f9fe0841e9dead6e344eca8c1b68fb6b3ac0d07f 100644
--- a/app/code/Magento/Eav/etc/di.xml
+++ b/app/code/Magento/Eav/etc/di.xml
@@ -62,7 +62,7 @@
             <argument name="reservedAttributeList" xsi:type="object">Magento\Catalog\Model\Product\ReservedAttributeList\Proxy</argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\ResourceModel\Db\ExtensionPool">
+    <type name="Magento\Framework\EntityManager\Operation\AttributePool">
         <arguments>
             <argument name="extensionActions" xsi:type="array">
                 <item name="eav" xsi:type="array">
@@ -84,11 +84,6 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Eav\Model\ResourceModel\ReadHandler">
-        <arguments>
-            <argument name="contextHandler" xsi:type="object">Magento\Eav\Model\ResourceModel\ContextHandler</argument>
-        </arguments>
-    </type>
     <type name="Magento\Eav\Model\Entity\AbstractEntity">
         <plugin name="clean_cache" type="Magento\Framework\App\Cache\FlushCacheByTags" />
     </type>
diff --git a/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php b/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php
index cca8ffca238bfe664dd69fda5d000ceed61a0497..9ebf08915283d038499017b47ea238091b72868a 100644
--- a/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php
+++ b/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php
@@ -162,7 +162,7 @@ class GroupedTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractI
                 'links' => $this->links
             ]
         );
-        $metadataPoolMock = $this->getMock(\Magento\Framework\Model\Entity\MetadataPool::class, [], [], '', false);
+        $metadataPoolMock = $this->getMock(\Magento\Framework\EntityManager\MetadataPool::class, [], [], '', false);
         $entityMetadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
         $metadataPoolMock->expects($this->any())
             ->method('getMetadata')
diff --git a/app/code/Magento/GroupedProduct/Model/ResourceModel/Product/Link.php b/app/code/Magento/GroupedProduct/Model/ResourceModel/Product/Link.php
index 944234c1d135a823c907636f827f65916711aa5f..b9bc442023ab1a3e41debc88fa68a0d49c1ee8e0 100644
--- a/app/code/Magento/GroupedProduct/Model/ResourceModel/Product/Link.php
+++ b/app/code/Magento/GroupedProduct/Model/ResourceModel/Product/Link.php
@@ -6,7 +6,7 @@
 namespace Magento\GroupedProduct\Model\ResourceModel\Product;
 
 use Magento\Catalog\Api\Data\ProductInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class Link
diff --git a/app/code/Magento/GroupedProduct/Model/ResourceModel/Product/Type/Grouped/AssociatedProductsCollection.php b/app/code/Magento/GroupedProduct/Model/ResourceModel/Product/Type/Grouped/AssociatedProductsCollection.php
index 9acbda5af933b1e0e5581d8d668a937aa4b4edda..b57f9e2455de098d5651c837becaf20300d85159 100644
--- a/app/code/Magento/GroupedProduct/Model/ResourceModel/Product/Type/Grouped/AssociatedProductsCollection.php
+++ b/app/code/Magento/GroupedProduct/Model/ResourceModel/Product/Type/Grouped/AssociatedProductsCollection.php
@@ -7,7 +7,7 @@
  */
 namespace Magento\GroupedProduct\Model\ResourceModel\Product\Type\Grouped;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php
index 54f112b4e3d428c3ee7a64bd12f70c3e7143ee44..306bf715fc1121e6b579578a4b2bc2cac594da1b 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php
@@ -242,7 +242,7 @@ abstract class AbstractEntity
     /**
      * Product metadata pool
      *
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -840,13 +840,13 @@ abstract class AbstractEntity
     /**
      * Get product metadata pool
      *
-     * @return \Magento\Framework\Model\Entity\MetadataPool
+     * @return \Magento\Framework\EntityManager\MetadataPool
      */
     protected function getMetadataPool()
     {
         if (!$this->metadataPool) {
             $this->metadataPool = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get(\Magento\Framework\Model\Entity\MetadataPool::class);
+                ->get(\Magento\Framework\EntityManager\MetadataPool::class);
         }
         return $this->metadataPool;
     }
diff --git a/app/code/Magento/SalesRule/Model/ResourceModel/ReadHandler.php b/app/code/Magento/SalesRule/Model/ResourceModel/ReadHandler.php
index 7a1162d4a2e5ed5b5dec31cd1fb5abf2bfa5d35f..e46fcd08b3c29b5c99210f7ec12bad6a101f07c2 100644
--- a/app/code/Magento/SalesRule/Model/ResourceModel/ReadHandler.php
+++ b/app/code/Magento/SalesRule/Model/ResourceModel/ReadHandler.php
@@ -6,7 +6,7 @@
 namespace Magento\SalesRule\Model\ResourceModel;
 
 use Magento\SalesRule\Model\ResourceModel\Rule;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class ReadHandler
 {
diff --git a/app/code/Magento/SalesRule/Model/ResourceModel/SaveHandler.php b/app/code/Magento/SalesRule/Model/ResourceModel/SaveHandler.php
index 777b241f8f7146301138467fe28bd812cb473b22..e882e86cdc17978e2498de8ac355cb7efacf2a85 100644
--- a/app/code/Magento/SalesRule/Model/ResourceModel/SaveHandler.php
+++ b/app/code/Magento/SalesRule/Model/ResourceModel/SaveHandler.php
@@ -6,7 +6,7 @@
 namespace Magento\SalesRule\Model\ResourceModel;
 
 use Magento\SalesRule\Model\ResourceModel\Rule;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 class SaveHandler
 {
diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
index 545358cf1c030de0e2c34a42d25a68f3c6315b60..71cf86f0e6fa509dde3fcbbc8c9e23e02b1d1873 100644
--- a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
+++ b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
@@ -7,7 +7,7 @@ namespace Magento\SalesRule\Test\Unit\Model\ResourceModel;
 
 use Magento\SalesRule\Model\ResourceModel\ReadHandler;
 use Magento\SalesRule\Model\ResourceModel\Rule;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\SalesRule\Api\Data\RuleInterface;
 
 /**
@@ -44,7 +44,7 @@ class ReadHandlerTest extends \PHPUnit_Framework_TestCase
         $className = 'Magento\SalesRule\Model\ResourceModel\Rule';
         $this->ruleResource = $this->getMock($className, [], [], '', false);
 
-        $className = 'Magento\Framework\Model\Entity\MetadataPool';
+        $className = 'Magento\Framework\EntityManager\MetadataPool';
         $this->metadataPool = $this->getMock($className, [], [], '', false);
 
         $this->model = $this->objectManager->getObject(
diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
index 02326529a8c670d40322c3d187a73bbc4b7c2dca..71fd7cece8a64d681795b08c40b5318d898c712b 100644
--- a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
+++ b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
@@ -7,7 +7,7 @@ namespace Magento\SalesRule\Test\Unit\Model\ResourceModel;
 
 use Magento\SalesRule\Model\ResourceModel\SaveHandler;
 use Magento\SalesRule\Model\ResourceModel\Rule;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\SalesRule\Api\Data\RuleInterface;
 
 /**
@@ -44,7 +44,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
         $className = 'Magento\SalesRule\Model\ResourceModel\Rule';
         $this->ruleResource = $this->getMock($className, [], [], '', false);
 
-        $className = 'Magento\Framework\Model\Entity\MetadataPool';
+        $className = 'Magento\Framework\EntityManager\MetadataPool';
         $this->metadataPool = $this->getMock($className, [], [], '', false);
 
         $this->model = $this->objectManager->getObject(
diff --git a/app/code/Magento/SalesRule/etc/di.xml b/app/code/Magento/SalesRule/etc/di.xml
index 0785a7faf1d68f0d06de6e384f3599a467cd2921..afe8e2cd48c01a3bbb03eb085868d4af8154b801 100644
--- a/app/code/Magento/SalesRule/etc/di.xml
+++ b/app/code/Magento/SalesRule/etc/di.xml
@@ -106,7 +106,7 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\Entity\MetadataPool">
+    <type name="Magento\Framework\EntityManager\MetadataPool">
         <arguments>
             <argument name="metadata" xsi:type="array">
                 <item name="Magento\SalesRule\Api\Data\RuleInterface" xsi:type="array">
@@ -116,11 +116,11 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\OrchestratorPool">
+    <type name="Magento\Framework\EntityManager\OperationPool">
         <arguments>
             <argument name="operations" xsi:type="array">
                 <item name="default" xsi:type="array">
-                    <item name="read" xsi:type="string">Magento\Framework\Model\Operation\Read</item>
+                    <item name="read" xsi:type="string">Magento\Framework\EntityManager\Operation\Read</item>
                     <item name="create" xsi:type="string">Magento\Framework\Model\Operation\Write\Create</item>
                     <item name="update" xsi:type="string">Magento\Framework\Model\Operation\Write\Update</item>
                     <item name="delete" xsi:type="string">Magento\Framework\Model\Operation\Write\Delete</item>
@@ -128,7 +128,7 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\ResourceModel\Db\ExtensionPool">
+    <type name="Magento\Framework\EntityManager\Operation\AttributePool">
         <arguments>
             <argument name="extensionActions" xsi:type="array">
                 <item name="salesRule" xsi:type="array">
diff --git a/app/code/Magento/Security/view/adminhtml/layout/admin_login.xml b/app/code/Magento/Security/view/adminhtml/layout/admin_login.xml
deleted file mode 100644
index 7e4f46d2adbff09d1011b559e7b13267ffb16177..0000000000000000000000000000000000000000
--- a/app/code/Magento/Security/view/adminhtml/layout/admin_login.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
-    <body>
-        <referenceBlock name="security.init.ajax.session.checker" remove="true"/>
-    </body>
-</page>
diff --git a/app/code/Magento/Security/view/adminhtml/layout/default.xml b/app/code/Magento/Security/view/adminhtml/layout/default.xml
deleted file mode 100644
index 39481ae09285371f3afe0cbb76ae841e558fb6bf..0000000000000000000000000000000000000000
--- a/app/code/Magento/Security/view/adminhtml/layout/default.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
-    <body>
-        <referenceContainer name="before.body.end">
-            <block class="Magento\Security\Block\Adminhtml\Js\Checker" name="security.init.ajax.session.checker" template="Magento_Security::js/init_ajax_session_checker.phtml" />
-        </referenceContainer>
-        <referenceContainer name="legal.system">
-            <block class="Magento\Framework\View\Element\Template" name="session.activity.link" template="Magento_Security::page/activity_link.phtml" before="report" ifconfig="admin/security/admin_account_sharing" />
-        </referenceContainer>
-    </body>
-</page>
diff --git a/app/code/Magento/Security/view/adminhtml/layout/security_session_activity.xml b/app/code/Magento/Security/view/adminhtml/layout/security_session_activity.xml
deleted file mode 100644
index bbb928a94f0bcc45de61092c60a8e6bbfb50041c..0000000000000000000000000000000000000000
--- a/app/code/Magento/Security/view/adminhtml/layout/security_session_activity.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-popup" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
-    <head>
-        <css src="Magento_Security::css/activity.css"/>
-    </head>
-    <body>
-        <referenceContainer name="content">
-            <block class="Magento\Security\Block\Adminhtml\Session\Activity" name="session.activity" template="Magento_Security::session/activity.phtml" />
-        </referenceContainer>
-    </body>
-</page>
diff --git a/app/code/Magento/Security/view/adminhtml/page_layout/admin-popup.xml b/app/code/Magento/Security/view/adminhtml/page_layout/admin-popup.xml
deleted file mode 100644
index 6aeabd73e08f9fcdbdfdf7f7ca295f46442c12fa..0000000000000000000000000000000000000000
--- a/app/code/Magento/Security/view/adminhtml/page_layout/admin-popup.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd">
-    <container name="backend.session.activity">
-        <container name="after.body.start" as="after.body.start" label="Page Top" before="-"/>
-        <container name="page.wrapper" as="page_wrapper" htmlTag="div" htmlClass="page-wrapper">
-            <container name="page.main.container" as="page_main_container" htmlId="page:main-container" htmlTag="div" htmlClass="page-columns">
-                <container name="main.col" as="main-col" htmlId="container" htmlTag="div" htmlClass="main-col">
-                    <container name="content" as="content" />
-                </container>
-            </container>
-            <container name="js" as="js" label="JavaScript"/>
-        </container>
-        <container name="before.body.end" as="before_body_end" label="Before Body End" after="-"/>
-    </container>
-</layout>
diff --git a/app/code/Magento/Sitemap/Model/ResourceModel/Catalog/Category.php b/app/code/Magento/Sitemap/Model/ResourceModel/Catalog/Category.php
index dc71b469f39a04063d10cbd219251cc9a6ae217c..2bd1435a1060eed349e4c7eb89db0b95ff721622 100644
--- a/app/code/Magento/Sitemap/Model/ResourceModel/Catalog/Category.php
+++ b/app/code/Magento/Sitemap/Model/ResourceModel/Catalog/Category.php
@@ -39,7 +39,7 @@ class Category extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
     protected $_categoryResource;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -47,14 +47,14 @@ class Category extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Catalog\Model\ResourceModel\Category $categoryResource
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param string $connectionName
      */
     public function __construct(
         \Magento\Framework\Model\ResourceModel\Db\Context $context,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Catalog\Model\ResourceModel\Category $categoryResource,
-        \Magento\Framework\Model\Entity\MetadataPool $metadataPool,
+        \Magento\Framework\EntityManager\MetadataPool $metadataPool,
         $connectionName = null
     ) {
         $this->_storeManager = $storeManager;
diff --git a/app/code/Magento/Sitemap/Model/ResourceModel/Cms/Page.php b/app/code/Magento/Sitemap/Model/ResourceModel/Cms/Page.php
index e500d84cabc900e2611a69f1ac66c86b58d148b6..2842898c75a488e33088449d7e39a29eb52aff3b 100644
--- a/app/code/Magento/Sitemap/Model/ResourceModel/Cms/Page.php
+++ b/app/code/Magento/Sitemap/Model/ResourceModel/Cms/Page.php
@@ -6,7 +6,7 @@
 namespace Magento\Sitemap\Model\ResourceModel\Cms;
 
 use Magento\Cms\Api\Data\PageInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\ResourceModel\Db\Context;
 use Magento\Framework\Model\AbstractModel;
 use Magento\Cms\Model\Page as CmsPage;
diff --git a/app/etc/di.xml b/app/etc/di.xml
index 2dc7d99d05bd36818206deeabc0c92477fb86cce..b74ea39ba89c334e199f02adf689b9692e897c11 100755
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -7,6 +7,8 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
     <preference for="Psr\Log\LoggerInterface" type="Magento\Framework\Logger\Monolog" />
+    <preference for="Magento\Framework\EntityManager\EntityMetadataInterface" type="Magento\Framework\EntityManager\EntityMetadata" />
+    <preference for="Magento\Framework\EntityManager\EntityHydratorInterface" type="Magento\Framework\Model\Entity\Hydrator" />
     <preference for="Magento\Framework\View\Template\Html\MinifierInterface" type="Magento\Framework\View\Template\Html\Minifier" />
     <preference for="Magento\Framework\Model\Entity\ScopeInterface" type="Magento\Framework\Model\Entity\Scope" />
     <preference for="Magento\Framework\ObjectManager\FactoryInterface" type="Magento\Framework\ObjectManager\Factory\Dynamic\Developer" />
@@ -1169,14 +1171,15 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Model\OrchestratorPool">
+    <type name="Magento\Framework\EntityManager\OperationPool">
         <arguments>
             <argument name="operations" xsi:type="array">
                 <item name="default" xsi:type="array">
-                    <item name="read" xsi:type="object">Magento\Framework\Model\Operation\Read</item>
-                    <item name="create" xsi:type="object">Magento\Framework\Model\Operation\Write\Create</item>
-                    <item name="update" xsi:type="object">Magento\Framework\Model\Operation\Write\Update</item>
-                    <item name="delete" xsi:type="object">Magento\Framework\Model\Operation\Write\Delete</item>
+                    <item name="checkIsExists" xsi:type="string">Magento\Framework\EntityManager\Operation\Read\CheckIsExists</item>
+                    <item name="read" xsi:type="string">Magento\Framework\EntityManager\Operation\Read</item>
+                    <item name="create" xsi:type="string">Magento\Framework\EntityManager\Operation\Write\Create</item>
+                    <item name="update" xsi:type="string">Magento\Framework\EntityManager\Operation\Write\Update</item>
+                    <item name="delete" xsi:type="string">Magento\Framework\EntityManager\Operation\Write\Delete</item>
                 </item>
             </argument>
         </arguments>
diff --git a/dev/tests/api-functional/phpunit.xml.dist b/dev/tests/api-functional/phpunit.xml.dist
index 5138d64ee83540d375a91bc64ee35f72a3b7cf53..aa6f7c08e307f601c9bf3e37530532bdff2e859e 100644
--- a/dev/tests/api-functional/phpunit.xml.dist
+++ b/dev/tests/api-functional/phpunit.xml.dist
@@ -35,7 +35,7 @@
         <!-- WebSerivice Type. Possible values: soap, rest -->
         <const name="TESTS_WEB_API_ADAPTER" value="rest"/>
         <!-- Webserver URL -->
-        <const name="TESTS_BASE_URL" value="http://magento.url"/>
+        <const name="TESTS_BASE_URL" value="http://magento-ee.localhost"/>
         <!-- Webserver API user -->
         <const name="TESTS_WEBSERVICE_USER" value="admin"/>
         <!-- Webserver API key -->
diff --git a/dev/tests/integration/etc/install-config-mysql.php.dist b/dev/tests/integration/etc/install-config-mysql.php.dist
index 3cbe5eed4e976da6ad88238ad9a60a7fdb42c999..aba4e19fd2a29166e4d1f60799cf9651a4aadd2b 100644
--- a/dev/tests/integration/etc/install-config-mysql.php.dist
+++ b/dev/tests/integration/etc/install-config-mysql.php.dist
@@ -7,7 +7,7 @@
 return [
     'db-host' => 'localhost',
     'db-user' => 'root',
-    'db-password' => '',
+    'db-password' => '123123q',
     'db-name' => 'magento_integration_tests',
     'db-prefix' => '',
     'backend-frontname' => 'backend',
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/TierpriceTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/TierpriceTest.php
index ca9f1333187277a38e152f1177c43b0f0bcf0d86..4f477c9fc80476c136dca2b9be967a960a1f08bb 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/TierpriceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/TierpriceTest.php
@@ -15,7 +15,7 @@ use Magento\Catalog\Api\Data\ProductInterface;
 class TierpriceTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool
+     * @var \Magento\Framework\EntityManager\MetadataPool
      */
     protected $metadataPool;
 
@@ -38,7 +38,7 @@ class TierpriceTest extends \PHPUnit_Framework_TestCase
             'Magento\Catalog\Model\ProductRepository'
         );
         $this->metadataPool = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-            'Magento\Framework\Model\Entity\MetadataPool'
+            'Magento\Framework\EntityManager\MetadataPool'
         );
         $this->_model->setAttribute(
             \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Gallery/ReadHandlerTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Gallery/ReadHandlerTest.php
index a21c8f78fb701a9efaf12396ab3a381df653db8f..592e42ef3b02927b8f35df85ea304df6b735fb33 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Gallery/ReadHandlerTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Gallery/ReadHandlerTest.php
@@ -6,7 +6,7 @@
 namespace Magento\Catalog\Model\Product\Gallery;
 
 use Magento\Catalog\Api\Data\ProductInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\TestFramework\Helper\Bootstrap;
 
 /**
diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableImportExport/Model/Import/Product/Type/ConfigurableTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableImportExport/Model/Import/Product/Type/ConfigurableTest.php
index 5f510ff8f58d67dcf7068845e0f21726e605f59b..d3ad2c76e3be5a844391f0f516d3479158ab3444 100644
--- a/dev/tests/integration/testsuite/Magento/ConfigurableImportExport/Model/Import/Product/Type/ConfigurableTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableImportExport/Model/Import/Product/Type/ConfigurableTest.php
@@ -51,8 +51,8 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
     {
         $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
         $this->model = $this->objectManager->create(\Magento\CatalogImportExport\Model\Import\Product::class);
-        /** @var \Magento\Framework\Model\Entity\MetadataPool $metadataPool */
-        $metadataPool = $this->objectManager->get(\Magento\Framework\Model\Entity\MetadataPool::class);
+        /** @var \Magento\Framework\EntityManager\MetadataPool $metadataPool */
+        $metadataPool = $this->objectManager->get(\Magento\Framework\EntityManager\MetadataPool::class);
         $this->productMetadata = $metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/DownloadableImportExport/Model/Import/Product/Type/DownloadableTest.php b/dev/tests/integration/testsuite/Magento/DownloadableImportExport/Model/Import/Product/Type/DownloadableTest.php
index 3a6d8166c9bc25e6a48be346b0a36012a5405880..cdf227d2a0bd2b5992df806a886c9b0b35abb69e 100644
--- a/dev/tests/integration/testsuite/Magento/DownloadableImportExport/Model/Import/Product/Type/DownloadableTest.php
+++ b/dev/tests/integration/testsuite/Magento/DownloadableImportExport/Model/Import/Product/Type/DownloadableTest.php
@@ -55,8 +55,8 @@ class DownloadableTest extends \PHPUnit_Framework_TestCase
         $this->model = $this->objectManager->create(
             \Magento\CatalogImportExport\Model\Import\Product::class
         );
-        /** @var \Magento\Framework\Model\Entity\MetadataPool $metadataPool */
-        $metadataPool = $this->objectManager->get(\Magento\Framework\Model\Entity\MetadataPool::class);
+        /** @var \Magento\Framework\EntityManager\MetadataPool $metadataPool */
+        $metadataPool = $this->objectManager->get(\Magento\Framework\EntityManager\MetadataPool::class);
         $this->productMetadata = $metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
     }
 
diff --git a/lib/internal/Magento/Framework/Model/CommitCallback.php b/lib/internal/Magento/Framework/EntityManager/CallbackHandler.php
similarity index 93%
rename from lib/internal/Magento/Framework/Model/CommitCallback.php
rename to lib/internal/Magento/Framework/EntityManager/CallbackHandler.php
index 0b13250bbaa356ba8cf4211703f9f3b6a1fa1568..630724ed656e3fd1a8c9b88b5cb9181d80834b0a 100644
--- a/lib/internal/Magento/Framework/Model/CommitCallback.php
+++ b/lib/internal/Magento/Framework/EntityManager/CallbackHandler.php
@@ -4,15 +4,15 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Framework\Model;
+namespace Magento\Framework\EntityManager;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\Model\CallbackPool;
 use Psr\Log\LoggerInterface;
 
 /**
- * Class CommitCallback
+ * Class CallbackHandler
  */
-class CommitCallback
+class CallbackHandler
 {
     /**
      * @var MetadataPool
diff --git a/lib/internal/Magento/Framework/EntityManager/Db/CreateRow.php b/lib/internal/Magento/Framework/EntityManager/Db/CreateRow.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a44569c939d5eb392dfb3f571c30ded8956000f
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Db/CreateRow.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Db;
+
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\EntityManager\EntityMetadataInterface;
+use Magento\Framework\DB\Adapter\AdapterInterface;
+use Magento\Framework\App\ResourceConnection;
+
+
+/**
+ * Class CreateRow
+ */
+class CreateRow
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var ResourceConnection
+     */
+    private $resourceConnection;
+
+    /**
+     * CreateRow constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param ResourceConnection $resourceConnection
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        ResourceConnection $resourceConnection
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->resourceConnection = $resourceConnection;
+    }
+
+    /**
+     * @param EntityMetadataInterface $metadata
+     * @param AdapterInterface $connection
+     * @param array $data
+     * @return array
+     */
+    protected function prepareData(EntityMetadataInterface $metadata, AdapterInterface $connection, $data)
+    {
+        $output = [];
+        foreach ($connection->describeTable($metadata->getEntityTable()) as $column) {
+
+            if ($column['DEFAULT'] == 'CURRENT_TIMESTAMP') {
+                continue;
+            }
+            if (isset($data[strtolower($column['COLUMN_NAME'])])) {
+                $output[strtolower($column['COLUMN_NAME'])] = $data[strtolower($column['COLUMN_NAME'])];
+            } elseif ($column['DEFAULT'] === null) {
+                $output[strtolower($column['COLUMN_NAME'])] = null;
+            }
+        }
+        if (empty($data[$metadata->getIdentifierField()])) {
+            $output[$metadata->getIdentifierField()] = $metadata->generateIdentifier();
+        }
+        return $output;
+    }
+
+    /**
+     * @param string $entityType
+     * @param array $data
+     * @return array
+     */
+    public function execute($entityType, $data)
+    {
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $linkField = $metadata->getLinkField();
+        $entityTable = $metadata->getEntityTable();
+        $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
+        $connection->insert($entityTable, $this->prepareData($metadata, $connection, $data));
+        $data[$linkField] = $connection->lastInsertId($entityTable);
+
+        return $data;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Db/DeleteRow.php b/lib/internal/Magento/Framework/EntityManager/Db/DeleteRow.php
new file mode 100644
index 0000000000000000000000000000000000000000..469ce93ec2bb54c82c9c5238b5946f0bb0fca8b6
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Db/DeleteRow.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Db;
+
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\App\ResourceConnection;
+
+
+/**
+ * Class DeleteRow
+ */
+class DeleteRow
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var ResourceConnection
+     */
+    private $resourceConnection;
+
+    /**
+     * CreateRow constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param ResourceConnection $resourceConnection
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        ResourceConnection $resourceConnection
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->resourceConnection = $resourceConnection;
+    }
+
+    /**
+     * @param string $entityType
+     * @param array $data
+     * @return int
+     * @throws \Exception
+     */
+    public function execute($entityType, $data)
+    {
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
+        return $connection->delete(
+            $metadata->getEntityTable(),
+            [$metadata->getLinkField() . ' = ?' => $data[$metadata->getLinkField()]]
+        );
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Db/ReadRow.php b/lib/internal/Magento/Framework/EntityManager/Db/ReadRow.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed69238cb67721532dd85a57be33b96ab4cfa2a4
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Db/ReadRow.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Db;
+
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\App\ResourceConnection;
+
+
+/**
+ * Class DeleteRow
+ */
+class ReadRow
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var ResourceConnection
+     */
+    private $resourceConnection;
+
+    /**
+     * CreateRow constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param ResourceConnection $resourceConnection
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        ResourceConnection $resourceConnection
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->resourceConnection = $resourceConnection;
+    }
+
+    /**
+     * @param string $entityType
+     * @param string $identifier
+     * @param array $context
+     * @return array
+     * @throws \Exception
+     */
+    public function execute($entityType, $identifier, $context = [])
+    {
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $select = $connection->select()
+            ->from(['t' => $metadata->getEntityTable()])
+            ->where($metadata->getIdentifierField() . ' = ?', $identifier);
+        foreach ($context as $field => $value) {
+            $select->where(
+                $connection->quoteIdentifier($field) . ' = ?',
+                $value
+            );
+        }
+        $data = $connection->fetchRow($select);
+        return $data ?: [];
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Db/UpdateRow.php b/lib/internal/Magento/Framework/EntityManager/Db/UpdateRow.php
new file mode 100644
index 0000000000000000000000000000000000000000..233dcc18c5aa02d26d358e339e6d5dacc141c0c8
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Db/UpdateRow.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Db;
+
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\EntityManager\EntityMetadataInterface;
+use Magento\Framework\DB\Adapter\AdapterInterface;
+use Magento\Framework\App\ResourceConnection;
+
+
+/**
+ * Class UpdateRow
+ */
+class UpdateRow
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var ResourceConnection
+     */
+    private $resourceConnection;
+
+    /**
+     * CreateRow constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param ResourceConnection $resourceConnection
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        ResourceConnection $resourceConnection
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->resourceConnection = $resourceConnection;
+    }
+
+    /**
+     * @param EntityMetadataInterface $metadata
+     * @param AdapterInterface $connection
+     * @param array $data
+     * @return array
+     */
+    protected function prepareData(EntityMetadataInterface $metadata, AdapterInterface $connection, $data)
+    {
+        $output = [];
+        foreach ($connection->describeTable($metadata->getEntityTable()) as $column) {
+
+            if ($column['DEFAULT'] == 'CURRENT_TIMESTAMP'|| $column['IDENTITY']) {
+                continue;
+            }
+            if (isset($data[strtolower($column['COLUMN_NAME'])])) {
+                $output[strtolower($column['COLUMN_NAME'])] = $data[strtolower($column['COLUMN_NAME'])];
+            } elseif ($column['DEFAULT'] === null) {
+                $output[strtolower($column['COLUMN_NAME'])] = null;
+            }
+        }
+        if (empty($data[$metadata->getIdentifierField()])) {
+            $output[$metadata->getIdentifierField()] = $metadata->generateIdentifier();
+        }
+        return $output;
+    }
+
+    /**
+     * @param string $entityType
+     * @param array $data
+     * @return array
+     */
+    public function execute($entityType, $data)
+    {
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
+        return $connection->update(
+            $metadata->getEntityTable(),
+            $this->prepareData($metadata, $connection, $data),
+            [$metadata->getLinkField() . ' = ?' => $data[$metadata->getLinkField()]]
+        );
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/EntityHydrator.php b/lib/internal/Magento/Framework/EntityManager/EntityHydrator.php
new file mode 100644
index 0000000000000000000000000000000000000000..3376e3a402744add98130fb9665c9e2715d74daa
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/EntityHydrator.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager;
+
+/**
+ * Class EntityHydrator
+ */
+class EntityHydrator implements EntityHydratorInterface
+{
+    public function extract($entity)
+    {
+        // TODO: Implement extract() method.
+    }
+
+    public function hydrate($entity, array $data)
+    {
+        // TODO: Implement hydrate() method.
+    }
+}
diff --git a/lib/internal/Magento/Framework/Model/Entity/HydratorInterface.php b/lib/internal/Magento/Framework/EntityManager/EntityHydratorInterface.php
similarity index 65%
rename from lib/internal/Magento/Framework/Model/Entity/HydratorInterface.php
rename to lib/internal/Magento/Framework/EntityManager/EntityHydratorInterface.php
index 9005b1380a72803c921b97d29fd22be4e0cba8c4..e1a208073a381fd1ab5c6e6cda25c1d2199bf98a 100644
--- a/lib/internal/Magento/Framework/Model/Entity/HydratorInterface.php
+++ b/lib/internal/Magento/Framework/EntityManager/EntityHydratorInterface.php
@@ -4,20 +4,24 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Framework\Model\Entity;
+namespace Magento\Framework\EntityManager;
 
 /**
- * Interface HydratorInterface
+ * Interface EntityHydratorInterface
  */
-interface HydratorInterface
+interface EntityHydratorInterface
 {
     /**
+     * Extract data from object
+     *
      * @param object $entity
      * @return array
      */
     public function extract($entity);
 
     /**
+     * Populate entity with data
+     *
      * @param object $entity
      * @param array $data
      * @return object
diff --git a/lib/internal/Magento/Framework/EntityManager/EntityManager.php b/lib/internal/Magento/Framework/EntityManager/EntityManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..53e1abd4562d957464f563682f53b8ab8c4a4c1c
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/EntityManager.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager;
+
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\Model\ResourceModel\Db\ObjectRelationProcessor;
+
+/**
+ * Class EntityManager
+ */
+class EntityManager
+{
+    /**
+     * @var OperationPool
+     */
+    private $operationPool;
+
+    /**
+     * @var CallbackHandler
+     */
+    private $callbackHandler;
+
+    /**
+     * EntityManager constructor.
+     *
+     * @param OperationPool $operationPool
+     * @param MetadataPool $metadataPool
+     * @param CallbackHandler $callbackHandler
+     */
+    public function __construct(
+        OperationPool $operationPool,
+        MetadataPool $metadataPool,
+        CallbackHandler $callbackHandler
+    ) {
+        $this->operationPool = $operationPool;
+        $this->metadataPool = $metadataPool;
+        $this->callbackHandler = $callbackHandler;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @param string $identifier
+     * @return object
+     * @throws \Exception
+     */
+    public function load($entityType, $entity, $identifier)
+    {
+        $operation = $this->operationPool->getOperation($entityType, 'read');
+        $entity = $operation->execute($entityType, $entity, $identifier);
+        return $entity;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return bool|object
+     * @throws \Exception
+     */
+    public function save($entityType, $entity)
+    {
+        if ($this->has($entityType, $entity)) {
+            $operation = $this->operationPool->getOperation($entityType, 'update');
+        } else {
+            $operation = $this->operationPool->getOperation($entityType, 'create');
+        }
+        try {
+        $entity = $operation->execute($entityType, $entity);
+            $this->callbackHandler->process($entityType);
+        } catch (\Exception $e) {
+            $this->callbackHandler->clear($entityType);
+            throw $e;
+        }
+        return $entity;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return bool
+     */
+    public function has($entityType, $entity)
+    {
+        $operation = $this->operationPool->getOperation($entityType, 'checkIsExists');
+        return $operation->execute($entityType, $entity);
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return bool|object
+     * @throws \Exception
+     */
+    public function delete($entityType, $entity)
+    {
+        $operation = $this->operationPool->getOperation($entityType, 'delete');
+        try {
+            $result = $operation->execute($entityType, $entity);
+            $this->callbackHandler->process($entityType);
+        } catch (\Exception $e) {
+            $this->callbackHandler->clear($entityType);
+            throw new $e;
+        }
+        return $result;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Model/Entity/EntityMetadata.php b/lib/internal/Magento/Framework/EntityManager/EntityMetadata.php
similarity index 58%
rename from lib/internal/Magento/Framework/Model/Entity/EntityMetadata.php
rename to lib/internal/Magento/Framework/EntityManager/EntityMetadata.php
index eb192f058e726681e541bbb25255b151b99590b4..7deaf131fb50f2c7c558aaedca92b314201e463b 100644
--- a/lib/internal/Magento/Framework/Model/Entity/EntityMetadata.php
+++ b/lib/internal/Magento/Framework/EntityManager/EntityMetadata.php
@@ -4,21 +4,21 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Framework\Model\Entity;
+namespace Magento\Framework\EntityManager;
 
-use Magento\Framework\App\ResourceConnection as AppResource;
+use Magento\Framework\App\ResourceConnection;
 use Magento\Framework\DB\Sequence\SequenceInterface;
 
 /**
  * Class EntityMetadata
  */
-class EntityMetadata
+class EntityMetadata implements EntityMetadataInterface
 {
 
     /**
-     * @var AppResource
+     * @var ResourceConnection
      */
-    protected $appResource;
+    protected $resourceConnection;
 
     /**
      * @var string
@@ -51,38 +51,32 @@ class EntityMetadata
     protected $entityContext;
 
     /**
-     * @var array
-     */
-    protected $fields;
-
-    /**
-     * @param AppResource $appResource
-     * @param string $entityTableName
-     * @param string $identifierField
+     * EntityMetadata constructor.
+     *
+     * @param ResourceConnection $resourceConnection
+     * @param $entityTableName
+     * @param $identifierField
      * @param SequenceInterface|null $sequence
-     * @param string|null $eavEntityType
-     * @param string|null $connectionName
+     * @param null $eavEntityType
+     * @param null $connectionName
      * @param array $entityContext
-     * @param array $fields
      */
     public function __construct(
-        AppResource $appResource,
+        ResourceConnection $resourceConnection,
         $entityTableName,
         $identifierField,
         SequenceInterface $sequence = null,
         $eavEntityType = null,
         $connectionName = null,
-        $entityContext = [],
-        $fields = []
+        $entityContext = []
     ) {
-        $this->appResource = $appResource;
+        $this->resourceConnection = $resourceConnection;
         $this->entityTableName = $entityTableName;
         $this->eavEntityType = $eavEntityType;
         $this->connectionName = $connectionName;
         $this->identifierField = $identifierField;
         $this->sequence = $sequence;
         $this->entityContext = $entityContext;
-        $this->fields = $fields;
     }
 
     /**
@@ -98,16 +92,18 @@ class EntityMetadata
      */
     public function getLinkField()
     {
-        $indexList = $this->getEntityConnection()->getIndexList($this->getEntityTable());
-        return $indexList[$this->getEntityConnection()->getPrimaryKeyName($this->getEntityTable())]['COLUMNS_LIST'][0];
+        $connection = $this->resourceConnection->getConnectionByName($this->getEntityConnectionName());
+        $indexList = $connection->getIndexList($this->getEntityTable());
+        return $indexList[$connection->getPrimaryKeyName($this->getEntityTable())]['COLUMNS_LIST'][0];
     }
 
     /**
      * @return \Magento\Framework\DB\Adapter\AdapterInterface
+     * @deprecated
      */
     public function getEntityConnection()
     {
-        return $this->appResource->getConnectionByName($this->connectionName);
+        return $this->resourceConnection->getConnectionByName($this->connectionName);
     }
 
     /**
@@ -115,7 +111,15 @@ class EntityMetadata
      */
     public function getEntityTable()
     {
-        return $this->appResource->getTableName($this->entityTableName);
+        return $this->resourceConnection->getTableName($this->entityTableName);
+    }
+
+    /**
+     * @return string
+     */
+    public function getEntityConnectionName()
+    {
+        return $this->connectionName;
     }
 
     /**
@@ -145,29 +149,4 @@ class EntityMetadata
     {
         return $this->eavEntityType;
     }
-
-    /**
-     * @return array
-     */
-    public function getExtensionFields()
-    {
-        return $this->fields;
-    }
-
-    /**
-     * Check is entity exists
-     *
-     * @param string $identifier
-     * @return bool
-     */
-    public function checkIsEntityExists($identifier)
-    {
-        return (bool)$this->getEntityConnection()->fetchOne(
-            $this->getEntityConnection()
-                ->select()
-                ->from($this->getEntityTable(), [$this->getIdentifierField()])
-                ->where($this->getIdentifierField() . ' = ?', $identifier)
-                ->limit(1)
-        );
-    }
 }
diff --git a/lib/internal/Magento/Framework/EntityManager/EntityMetadataInterface.php b/lib/internal/Magento/Framework/EntityManager/EntityMetadataInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..ee3641240fb9a38a3d537fabe22927bd3b500d1d
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/EntityMetadataInterface.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager;
+
+/**
+ * Interface EntityMetadataInterface
+ */
+interface EntityMetadataInterface
+{
+    /**
+     * @return string
+     */
+    public function getIdentifierField();
+
+    /**
+     * @return string
+     */
+    public function getLinkField();
+
+    /**
+     * @return string
+     */
+    public function getEntityTable();
+
+    /**
+     * @return string
+     */
+    public function getEntityConnectionName();
+
+    /**
+     * @return null|string
+     */
+    public function generateIdentifier();
+
+    /**
+     * @return string[]
+     */
+    public function getEntityContext();
+
+    /**
+     * @return null|string
+     */
+    public function getEavEntityType();
+
+    /**
+     * @return \Magento\Framework\DB\Adapter\AdapterInterface
+     * @deprecated
+     */
+    public function getEntityConnection();
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/HydratorPool.php b/lib/internal/Magento/Framework/EntityManager/HydratorPool.php
new file mode 100644
index 0000000000000000000000000000000000000000..f533787d6373f295462b0231305d7906eab45955
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/HydratorPool.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager;
+
+use Magento\Framework\ObjectManagerInterface;
+
+/**
+ * Class HydratorPool
+ */
+class HydratorPool
+{
+    /**
+     * @var
+     */
+    private $hydrators;
+
+    /**
+     * @var ObjectManagerInterface
+     */
+    protected $objectManager;
+
+    /**
+     * HydratorPool constructor.
+     * @param ObjectManagerInterface $objectManager
+     * @param string[] $hydrators
+     */
+    public function __construct(
+        ObjectManagerInterface $objectManager,
+        $hydrators = []
+    ) {
+        $this->objectManager = $objectManager;
+        $this->hydrators = $hydrators;
+    }
+
+    /**
+     * @param string $entityType
+     * @return EntityHydratorInterface
+     */
+    public function getHydrator($entityType)
+    {
+        if (isset($this->hydrators[$entityType])) {
+            return $this->objectManager->get($this->hydrators[$entityType]);
+        } else {
+            return $this->objectManager->get(EntityHydratorInterface::class);
+        }
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/MetadataPool.php b/lib/internal/Magento/Framework/EntityManager/MetadataPool.php
new file mode 100644
index 0000000000000000000000000000000000000000..ee7753e395ea9326af4d5f46fd3aa7b0e11c3f3f
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/MetadataPool.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager;
+
+use Magento\Framework\ObjectManagerInterface;
+use Magento\Framework\EntityManager\Sequence\SequenceFactory;
+
+/**
+ * Class MetadataPool
+ */
+class MetadataPool
+{
+    /**
+     * @var ObjectManagerInterface
+     */
+    protected $objectManager;
+
+    /**
+     * @var array
+     */
+    protected $metadata;
+
+    /**
+     * @var \Magento\Framework\Model\Entity\EntityMetadata[]
+     */
+    protected $registry;
+
+    /**
+     * @var SequenceFactory
+     */
+    protected $sequenceFactory;
+
+    /**
+     * MetadataPool constructor.
+     * @param ObjectManagerInterface $objectManager
+     * @param SequenceFactory $sequenceFactory
+     * @param array $metadata
+     */
+    public function __construct(
+        ObjectManagerInterface $objectManager,
+        SequenceFactory $sequenceFactory,
+        array $metadata
+    ) {
+        $this->objectManager = $objectManager;
+        $this->sequenceFactory = $sequenceFactory;
+        $this->metadata = $metadata;
+    }
+
+    /**
+     * @param string $entityType
+     * @return EntityMetadataInterface
+     */
+    private function createMetadata($entityType)
+    {
+        //@todo: use ID as default if , check is type has EAV attributes
+        $connectionName = isset($this->metadata[$entityType]['connectionName'])
+            ? $this->metadata[$entityType]['connectionName']
+            : 'default';
+        $eavEntityType = isset($this->metadata[$entityType]['eavEntityType'])
+            ? $this->metadata[$entityType]['eavEntityType']
+            : null;
+        $entityContext = isset($this->metadata[$entityType]['entityContext'])
+            ? $this->metadata[$entityType]['entityContext']
+            : [];
+        return $this->objectManager->create(
+            EntityMetadataInterface::class,
+            [
+                'entityTableName' => $this->metadata[$entityType]['entityTableName'],
+                'eavEntityType' => $eavEntityType,
+                'connectionName' => $connectionName,
+                'identifierField' => $this->metadata[$entityType]['identifierField'],
+                'sequence' => $this->sequenceFactory->create($entityType, $this->metadata),
+                'entityContext' => $entityContext
+            ]
+        );
+    }
+
+    /**
+     * @param string $entityType
+     * @return EntityMetadataInterface
+     * @throws \Exception
+     */
+    public function getMetadata($entityType)
+    {
+        if (!isset($this->metadata[$entityType])) {
+            throw new \Exception(sprintf('Unknown entity type: %s requested', $entityType));
+        }
+        if (!isset($this->registry[$entityType])) {
+
+            $this->registry[$entityType] = $this->createMetadata($entityType);
+        }
+        return $this->registry[$entityType];
+    }
+
+    /**
+     * @param $entityType
+     * @deprecated
+     * @return EntityHydratorInterface
+     */
+    public function getHydrator($entityType)
+    {
+        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
+        return $objectManager->get(HydratorPool::class)->getHydrator($entityType);
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/AttributePool.php b/lib/internal/Magento/Framework/EntityManager/Operation/AttributePool.php
new file mode 100644
index 0000000000000000000000000000000000000000..413de81bfd583e406ae9113a4c49ec6b38ae1310
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/AttributePool.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation;
+
+use Magento\Framework\ObjectManagerInterface;
+
+/**
+ * Class AttributePool
+ */
+class AttributePool
+{
+    /**
+     * @var ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var object[]
+     */
+    private $actions;
+
+    /**
+     * @param ObjectManagerInterface $objectManager
+     * @param array $extensionActions
+     */
+    public function __construct(
+        ObjectManagerInterface $objectManager,
+        array $extensionActions = []
+    ) {
+        $this->objectManager = $objectManager;
+        $this->actions = $extensionActions;
+    }
+
+    /**
+     * @param string $entityType
+     * @param string $actionName
+     * @return object[]
+     * @throws \Exception
+     */
+    public function getActions($entityType, $actionName)
+    {
+        $actions = [];
+        foreach ($this->actions as $name => $actionGroup) {
+            if (isset($actionGroup[$entityType][$actionName])) {
+                $actions[$name] = $this->objectManager->get($actionGroup[$entityType][$actionName]);
+            } elseif (isset($actionGroup['default'][$actionName])) {
+                $actions[$name] = $this->objectManager->get($actionGroup['default'][$actionName]);
+            }
+        }
+        return $actions;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/ExtensionPool.php b/lib/internal/Magento/Framework/EntityManager/Operation/ExtensionPool.php
new file mode 100644
index 0000000000000000000000000000000000000000..73db14888e235a7bb1571401119f996120c42192
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/ExtensionPool.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation;
+
+use Magento\Framework\ObjectManagerInterface;
+
+/**
+ * Class ExtensionPool
+ */
+class ExtensionPool
+{
+    /**
+     * @var ObjectManagerInterface
+     */
+    protected $objectManager;
+
+    /**
+     * @var object[]
+     */
+    protected $actions;
+
+    /**
+     * @param ObjectManagerInterface $objectManager
+     * @param array $extensionActions
+     */
+    public function __construct(
+        ObjectManagerInterface $objectManager,
+        array $extensionActions = []
+    ) {
+        $this->objectManager = $objectManager;
+        $this->actions = $extensionActions;
+    }
+
+    /**
+     * @param string $entityType
+     * @param string $actionName
+     * @return object[]
+     * @throws \Exception
+     */
+    public function getActions($entityType, $actionName)
+    {
+        $actions = [];
+        foreach ($this->actions as $name => $actionGroup) {
+            if (isset($actionGroup[$entityType][$actionName])) {
+                $actions[$name] = $this->objectManager->get($actionGroup[$entityType][$actionName]);
+            } elseif (isset($actionGroup['default'][$actionName])) {
+                $actions[$name] = $this->objectManager->get($actionGroup['default'][$actionName]);
+            }
+        }
+        return $actions;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Read.php b/lib/internal/Magento/Framework/EntityManager/Operation/Read.php
new file mode 100644
index 0000000000000000000000000000000000000000..65d364faa17b944f5d53caea3e26a62b44a26274
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Read.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation;
+
+use Magento\Framework\EntityManager\HydratorPool;
+use Magento\Framework\EntityManager\Operation\Read\ReadMain;
+use Magento\Framework\EntityManager\Operation\Read\ReadAttributes;
+use Magento\Framework\EntityManager\Operation\Read\ReadExtensions;
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\Event\ManagerInterface;
+
+/**
+ * Class Read
+ */
+class Read
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var ManagerInterface
+     */
+    private $eventManager;
+
+    /**
+     * @var ReadMain
+     */
+    private $readMain;
+
+    /**
+     * @var ReadAttributes
+     */
+    private $readAttributes;
+
+    /**
+     * @var ReadAttributes
+     */
+    private $readExtensions;
+
+    /**
+     * Read constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param HydratorPool $hydratorPool
+     * @param ManagerInterface $eventManager
+     * @param ReadMain $readMain
+     * @param ReadAttributes $readAttributes
+     * @param ReadAttributes $readExtensions
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        HydratorPool $hydratorPool,
+        ManagerInterface $eventManager,
+        ReadMain $readMain,
+        ReadAttributes $readAttributes,
+        ReadExtensions $readExtensions
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->hydratorPool = $hydratorPool;
+        $this->eventManager = $eventManager;
+        $this->readMain = $readMain;
+        $this->readAttributes = $readAttributes;
+        $this->readExtensions = $readExtensions;
+    }
+
+    public function execute($entityType, $entity, $identifier)
+    {
+        $metadata = $this->metadataPool->getMetadata($entityType);
+
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $entity = $this->readMain->execute($entityType, $entity, $identifier);
+
+        $entityData = $hydrator->extract($entity);
+        if (isset($entityData[$metadata->getLinkField()])) {
+            $entity = $this->readAttributes->execute($entityType, $entity);
+            $entity = $this->readExtensions->execute($entityType, $entity);
+        }
+
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Read/CheckIsExists.php b/lib/internal/Magento/Framework/EntityManager/Operation/Read/CheckIsExists.php
new file mode 100644
index 0000000000000000000000000000000000000000..1377036fa91adf838acddd121278ca4308d14fff
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Read/CheckIsExists.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Read;
+
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\EntityManager\HydratorPool;
+use Magento\Framework\App\ResourceConnection;
+
+/**
+ * Class CheckIsExists
+ */
+class CheckIsExists
+{
+    /**
+     * @var ResourceConnection
+     */
+    private $resourceConnection;
+
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * CheckIsExists constructor.
+     *
+     * @param ResourceConnection $resourceConnection
+     * @param MetadataPool $metadataPool
+     * @param HydratorPool $hydratorPool
+     */
+    public function __construct(
+        ResourceConnection $resourceConnection,
+        MetadataPool $metadataPool,
+        HydratorPool $hydratorPool
+    ) {
+        $this->resourceConnection = $resourceConnection;
+        $this->metadataPool = $metadataPool;
+        $this->hydratorPool = $hydratorPool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return bool
+     * @throws \Exception
+     */
+    public function execute($entityType, $entity)
+    {
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
+        $entityData = $hydrator->extract($entity);
+        if (!isset($entityData[$metadata->getIdentifierField()])) {
+            return false;
+        }
+        return (bool)$connection->fetchOne(
+            $connection->select()
+                ->from($metadata->getEntityTable(), [$metadata->getIdentifierField()])
+                ->where($metadata->getIdentifierField() . ' = ?', $entityData[$metadata->getIdentifierField()])
+                ->limit(1)
+        );
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadAttributes.php b/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadAttributes.php
new file mode 100644
index 0000000000000000000000000000000000000000..4217992553fb114ef40356f0341c8ea130ad378a
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadAttributes.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Read;
+
+use Magento\Framework\EntityManager\Operation\AttributePool;
+use Magento\Framework\EntityManager\HydratorPool;
+
+/**
+ * Class ReadAttributes
+ */
+class ReadAttributes
+{
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var AttributePool
+     */
+    private $attributePool;
+
+    /**
+     * ReadAttributes constructor.
+     *
+     * @param HydratorPool $hydratorPool
+     * @param AttributePool $attributePool
+     */
+    public function __construct(
+        HydratorPool $hydratorPool,
+        AttributePool $attributePool
+    ) {
+        $this->hydratorPool = $hydratorPool;
+        $this->attributePool = $attributePool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity)
+    {
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $entityData = $hydrator->extract($entity);
+        $actions = $this->attributePool->getActions($entityType, 'read');
+        foreach ($actions as $action) {
+            $entityData = array_merge($entityData, $action->execute($entityType, $entityData));
+        }
+        $entity = $hydrator->hydrate($entity, $entityData);
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadExtensions.php b/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadExtensions.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bd413cff8e94d35b21b224ed7ba899d79504b1f
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadExtensions.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Read;
+
+use Magento\Framework\EntityManager\Operation\ExtensionPool;
+
+/**
+ * Class ReadExtensions
+ */
+class ReadExtensions
+{
+    /**
+     * @var ExtensionPool
+     */
+    private $extensionPool;
+
+    /**
+     * ReadExtensions constructor.
+     *
+     * @param ExtensionPool $extensionPool
+     */
+    public function __construct(
+        ExtensionPool $extensionPool
+    ) {
+        $this->extensionPool = $extensionPool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity)
+    {
+        $actions = $this->extensionPool->getActions($entityType, 'read');
+        foreach ($actions as $action) {
+            $entity = $action->execute($entityType, $entity);
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadMain.php b/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadMain.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ab9eb8f7ecebbd579a66ee21c8aff0e87afc296
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadMain.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Read;
+
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\EntityManager\HydratorPool;
+use Magento\Framework\EntityManager\Db\ReadRow;
+
+class ReadMain
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var ReadRow
+     */
+    private $readRow;
+
+    /**
+     * ReadMain constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param HydratorPool $hydratorPool
+     * @param ReadRow $readRow
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        HydratorPool $hydratorPool,
+        ReadRow $readRow
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->hydratorPool = $hydratorPool;
+        $this->readRow = $readRow;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @param string $identifier
+     * @return object
+     */
+    public function execute($entityType, $entity, $identifier)
+    {
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $entityData = $this->readRow->execute($entityType, $identifier);
+        $entity = $hydrator->hydrate($entity, $entityData);
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/ValidatorPool.php b/lib/internal/Magento/Framework/EntityManager/Operation/ValidatorPool.php
new file mode 100644
index 0000000000000000000000000000000000000000..78acc27daf6d27056cf85cc28422f09b3f43bf2f
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/ValidatorPool.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation;
+
+use Magento\Framework\ObjectManagerInterface;
+
+/**
+ * Class ValidatorPool
+ */
+class ValidatorPool
+{
+    /**
+     * @var ObjectManagerInterface
+     */
+    protected $objectManager;
+
+    /**
+     * @var object[]
+     */
+    protected $validators;
+
+    /**
+     * @param ObjectManagerInterface $objectManager
+     * @param array $extensionActions
+     */
+    public function __construct(
+        ObjectManagerInterface $objectManager,
+        array $extensionActions = []
+    ) {
+        $this->objectManager = $objectManager;
+        $this->actions = $extensionActions;
+    }
+
+    /**
+     * @param string $entityType
+     * @param string $actionName
+     * @return object[]
+     * @throws \Exception
+     */
+    public function getValidators($entityType, $actionName)
+    {
+        $actions = [];
+        foreach ($this->validators as $name => $actionGroup) {
+            if (isset($actionGroup[$entityType][$actionName])) {
+                $actions[$name] = $this->objectManager->get($actionGroup[$entityType][$actionName]);
+            } elseif (isset($actionGroup['default'][$actionName])) {
+                $actions[$name] = $this->objectManager->get($actionGroup['default'][$actionName]);
+            }
+        }
+        return $actions;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc0884ac2ffa6f19caf0844bc309eb49be4d68a2
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write;
+
+use Magento\Framework\EntityManager\Operation\Write\Create\ValidateCreate;
+use Magento\Framework\EntityManager\Operation\Write\Create\CreateMain;
+use Magento\Framework\EntityManager\Operation\Write\Create\CreateAttributes;
+use Magento\Framework\EntityManager\Operation\Write\Create\CreateExtensions;
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\Event\ManagerInterface;
+
+/**
+ * Class Create
+ */
+class Create
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var ResourceConnection
+     */
+    private $resourceConnection;
+
+    /**
+     * @var ManagerInterface
+     */
+    private $eventManager;
+
+    /**
+     * @var ValidateCreate
+     */
+    private $validateCreate;
+
+    /**
+     * @var CreateMain
+     */
+    private $createMain;
+
+    /**
+     * @var CreateAttributes
+     */
+    private $createAttributes;
+
+    /**
+     * @var CreateExtensions
+     */
+    private $createExtensions;
+
+    /**
+     * Create constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param ResourceConnection $resourceConnection
+     * @param ManagerInterface $eventManager
+     * @param ValidateCreate $validateCreate
+     * @param CreateMain $createMain
+     * @param CreateAttributes $createAttributes
+     * @param CreateExtensions $createExtensions
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        ResourceConnection $resourceConnection,
+        ManagerInterface $eventManager,
+        ValidateCreate $validateCreate,
+        CreateMain $createMain,
+        CreateAttributes $createAttributes,
+        CreateExtensions $createExtensions
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->resourceConnection = $resourceConnection;
+        $this->eventManager = $eventManager;
+        $this->validateCreate = $validateCreate;
+        $this->createMain = $createMain;
+        $this->createAttributes = $createAttributes;
+        $this->createExtensions = $createExtensions;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     * @throws \Exception
+     */
+    public function execute($entityType, $entity)
+    {
+        $this->validateCreate->execute($entityType, $entity);
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
+        $connection->beginTransaction();
+        try {
+            $this->eventManager->dispatch('entity_save_before', ['entity_type' => $entityType, 'entity' => $entity]);
+            $entity = $this->createMain->execute($entityType, $entity);
+            $entity = $this->createAttributes->execute($entityType, $entity);
+            $entity = $this->createExtensions->execute($entityType, $entity);
+            $this->eventManager->dispatch('entity_save_after', ['entity_type' => $entityType, 'entity' => $entity]);
+            $connection->commit();
+        } catch (\Exception $e) {
+            $connection->rollBack();
+            throw $e;
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateAttributes.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateAttributes.php
new file mode 100644
index 0000000000000000000000000000000000000000..564609bd8cf44dd4c0a81c399a13616d9317149d
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateAttributes.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Create;
+
+use Magento\Framework\EntityManager\Operation\AttributePool;
+use Magento\Framework\EntityManager\HydratorPool;
+
+/**
+ * Class CreateAttributes
+ */
+class CreateAttributes
+{
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var AttributePool
+     */
+    private $attributePool;
+
+    /**
+     * CreateAttributes constructor.
+     *
+     * @param HydratorPool $hydratorPool
+     * @param AttributePool $attributePool
+     */
+    public function __construct(
+        HydratorPool $hydratorPool,
+        AttributePool $attributePool
+    ) {
+        $this->hydratorPool = $hydratorPool;
+        $this->attributePool = $attributePool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity, $data = [])
+    {
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $entityData = array_merge($hydrator->extract($entity), $data);
+        $actions = $this->attributePool->getActions($entityType, 'create');
+        foreach ($actions as $action) {
+            $action->execute($entityType, $entityData);
+        }
+        $entity = $hydrator->hydrate($entity, $entityData);
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateExtensions.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateExtensions.php
new file mode 100644
index 0000000000000000000000000000000000000000..7706d1a5fd79dab382665b1da3f2cbc677e0926b
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateExtensions.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Create;
+
+use Magento\Framework\EntityManager\Operation\ExtensionPool;
+
+/**
+ * Class CreateExtensions
+ */
+class CreateExtensions
+{
+    /**
+     * @var ExtensionPool
+     */
+    private $extensionPool;
+
+    /**
+     * CreateExtensions constructor.
+     * @param ExtensionPool $extensionPool
+     */
+    public function __construct(
+        ExtensionPool $extensionPool
+    ) {
+        $this->extensionPool = $extensionPool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity)
+    {
+        $actions = $this->extensionPool->getActions($entityType, 'create');
+        foreach ($actions as $action) {
+            $entity = $action->execute($entityType, $entity);
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateMain.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateMain.php
new file mode 100644
index 0000000000000000000000000000000000000000..31637ea41c7d43fb98cba6a124aa01c56991b815
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateMain.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Create;
+
+use Magento\Framework\EntityManager\HydratorPool;
+use Magento\Framework\EntityManager\Db\CreateRow;
+
+/**
+ * Class CreateMain
+ */
+class CreateMain
+{
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var CreateRow
+     */
+    private $createRow;
+
+    /**
+     * CreateMain constructor.
+     *
+     * @param HydratorPool $hydratorPool
+     * @param CreateRow $createRow
+     */
+    public function __construct(
+        HydratorPool $hydratorPool,
+        CreateRow $createRow
+    ) {
+        $this->hydratorPool = $hydratorPool;
+        $this->createRow = $createRow;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity, $data = [])
+    {
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $entityData = $this->createRow->execute(
+            $entityType,
+            array_merge($hydrator->extract($entity), $data)
+        );
+        $entity = $hydrator->hydrate($entity, $entityData);
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/ValidateCreate.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/ValidateCreate.php
new file mode 100644
index 0000000000000000000000000000000000000000..09946dec6a1cb04c734dd4a8c93d560fce752e0e
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/ValidateCreate.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Create;
+
+use Magento\Framework\EntityManager\Operation\ValidatorPool;
+
+/**
+ * Class ValidateCreate
+ */
+class ValidateCreate
+{
+    /**
+     * @var ValidatorPool
+     */
+    private $validatorPool;
+
+    /**
+     * ValidateCreate constructor.
+     *
+     * @param ValidatorPool $validatorPool
+     */
+    public function __construct(
+        ValidatorPool $validatorPool
+    ) {
+        $this->validatorPool = $validatorPool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity)
+    {
+        $validators = $this->validatorPool->getValidators($entityType, 'create');
+        foreach ($validators as $validator) {
+            $validator->execute($entityType, $entity);
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete.php
new file mode 100644
index 0000000000000000000000000000000000000000..adc12a0fb06b2bf352155ca2e5f0f1df83041eea
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write;
+
+use Magento\Framework\EntityManager\Operation\Write\Delete\ValidateDelete;
+use Magento\Framework\EntityManager\Operation\Write\Delete\DeleteMain;
+use Magento\Framework\EntityManager\Operation\Write\Delete\DeleteAttributes;
+use Magento\Framework\EntityManager\Operation\Write\Delete\DeleteExtensions;
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\Event\ManagerInterface;
+use Magento\Framework\Model\ResourceModel\Db\TransactionManagerInterface;
+
+/**
+ * Class Delete
+ */
+class Delete
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var ResourceConnection
+     */
+    private $resourceConnection;
+
+    /**
+     * @var ManagerInterface
+     */
+    private $eventManager;
+
+    /**
+     * @var TransactionManagerInterface
+     */
+    private $transactionManager;
+
+    private $validateDelete;
+
+    /**
+     * @var DeleteMain
+     */
+    private $deleteMain;
+
+    /**
+     * @var DeleteAttributes
+     */
+    private $deleteAttributes;
+
+    /**
+     * @var DeleteExtensions
+     */
+    private $deleteExtensions;
+
+    /**
+     * Delete constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param ResourceConnection $resourceConnection
+     * @param ManagerInterface $eventManager
+     * @param TransactionManagerInterface $transactionManager
+     * @param ValidateDelete $validateDelete
+     * @param DeleteMain $deleteMain
+     * @param DeleteAttributes $deleteAttributes
+     * @param DeleteExtensions $deleteExtensions
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        ResourceConnection $resourceConnection,
+        ManagerInterface $eventManager,
+        TransactionManagerInterface $transactionManager,
+        ValidateDelete $validateDelete,
+        DeleteMain $deleteMain,
+        DeleteAttributes $deleteAttributes,
+        DeleteExtensions $deleteExtensions
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->resourceConnection = $resourceConnection;
+        $this->eventManager = $eventManager;
+        $this->transactionManager = $transactionManager;
+        $this->validateDelete = $validateDelete;
+        $this->deleteMain = $deleteMain;
+        $this->deleteAttributes = $deleteAttributes;
+        $this->deleteExtensions = $deleteExtensions;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     * @throws \Exception
+     */
+    public function execute($entityType, $entity)
+    {
+        $this->validateDelete->execute($entityType, $entity);
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
+        $this->transactionManager->start($connection);
+        try {
+            $this->eventManager->dispatch('entity_delete_before', ['entity_type' => $entityType, 'entity' => $entity]);
+            $entity = $this->deleteMain->execute($entityType, $entity);
+            $entity = $this->deleteAttributes->execute($entityType, $entity);
+            $entity = $this->deleteExtensions->execute($entityType, $entity);
+            $this->eventManager->dispatch('entity_delete_before', ['entity_type' => $entityType, 'entity' => $entity]);
+            $this->transactionManager->commit();
+        } catch (\Exception $e) {
+            $this->transactionManager->rollBack();
+            throw $e;
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteAttributes.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteAttributes.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bbf27526c65bbcbc412f39d061cfd9e4d18cbcd
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteAttributes.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Delete;
+
+use Magento\Framework\EntityManager\Operation\AttributePool;
+use Magento\Framework\EntityManager\HydratorPool;
+
+/**
+ * Class DeleteAttributes
+ */
+class DeleteAttributes
+{
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var AttributePool
+     */
+    private $attributePool;
+
+    /**
+     * DeleteAttributes constructor.
+     *
+     * @param HydratorPool $hydratorPool
+     * @param AttributePool $attributePool
+     */
+    public function __construct(
+        HydratorPool $hydratorPool,
+        AttributePool $attributePool
+    ) {
+        $this->hydratorPool = $hydratorPool;
+        $this->attributePool = $attributePool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity, $data = [])
+    {
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $entityData = array_merge($hydrator->extract($entity), $data);
+        $actions = $this->attributePool->getActions($entityType, 'delete');
+        foreach ($actions as $action) {
+            $action->execute($entityType, $entityData);
+        }
+        $entity = $hydrator->hydrate($entity, $entityData);
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteExtensions.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteExtensions.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ceeea3650077facd25bfa518f4a6cff4634a008
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteExtensions.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Delete;
+
+use Magento\Framework\EntityManager\Operation\ExtensionPool;
+
+/**
+ * Class DeleteExtensions
+ */
+class DeleteExtensions
+{
+    /**
+     * @var ExtensionPool
+     */
+    private $extensionPool;
+
+    /**
+     * CreateExtensions constructor.
+     * @param ExtensionPool $extensionPool
+     */
+    public function __construct(
+        ExtensionPool $extensionPool
+    ) {
+        $this->extensionPool = $extensionPool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity)
+    {
+        $actions = $this->extensionPool->getActions($entityType, 'delete');
+        foreach ($actions as $action) {
+            $entity = $action->execute($entityType, $entity);
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteMain.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteMain.php
new file mode 100644
index 0000000000000000000000000000000000000000..73b177a4946402b7dd61be9106bd489a9a2a06ec
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteMain.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Delete;
+
+use Magento\Framework\EntityManager\HydratorPool;
+use Magento\Framework\EntityManager\Db\DeleteRow;
+
+/**
+ * Class DeleteMain
+ */
+class DeleteMain
+{
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var DeleteRow
+     */
+    private $deleteRow;
+
+    /**
+     * DeleteMain constructor.
+     *
+     * @param HydratorPool $hydratorPool
+     * @param DeleteRow $deleteRow
+     */
+    public function __construct(
+        HydratorPool $hydratorPool,
+        DeleteRow $deleteRow
+    ) {
+        $this->hydratorPool = $hydratorPool;
+        $this->deleteRow = $deleteRow;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return int
+     */
+    public function execute($entityType, $entity)
+    {
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        return $this->deleteRow->execute($entityType, $hydrator->extract($entity));
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/ValidateDelete.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/ValidateDelete.php
new file mode 100644
index 0000000000000000000000000000000000000000..f2002cb54fbd5b7493a8ccc45d28d423d4996683
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/ValidateDelete.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Delete;
+
+use Magento\Framework\EntityManager\Operation\ValidatorPool;
+
+/**
+ * Class ValidateDelete
+ */
+class ValidateDelete
+{
+    /**
+     * @var ValidatorPool
+     */
+    private $validatorPool;
+
+    /**
+     * ValidateDelete constructor.
+     *
+     * @param ValidatorPool $validatorPool
+     */
+    public function __construct(
+        ValidatorPool $validatorPool
+    ) {
+        $this->validatorPool = $validatorPool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity)
+    {
+        $validators = $this->validatorPool->getValidators($entityType, 'delete');
+        foreach ($validators as $validator) {
+            $validator->execute($entityType, $entity);
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update.php
new file mode 100644
index 0000000000000000000000000000000000000000..cd89c3f380b2e24568642e18528bbec70b15cc2a
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write;
+
+use Magento\Framework\EntityManager\Operation\Write\Update\ValidateUpdate;
+use Magento\Framework\EntityManager\Operation\Write\Update\UpdateMain;
+use Magento\Framework\EntityManager\Operation\Write\Update\UpdateAttributes;
+use Magento\Framework\EntityManager\Operation\Write\Update\UpdateExtensions;
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\Event\ManagerInterface;
+
+/**
+ * Class Update
+ */
+class Update
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var ResourceConnection
+     */
+    private $resourceConnection;
+
+    /**
+     * @var ManagerInterface
+     */
+    private $eventManager;
+
+    /**
+     * @var ValidateUpdate
+     */
+    private $validateUpdate;
+
+    /**
+     * @var UpdateMain
+     */
+    private $updateMain;
+
+    /**
+     * @var UpdateAttributes
+     */
+    private $updateAttributes;
+
+    /**
+     * @var UpdateExtensions
+     */
+    private $updateExtensions;
+
+    /**
+     * Update constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param ResourceConnection $resourceConnection
+     * @param ManagerInterface $eventManager
+     * @param ValidateUpdate $validateUpdate
+     * @param UpdateMain $updateMain
+     * @param UpdateAttributes $updateAttributes
+     * @param UpdateExtensions $updateExtensions
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        ResourceConnection $resourceConnection,
+        ManagerInterface $eventManager,
+        ValidateUpdate $validateUpdate,
+        UpdateMain $updateMain,
+        UpdateAttributes $updateAttributes,
+        UpdateExtensions $updateExtensions
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->resourceConnection = $resourceConnection;
+        $this->eventManager = $eventManager;
+        $this->validateUpdate = $validateUpdate;
+        $this->updateMain = $updateMain;
+        $this->updateAttributes = $updateAttributes;
+        $this->updateExtensions = $updateExtensions;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     * @throws \Exception
+     */
+    public function execute($entityType, $entity)
+    {
+        $this->validateUpdate->execute($entityType, $entity);
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
+        $connection->beginTransaction();
+        try {
+            $this->eventManager->dispatch('entity_save_before', ['entity_type' => $entityType, 'entity' => $entity]);
+            $entity = $this->updateMain->execute($entityType, $entity);
+            $entity = $this->updateAttributes->execute($entityType, $entity);
+            $entity = $this->updateExtensions->execute($entityType, $entity);
+            $this->eventManager->dispatch('entity_save_after', ['entity_type' => $entityType, 'entity' => $entity]);
+            $connection->commit();
+        } catch (\Exception $e) {
+            $connection->rollBack();
+            throw $e;
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateAttributes.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateAttributes.php
new file mode 100644
index 0000000000000000000000000000000000000000..16b640630d2532f3a3d75ffa076f2e8af6110145
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateAttributes.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Update;
+
+use Magento\Framework\EntityManager\Operation\AttributePool;
+use Magento\Framework\EntityManager\HydratorPool;
+
+/**
+ * Class UpdateAttributes
+ */
+class UpdateAttributes
+{
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var AttributePool
+     */
+    private $attributePool;
+
+    /**
+     * DeleteAttributes constructor.
+     *
+     * @param HydratorPool $hydratorPool
+     * @param AttributePool $attributePool
+     */
+    public function __construct(
+        HydratorPool $hydratorPool,
+        AttributePool $attributePool
+    ) {
+        $this->hydratorPool = $hydratorPool;
+        $this->attributePool = $attributePool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity, $data = [])
+    {
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $entityData = array_merge($hydrator->extract($entity), $data);
+        $actions = $this->attributePool->getActions($entityType, 'update');
+        foreach ($actions as $action) {
+            $action->execute($entityType, $entityData);
+        }
+        $entity = $hydrator->hydrate($entity, $entityData);
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateExtensions.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateExtensions.php
new file mode 100644
index 0000000000000000000000000000000000000000..5add30b29658d2135f758e119dfdafc6d2a4fda7
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateExtensions.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Update;
+
+use Magento\Framework\EntityManager\Operation\ExtensionPool;
+
+/**
+ * Class UpdateExtensions
+ */
+class UpdateExtensions
+{
+    /**
+     * @var ExtensionPool
+     */
+    private $extensionPool;
+
+    /**
+     * CreateExtensions constructor.
+     * @param ExtensionPool $extensionPool
+     */
+    public function __construct(
+        ExtensionPool $extensionPool
+    ) {
+        $this->extensionPool = $extensionPool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity)
+    {
+        $actions = $this->extensionPool->getActions($entityType, 'update');
+        foreach ($actions as $action) {
+            $entity = $action->execute($entityType, $entity);
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateMain.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateMain.php
new file mode 100644
index 0000000000000000000000000000000000000000..c0266ab05d81284fd4ea8df7e800ebaa59347893
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateMain.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Update;
+
+use Magento\Framework\EntityManager\HydratorPool;
+use Magento\Framework\EntityManager\Db\UpdateRow;
+
+/**
+ * Class UpdateMain
+ */
+class UpdateMain
+{
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var UpdateRow
+     */
+    private $updateRow;
+
+    /**
+     * UpdateMain constructor.
+     *
+     * @param HydratorPool $hydratorPool
+     * @param UpdateRow $updateRow
+     */
+    public function __construct(
+        HydratorPool $hydratorPool,
+        UpdateRow $updateRow
+    ) {
+        $this->hydratorPool = $hydratorPool;
+        $this->updateRow = $updateRow;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity, $data = [])
+    {
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $entityData = $this->updateRow->execute(
+            $entityType,
+            array_merge($hydrator->extract($entity), $data)
+        );
+        $entity = $hydrator->hydrate($entity, $entityData);
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/ValidateUpdate.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/ValidateUpdate.php
new file mode 100644
index 0000000000000000000000000000000000000000..eeb147c06f02b54ccf3016b5ed0a07491118191d
--- /dev/null
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/ValidateUpdate.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\EntityManager\Operation\Write\Update;
+
+use Magento\Framework\EntityManager\Operation\ValidatorPool;
+
+/**
+ * Class ValidateUpdate
+ */
+class ValidateUpdate
+{
+    /**
+     * @var ValidatorPool
+     */
+    private $validatorPool;
+
+    /**
+     * ValidateUpdate constructor.
+     *
+     * @param ValidatorPool $validatorPool
+     */
+    public function __construct(
+        ValidatorPool $validatorPool
+    ) {
+        $this->validatorPool = $validatorPool;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @return object
+     */
+    public function execute($entityType, $entity)
+    {
+        $validators = $this->validatorPool->getValidators($entityType, 'update');
+        foreach ($validators as $validator) {
+            $validator->execute($entityType, $entity);
+        }
+        return $entity;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Model/OrchestratorPool.php b/lib/internal/Magento/Framework/EntityManager/OperationPool.php
similarity index 57%
rename from lib/internal/Magento/Framework/Model/OrchestratorPool.php
rename to lib/internal/Magento/Framework/EntityManager/OperationPool.php
index 86708c3689e469064100937d35ca0f735a19a9f4..d5b4e62ebce001ac5a72bb003b87cdfe51e0122c 100644
--- a/lib/internal/Magento/Framework/Model/OrchestratorPool.php
+++ b/lib/internal/Magento/Framework/EntityManager/OperationPool.php
@@ -4,24 +4,24 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Framework\Model;
+namespace Magento\Framework\EntityManager;
 
 use Magento\Framework\ObjectManagerInterface as ObjectManager;
 
 /**
- * Class Orchestrator
+ * Class OperationPool
  */
-class OrchestratorPool
+class OperationPool
 {
     /**
      * @var array
      */
-    protected $operations;
+    private $operations;
 
     /**
      * @var ObjectManager
      */
-    protected $objectManager;
+    private $objectManager;
 
     /**
      * OrchestratorPool constructor.
@@ -37,29 +37,17 @@ class OrchestratorPool
     }
 
     /**
+     * Returns operation by name by entity type
+     *
      * @param string $entityType
      * @param string $operationName
-     * @return Operation\WriteInterface
-     * @throws \Exception
+     * @return object
      */
-    public function getWriteOperation($entityType, $operationName)
+    public function getOperation($entityType, $operationName)
     {
         if (!isset($this->operations[$entityType][$operationName])) {
             return $this->objectManager->get($this->operations['default'][$operationName]);
         }
         return $this->objectManager->get($this->operations[$entityType][$operationName]);
     }
-
-    /**
-     * @param string $entityType
-     * @return Operation\ReadInterface
-     * @throws \Exception
-     */
-    public function getReadOperation($entityType)
-    {
-        if (!isset($this->operations[$entityType]['read'])) {
-            return $this->objectManager->get($this->operations['default']['read']);
-        }
-        return $this->objectManager->get($this->operations[$entityType]['read']);
-    }
 }
diff --git a/lib/internal/Magento/Framework/Model/Entity/Sequence.php b/lib/internal/Magento/Framework/EntityManager/Sequence/Sequence.php
similarity index 91%
rename from lib/internal/Magento/Framework/Model/Entity/Sequence.php
rename to lib/internal/Magento/Framework/EntityManager/Sequence/Sequence.php
index ce7aab9fa3ad3450343657d122321a1efd12ab76..bb0daf008bc86b0de62f703409e5b3d2cb280f66 100644
--- a/lib/internal/Magento/Framework/Model/Entity/Sequence.php
+++ b/lib/internal/Magento/Framework/EntityManager/Sequence/Sequence.php
@@ -4,14 +4,15 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Framework\Model\Entity;
+namespace Magento\Framework\EntityManager\Sequence;
 
 use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\DB\Sequence\SequenceInterface;
 
 /**
  * Class Sequence
  */
-class Sequence implements \Magento\Framework\DB\Sequence\SequenceInterface
+class Sequence implements SequenceInterface
 {
     /**
      * @var string
diff --git a/lib/internal/Magento/Framework/Model/Entity/SequenceFactory.php b/lib/internal/Magento/Framework/EntityManager/Sequence/SequenceFactory.php
similarity index 81%
rename from lib/internal/Magento/Framework/Model/Entity/SequenceFactory.php
rename to lib/internal/Magento/Framework/EntityManager/Sequence/SequenceFactory.php
index f748a52f478a125f1a1c58cc4756e0def63d1792..f52828b5b467d1acd6d46967d5017b6d3f7f7d09 100644
--- a/lib/internal/Magento/Framework/Model/Entity/SequenceFactory.php
+++ b/lib/internal/Magento/Framework/EntityManager/Sequence/SequenceFactory.php
@@ -4,11 +4,14 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Framework\Model\Entity;
+namespace Magento\Framework\EntityManager\Sequence;
 
 use Magento\Framework\DB\Sequence\SequenceInterface;
 use Magento\Framework\ObjectManagerInterface;
 
+/**
+ * Class SequenceFactory
+ */
 class SequenceFactory
 {
     /**
@@ -34,7 +37,7 @@ class SequenceFactory
     public function __construct(
         SequenceRegistry $sequenceRegistry,
         ObjectManagerInterface $objectManager,
-        $instanceName = 'Magento\\Framework\\Model\\Entity\\Sequence'
+        $instanceName = 'Magento\\Framework\\EntityManager\\Sequence\\Sequence'
     ) {
         $this->sequenceRegistry = $sequenceRegistry;
         $this->objectManager = $objectManager;
@@ -57,12 +60,17 @@ class SequenceFactory
                     $config[$entityType]['sequence']
                 );
             } elseif (isset($config[$entityType]['sequenceTable'])) {
+                if (isset($config[$entityType]['connectionName'])) {
+                    $connectionName = $config[$entityType]['connectionName'];
+                } else {
+                    $connectionName = 'default';
+                }
                 $this->sequenceRegistry->register(
                     $entityType,
                     $this->objectManager->create(
                         $this->instanceName,
                         [
-                            'connectionName' => $config[$entityType]['connectionName'],
+                            'connectionName' => $connectionName,
                             'sequenceTable' => $config[$entityType]['sequenceTable'],
                         ]
                     ),
diff --git a/lib/internal/Magento/Framework/Model/Entity/SequenceManager.php b/lib/internal/Magento/Framework/EntityManager/Sequence/SequenceManager.php
similarity index 85%
rename from lib/internal/Magento/Framework/Model/Entity/SequenceManager.php
rename to lib/internal/Magento/Framework/EntityManager/Sequence/SequenceManager.php
index c3e48d5e3b38e4d1b3256092113571e547e78588..b46a69f65545a310e1bcc781a5b3979ddb2e13d0 100644
--- a/lib/internal/Magento/Framework/Model/Entity/SequenceManager.php
+++ b/lib/internal/Magento/Framework/EntityManager/Sequence/SequenceManager.php
@@ -4,39 +4,35 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Framework\Model\Entity;
+namespace Magento\Framework\EntityManager\Sequence;
 
 use Psr\Log\LoggerInterface;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class SequenceManager
  */
 class SequenceManager
 {
-    /**
-     * @var array
-     */
-    protected $registry;
-
     /**
      * @var SequenceRegistry
      */
-    protected $sequenceRegistry;
+    private $sequenceRegistry;
 
     /**
      * @var MetadataPool
      */
-    protected $metadataPool;
+    private $metadataPool;
 
     /**
      * @var LoggerInterface
      */
-    protected $logger;
+    private $logger;
 
     /**
      * @var \Magento\Framework\App\ResourceConnection
      */
-    protected $appResource;
+    private $appResource;
 
     /**
      * @param MetadataPool $metadataPool
@@ -73,7 +69,8 @@ class SequenceManager
             throw new \Exception('TODO: use correct Exception class' . PHP_EOL  . ' Sequence table doesnt exists');
         }
         try {
-            return $metadata->getEntityConnection()->insert(
+            $connection = $this->appResource->getConnectionByName($metadata->getEntityConnectionName());
+            return $connection->insert(
                 $this->appResource->getTableName($sequenceInfo['sequenceTable']),
                 ['sequence_value' => $identifier]
             );
@@ -97,7 +94,8 @@ class SequenceManager
             throw new \Exception('TODO: use correct Exception class' . PHP_EOL  . ' Sequence table doesnt exists');
         }
         try {
-            return $metadata->getEntityConnection()->delete(
+            $connection = $this->appResource->getConnectionByName($metadata->getEntityConnectionName());
+            return $connection->delete(
                 $this->appResource->getTableName($sequenceInfo['sequenceTable']),
                 ['sequence_value = ?' => $identifier]
             );
diff --git a/lib/internal/Magento/Framework/Model/Entity/SequenceRegistry.php b/lib/internal/Magento/Framework/EntityManager/Sequence/SequenceRegistry.php
similarity index 93%
rename from lib/internal/Magento/Framework/Model/Entity/SequenceRegistry.php
rename to lib/internal/Magento/Framework/EntityManager/Sequence/SequenceRegistry.php
index 056e354ce236438ea52fd2d5742832899c52033b..c50159df27b19fea53abb4b2a761a421af95bd1e 100644
--- a/lib/internal/Magento/Framework/Model/Entity/SequenceRegistry.php
+++ b/lib/internal/Magento/Framework/EntityManager/Sequence/SequenceRegistry.php
@@ -4,7 +4,7 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Framework\Model\Entity;
+namespace Magento\Framework\EntityManager\Sequence;
 
 use Magento\Framework\DB\Sequence\SequenceInterface;
 
@@ -16,7 +16,7 @@ class SequenceRegistry
     /**
      * @var array
      */
-    protected $registry;
+    private $registry;
 
     /**
      * Register information about existing sequence
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/CreateExtension.php b/lib/internal/Magento/Framework/Model/Entity/Action/CreateExtension.php
deleted file mode 100644
index d6268e015feb7be9eadf9fba5625a55ed7d7bf46..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/CreateExtension.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ExtensionPool;
-
-/**
- * Class CreateExtension
- */
-class CreateExtension
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var ExtensionPool
-     */
-    protected $extensionPool;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param ExtensionPool $extensionPool
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        ExtensionPool $extensionPool
-    ) {
-        $this->extensionPool = $extensionPool;
-        $this->metadataPool = $metadataPool;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @param array $data
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity, $data = [])
-    {
-        $hydrator = $this->metadataPool->getHydrator($entityType);
-        $entityData = array_merge($hydrator->extract($entity), $data);
-        $actions = $this->extensionPool->getActions($entityType, 'create');
-        foreach ($actions as $action) {
-            $entityData = $action->execute($entityType, $entityData);
-        }
-        $entity = $hydrator->hydrate($entity, $entityData);
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/CreateMain.php b/lib/internal/Magento/Framework/Model/Entity/Action/CreateMain.php
deleted file mode 100644
index 1eba9e8a5970cf4327986158aef0b670783007e7..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/CreateMain.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\CreateEntityRow;
-
-/**
- * Class CreateMain
- */
-class CreateMain
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var CreateEntityRow
-     */
-    protected $createEntityRow;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param CreateEntityRow $createEntityRow
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        CreateEntityRow $createEntityRow
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->createEntityRow = $createEntityRow;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @param array $data
-     * @return object
-     */
-    public function execute($entityType, $entity, $data = [])
-    {
-        $hydrator = $this->metadataPool->getHydrator($entityType);
-        $entityData = $this->createEntityRow->execute(
-            $entityType,
-            array_merge($hydrator->extract($entity), $data)
-        );
-        $entity = $hydrator->hydrate($entity, $entityData);
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/CreateRelation.php b/lib/internal/Magento/Framework/Model/Entity/Action/CreateRelation.php
deleted file mode 100644
index e00018284dea5bc48f7e92adb67f455dd7584d20..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/CreateRelation.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool as RelationActionPool;
-
-/**
- * Class CreateRelation
- */
-class CreateRelation
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var RelationActionPool
-     */
-    protected $relationActionPool;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param RelationActionPool $relationActionPool
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        RelationActionPool $relationActionPool
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->relationActionPool = $relationActionPool;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity)
-    {
-        $actions = $this->relationActionPool->getActions($entityType, 'create');
-        foreach ($actions as $action) {
-            $entity = $action->execute($entityType, $entity);
-        }
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/DeleteExtension.php b/lib/internal/Magento/Framework/Model/Entity/Action/DeleteExtension.php
deleted file mode 100644
index f4b6e7b8a88535d548deeeba4c1addb0f25d614d..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/DeleteExtension.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ExtensionPool;
-
-/**
- * Class DeleteExtension
- */
-class DeleteExtension
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var ExtensionPool
-     */
-    protected $extensionPool;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param ExtensionPool $extensionPool
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        ExtensionPool $extensionPool
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->extensionPool = $extensionPool;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @param array $data
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity, $data = [])
-    {
-        $metadata = $this->metadataPool->getMetadata($entityType);
-        if ($metadata->getEavEntityType()) {
-            $hydrator = $this->metadataPool->getHydrator($entityType);
-            $entityData = array_merge($hydrator->extract($entity), $data);
-            $actions = $this->extensionPool->getActions($entityType, 'delete');
-            foreach ($actions as $action) {
-                $action->execute($entityType, $entityData);
-            }
-            $entity = $hydrator->hydrate($entity, $entityData);
-        }
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/DeleteMain.php b/lib/internal/Magento/Framework/Model/Entity/Action/DeleteMain.php
deleted file mode 100644
index 61ed8e908e1b80ebdccb6ea7984d21a182839f9f..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/DeleteMain.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\DeleteEntityRow;
-
-/**
- * Class DeleteMain
- */
-class DeleteMain
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var DeleteEntityRow
-     */
-    protected $deleteEntityRow;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param DeleteEntityRow $createEntityRow
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        DeleteEntityRow $createEntityRow
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->deleteEntityRow = $createEntityRow;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return bool
-     */
-    public function execute($entityType, $entity)
-    {
-        $hydrator = $this->metadataPool->getHydrator($entityType);
-        $entityData = $hydrator->extract($entity);
-        return $this->deleteEntityRow->execute(
-            $entityType,
-            $entityData
-        );
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/DeleteRelation.php b/lib/internal/Magento/Framework/Model/Entity/Action/DeleteRelation.php
deleted file mode 100644
index a295152aa1b2a5aabc2f612119889868c636c56f..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/DeleteRelation.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool as RelationActionPool;
-
-/**
- * Class CreateRelation
- */
-class DeleteRelation
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var RelationActionPool
-     */
-    protected $relationActionPool;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param RelationActionPool $relationActionPool
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        RelationActionPool $relationActionPool
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->relationActionPool = $relationActionPool;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity)
-    {
-        $actions = $this->relationActionPool->getActions($entityType, 'delete');
-        foreach ($actions as $action) {
-            $entity = $action->execute($entityType, $entity);
-        }
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/ReadExtension.php b/lib/internal/Magento/Framework/Model/Entity/Action/ReadExtension.php
deleted file mode 100644
index a0cc7b7e3fea6a61cb5582a3adddc1b8090bcdcb..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/ReadExtension.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ExtensionPool;
-
-/**
- * Class ReadExtension
- */
-class ReadExtension
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var ExtensionPool
-     */
-    protected $extensionPool;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param ExtensionPool $extensionPool
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        ExtensionPool $extensionPool
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->extensionPool = $extensionPool;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity)
-    {
-        $hydrator = $this->metadataPool->getHydrator($entityType);
-        $entityData = $hydrator->extract($entity);
-        $actions = $this->extensionPool->getActions($entityType, 'read');
-        foreach ($actions as $action) {
-            $data = $action->execute($entityType, $entityData);
-            $entity = $hydrator->hydrate($entity, $data);
-        }
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/ReadMain.php b/lib/internal/Magento/Framework/Model/Entity/Action/ReadMain.php
deleted file mode 100644
index 21d76260c10cf0bd35e2f583e1de2e929722bbcf..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/ReadMain.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ReadEntityRow;
-
-/**
- * Class ReadMain
- */
-class ReadMain
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var ReadEntityRow
-     */
-    protected $readEntityRow;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param ReadEntityRow $readEntityRow
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        ReadEntityRow $readEntityRow
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->readEntityRow = $readEntityRow;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @param string $identifier
-     * @return object
-     */
-    public function execute($entityType, $entity, $identifier)
-    {
-        $hydrator = $this->metadataPool->getHydrator($entityType);
-        $data = $this->readEntityRow->execute($entityType, $identifier);
-        return $hydrator->hydrate($entity, $data);
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/ReadRelation.php b/lib/internal/Magento/Framework/Model/Entity/Action/ReadRelation.php
deleted file mode 100644
index 00f1cee3a236ea96e4890469a083b598951f457c..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/ReadRelation.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool as RelationActionPool;
-
-/**
- * Class ReadRelation
- */
-class ReadRelation
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var RelationActionPool
-     */
-    protected $relationActionPool;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param RelationActionPool $relationActionPool
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        RelationActionPool $relationActionPool
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->relationActionPool = $relationActionPool;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity)
-    {
-        $actions = $this->relationActionPool->getActions($entityType, 'read');
-        foreach ($actions as $action) {
-            $entity = $action->execute($entityType, $entity);
-        }
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/UpdateExtension.php b/lib/internal/Magento/Framework/Model/Entity/Action/UpdateExtension.php
deleted file mode 100644
index 0a841619f934781baaca492e9a07addd1061b4f4..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/UpdateExtension.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ExtensionPool;
-
-/**
- * Class UpdateExtension
- */
-class UpdateExtension
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var ExtensionPool
-     */
-    protected $extensionPool;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param ExtensionPool $extensionPool
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        ExtensionPool $extensionPool
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->extensionPool = $extensionPool;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @param array $data
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity, $data = [])
-    {
-        $hydrator = $this->metadataPool->getHydrator($entityType);
-        $entityData = array_merge($hydrator->extract($entity), $data);
-        $actions = $this->extensionPool->getActions($entityType, 'update');
-        foreach ($actions as $action) {
-            $action->execute($entityType, $entityData);
-            $entity = $hydrator->hydrate($entity, $entityData);
-        }
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/UpdateMain.php b/lib/internal/Magento/Framework/Model/Entity/Action/UpdateMain.php
deleted file mode 100644
index 3718da8c7f0df9255efccb15c22614c1ca1161bc..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/UpdateMain.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\UpdateEntityRow;
-
-/**
- * Class UpdateMain
- */
-class UpdateMain
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var UpdateEntityRow
-     */
-    protected $updateEntityRow;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param UpdateEntityRow $updateEntityRow
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        UpdateEntityRow $updateEntityRow
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->updateEntityRow = $updateEntityRow;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @param array $data
-     * @return object
-     */
-    public function execute($entityType, $entity, $data = [])
-    {
-        $hydrator = $this->metadataPool->getHydrator($entityType);
-        $entityData = array_merge($hydrator->extract($entity), $data);
-        $this->updateEntityRow->execute($entityType, $entityData);
-        $hydrator->hydrate($entity, $entityData);
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/Action/UpdateRelation.php b/lib/internal/Magento/Framework/Model/Entity/Action/UpdateRelation.php
deleted file mode 100644
index 058b981ac587a26b3708d65fd7c704db799acc62..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/Action/UpdateRelation.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool as RelationActionPool;
-
-/**
- * Class UpdateRelation
- */
-class UpdateRelation
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var RelationActionPool
-     */
-    protected $relationActionPool;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param RelationActionPool $relationActionPool
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        RelationActionPool $relationActionPool
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->relationActionPool = $relationActionPool;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity)
-    {
-        $actions = $this->relationActionPool->getActions($entityType, 'update');
-        foreach ($actions as $action) {
-            $entity = $action->execute($entityType, $entity);
-        }
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php b/lib/internal/Magento/Framework/Model/Entity/Hydrator.php
similarity index 74%
rename from lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php
rename to lib/internal/Magento/Framework/Model/Entity/Hydrator.php
index b4001018e2ecaa30044d9ab17978bef8e7cd95e1..cd5fe987fcd47d37fbf695cb9804d562f947da58 100644
--- a/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php
+++ b/lib/internal/Magento/Framework/Model/Entity/Hydrator.php
@@ -3,13 +3,14 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Framework\Model\Entity;
 
+use Magento\Framework\EntityManager\EntityHydratorInterface;
+
 /**
- * Class EntityHydrator
+ * Class Hydrator
  */
-class EntityHydrator implements HydratorInterface
+class Hydrator implements EntityHydratorInterface
 {
     /**
      * @param object $entity
@@ -17,7 +18,6 @@ class EntityHydrator implements HydratorInterface
      */
     public function extract($entity)
     {
-        //TODO: refactor with using API data interfaces
         return $entity->getData();
     }
 
@@ -28,7 +28,6 @@ class EntityHydrator implements HydratorInterface
      */
     public function hydrate($entity, array $data)
     {
-        //TODO: refactor with using API data interfaces
         $entity->setData(array_merge($entity->getData(), $data));
         return $entity;
     }
diff --git a/lib/internal/Magento/Framework/Model/Entity/MetadataPool.php b/lib/internal/Magento/Framework/Model/Entity/MetadataPool.php
deleted file mode 100644
index ef1b50474555827537a093b5c40f6cc53923b3cc..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Entity/MetadataPool.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Entity;
-
-use Magento\Framework\ObjectManagerInterface;
-
-/**
- * Class MetadataPool
- */
-class MetadataPool
-{
-    /**
-     * @var ObjectManagerInterface
-     */
-    protected $objectManager;
-
-    /**
-     * @var array
-     */
-    protected $metadata;
-
-    /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata[]
-     */
-    protected $registry;
-
-    /**
-     * @var SequenceFactory
-     */
-    protected $sequenceFactory;
-
-    /**
-     * MetadataPool constructor.
-     * @param ObjectManagerInterface $objectManager
-     * @param SequenceFactory $sequenceFactory
-     * @param array $metadata
-     */
-    public function __construct(
-        ObjectManagerInterface $objectManager,
-        SequenceFactory $sequenceFactory,
-        array $metadata
-    ) {
-        $this->objectManager = $objectManager;
-        $this->sequenceFactory = $sequenceFactory;
-        $this->metadata = $metadata;
-    }
-
-    /**
-     * @param string $bentityType
-     * @return EntityMetadata
-     * @throws \Exception
-     * @SuppressWarnings(PHPMD.NPathComplexity)
-     */
-    public function getMetadata($entityType)
-    {
-        if (!isset($this->metadata[$entityType])) {
-            throw new \Exception('Not enough configuration');
-        }
-        if (!isset($this->registry[$entityType])) {
-            $this->metadata[$entityType]['connectionName'] = 'default';
-            $this->registry[$entityType] = $this->objectManager->create(
-                EntityMetadata::class,
-                [
-                    'entityTableName' => $this->metadata[$entityType]['entityTableName'],
-                    'eavEntityType' => isset($this->metadata[$entityType]['eavEntityType'])
-                        ? $this->metadata[$entityType]['eavEntityType']
-                        : null,
-                        //isset($this->eavMapping[$entityType]) ? $this->eavMapping[$entityType] : null,
-                    'connectionName' => $this->metadata[$entityType]['connectionName'],
-                    'identifierField' => $this->metadata[$entityType]['identifierField'],
-                    'sequence' => $this->sequenceFactory->create($entityType, $this->metadata),
-                    'entityContext' => isset($this->metadata[$entityType]['entityContext'])
-                        ? $this->metadata[$entityType]['entityContext']
-                        : [],
-                    'fields' => isset($this->metadata[$entityType]['fields'])
-                        ? $this->metadata[$entityType]['fields']
-                        : null,
-                ]
-            );
-        }
-        return $this->registry[$entityType];
-    }
-
-    /**
-     * @param string $entityType
-     * @return HydratorInterface
-     */
-    public function getHydrator($entityType)
-    {
-        if (!isset($this->metadata[$entityType]['hydrator'])) {
-            return $this->objectManager->get(EntityHydrator::class);
-        } else {
-            return $this->objectManager->get($this->metadata[$entityType]['hydrator']);
-        }
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Entity/ScopeResolver.php b/lib/internal/Magento/Framework/Model/Entity/ScopeResolver.php
index 72a910de27193d820dffc868d2076116c6a49c7f..9cf4cde3eb89760182f6157ceb7f842352ce47f5 100644
--- a/lib/internal/Magento/Framework/Model/Entity/ScopeResolver.php
+++ b/lib/internal/Magento/Framework/Model/Entity/ScopeResolver.php
@@ -8,6 +8,7 @@ namespace Magento\Framework\Model\Entity;
 
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Framework\Exception\ConfigurationMismatchException;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Phrase;
 
 /**
diff --git a/lib/internal/Magento/Framework/Model/EntityManager.php b/lib/internal/Magento/Framework/Model/EntityManager.php
index e254588e33f6c1b8187167275e5b44ed10e5eb4b..c25bd1b99e8672433ed6335b3da92accc74dbe8e 100644
--- a/lib/internal/Magento/Framework/Model/EntityManager.php
+++ b/lib/internal/Magento/Framework/Model/EntityManager.php
@@ -6,208 +6,9 @@
 
 namespace Magento\Framework\Model;
 
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Api\SearchCriteria;
-use Magento\Framework\Model\ResourceModel\Db\ObjectRelationProcessor;
-use Magento\Framework\Event\ManagerInterface as EventManager;
-use Magento\Framework\Model\ResourceModel\Db\TransactionManagerInterface as TransactionManager;
-
 /**
  * Class EntityManager
  */
-class EntityManager
+class EntityManager extends \Magento\Framework\EntityManager\EntityManager
 {
-    /**
-     * @var OrchestratorPool
-     */
-    private $orchestratorPool;
-
-    /**
-     * @var MetadataPool
-     */
-    private $metadataPool;
-
-    /**
-     * @var ObjectRelationProcessor
-     */
-    private $relationProcessor;
-
-    /**
-     * @var EventManager
-     */
-    private $eventManger;
-
-    /**
-     * @var CommitCallback
-     */
-    private $commitCallback;
-
-    /**
-     * @var TransactionManager
-     */
-    private $transactionManager;
-
-    /**
-     * EntityManager constructor.
-     *
-     * @param OrchestratorPool $orchestratorPool
-     * @param MetadataPool $metadataPool
-     * @param ObjectRelationProcessor $relationProcessor
-     * @param EventManager $eventManager
-     * @param CommitCallback $commitCallback
-     * @param TransactionManager $transactionManager
-     */
-    public function __construct(
-        OrchestratorPool $orchestratorPool,
-        MetadataPool $metadataPool,
-        ObjectRelationProcessor $relationProcessor,
-        EventManager $eventManager,
-        CommitCallback $commitCallback,
-        TransactionManager $transactionManager
-    ) {
-        $this->relationProcessor = $relationProcessor;
-        $this->orchestratorPool = $orchestratorPool;
-        $this->metadataPool = $metadataPool;
-        $this->eventManger = $eventManager;
-        $this->commitCallback = $commitCallback;
-        $this->transactionManager = $transactionManager;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @param string $identifier
-     * @return object
-     * @throws \Exception
-     */
-    public function load($entityType, $entity, $identifier)
-    {
-        $this->eventManger->dispatch(
-            'entity_load_before',
-            [
-                'entity_type' => $entityType,
-                'identifier' => $identifier
-            ]
-        );
-        $operation = $this->orchestratorPool->getReadOperation($entityType);
-        $entity = $operation->execute($entityType, $entity, $identifier);
-        $this->eventManger->dispatch(
-            'entity_load_after',
-            [
-                'entity_type' => $entityType,
-                'entity' => $entity
-            ]
-        );
-        return $entity;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return bool|object
-     * @throws \Exception
-     */
-    public function save($entityType, $entity)
-    {
-        $hydrator = $this->metadataPool->getHydrator($entityType);
-        $metadata = $this->metadataPool->getMetadata($entityType);
-        $entityData = $hydrator->extract($entity);
-        $connection = $metadata->getEntityConnection();
-
-        if (!empty($entityData[$metadata->getIdentifierField()])
-            && $metadata->checkIsEntityExists($entityData[$metadata->getIdentifierField()])
-        ) {
-            $operation = $this->orchestratorPool->getWriteOperation($entityType, 'update');
-        } else {
-            $operation = $this->orchestratorPool->getWriteOperation($entityType, 'create');
-        }
-        $connection->beginTransaction();
-        try {
-            $this->eventManger->dispatch(
-                'entity_save_before',
-                [
-                    'entity_type' => $entityType,
-                    'entity' => $entity
-                ]
-            );
-            $this->relationProcessor->validateDataIntegrity($metadata->getEntityTable(), $entityData);
-            $entity = $operation->execute($entityType, $entity);
-            $this->eventManger->dispatch(
-                'entity_save_after',
-                [
-                    'entity_type' => $entityType,
-                    'entity' => $entity
-                ]
-            );
-            $connection->commit();
-            $this->commitCallback->process($entityType);
-        } catch (\Exception $e) {
-            $connection->rollBack();
-            $this->commitCallback->clear($entityType);
-            throw $e;
-        }
-        return $entity;
-    }
-
-    /**
-     * Is entity exists in Entity Manager
-     *
-     * @param string $entityType
-     * @param string $identifier
-     * @return bool
-     * @throws \Exception
-     */
-    public function has($entityType, $identifier)
-    {
-        return $this->metadataPool->getMetadata($entityType)->checkIsEntityExists($identifier);
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return bool|object
-     * @throws \Exception
-     */
-    public function delete($entityType, $entity)
-    {
-        $metadata = $this->metadataPool->getMetadata($entityType);
-        $connection = $metadata->getEntityConnection();
-        $operation = $this->orchestratorPool->getWriteOperation($entityType, 'delete');
-        $this->transactionManager->start($connection);
-        try {
-            $this->eventManger->dispatch(
-                'entity_delete_before',
-                [
-                    'entity_type' => $entityType,
-                    'entity' => $entity
-                ]
-            );
-            $result = $operation->execute($entityType, $entity);
-            $this->eventManger->dispatch(
-                'entity_delete_after',
-                [
-                    'entity_type' => $entityType,
-                    'entity' => $entity
-                ]
-            );
-            $this->transactionManager->commit();
-            $this->commitCallback->process($entityType);
-        } catch (\Exception $e) {
-            $this->transactionManager->rollBack();
-            $this->commitCallback->clear($entityType);
-            throw $e;
-        }
-        return $result;
-    }
-
-    /**
-     * @param string $entityType
-     * @param SearchCriteria $searchCriteria
-     * @return object[]
-     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
-     */
-    public function find($entityType, SearchCriteria $searchCriteria)
-    {
-        //TODO:: implement method
-    }
 }
diff --git a/lib/internal/Magento/Framework/Model/EntitySnapshot.php b/lib/internal/Magento/Framework/Model/EntitySnapshot.php
index 02a6a4a6a004fa931dcdd4339516b86b7595d5bb..fe804724bb6f7efb1075e95f6c652c3a66cbf84b 100644
--- a/lib/internal/Magento/Framework/Model/EntitySnapshot.php
+++ b/lib/internal/Magento/Framework/Model/EntitySnapshot.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Framework\Model;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\EntitySnapshot\AttributeProvider;
 
 /**
diff --git a/lib/internal/Magento/Framework/Model/EntitySnapshot/AttributeProvider.php b/lib/internal/Magento/Framework/Model/EntitySnapshot/AttributeProvider.php
index e5bf650458a69c8ae57406d2f7499e346f2e497e..6811fab84fbdf2942c6787d73730d668ba3e2ed7 100644
--- a/lib/internal/Magento/Framework/Model/EntitySnapshot/AttributeProvider.php
+++ b/lib/internal/Magento/Framework/Model/EntitySnapshot/AttributeProvider.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Framework\Model\EntitySnapshot;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\ObjectManagerInterface as ObjectManager;
 
 /**
diff --git a/lib/internal/Magento/Framework/Model/Operation/ContextHandlerInterface.php b/lib/internal/Magento/Framework/Model/Operation/ContextHandlerInterface.php
deleted file mode 100644
index ea73d006a6af972d079a4b8023b2231a5bfa9b24..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Operation/ContextHandlerInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Operation;
-
-use Magento\Framework\Model\Entity\EntityMetadata;
-
-/**
- * Interface ContextHandler
- *
- * Retrieve context value map based on metadata context
- */
-interface ContextHandlerInterface
-{
-    /**
-     * @param EntityMetadata $metadata
-     * @param array $entityData
-     * @return array
-     */
-    public function retrieve(EntityMetadata $metadata, array $entityData);
-}
diff --git a/lib/internal/Magento/Framework/Model/Operation/Read.php b/lib/internal/Magento/Framework/Model/Operation/Read.php
deleted file mode 100755
index baac6a12b1579dcd482d3cebae0903da3fdcca71..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Operation/Read.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\Model\Operation;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\Entity\Action\ReadMain;
-use Magento\Framework\Model\Entity\Action\ReadExtension;
-use Magento\Framework\Model\Entity\Action\ReadRelation;
-
-/**
- * Class Read
- */
-class Read implements ReadInterface
-{
-    /**
-     * @var MetadataPool
-     */
-    protected $metadataPool;
-
-    /**
-     * @var ReadMain
-     */
-    protected $readMain;
-
-    /**
-     * @var ReadExtension
-     */
-    protected $readExtension;
-
-    /**
-     * @var ReadRelation
-     */
-    protected $readRelation;
-
-    /**
-     * @param MetadataPool $metadataPool
-     * @param ReadMain $readMain
-     * @param ReadExtension $readExtension
-     * @param ReadRelation $readRelation
-     */
-    public function __construct(
-        MetadataPool $metadataPool,
-        ReadMain $readMain,
-        ReadExtension $readExtension,
-        ReadRelation $readRelation
-    ) {
-        $this->metadataPool = $metadataPool;
-        $this->readMain = $readMain;
-        $this->readExtension = $readExtension;
-        $this->readRelation = $readRelation;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function execute($entityType, $entity, $identifier)
-    {
-        $metadata = $this->metadataPool->getMetadata($entityType);
-
-        $hydrator = $this->metadataPool->getHydrator($entityType);
-        $entity = $this->readMain->execute($entityType, $entity, $identifier);
-
-        $entityData = $hydrator->extract($entity);
-        if (isset($entityData[$metadata->getLinkField()])) {
-            $entity = $this->readExtension->execute($entityType, $entity);
-            $entity = $this->readRelation->execute($entityType, $entity);
-        }
-
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Operation/Write/Create.php b/lib/internal/Magento/Framework/Model/Operation/Write/Create.php
deleted file mode 100755
index 2efcee68ad2c3b1cfd5af3120e7d0da84a6d019e..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Operation/Write/Create.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\Model\Operation\Write;
-
-use Magento\Framework\Model\Operation\WriteInterface;
-use Magento\Framework\Model\Entity\Action\CreateMain;
-use Magento\Framework\Model\Entity\Action\CreateExtension;
-use Magento\Framework\Model\Entity\Action\CreateRelation;
-
-/**
- * Class Create
- */
-class Create implements WriteInterface
-{
-    /**
-     * @var CreateMain
-     */
-    protected $createMain;
-
-    /**
-     * @var CreateExtension
-     */
-    protected $createExtension;
-
-    /**
-     * @var CreateRelation
-     */
-    protected $createRelation;
-
-    /**
-     * @param CreateMain $createMain
-     * @param CreateExtension $createExtension
-     * @param CreateRelation $createRelation
-     */
-    public function __construct(
-        CreateMain $createMain,
-        CreateExtension $createExtension,
-        CreateRelation $createRelation
-    ) {
-        $this->createMain = $createMain;
-        $this->createExtension = $createExtension;
-        $this->createRelation = $createRelation;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity)
-    {
-        $entity = $this->createMain->execute($entityType, $entity);
-        $entity = $this->createExtension->execute($entityType, $entity);
-        $entity = $this->createRelation->execute($entityType, $entity);
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Operation/Write/Delete.php b/lib/internal/Magento/Framework/Model/Operation/Write/Delete.php
deleted file mode 100755
index 68fe762b1cb77303d0c49cc19a7310ad1d3db06c..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Operation/Write/Delete.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\Model\Operation\Write;
-
-use Magento\Framework\Model\Operation\WriteInterface;
-use Magento\Framework\Model\Entity\Action\DeleteMain;
-use Magento\Framework\Model\Entity\Action\DeleteExtension;
-use Magento\Framework\Model\Entity\Action\DeleteRelation;
-
-/**
- * Class Delete
- */
-class Delete implements WriteInterface
-{
-    /**
-     * @var DeleteMain
-     */
-    protected $deleteMain;
-
-    /**
-     * @var DeleteExtension
-     */
-    protected $deleteExtension;
-
-    /**
-     * @var DeleteRelation
-     */
-    protected $deleteRelation;
-
-    /**
-     * @param DeleteMain $deleteMain
-     * @param DeleteExtension $deleteExtension
-     * @param DeleteRelation $deleteRelation
-     */
-    public function __construct(
-        DeleteMain $deleteMain,
-        DeleteExtension $deleteExtension,
-        DeleteRelation $deleteRelation
-    ) {
-        $this->deleteMain = $deleteMain;
-        $this->deleteExtension = $deleteExtension;
-        $this->deleteRelation = $deleteRelation;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return true
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity)
-    {
-        $this->deleteRelation->execute($entityType, $entity);
-        $this->deleteExtension->execute($entityType, $entity);
-        $this->deleteMain->execute($entityType, $entity);
-        return true;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Operation/Write/Update.php b/lib/internal/Magento/Framework/Model/Operation/Write/Update.php
deleted file mode 100755
index a48d7958a78d112db285a59a8e3cf5a301b5450b..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Operation/Write/Update.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\Model\Operation\Write;
-
-use Magento\Framework\Model\Operation\WriteInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\Entity\Action\UpdateMain;
-use Magento\Framework\Model\Entity\Action\UpdateExtension;
-use Magento\Framework\Model\Entity\Action\UpdateRelation;
-
-/**
- * Class Update
- */
-class Update implements WriteInterface
-{
-    /**
-     * @var UpdateMain
-     */
-    protected $updateMain;
-
-    /**
-     * @var UpdateExtension
-     */
-    protected $updateExtension;
-
-    /**
-     * @var UpdateRelation
-     */
-    protected $updateRelation;
-
-    /**
-     * @param UpdateMain $updateMain
-     * @param UpdateExtension $updateExtension
-     * @param UpdateRelation $updateRelation
-     */
-    public function __construct(
-        UpdateMain $updateMain,
-        UpdateExtension $updateExtension,
-        UpdateRelation $updateRelation
-    ) {
-        $this->updateMain = $updateMain;
-        $this->updateExtension = $updateExtension;
-        $this->updateRelation = $updateRelation;
-    }
-
-    /**
-     * @param string $entityType
-     * @param object $entity
-     * @return object
-     * @throws \Exception
-     */
-    public function execute($entityType, $entity)
-    {
-        $entity = $this->updateMain->execute($entityType, $entity);
-        $entity = $this->updateExtension->execute($entityType, $entity);
-        $entity = $this->updateRelation->execute($entityType, $entity);
-        return $entity;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/Db/CreateEntityRow.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/CreateEntityRow.php
index cc90efda449ea5a5eb66729212f1875fb13581f4..fbcad7b1312c543fc80a40bae78182d6eb8d0942 100755
--- a/lib/internal/Magento/Framework/Model/ResourceModel/Db/CreateEntityRow.php
+++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/CreateEntityRow.php
@@ -5,7 +5,7 @@
  */
 namespace Magento\Framework\Model\ResourceModel\Db;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\Entity\EntityMetadata;
 
 /**
diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/Db/DeleteEntityRow.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/DeleteEntityRow.php
index a3622682611695bd75ef28da82fec2918e287d64..e3a3dcf5afb0f4f5d509024e94e7f477ed07d93e 100755
--- a/lib/internal/Magento/Framework/Model/ResourceModel/Db/DeleteEntityRow.php
+++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/DeleteEntityRow.php
@@ -5,7 +5,7 @@
  */
 namespace Magento\Framework\Model\ResourceModel\Db;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\Entity\EntityMetadata;
 
 class DeleteEntityRow
diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/Db/ReadEntityRow.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/ReadEntityRow.php
index d0e081234d9aae4efa7c507399240b3cd0307329..2e61de6ae12b242c56a21521ff7c13285b69dbd7 100644
--- a/lib/internal/Magento/Framework/Model/ResourceModel/Db/ReadEntityRow.php
+++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/ReadEntityRow.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Framework\Model\ResourceModel\Db;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Class ReadEntityRow
diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/Db/UpdateEntityRow.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/UpdateEntityRow.php
index 26e52091d63c98b09a0448081f5aa41561ea169a..c26d813b6a55ec05efb5bf2461ac6c44be0690d6 100755
--- a/lib/internal/Magento/Framework/Model/ResourceModel/Db/UpdateEntityRow.php
+++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/UpdateEntityRow.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Framework\Model\ResourceModel\Db;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\Entity\EntityMetadata;
 
 /**
diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/Db/ValidateDataIntegrity.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/ValidateDataIntegrity.php
new file mode 100644
index 0000000000000000000000000000000000000000..8dda7cb4a751ed59385c446bfe7590a3c18d32c1
--- /dev/null
+++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/ValidateDataIntegrity.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Model\ResourceModel\Db;
+
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\EntityManager\HydratorPool;
+
+/**
+ * Class ValidateDataIntegrity
+ */
+class ValidateDataIntegrity
+{
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * @var HydratorPool
+     */
+    private $hydratorPool;
+
+    /**
+     * @var ObjectRelationProcessor
+     */
+    private $objectRelationProcessor;
+
+    /**
+     * ValidateDataIntegrity constructor.
+     *
+     * @param MetadataPool $metadataPool
+     * @param HydratorPool $hydratorPool
+     * @param ObjectRelationProcessor $objectRelationProcessor
+     */
+    public function __construct(
+        MetadataPool $metadataPool,
+        HydratorPool $hydratorPool,
+        ObjectRelationProcessor $objectRelationProcessor
+    ) {
+        $this->metadataPool = $metadataPool;
+        $this->hydratorPool = $hydratorPool;
+        $this->objectRelationProcessor = $objectRelationProcessor;
+    }
+
+    /**
+     * @param string $entityType
+     * @param object $entity
+     * @throws \Exception
+     */
+    public function execute($entityType, $entity)
+    {
+        $metadata = $this->metadataPool->getMetadata($entityType);
+        $hydrator = $this->hydratorPool->getHydrator($entityType);
+        $this->objectRelationProcessor->validateDataIntegrity(
+            $metadata->getEntityTable(),
+            $hydrator->extract($entity)
+        );
+    }
+}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/CreateExtensionTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/CreateExtensionTest.php
deleted file mode 100644
index fa44e376e373c3ab36fbb78718d6219987406d55..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/CreateExtensionTest.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\Action\CreateExtension;
-use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ExtensionPool;
-
-/**
- * Class CreateExtensionTest
- */
-class CreateExtensionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $extensionPoolMock;
-
-    /**
-     * @var CreateExtension
-     */
-    protected $createExtension;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->extensionPoolMock = $this->getMockBuilder(ExtensionPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->createExtension = new CreateExtension(
-            $this->metadataPoolMock,
-            $this->extensionPoolMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $entityData = ['name' => 'test'];
-        $entityHydrator = $this->getMockBuilder(EntityHydrator::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $action = $this->getMockBuilder(\stdClass::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['execute'])
-            ->getMock();
-        $this->metadataPoolMock->expects($this->once())->method('getHydrator')->willReturn($entityHydrator);
-        $entityHydrator->expects($this->once())->method('extract')->with($entity)->willReturn([]);
-        $this->extensionPoolMock->expects($this->once())
-            ->method('getActions')
-            ->with($entityType, 'create')
-            ->willReturn([$action]);
-        $action->expects($this->once())->method('execute')->with($entityType, $entityData)->willReturn($entityData);
-        $entityHydrator->expects($this->once())->method('hydrate')->with($entity, $entityData)->willReturn($entity);
-        $this->assertEquals($entity, $this->createExtension->execute($entityType, $entity, $entityData));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/CreateMainTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/CreateMainTest.php
deleted file mode 100644
index d3a40056e14f455be27c718cf0e00145bc3d6c11..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/CreateMainTest.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\CreateEntityRow;
-use Magento\Framework\Model\Entity\Action\CreateMain;
-
-/**
- * Class CreateMainTest
- */
-class CreateMainTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $createEntityRowMock;
-
-    /**
-     * @var CreateMain
-     */
-    protected $createMain;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->createEntityRowMock = $this->getMockBuilder(CreateEntityRow::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->createMain = new CreateMain(
-            $this->metadataPoolMock,
-            $this->createEntityRowMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $entityData = ['name' => 'test'];
-        $entityHydrator = $this->getMockBuilder(EntityHydrator::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->metadataPoolMock->expects($this->once())->method('getHydrator')->willReturn($entityHydrator);
-        $entityHydrator->expects($this->once())->method('extract')->with($entity)->willReturn([]);
-        $entityHydrator->expects($this->once())->method('hydrate')->with($entity, $entityData)->willReturn($entity);
-        $this->createEntityRowMock->expects($this->once())
-            ->method('execute')
-            ->with($entityType, $entityData)
-            ->willReturn($entityData);
-        $this->assertEquals($entity, $this->createMain->execute($entityType, $entity, $entityData));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/CreateRelationTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/CreateRelationTest.php
deleted file mode 100644
index 0a79a926add49891510a0d77feb47766e4e8a091..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/CreateRelationTest.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool as RelationActionPool;
-use Magento\Framework\Model\Entity\Action\CreateRelation;
-
-/**
- * Class CreateRelationTest
- */
-class CreateRelationTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $relationActionPoolMock;
-
-    /**
-     * @var CreateRelation
-     */
-    protected $createRelation;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->relationActionPoolMock = $this->getMockBuilder(RelationActionPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->createRelation = new CreateRelation(
-            $this->metadataPoolMock,
-            $this->relationActionPoolMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $action = $this->getMockBuilder(\stdClass::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['execute'])
-            ->getMock();
-        $this->relationActionPoolMock->expects($this->once())
-            ->method('getActions')
-            ->with($entityType, 'create')
-            ->willReturn([$action]);
-        $action->expects($this->once())->method('execute')->with($entityType, $entity)->willReturn($entity);
-        $this->assertEquals($entity, $this->createRelation->execute($entityType, $entity));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/DeleteExtensionTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/DeleteExtensionTest.php
deleted file mode 100644
index b6b1e0c98e4940ec60e7b5175286abb8f04b23d4..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/DeleteExtensionTest.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\Action\DeleteExtension;
-use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\EntityMetadata;
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ExtensionPool;
-
-class DeleteExtensionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $extensionPoolMock;
-
-    /**
-     * @var DeleteExtension
-     */
-    protected $deleteExtension;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->extensionPoolMock = $this->getMockBuilder(ExtensionPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->deleteExtension = new DeleteExtension(
-            $this->metadataPoolMock,
-            $this->extensionPoolMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $entityData = ['name' => 'test'];
-        $entityHydrator = $this->getMockBuilder(EntityHydrator::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $action = $this->getMockBuilder(\stdClass::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['execute'])
-            ->getMock();
-        $entityMetadata = $this->getMockBuilder(EntityMetadata::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->metadataPoolMock->expects($this->once())->method('getHydrator')->willReturn($entityHydrator);
-        $this->metadataPoolMock->expects($this->once())->method('getMetadata')->willReturn($entityMetadata);
-        $entityMetadata->expects($this->once())->method('getEavEntityType')->willReturn(true);
-        $entityHydrator->expects($this->once())->method('extract')->with($entity)->willReturn([]);
-        $this->extensionPoolMock->expects($this->once())
-            ->method('getActions')
-            ->with($entityType, 'delete')
-            ->willReturn([$action]);
-        $action->expects($this->once())->method('execute')->with($entityType, $entityData)->willReturn($entityData);
-        $entityHydrator->expects($this->once())->method('hydrate')->with($entity, $entityData)->willReturn($entity);
-        $this->assertEquals($entity, $this->deleteExtension->execute($entityType, $entity, $entityData));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/DeleteMainTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/DeleteMainTest.php
deleted file mode 100644
index ac76e23b397c4401b039b49e3150d6468da1f257..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/DeleteMainTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\DeleteEntityRow;
-use Magento\Framework\Model\Entity\Action\DeleteMain;
-
-/**
- * Class DeleteMainTest
- */
-class DeleteMainTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $deleteEntityRowMock;
-
-    /**
-     * @var DeleteMain
-     */
-    protected $deleteMain;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->deleteEntityRowMock = $this->getMockBuilder(DeleteEntityRow::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->deleteMain = new DeleteMain(
-            $this->metadataPoolMock,
-            $this->deleteEntityRowMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $entityData = ['name' => 'test'];
-        $entityHydrator = $this->getMockBuilder(EntityHydrator::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->metadataPoolMock->expects($this->once())->method('getHydrator')->willReturn($entityHydrator);
-        $entityHydrator->expects($this->once())->method('extract')->with($entity)->willReturn($entityData);
-        $this->deleteEntityRowMock->expects($this->once())
-            ->method('execute')
-            ->with($entityType, $entityData)
-            ->willReturn($entity);
-        $this->assertEquals($entity, $this->deleteMain->execute($entityType, $entity));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/DeleteRelationTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/DeleteRelationTest.php
deleted file mode 100644
index 175684428eaa813afe3e940261c913dfc9ee0531..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/DeleteRelationTest.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool as RelationActionPool;
-use Magento\Framework\Model\Entity\Action\DeleteRelation;
-
-/**
- * Class DeleteRelationTest
- */
-class DeleteRelationTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $relationActionPoolMock;
-
-    /**
-     * @var DeleteRelation
-     */
-    protected $deleteRelation;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->relationActionPoolMock = $this->getMockBuilder(RelationActionPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->deleteRelation = new DeleteRelation(
-            $this->metadataPoolMock,
-            $this->relationActionPoolMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $action = $this->getMockBuilder(\stdClass::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['execute'])
-            ->getMock();
-        $this->relationActionPoolMock->expects($this->once())
-            ->method('getActions')
-            ->with($entityType, 'delete')
-            ->willReturn([$action]);
-        $action->expects($this->once())->method('execute')->with($entityType, $entity)->willReturn($entity);
-        $this->assertEquals($entity, $this->deleteRelation->execute($entityType, $entity));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/ReadExtensionTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/ReadExtensionTest.php
deleted file mode 100644
index c0800668d8bff2c96e8d34ffecab95261d0db47d..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/ReadExtensionTest.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\Action\ReadExtension;
-use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ExtensionPool;
-
-/**
- * Class ReadExtensionTest
- */
-class ReadExtensionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $extensionPoolMock;
-
-    /**
-     * @var ReadExtension
-     */
-    protected $readExtension;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->extensionPoolMock = $this->getMockBuilder(ExtensionPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->readExtension = new ReadExtension(
-            $this->metadataPoolMock,
-            $this->extensionPoolMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $entityData = ['name' => 'test'];
-        $entityHydrator = $this->getMockBuilder(EntityHydrator::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $action = $this->getMockBuilder(\stdClass::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['execute'])
-            ->getMock();
-        $this->metadataPoolMock->expects($this->once())->method('getHydrator')->willReturn($entityHydrator);
-        $entityHydrator->expects($this->once())->method('extract')->with($entity)->willReturn($entityData);
-        $this->extensionPoolMock->expects($this->once())
-            ->method('getActions')
-            ->with($entityType, 'read')
-            ->willReturn([$action]);
-        $action->expects($this->once())->method('execute')->with($entityType, $entityData)->willReturn($entityData);
-        $entityHydrator->expects($this->once())->method('hydrate')->with($entity, $entityData)->willReturn($entity);
-        $this->assertEquals($entity, $this->readExtension->execute($entityType, $entity));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/ReadMainTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/ReadMainTest.php
deleted file mode 100644
index 572eccbca8ac445ca50883d0a7d5a59888cc6e48..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/ReadMainTest.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ReadEntityRow;
-use Magento\Framework\Model\Entity\Action\ReadMain;
-
-/**
- * Class ReadMainTest
- */
-class ReadMainTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $readEntityRowMock;
-
-    /**
-     * @var ReadMain
-     */
-    protected $readMain;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->readEntityRowMock = $this->getMockBuilder(ReadEntityRow::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->readMain = new ReadMain(
-            $this->metadataPoolMock,
-            $this->readEntityRowMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $entityData = ['name' => 'test'];
-        $id = 1;
-        $entityHydrator = $this->getMockBuilder(EntityHydrator::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->metadataPoolMock->expects($this->once())->method('getHydrator')->willReturn($entityHydrator);
-        $entityHydrator->expects($this->once())->method('hydrate')->with($entity, $entityData)->willReturn($entity);
-        $this->readEntityRowMock->expects($this->once())
-            ->method('execute')
-            ->with($entityType, $id)
-            ->willReturn($entityData);
-        $this->assertEquals($entity, $this->readMain->execute($entityType, $entity, $id));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/ReadRelationTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/ReadRelationTest.php
deleted file mode 100644
index c370f9e3dcbe46f6d824a5a3561b9431931dd78d..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/ReadRelationTest.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool as RelationActionPool;
-use Magento\Framework\Model\Entity\Action\ReadRelation;
-
-/**
- * Class ReadRelationTest
- */
-class ReadRelationTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $relationActionPoolMock;
-
-    /**
-     * @var ReadRelation
-     */
-    protected $readRelation;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->relationActionPoolMock = $this->getMockBuilder(RelationActionPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->readRelation = new ReadRelation(
-            $this->metadataPoolMock,
-            $this->relationActionPoolMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $action = $this->getMockBuilder(\stdClass::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['execute'])
-            ->getMock();
-        $this->relationActionPoolMock->expects($this->once())
-            ->method('getActions')
-            ->with($entityType, 'read')
-            ->willReturn([$action]);
-        $action->expects($this->once())->method('execute')->with($entityType, $entity)->willReturn($entity);
-        $this->assertEquals($entity, $this->readRelation->execute($entityType, $entity));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/UpdateExtensionTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/UpdateExtensionTest.php
deleted file mode 100644
index b12d32de6b4cb754459372ede2ef258de7e87fdc..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/UpdateExtensionTest.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\Action\UpdateExtension;
-use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\ExtensionPool;
-
-/**
- * Class UpdateExtensionTest
- */
-class UpdateExtensionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $extensionPoolMock;
-
-    /**
-     * @var UpdateExtension
-     */
-    protected $updateExtension;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->extensionPoolMock = $this->getMockBuilder(ExtensionPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->updateExtension = new UpdateExtension(
-            $this->metadataPoolMock,
-            $this->extensionPoolMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $entityData = ['name' => 'test'];
-        $entityHydrator = $this->getMockBuilder(EntityHydrator::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $action = $this->getMockBuilder(\stdClass::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['execute'])
-            ->getMock();
-        $this->metadataPoolMock->expects($this->once())->method('getHydrator')->willReturn($entityHydrator);
-        $entityHydrator->expects($this->once())->method('extract')->with($entity)->willReturn([]);
-        $this->extensionPoolMock->expects($this->once())
-            ->method('getActions')
-            ->with($entityType, 'update')
-            ->willReturn([$action]);
-        $action->expects($this->once())->method('execute')->with($entityType, $entityData)->willReturn($entityData);
-        $entityHydrator->expects($this->once())->method('hydrate')->with($entity, $entityData)->willReturn($entity);
-        $this->assertEquals($entity, $this->updateExtension->execute($entityType, $entity, $entityData));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/UpdateMainTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/UpdateMainTest.php
deleted file mode 100644
index e9a91a3d804fd9622b39ae869bf5f2c64a33379e..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/UpdateMainTest.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\UpdateEntityRow;
-use Magento\Framework\Model\Entity\Action\UpdateMain;
-
-/**
- * Class UpdateMainTest
- */
-class UpdateMainTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $updateEntityRowMock;
-
-    /**
-     * @var UpdateMain
-     */
-    protected $updateMain;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->updateEntityRowMock = $this->getMockBuilder(UpdateEntityRow::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->updateMain = new UpdateMain(
-            $this->metadataPoolMock,
-            $this->updateEntityRowMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $entityData = ['name' => 'test'];
-        $entityHydrator = $this->getMockBuilder(EntityHydrator::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->metadataPoolMock->expects($this->once())->method('getHydrator')->willReturn($entityHydrator);
-        $entityHydrator->expects($this->once())->method('extract')->with($entity)->willReturn([]);
-        $entityHydrator->expects($this->once())->method('hydrate')->with($entity, $entityData)->willReturn($entity);
-        $this->updateEntityRowMock->expects($this->once())
-            ->method('execute')
-            ->with($entityType, $entityData)
-            ->willReturn($entityData);
-        $this->assertEquals($entity, $this->updateMain->execute($entityType, $entity, $entityData));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/UpdateRelationTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/UpdateRelationTest.php
deleted file mode 100644
index 143be1795c48c5d245f41192db1f7f0158486fd3..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/Action/UpdateRelationTest.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Model\Test\Unit\Entity\Action;
-
-use Magento\Framework\Model\Entity\MetadataPool;
-use Magento\Framework\Model\ResourceModel\Db\Relation\ActionPool as RelationActionPool;
-use Magento\Framework\Model\Entity\Action\UpdateRelation;
-
-/**
- * Class UpdateRelationTest
- */
-class UpdateRelationTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataPoolMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $relationActionPoolMock;
-
-    /**
-     * @var UpdateRelation
-     */
-    protected $updateRelation;
-
-    protected function setUp()
-    {
-        $this->metadataPoolMock = $this->getMockBuilder(MetadataPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->relationActionPoolMock = $this->getMockBuilder(RelationActionPool::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->updateRelation = new UpdateRelation(
-            $this->metadataPoolMock,
-            $this->relationActionPoolMock
-        );
-    }
-
-    public function testExecute()
-    {
-        $entityType = 'Type';
-        $entity = new \stdClass();
-        $action = $this->getMockBuilder(\stdClass::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['execute'])
-            ->getMock();
-        $this->relationActionPoolMock->expects($this->once())
-            ->method('getActions')
-            ->with($entityType, 'update')
-            ->willReturn([$action]);
-        $action->expects($this->once())->method('execute')->with($entityType, $entity)->willReturn($entity);
-        $this->assertEquals($entity, $this->updateRelation->execute($entityType, $entity));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/MetadataPoolTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/MetadataPoolTest.php
index 13a2c683f900a632649cab87ac472407e83f7693..7fcc637e52dd49b6e9a69ac0f07baf5bb7268ee8 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/MetadataPoolTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/MetadataPoolTest.php
@@ -7,7 +7,7 @@
 namespace Magento\Framework\Model\Test\Unit\Entity;
 
 use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\Entity\EntityMetadata;
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Framework\Model\Entity\SequenceFactory;
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/EntityManagerTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/EntityManagerTest.php
index cdd331fed9a1634b4c3011b89e38ec8359987d2b..1e453428988b3f432e4535b9004cd5db1eea7389 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/EntityManagerTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/EntityManagerTest.php
@@ -28,7 +28,7 @@ class EntityManagerTest extends \PHPUnit_Framework_TestCase
     protected $hydrator;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPool;
 
@@ -71,7 +71,7 @@ class EntityManagerTest extends \PHPUnit_Framework_TestCase
         );
 
         $this->metadataPool = $this->getMock(
-            'Magento\Framework\Model\Entity\MetadataPool',
+            'Magento\Framework\EntityManager\MetadataPool',
             [],
             [],
             '',
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshot/AttributeProviderTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshot/AttributeProviderTest.php
index 83f31ee98bf153d293f66058c21cea7e4c9e82b3..0ca67fa6f2d49ea98faa3e859a63035da65153de 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshot/AttributeProviderTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshot/AttributeProviderTest.php
@@ -10,7 +10,7 @@ use Magento\Framework\DB\Adapter\AdapterInterface;
 use Magento\Framework\Model\Entity\EntityMetadata;
 use Magento\Framework\Model\EntitySnapshot\AttributeProvider;
 use Magento\Framework\Model\EntitySnapshot\AttributeProviderInterface;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\ObjectManagerInterface as ObjectManager;
 
 /**
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshotTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshotTest.php
index 6331e658c1466208547815bff99b3aa09a23cafc..d06a4b04aa04d7a86b61a9694c20e774ce602e7d 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshotTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshotTest.php
@@ -8,7 +8,7 @@ namespace Magento\Framework\Model\Test\Unit;
 
 use Magento\Framework\Model\Entity\EntityHydrator;
 use Magento\Framework\Model\Entity\EntityMetadata;
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\EntitySnapshot;
 use Magento\Framework\Model\EntitySnapshot\AttributeProvider;
 
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Operation/ReadTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Operation/ReadTest.php
index 5f03986123a052f35c91843be62a231dcd87f3fd..1524629212bb6a02e394a3a89e5aefc41933666b 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Operation/ReadTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/Operation/ReadTest.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Framework\Model\Test\Unit\Operation;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\Entity\Action\ReadMain;
 use Magento\Framework\Model\Entity\Action\ReadExtension;
 use Magento\Framework\Model\Entity\Action\ReadRelation;
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Operation/Write/UpdateTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Operation/Write/UpdateTest.php
index 097fcc6daa6f3ae5a76ff60ea76ddf8eefacf58a..3d79f0104e3b4b4f68abade13425b6a6223bc30b 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Operation/Write/UpdateTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/Operation/Write/UpdateTest.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Framework\Model\Test\Unit\Operation\Write;
 
-use Magento\Framework\Model\Entity\MetadataPool;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Model\Entity\Action\UpdateMain;
 use Magento\Framework\Model\Entity\Action\UpdateExtension;
 use Magento\Framework\Model\Entity\Action\UpdateRelation;
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/CreateEntityRowTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/CreateEntityRowTest.php
index 3da0e1b84782245e2d1b79552d8175ec07a7d6f3..fb25eb23bedb1285f782281e5659a5b38c9b387d 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/CreateEntityRowTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/CreateEntityRowTest.php
@@ -23,7 +23,7 @@ class CreateEntityRowTest extends \PHPUnit_Framework_TestCase
     protected $connection;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPool;
 
@@ -72,7 +72,7 @@ class CreateEntityRowTest extends \PHPUnit_Framework_TestCase
             ->willReturn('100000001');
 
         $this->metadataPool = $this->getMock(
-            'Magento\Framework\Model\Entity\MetadataPool',
+            'Magento\Framework\EntityManager\MetadataPool',
             [],
             [],
             '',
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/DeleteEntityRowTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/DeleteEntityRowTest.php
index 6aa524e30caa14c413fcb66478ca6223da7d98d1..e186121079f4d1757817f659b876e131b09407e1 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/DeleteEntityRowTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/DeleteEntityRowTest.php
@@ -23,7 +23,7 @@ class DeleteEntityRowTest extends \PHPUnit_Framework_TestCase
     protected $connection;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPool;
 
@@ -60,7 +60,7 @@ class DeleteEntityRowTest extends \PHPUnit_Framework_TestCase
             ->willReturn($this->connection);
 
         $this->metadataPool = $this->getMock(
-            'Magento\Framework\Model\Entity\MetadataPool',
+            'Magento\Framework\EntityManager\MetadataPool',
             [],
             [],
             '',
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/ReadEntityRowTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/ReadEntityRowTest.php
index 55b0330d6eb33a4c6c423a3090249aad79434dfd..ec4042a4b0908f66fff6c01a9334be0493a29ccd 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/ReadEntityRowTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/ReadEntityRowTest.php
@@ -28,7 +28,7 @@ class ReadEntityRowTest extends \PHPUnit_Framework_TestCase
     protected $connection;
 
     /**
-     * @var \Magento\Framework\Model\Entity\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\MetadataPool|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataPool;
 
@@ -81,7 +81,7 @@ class ReadEntityRowTest extends \PHPUnit_Framework_TestCase
             ->willReturn('identifier');
 
         $this->metadataPool = $this->getMock(
-            'Magento\Framework\Model\Entity\MetadataPool',
+            'Magento\Framework\EntityManager\MetadataPool',
             [],
             [],
             '',
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/UpdateEntityRowTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/UpdateEntityRowTest.php
index 66d33ff0be011e01305be87d80bbc5bb55cff8c9..cc4263338cf62db407db7d5b0c403fa3ecaf8f89 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/UpdateEntityRowTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/UpdateEntityRowTest.php
@@ -22,7 +22,7 @@ class UpdateEntityRowTest extends \PHPUnit_Framework_TestCase
     protected function setUp()
     {
         $objectManager = new ObjectManager($this);
-        $this->metadataPoolMock = $this->getMockBuilder('\Magento\Framework\Model\Entity\MetadataPool')
+        $this->metadataPoolMock = $this->getMockBuilder('\Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
         $this->model = $objectManager->getObject(
diff --git a/setup/src/Magento/Setup/Fixtures/CatalogPriceRulesFixture.php b/setup/src/Magento/Setup/Fixtures/CatalogPriceRulesFixture.php
index ec83f33944f3e06dff2f9f61fdc23f9c8094d056..a344cfe8d62d7499e3088a29235ba94b5bc62989 100644
--- a/setup/src/Magento/Setup/Fixtures/CatalogPriceRulesFixture.php
+++ b/setup/src/Magento/Setup/Fixtures/CatalogPriceRulesFixture.php
@@ -34,8 +34,8 @@ class CatalogPriceRulesFixture extends Fixture
         $category = $this->fixtureModel->getObjectManager()->get('Magento\Catalog\Model\Category');
         /** @var $model  \Magento\CatalogRule\Model\Rule*/
         $model = $this->fixtureModel->getObjectManager()->get('Magento\CatalogRule\Model\Rule');
-        /** @var \Magento\Framework\Model\Entity\MetadataPool $metadataPool */
-        $metadataPool = $this->fixtureModel->getObjectManager()->get('Magento\Framework\Model\Entity\MetadataPool');
+        /** @var \Magento\Framework\EntityManager\MetadataPool $metadataPool */
+        $metadataPool = $this->fixtureModel->getObjectManager()->get('Magento\Framework\EntityManager\MetadataPool');
         $metadata = $metadataPool->getMetadata('Magento\CatalogRule\Api\Data\RuleInterface');
 
         //Get all websites
diff --git a/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php b/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php
index 71241d9d5800417b569c2eda93712e0f88282e0b..344e8ad46d0686dff88c6d8fe5ab1532056c875b 100644
--- a/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php
@@ -74,7 +74,7 @@ class CatalogPriceRulesFixtureTest extends \PHPUnit_Framework_TestCase
 
         $modelMock = $this->getMock('Magento\CatalogRule\Model\Rule', [], [], '', false);
         $metadataMock = $this->getMock('\Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
-        $metadataPoolMock = $this->getMock('Magento\Framework\Model\Entity\MetadataPool', [], [], '', false);
+        $metadataPoolMock = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
         $metadataMock->expects($this->once())
             ->method('getLinkField')
             ->will($this->returnValue('Field Id Name'));
@@ -82,7 +82,7 @@ class CatalogPriceRulesFixtureTest extends \PHPUnit_Framework_TestCase
         $valueMap = [
             ['Magento\CatalogRule\Model\Rule', $modelMock],
             ['Magento\Catalog\Model\Category', $categoryMock],
-            ['Magento\Framework\Model\Entity\MetadataPool', $metadataPoolMock]
+            ['Magento\Framework\EntityManager\MetadataPool', $metadataPoolMock]
         ];
         $metadataPoolMock
             ->expects($this->once())