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 c4f21dd420be35d48851994cd84b454f2797a34a..a289e9970b4999ee82bde14fdb452ef0d78236df 100644
--- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php
+++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php
@@ -992,7 +992,7 @@ class AdvancedPricingTest extends \Magento\ImportExport\Test\Unit\Model\Import\A
             false
         );
         $metadataMock = $this->getMock(
-            \Magento\Framework\Model\Entity\EntityMetadata::class,
+            \Magento\Framework\EntityManager\EntityMetadata::class,
             [],
             [],
             '',
diff --git a/app/code/Magento/Bundle/Test/Unit/Model/LinkManagementTest.php b/app/code/Magento/Bundle/Test/Unit/Model/LinkManagementTest.php
index 9bc4162b99252bae3191815cc7a5a433f3c2bcbd..8e221ccf520b83c4918d61434d48049301c149cc 100644
--- a/app/code/Magento/Bundle/Test/Unit/Model/LinkManagementTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Model/LinkManagementTest.php
@@ -105,7 +105,7 @@ class LinkManagementTest extends \PHPUnit_Framework_TestCase
     protected $metadataPoolMock;
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\EntityMetadata|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataMock;
 
@@ -161,7 +161,7 @@ class LinkManagementTest extends \PHPUnit_Framework_TestCase
         $this->metadataPoolMock = $this->getMockBuilder('\Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
-        $this->metadataMock = $this->getMockBuilder('\Magento\Framework\Model\Entity\EntityMetadata')
+        $this->metadataMock = $this->getMockBuilder('\Magento\Framework\EntityManager\EntityMetadata')
             ->disableOriginalConstructor()
             ->getMock();
         $this->metadataPoolMock->expects($this->any())->method('getMetadata')
diff --git a/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php b/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php
index 1a3f3154a6b340ab2949d3348940f04eac7fbb88..465ae18a68845fa0b189aef300c69541527daf6d 100644
--- a/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php
@@ -290,7 +290,7 @@ class OptionRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
         $metadataMock = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
@@ -347,7 +347,7 @@ class OptionRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
         $metadataMock = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
@@ -411,7 +411,7 @@ class OptionRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
         $metadataMock = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
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 f700948e5135dcb0f5faeeec54097d7053634e17..2379ad7f10701acee700e7ef2adfa3390daccb1a 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
@@ -202,7 +202,7 @@ class BundleTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractIm
             ]
         );
 
-        $metadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
+        $metadataMock = $this->getMock(\Magento\Framework\EntityManager\EntityMetadata::class, [], [], '', false);
         $metadataMock->expects($this->any())
             ->method('getLinkField')
             ->willReturn('entity_id');
diff --git a/app/code/Magento/Catalog/Console/Command/ProductAttributesCleanUp.php b/app/code/Magento/Catalog/Console/Command/ProductAttributesCleanUp.php
index 8e82e443dda7023d8fa83ccbd813445fea509dce..d1b938296f9bd6afb3930c3bc9e3d6bc274f6766 100644
--- a/app/code/Magento/Catalog/Console/Command/ProductAttributesCleanUp.php
+++ b/app/code/Magento/Catalog/Console/Command/ProductAttributesCleanUp.php
@@ -37,7 +37,7 @@ class ProductAttributesCleanUp extends \Symfony\Component\Console\Command\Comman
     protected $appState;
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata
+     * @var \Magento\Framework\EntityManager\EntityMetadata
      */
     protected $metadata;
 
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 96ae880b6fad9872dfdb3ac02b9bb317e6e8f455..8b2f62ad2a0e8a8a24d7f227a6fddfa3e68e7929 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
@@ -55,7 +55,7 @@ class AbstractAction
     protected $connection;
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata
+     * @var \Magento\Framework\EntityManager\EntityMetadata
      */
     protected $categoryMetadata;
 
diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
index 044444d7e7ceb9622ac87c8f5725ab2e4c62324d..94d45ddb3530cf2562c57fea4b193428f7f8ceb6 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
@@ -15,7 +15,7 @@ use Magento\MediaStorage\Model\File\Uploader as FileUploader;
 class CreateHandler
 {
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata
+     * @var \Magento\Framework\EntityManager\EntityMetadata
      */
     protected $metadata;
 
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Category.php b/app/code/Magento/Catalog/Model/ResourceModel/Category.php
index 3a4f7d8e350389baed3bf1a1c60f41aea3ad901c..a1a2a760c0715d32110cdcf44802e6fd7a10621a 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Category.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Category.php
@@ -11,7 +11,7 @@
  */
 namespace Magento\Catalog\Model\ResourceModel;
 
-use Magento\Framework\Model\EntityManager;
+use Magento\Framework\EntityManager\EntityManager;
 use Magento\Catalog\Api\Data\CategoryInterface;
 
 /**
@@ -999,8 +999,8 @@ 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, $object)) {
+        $object = $this->entityManager->load($object, $entityId, CategoryInterface::class);
+        if (!$this->entityManager->has($object, CategoryInterface::class)) {
             $object->isObjectNew(true);
         }
         return $this;
@@ -1011,7 +1011,7 @@ class Category extends AbstractResource
      */
     public function delete($object)
     {
-        $this->entityManager->delete(CategoryInterface::class, $object);
+        $this->entityManager->delete($object, CategoryInterface::class);
         $this->_eventManager->dispatch(
             'catalog_category_delete_after_done',
             ['product' => $object]
@@ -1028,7 +1028,7 @@ class Category extends AbstractResource
      */
     public function save(\Magento\Framework\Model\AbstractModel $object)
     {
-        $this->entityManager->save(CategoryInterface::class, $object);
+        $this->entityManager->save($object, CategoryInterface::class);
         return $this;
     }
 }
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product.php b/app/code/Magento/Catalog/Model/ResourceModel/Product.php
index 205e391ef99876cdf59479655aae61f2a2c4283b..7f49709a9e1ee171e9bc4dd7914e2e455e5a3af6 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product.php
@@ -98,7 +98,7 @@ class Product extends AbstractResource
         \Magento\Eav\Model\Entity\Attribute\SetFactory $setFactory,
         \Magento\Eav\Model\Entity\TypeFactory $typeFactory,
         \Magento\Catalog\Model\Product\Attribute\DefaultAttributes $defaultAttributes,
-        \Magento\Framework\Model\EntityManager $entityManager,
+        \Magento\Framework\EntityManager\EntityManager $entityManager,
         $data = []
     ) {
         $this->_categoryCollectionFactory = $categoryCollectionFactory;
@@ -302,7 +302,7 @@ class Product extends AbstractResource
      */
     public function delete($object)
     {
-        $this->entityManager->delete(\Magento\Catalog\Api\Data\ProductInterface::class, $object);
+        $this->entityManager->delete($object, \Magento\Catalog\Api\Data\ProductInterface::class);
         $this->eventManager->dispatch(
             'catalog_product_delete_after_done',
             ['product' => $object]
@@ -654,7 +654,9 @@ class Product extends AbstractResource
     public function load($object, $entityId, $attributes = [])
     {
         $this->loadAttributesMetadata($attributes);
-        $this->entityManager->load(\Magento\Catalog\Api\Data\ProductInterface::class, $object, $entityId);
+        $this->entityManager->load(
+            $object, $entityId, \Magento\Catalog\Api\Data\ProductInterface::class
+        );
         return $this;
     }
 
@@ -694,7 +696,7 @@ class Product extends AbstractResource
      */
     public function save(\Magento\Framework\Model\AbstractModel $object)
     {
-        $this->entityManager->save(ProductInterface::class, $object);
+        $this->entityManager->save($object, ProductInterface::class);
         return $this;
     }
 }
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Gallery.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Gallery.php
index 23ad576287d899f931326bca862c81f94aad8a8d..53b65fcb93af7afdb7a08017164633b9f7aab03d 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Gallery.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Gallery.php
@@ -21,7 +21,7 @@ class Gallery extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
     /**#@-*/
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata
+     * @var \Magento\Framework\EntityManager\EntityMetadata
      */
     protected $metadata;
 
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php
index d42fc8b850ab5f74a9a5a8e44900876648d549d2..f1120bc464e4a9103802fe62cd61c4a2f8a3dcfc 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php
@@ -66,7 +66,7 @@ class CategoryRepositoryTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $metadataMock = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
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 1bf05cad65803b9335fb2fa59bde2813cf41c0d2..94382310ded642446c7d4df367b86861430b2574 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
@@ -65,7 +65,7 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
         $metadataPool = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
-        $metadata = $this->getMockBuilder('Magento\Framework\Model\Entity\EntityMetadata')
+        $metadata = $this->getMockBuilder('Magento\Framework\EntityManager\EntityMetadata')
             ->disableOriginalConstructor()
             ->getMock();
         $metadataPool->expects($this->any())->method('getMetadata')->willReturn($metadata);
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 26c676ae1fe14bd4560f0a42b7519e17ce6080a7..1f9139425e7a83e7b646de9c42766297352a2622 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php
@@ -92,7 +92,7 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
         $this->metadataMock = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
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 1e22aeb80583b38c85c919c2c7568325d8d1e719..e68c41302574db8882b315107033109075952c5c 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
@@ -9,7 +9,7 @@
 namespace Magento\Catalog\Test\Unit\Model\ResourceModel\Category;
 
 use Magento\Catalog\Api\Data\CategoryInterface;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 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 c93a7db2eb8419a9ea98509cc5db7c8ca4df6d6f..b42c9c8027de3d4ac9d7788c215113ac36308775 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
@@ -63,7 +63,7 @@ class GalleryTest extends \PHPUnit_Framework_TestCase
             ->method('setCacheAdapter');
 
         $metadata = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
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 f1a4add4532883bb3eb7b90d269d75913b9ce591..349d3a5a41ae7e9978d6256236ed379454053b5c 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
@@ -129,7 +129,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
                 'catalog_product_entity'
             );
         $this->metadataPoolMock = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
-        $metadata = $this->getMock('Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
+        $metadata = $this->getMock('Magento\Framework\EntityManager\EntityMetadata', [], [], '', false);
         $metadata->expects($this->any())->method('getLinkField')->willReturn('id');
         $this->metadataPoolMock->expects($this->any())->method('getMetadata')->willReturn($metadata);
         $this->selectMock->expects($this->exactly(2))->method('join');
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 2da1f432bd9ed75e75231b54de7f27ba4c07bca1..c4c81329267f4887789e3aa2fd562873205a9c22 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
@@ -247,7 +247,7 @@ class OptionTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractIm
             '',
             false
         );
-        $entityMetadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
+        $entityMetadataMock = $this->getMock(\Magento\Framework\EntityManager\EntityMetadata::class, [], [], '', false);
         $this->metadataPoolMock->expects($this->any())
             ->method('getMetadata')
             ->with(\Magento\Catalog\Api\Data\ProductInterface::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 f4575adc7c02da4d129a77621aa2bf7d07637f47..f670158e9b7c3ff14464714bb42de72d0bedd2f3 100644
--- a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php
+++ b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php
@@ -168,7 +168,7 @@ class ProductTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractI
         parent::setUp();
 
         $metadataPoolMock = $this->getMock(\Magento\Framework\EntityManager\MetadataPool::class, [], [], '', false);
-        $entityMetadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
+        $entityMetadataMock = $this->getMock(\Magento\Framework\EntityManager\EntityMetadata::class, [], [], '', false);
         $metadataPoolMock->expects($this->any())
             ->method('getMetadata')
             ->with(\Magento\Catalog\Api\Data\ProductInterface::class)
diff --git a/app/code/Magento/CatalogInventory/Model/ResourceModel/Indexer/Stock/DefaultStock.php b/app/code/Magento/CatalogInventory/Model/ResourceModel/Indexer/Stock/DefaultStock.php
index 30ea482cce93ddb240c0a0c3a5d98f3f90af261a..eff5f716c8fdbca6b4aa4b01be37ee92ba1ad54c 100644
--- a/app/code/Magento/CatalogInventory/Model/ResourceModel/Indexer/Stock/DefaultStock.php
+++ b/app/code/Magento/CatalogInventory/Model/ResourceModel/Indexer/Stock/DefaultStock.php
@@ -43,21 +43,21 @@ class DefaultStock extends AbstractIndexer implements StockInterface
     private $queryProcessorComposite;
 
     /**
-     * Class constructor
+     * DefaultStock constructor.
      *
      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
      * @param \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy
      * @param \Magento\Eav\Model\Config $eavConfig
-     * @param \Magento\Framework\Model\Entity\MetadataPool $metadataPool
+     * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
      * @param QueryProcessorComposite $queryProcessorComposite
-     * @param string $connectionName
+     * @param null $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,
         \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
         QueryProcessorComposite $queryProcessorComposite,
         $connectionName = null
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 bcf6074b312b16e549319088ef015255519b0678..afcd54996b2cbdd3134ba43f81236ee393f4c9ee 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php
@@ -143,7 +143,7 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase
         );
         $this->select = $this->getMock('Magento\Framework\DB\Select', [], [], '', false);
         $this->metadataPool = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
-        $metadata = $this->getMockBuilder('Magento\Framework\Model\Entity\EntityMetadata')
+        $metadata = $this->getMockBuilder('Magento\Framework\EntityManager\EntityMetadata')
             ->disableOriginalConstructor()
             ->getMock();
         $this->metadataPool->expects($this->any())->method('getMetadata')->willReturn($metadata);
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 dd82c2d2e5b36cc681bc7098c6eff3f1299a2d38..811c095f5f8ab53a4cea36604d7f1064d7b41e34 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
@@ -45,7 +45,7 @@ class ReadHandlerTest extends \PHPUnit_Framework_TestCase
         $websiteIds = [4, 5, 6];
 
         $metadataMock = $this->getMock(
-            '\Magento\Framework\Model\Entity\EntityMetadata',
+            '\Magento\Framework\EntityManager\EntityMetadata',
             ['getLinkField'],
             [],
             '',
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 e5438e0cac77bef7e79d4dcb1593743f3ec08471..0aba546d5e98810e38ed65340d1c3b605535c64b 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
@@ -47,7 +47,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
         ];
 
         $metadataMock = $this->getMock(
-            '\Magento\Framework\Model\Entity\EntityMetadata',
+            '\Magento\Framework\EntityManager\EntityMetadata',
             ['getLinkField'],
             [],
             '',
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 45280f7508d4437eb46090a1fb0cf4aca3f640ce..5a5529cb22aec803002e0f1f3cfa86bdb7de71e3 100644
--- a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php
@@ -90,7 +90,7 @@ class DataProvider
     private $connection;
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata
+     * @var \Magento\Framework\EntityManager\EntityMetadata
      */
     private $metadata;
 
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 88b80ddd77673663e19eb16b6176f7362b752d61..39c29a0a0da9beac35729f3ba7caa88d2747bedf 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
@@ -7,7 +7,7 @@
 namespace Magento\CatalogSearch\Test\Unit\Model\Adapter\Mysql\Filter;
 
 use Magento\Framework\DB\Select;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 use Magento\Framework\Search\Request\FilterInterface;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
 use PHPUnit_Framework_MockObject_MockObject as MockObject;
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 e4e61246df3c34a0582ab73ff0e98e99ff94ceff..fb27ec0c908a5f128226bcaed5146abcda8df4df 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
@@ -71,7 +71,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
             ->with('cms_block_store', [$whereForInsert])
             ->willReturnSelf();
 
-        $entityMetadata = $this->getMockBuilder('Magento\Framework\Model\Entity\EntityMetadata')
+        $entityMetadata = $this->getMockBuilder('Magento\Framework\EntityManager\EntityMetadata')
             ->disableOriginalConstructor()
             ->getMock();
         $entityMetadata->expects($this->once())
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 519c3ec7d971b9dcce453c58aad9c6713aaa1a94..ef7be111839b5ee57304e623598f68e7bb0c6331 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
@@ -71,7 +71,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
             ->with('cms_page_store', [$whereForInsert])
             ->willReturnSelf();
 
-        $entityMetadata = $this->getMockBuilder('Magento\Framework\Model\Entity\EntityMetadata')
+        $entityMetadata = $this->getMockBuilder('Magento\Framework\EntityManager\EntityMetadata')
             ->disableOriginalConstructor()
             ->getMock();
         $entityMetadata->expects($this->once())
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 46cfac08df07c4199329815e2f0682eaf75d4d1e..8ce7489db932ef9f21eb5eb1ae21d6341e1658c9 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
@@ -293,7 +293,7 @@ class ConfigurableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst
         ]));
 
         $metadataPoolMock = $this->getMock(\Magento\Framework\EntityManager\MetadataPool::class, [], [], '', false);
-        $entityMetadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
+        $entityMetadataMock = $this->getMock(\Magento\Framework\EntityManager\EntityMetadata::class, [], [], '', false);
         $metadataPoolMock->expects($this->any())
             ->method('getMetadata')
             ->with(\Magento\Catalog\Api\Data\ProductInterface::class)
diff --git a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Attribute/Collection.php b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Attribute/Collection.php
index f1b7238b38313596c9ccf5a81b9bc9b4c4e9064b..c4de0612c5d62e53f5c2c28bb65baa666ea19fa2 100644
--- a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Attribute/Collection.php
+++ b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Attribute/Collection.php
@@ -11,7 +11,7 @@ use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 use Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Attribute;
 use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
 use Magento\Framework\App\ObjectManager;
-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 698cc19c681be96747881eed5f5e4b5efba56aae..b6dc85902702a87bd733dfa8575c4a38a16e988b 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Attribute/LockValidatorTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Attribute/LockValidatorTest.php
@@ -7,7 +7,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\EntityManager\EntityMetadata;
 use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 
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 456066de44aeb8b35b4294ec1e236e1e6878aa11..edd105f0d1e9569c1bc79a3a38abf5bf5cd8450f 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
@@ -11,7 +11,7 @@ namespace Magento\ConfigurableProduct\Test\Unit\Model\Product\Type;
 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\EntityManager\EntityMetadata;
 use Magento\Framework\EntityManager\MetadataPool;
 
 /**
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 d6294ea386ed6327903153d923c2dd231db645c2..60efa37618630176e3c635e65df73058157a6466 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
@@ -41,7 +41,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
     protected $metadataPoolMock;
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\EntityMetadata|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadataMock;
 
@@ -57,7 +57,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $this->metadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
+        $this->metadataMock = $this->getMock(\Magento\Framework\EntityManager\EntityMetadata::class, [], [], '', false);
         $this->metadataPoolMock = $this->getMock(
             \Magento\Framework\EntityManager\MetadataPool::class,
             [],
diff --git a/app/code/Magento/Downloadable/Test/Unit/Model/LinkRepositoryTest.php b/app/code/Magento/Downloadable/Test/Unit/Model/LinkRepositoryTest.php
index c2dba836c14a16935a0db6d2751ca5c77350a798..37e47ff43d6d5b06fff0007ba597fd4458a51c3e 100644
--- a/app/code/Magento/Downloadable/Test/Unit/Model/LinkRepositoryTest.php
+++ b/app/code/Magento/Downloadable/Test/Unit/Model/LinkRepositoryTest.php
@@ -110,7 +110,7 @@ class LinkRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
 
-        $metadata = $this->getMock('Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
+        $metadata = $this->getMock('Magento\Framework\EntityManager\EntityMetadata', [], [], '', false);
         $metadata->expects($this->any())->method('getLinkField')->willReturn('id');
         $this->metadataPoolMock->expects($this->any())->method('getMetadata')->willReturn($metadata);
         $this->service = new \Magento\Downloadable\Model\LinkRepository(
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 d8723370e4b0b1d1d11aee7562e24641af1e9231..53b3c1d9368166de0cac236ad015ad2c59fc18e3 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
@@ -51,7 +51,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase
         $this->metadataPoolMock = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
-        $this->metadataMock = $this->getMock('Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
+        $this->metadataMock = $this->getMock('Magento\Framework\EntityManager\EntityMetadata', [], [], '', false);
         $this->metadataMock->expects($this->any())->method('getLinkField')->willReturn('id');
         $this->metadataPoolMock->expects($this->any())->method('getMetadata')->willReturn($this->metadataMock);
         $this->target = $objectManagerHelper->getObject(
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 448ae47056210ec5752b99d589532a2b034cb7f5..76fe7b1832eb8aec40e92645c2c47f6133c7ca90 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
@@ -58,7 +58,7 @@ class SampleTest extends \PHPUnit_Framework_TestCase
         $this->metadataPoolMock = $this->getMockBuilder('Magento\Framework\EntityManager\MetadataPool')
             ->disableOriginalConstructor()
             ->getMock();
-        $this->metadataMock = $this->getMock('Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
+        $this->metadataMock = $this->getMock('Magento\Framework\EntityManager\EntityMetadata', [], [], '', false);
         $this->metadataPoolMock->expects($this->any())->method('getMetadata')->willReturn($this->metadataMock);
         $this->target = $objectManagerHelper->getObject(
             'Magento\Downloadable\Model\Product\TypeHandler\Sample',
diff --git a/app/code/Magento/Downloadable/Test/Unit/Model/SampleRepositoryTest.php b/app/code/Magento/Downloadable/Test/Unit/Model/SampleRepositoryTest.php
index d663c02c9c120bd1333890c59012bc5b4ff2d9c5..617847dcb44d2115dbbd5d5b2cdcdb31968d9fa3 100644
--- a/app/code/Magento/Downloadable/Test/Unit/Model/SampleRepositoryTest.php
+++ b/app/code/Magento/Downloadable/Test/Unit/Model/SampleRepositoryTest.php
@@ -116,7 +116,7 @@ class SampleRepositoryTest extends \PHPUnit_Framework_TestCase
             false
         );
 
-        $metadata = $this->getMock('Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
+        $metadata = $this->getMock('Magento\Framework\EntityManager\EntityMetadata', [], [], '', false);
         $metadata->expects($this->any())->method('getLinkField')->willReturn('id');
         $this->metadataPoolMock->expects($this->any())->method('getMetadata')->willReturn($metadata);
         $this->service = new \Magento\Downloadable\Model\SampleRepository(
diff --git a/app/code/Magento/Eav/Model/ResourceModel/ContextHandler.php b/app/code/Magento/Eav/Model/ResourceModel/ContextHandler.php
index 24541ab6d5135b32d0609aad3ede5c5edce333a1..6596d3e454b040c3946c699fa38fc1d9e433c0c0 100644
--- a/app/code/Magento/Eav/Model/ResourceModel/ContextHandler.php
+++ b/app/code/Magento/Eav/Model/ResourceModel/ContextHandler.php
@@ -6,7 +6,7 @@
 
 namespace Magento\Eav\Model\ResourceModel;
 
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 use Magento\Store\Model\StoreManagerInterface;
 
 /**
diff --git a/app/code/Magento/Eav/Model/ResourceModel/ReadHandler.php b/app/code/Magento/Eav/Model/ResourceModel/ReadHandler.php
index 4c57e093c0480c200711eb43c61242329d9a3ec3..8a9a8406777da3aaf94ad109e10a3d1b53451e26 100644
--- a/app/code/Magento/Eav/Model/ResourceModel/ReadHandler.php
+++ b/app/code/Magento/Eav/Model/ResourceModel/ReadHandler.php
@@ -108,7 +108,7 @@ class ReadHandler
     {
         $data = [];
         $metadata = $this->metadataPool->getMetadata($entityType);
-        if (!$metadata->getEavEntityType()) {
+        if (!$metadata->getEavEntityType()) {//todo hasCustomAttributes
             return $data;
         }
         $context = $this->scopeResolver->getEntityContext($entityType, $entityData);
@@ -138,6 +138,14 @@ class ReadHandler
                     $this->getContextVariables($scope)
                 )->order('t.' . $scope->getIdentifier() . ' DESC');
             }
+//            array_intersect($arguments, $metadata->getS);
+            foreach ($context as $scope) {
+                //TODO: if (in table exists context field)
+                $select->where(
+                    $metadata->getEntityConnection()->quoteIdentifier($scope->getIdentifier()) . ' IN (?)',
+                    $this->getContextVariables($scope)
+                )->order('t.' . $scope->getIdentifier() . ' DESC');
+            }
             $selects[] = $select;
         }
         $unionSelect = new \Magento\Framework\DB\Sql\UnionExpression(
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 86f8bc9c6efb38c5015fec5017a1cc849c9857e1..390d396ba4778332f53112b191c2b091a533e22f 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
@@ -163,7 +163,7 @@ class GroupedTest extends \Magento\ImportExport\Test\Unit\Model\Import\AbstractI
             ]
         );
         $metadataPoolMock = $this->getMock(\Magento\Framework\EntityManager\MetadataPool::class, [], [], '', false);
-        $entityMetadataMock = $this->getMock(\Magento\Framework\Model\Entity\EntityMetadata::class, [], [], '', false);
+        $entityMetadataMock = $this->getMock(\Magento\Framework\EntityManager\EntityMetadata::class, [], [], '', false);
         $metadataPoolMock->expects($this->any())
             ->method('getMetadata')
             ->with(\Magento\Catalog\Api\Data\ProductInterface::class)
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 71cf86f0e6fa509dde3fcbbc8c9e23e02b1d1873..681647d5d19899e6c47491e4e429ea90500a9ff9 100644
--- a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
+++ b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/ReadHandlerTest.php
@@ -69,7 +69,7 @@ class ReadHandlerTest extends \PHPUnit_Framework_TestCase
         $customers = [1, 2];
         $websites = [3, 4, 5];
 
-        $className = '\Magento\Framework\Model\Entity\EntityMetadata';
+        $className = '\Magento\Framework\EntityManager\EntityMetadata';
         $metadata = $this->getMock($className, [], [], '', false);
 
         $metadata->expects($this->once())
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 71fd7cece8a64d681795b08c40b5318d898c712b..a3041140a0a60733ee6fd6f587ca5b34a76d7a1d 100644
--- a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
+++ b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/SaveHandlerTest.php
@@ -66,7 +66,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
             'rule_id' => 1
         ];
 
-        $className = '\Magento\Framework\Model\Entity\EntityMetadata';
+        $className = '\Magento\Framework\EntityManager\EntityMetadata';
         $metadata = $this->getMock($className, [], [], '', false);
 
         $metadata->expects($this->once())
@@ -95,7 +95,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
 
 
 
-        $className = '\Magento\Framework\Model\Entity\EntityMetadata';
+        $className = '\Magento\Framework\EntityManager\EntityMetadata';
         $metadata = $this->getMock($className, [], [], '', false);
 
         $metadata->expects($this->once())
@@ -125,7 +125,7 @@ class SaveHandlerTest extends \PHPUnit_Framework_TestCase
             'customer_group_ids' => $customers
         ];
 
-        $className = '\Magento\Framework\Model\Entity\EntityMetadata';
+        $className = '\Magento\Framework\EntityManager\EntityMetadata';
         $metadata = $this->getMock($className, [], [], '', false);
 
         $metadata->expects($this->once())
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 fc8851e34e83dc25fb502215602b5b12b1cc5ed6..7869a012e4646afb941234ac1830cd58f0c95f0f 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
@@ -46,7 +46,7 @@ class ReadHandlerTest extends \PHPUnit_Framework_TestCase
         );
 
         /**
-         * @var $entityMetadata \Magento\Framework\Model\Entity\EntityMetadata
+         * @var $entityMetadata \Magento\Framework\EntityManager\EntityMetadata
          */
         $entityMetadata = $this->objectManager
             ->get(MetadataPool::class)
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 5a03263f61e409b75ab9a6c3cd0299a77b486288..1f7e0c9c71f06f1d26ccc0f71fab0a1618f413a1 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
@@ -43,7 +43,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
     protected $objectManager;
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata
+     * @var \Magento\Framework\EntityManager\EntityMetadata
      */
     protected $productMetadata;
 
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 6178b028c33d44668c1ddc35d8f96f5ac78fa9b6..8db369facf97f4d61dd8468dd34db67b5250bf13 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
@@ -45,7 +45,7 @@ class DownloadableTest extends \PHPUnit_Framework_TestCase
     protected $objectManager;
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata
+     * @var \Magento\Framework\EntityManager\EntityMetadata
      */
     protected $productMetadata;
 
diff --git a/lib/internal/Magento/Framework/EntityManager/EntityManager.php b/lib/internal/Magento/Framework/EntityManager/EntityManager.php
index 53e1abd4562d957464f563682f53b8ab8c4a4c1c..798d735f3e481ca7b56db518f33b39d25bbaa8b1 100644
--- a/lib/internal/Magento/Framework/EntityManager/EntityManager.php
+++ b/lib/internal/Magento/Framework/EntityManager/EntityManager.php
@@ -42,34 +42,37 @@ class EntityManager
     }
 
     /**
-     * @param string $entityType
      * @param object $entity
      * @param string $identifier
-     * @return object
-     * @throws \Exception
+     * @param string|null $entityType
+     * @param array $arguments
+     * @return mixed
      */
-    public function load($entityType, $entity, $identifier)
+    public function load($entity, $identifier, $entityType = null, $arguments = [])
     {
         $operation = $this->operationPool->getOperation($entityType, 'read');
-        $entity = $operation->execute($entityType, $entity, $identifier);
+        $entity = $operation->execute($entityType, $entity, $identifier, $arguments);
         return $entity;
     }
 
     /**
-     * @param string $entityType
      * @param object $entity
-     * @return bool|object
+     * @param string|null $entityType
+     * @param array $arguments
+     * @return object
      * @throws \Exception
      */
-    public function save($entityType, $entity)
+    public function save($entity, $entityType = null, $arguments = [])
     {
-        if ($this->has($entityType, $entity)) {
+
+        //@todo add EntityTypeResolver
+        if ($this->has($entity, $entityType, $arguments)) {
             $operation = $this->operationPool->getOperation($entityType, 'update');
         } else {
             $operation = $this->operationPool->getOperation($entityType, 'create');
         }
         try {
-        $entity = $operation->execute($entityType, $entity);
+        $entity = $operation->execute($entityType, $entity, $arguments);
             $this->callbackHandler->process($entityType);
         } catch (\Exception $e) {
             $this->callbackHandler->clear($entityType);
@@ -79,27 +82,28 @@ class EntityManager
     }
 
     /**
-     * @param string $entityType
      * @param object $entity
+     * @param string|null $entityType
+     * @param array $arguments
      * @return bool
      */
-    public function has($entityType, $entity)
+    public function has($entity, $entityType = null, $arguments = [])
     {
         $operation = $this->operationPool->getOperation($entityType, 'checkIsExists');
-        return $operation->execute($entityType, $entity);
+        return $operation->execute($entityType, $entity, $arguments);
     }
 
     /**
-     * @param string $entityType
      * @param object $entity
-     * @return bool|object
-     * @throws \Exception
+     * @param string|null $entityType
+     * @param array $arguments
+     * @return bool
      */
-    public function delete($entityType, $entity)
+    public function delete($entity, $entityType = null, $arguments = [])
     {
         $operation = $this->operationPool->getOperation($entityType, 'delete');
         try {
-            $result = $operation->execute($entityType, $entity);
+            $result = $operation->execute($entityType, $entity, $arguments);
             $this->callbackHandler->process($entityType);
         } catch (\Exception $e) {
             $this->callbackHandler->clear($entityType);
diff --git a/lib/internal/Magento/Framework/EntityManager/MetadataPool.php b/lib/internal/Magento/Framework/EntityManager/MetadataPool.php
index ee7753e395ea9326af4d5f46fd3aa7b0e11c3f3f..64547b22bc9ef7798480f72565dd25664175927c 100644
--- a/lib/internal/Magento/Framework/EntityManager/MetadataPool.php
+++ b/lib/internal/Magento/Framework/EntityManager/MetadataPool.php
@@ -25,7 +25,7 @@ class MetadataPool
     protected $metadata;
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata[]
+     * @var \Magento\Framework\EntityManager\EntityMetadata[]
      */
     protected $registry;
 
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Read.php b/lib/internal/Magento/Framework/EntityManager/Operation/Read.php
index 3e4c0d0f3527ce61c1842e9f2b1188666f762203..0aec0ea2149d8cf82a0e73437286943ceee8c899 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Read.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Read.php
@@ -79,34 +79,50 @@ class Read
      * @param string $entityType
      * @param object $entity
      * @param string $identifier
+     * @param array $arguments
      * @return object
      * @throws \Exception
      */
-    public function execute($entityType, $entity, $identifier)
+    public function execute($entityType, $entity, $identifier, $arguments = [])
     {
         $metadata = $this->metadataPool->getMetadata($entityType);
-        $eventPrefix = strtolower(str_replace("\\", "_", $entityType));
         $hydrator = $this->hydratorPool->getHydrator($entityType);
-        $entity = $this->readMain->execute($entityType, $entity, $identifier);
         $this->eventManager->dispatch(
             'entity_manager_load_before',
             [
                 'entity_type' => $entityType,
-                'identifier' => $identifier
+                'identifier' => $identifier,
+                'arguments' => $arguments
             ]
         );
-        $this->eventManager->dispatchEntityEvent($entityType, 'load_before', ['identifier' => $identifier]);
+        $this->eventManager->dispatchEntityEvent(
+            $entityType,
+            'load_before',
+            [
+                'identifier' => $identifier,
+                'arguments' => $arguments
+            ]
+        );
+        $entity = $this->readMain->execute($entityType, $entity, $identifier, $arguments);
         $entityData = $hydrator->extract($entity);
         if (isset($entityData[$metadata->getLinkField()])) {
-            $entity = $this->readAttributes->execute($entityType, $entity);
-            $entity = $this->readExtensions->execute($entityType, $entity);
+            $entity = $this->readAttributes->execute($entityType, $entity, $arguments);
+            $entity = $this->readExtensions->execute($entityType, $entity, $arguments);
         }
-        $this->eventManager->dispatchEntityEvent($entityType, 'load_after', ['entity' => $entity]);
+        $this->eventManager->dispatchEntityEvent(
+            $entityType,
+            'load_after',
+            [
+                'entity' => $entity,
+                'arguments' => $arguments
+            ]
+        );
         $this->eventManager->dispatch(
             'entity_manager_load_after',
             [
                 'entity_type' => $entityType,
-                'entity' => $entity
+                'entity' => $entity,
+                'arguments' => $arguments
             ]
         );
 
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Read/CheckIsExists.php b/lib/internal/Magento/Framework/EntityManager/Operation/Read/CheckIsExists.php
index 1377036fa91adf838acddd121278ca4308d14fff..ed49054c9c3d1a6cca3df82affa7197db72d6a3a 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Read/CheckIsExists.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Read/CheckIsExists.php
@@ -50,10 +50,11 @@ class CheckIsExists
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return bool
      * @throws \Exception
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $metadata = $this->metadataPool->getMetadata($entityType);
         $hydrator = $this->hydratorPool->getHydrator($entityType);
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadAttributes.php b/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadAttributes.php
index 4217992553fb114ef40356f0341c8ea130ad378a..123522ef439f881754965f453b12e2d1c3c48452 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadAttributes.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadAttributes.php
@@ -41,15 +41,16 @@ class ReadAttributes
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $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));
+            $entityData = array_merge($entityData, $action->execute($entityType, $entityData, $arguments));
         }
         $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
index 9bd413cff8e94d35b21b224ed7ba899d79504b1f..76fdeda808333ca1f7e04c3a51de6051e52b472e 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadExtensions.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Read/ReadExtensions.php
@@ -32,13 +32,14 @@ class ReadExtensions
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $actions = $this->extensionPool->getActions($entityType, 'read');
         foreach ($actions as $action) {
-            $entity = $action->execute($entityType, $entity);
+            $entity = $action->execute($entityType, $entity, $arguments);
         }
         return $entity;
     }
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create.php
index b6ba5b411d398aa0adcd1989bcd7fc61696e8227..f9864acdcd2eb4f8f8875086e80e883a75000b7f 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create.php
@@ -78,10 +78,11 @@ class Create
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      * @throws \Exception
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $metadata = $this->metadataPool->getMetadata($entityType);
         $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
@@ -95,9 +96,9 @@ class Create
                 ]
             );
             $this->eventManager->dispatchEntityEvent($entityType, 'save_before', ['entity' => $entity]);
-            $entity = $this->createMain->execute($entityType, $entity);
-            $entity = $this->createAttributes->execute($entityType, $entity);
-            $entity = $this->createExtensions->execute($entityType, $entity);
+            $entity = $this->createMain->execute($entityType, $entity, $arguments);
+            $entity = $this->createAttributes->execute($entityType, $entity, $arguments);
+            $entity = $this->createExtensions->execute($entityType, $entity, $arguments);
             $this->eventManager->dispatchEntityEvent($entityType, 'save_after', ['entity' => $entity]);
             $this->eventManager->dispatch(
                 'entity_manager_save_after',
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateAttributes.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateAttributes.php
index 564609bd8cf44dd4c0a81c399a13616d9317149d..80440562c9df02f47d78a2e1ee244a9e56ac54a3 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateAttributes.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateAttributes.php
@@ -41,12 +41,13 @@ class CreateAttributes
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity, $data = [])
+    public function execute($entityType, $entity, $arguments = [])
     {
         $hydrator = $this->hydratorPool->getHydrator($entityType);
-        $entityData = array_merge($hydrator->extract($entity), $data);
+        $entityData = array_merge($hydrator->extract($entity), $arguments);
         $actions = $this->attributePool->getActions($entityType, 'create');
         foreach ($actions as $action) {
             $action->execute($entityType, $entityData);
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateExtensions.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateExtensions.php
index 7706d1a5fd79dab382665b1da3f2cbc677e0926b..4a3ecf51430197e49816a2e0e598b965c7d1f73d 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateExtensions.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateExtensions.php
@@ -31,13 +31,14 @@ class CreateExtensions
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $actions = $this->extensionPool->getActions($entityType, 'create');
         foreach ($actions as $action) {
-            $entity = $action->execute($entityType, $entity);
+            $entity = $action->execute($entityType, $entity, $arguments);
         }
         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
index 31637ea41c7d43fb98cba6a124aa01c56991b815..6367e86b1c66228eb7448e983562889c0f79e80d 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateMain.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/CreateMain.php
@@ -43,12 +43,12 @@ class CreateMain
      * @param object $entity
      * @return object
      */
-    public function execute($entityType, $entity, $data = [])
+    public function execute($entityType, $entity, $arguments = [])
     {
         $hydrator = $this->hydratorPool->getHydrator($entityType);
         $entityData = $this->createRow->execute(
             $entityType,
-            array_merge($hydrator->extract($entity), $data)
+            array_merge($hydrator->extract($entity), $arguments)
         );
         $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
deleted file mode 100644
index 09946dec6a1cb04c734dd4a8c93d560fce752e0e..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/ValidateCreate.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?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
index e86f5c99cae8b56ea50e44630db6d5a652cf881c..6ae92b12749669cced4a61eb83d5ae1b31c85915 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete.php
@@ -87,10 +87,11 @@ class Delete
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      * @throws \Exception
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $metadata = $this->metadataPool->getMetadata($entityType);
         $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
@@ -104,9 +105,9 @@ class Delete
                 ]
             );
             $this->eventManager->dispatchEntityEvent($entityType, 'delete_before', ['entity' => $entity]);
-            $entity = $this->deleteMain->execute($entityType, $entity);
-            $entity = $this->deleteAttributes->execute($entityType, $entity);
-            $entity = $this->deleteExtensions->execute($entityType, $entity);
+            $entity = $this->deleteMain->execute($entityType, $entity, $arguments);
+            $entity = $this->deleteAttributes->execute($entityType, $entity, $arguments);
+            $entity = $this->deleteExtensions->execute($entityType, $entity, $arguments);
             $this->eventManager->dispatchEntityEvent($entityType, 'delete_after', ['entity' => $entity]);
             $this->eventManager->dispatch(
                 'entity_manager_delete_before',
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteAttributes.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteAttributes.php
index 9bbf27526c65bbcbc412f39d061cfd9e4d18cbcd..5db2a375d8fd85d8ebf97788ba7c0ae99528b5d4 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteAttributes.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteAttributes.php
@@ -41,15 +41,16 @@ class DeleteAttributes
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity, $data = [])
+    public function execute($entityType, $entity, $arguments = [])
     {
         $hydrator = $this->hydratorPool->getHydrator($entityType);
-        $entityData = array_merge($hydrator->extract($entity), $data);
+        $entityData = array_merge($hydrator->extract($entity), $arguments);
         $actions = $this->attributePool->getActions($entityType, 'delete');
         foreach ($actions as $action) {
-            $action->execute($entityType, $entityData);
+            $action->execute($entityType, $entityData, $arguments);
         }
         $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
index 6ceeea3650077facd25bfa518f4a6cff4634a008..8b32645dd7c738df1b55d352520180ae2ea0b5bb 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteExtensions.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteExtensions.php
@@ -31,13 +31,14 @@ class DeleteExtensions
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $actions = $this->extensionPool->getActions($entityType, 'delete');
         foreach ($actions as $action) {
-            $entity = $action->execute($entityType, $entity);
+            $action->execute($entityType, $entity, $arguments);
         }
         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
index 414580b9b8d215093cd3d94faa437e025d5228bb..fe4907baee6ba501550afe7e6f57d463cc893f2a 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteMain.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/DeleteMain.php
@@ -41,9 +41,10 @@ class DeleteMain
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $hydrator = $this->hydratorPool->getHydrator($entityType);
         $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
deleted file mode 100644
index f2002cb54fbd5b7493a8ccc45d28d423d4996683..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/ValidateDelete.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?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
index d14abafa542ac5dd50f309960f2de5a6bc9ee4de..d5deaf7c4c8a109aa44d4cca3b321fff86e1b9a8 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update.php
@@ -78,10 +78,11 @@ class Update
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      * @throws \Exception
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $metadata = $this->metadataPool->getMetadata($entityType);
         $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
@@ -95,9 +96,9 @@ class Update
                 ]
             );
             $this->eventManager->dispatchEntityEvent($entityType, 'save_before', ['entity' => $entity]);
-            $entity = $this->updateMain->execute($entityType, $entity);
-            $entity = $this->updateAttributes->execute($entityType, $entity);
-            $entity = $this->updateExtensions->execute($entityType, $entity);
+            $entity = $this->updateMain->execute($entityType, $entity, $arguments);
+            $entity = $this->updateAttributes->execute($entityType, $entity, $arguments);
+            $entity = $this->updateExtensions->execute($entityType, $entity, $arguments);
             $this->eventManager->dispatchEntityEvent($entityType, 'save_after', ['entity' => $entity]);
             $this->eventManager->dispatch(
                 'entity_manager_save_after',
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateAttributes.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateAttributes.php
index 16b640630d2532f3a3d75ffa076f2e8af6110145..3bab8836d7cc6537161c51f82b8bc5ab93404268 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateAttributes.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateAttributes.php
@@ -41,15 +41,16 @@ class UpdateAttributes
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity, $data = [])
+    public function execute($entityType, $entity, $arguments = [])
     {
         $hydrator = $this->hydratorPool->getHydrator($entityType);
-        $entityData = array_merge($hydrator->extract($entity), $data);
+        $entityData = array_merge($hydrator->extract($entity), $arguments);
         $actions = $this->attributePool->getActions($entityType, 'update');
         foreach ($actions as $action) {
-            $action->execute($entityType, $entityData);
+            $action->execute($entityType, $entityData, $arguments);
         }
         $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
index 5add30b29658d2135f758e119dfdafc6d2a4fda7..0492c84046c9fdb216e8ad1b12c36dad797159ed 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateExtensions.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateExtensions.php
@@ -31,9 +31,10 @@ class UpdateExtensions
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity)
+    public function execute($entityType, $entity, $arguments = [])
     {
         $actions = $this->extensionPool->getActions($entityType, 'update');
         foreach ($actions as $action) {
diff --git a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateMain.php b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateMain.php
index c0266ab05d81284fd4ea8df7e800ebaa59347893..0f42227b009b351eac1ed4560f4323348b5ed793 100644
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateMain.php
+++ b/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/UpdateMain.php
@@ -41,14 +41,15 @@ class UpdateMain
     /**
      * @param string $entityType
      * @param object $entity
+     * @param array $arguments
      * @return object
      */
-    public function execute($entityType, $entity, $data = [])
+    public function execute($entityType, $entity, $arguments = [])
     {
         $hydrator = $this->hydratorPool->getHydrator($entityType);
         $entityData = $this->updateRow->execute(
             $entityType,
-            array_merge($hydrator->extract($entity), $data)
+            array_merge($hydrator->extract($entity), $arguments)
         );
         $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
deleted file mode 100644
index eeb147c06f02b54ccf3016b5ed0a07491118191d..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/ValidateUpdate.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?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/ResourceModel/Db/CreateEntityRow.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/CreateEntityRow.php
index 7c117a8cb79e3992113ede79261e62361d296425..27d683b85835a9f7be77f4aa82e717081c98a380 100755
--- a/lib/internal/Magento/Framework/Model/ResourceModel/Db/CreateEntityRow.php
+++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/CreateEntityRow.php
@@ -6,7 +6,7 @@
 namespace Magento\Framework\Model\ResourceModel\Db;
 
 use Magento\Framework\EntityManager\MetadataPool;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 
 /**
  * Class ReadEntityRow
diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/Db/DeleteEntityRow.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/DeleteEntityRow.php
index 522787f70ac7083df3f848a841f36a57d9fab93c..7fc6bd248ee442d929adfb5c4c7db81008027193 100755
--- a/lib/internal/Magento/Framework/Model/ResourceModel/Db/DeleteEntityRow.php
+++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/DeleteEntityRow.php
@@ -6,7 +6,7 @@
 namespace Magento\Framework\Model\ResourceModel\Db;
 
 use Magento\Framework\EntityManager\MetadataPool;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 
 class DeleteEntityRow
 {
diff --git a/lib/internal/Magento/Framework/Model/ResourceModel/Db/UpdateEntityRow.php b/lib/internal/Magento/Framework/Model/ResourceModel/Db/UpdateEntityRow.php
index 456fd7d9e85dfaf6b2cfc8a038fbb9410aa77608..e22e19ef0e1b54c87ae399fe7c29f0bf8032d32f 100755
--- a/lib/internal/Magento/Framework/Model/ResourceModel/Db/UpdateEntityRow.php
+++ b/lib/internal/Magento/Framework/Model/ResourceModel/Db/UpdateEntityRow.php
@@ -7,7 +7,7 @@
 namespace Magento\Framework\Model\ResourceModel\Db;
 
 use Magento\Framework\EntityManager\MetadataPool;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 
 /**
  * Class ReadEntityRow
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/EntityMetadataTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/EntityMetadataTest.php
index 91e8cca4a34cd517e3660ae7cf014f84580cd90f..26a977054156a5694f1a985712809021b5191847 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/EntityMetadataTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/EntityMetadataTest.php
@@ -10,7 +10,7 @@ use Magento\Framework\App\ResourceConnection as AppResource;
 use Magento\Framework\DB\Sequence\SequenceInterface;
 use Magento\Framework\DB\Adapter\AdapterInterface;
 use Magento\Framework\DB\Select;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 
 /**
  * Class EntityMetadataTest
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 63d2132c42093c003de066d5f8b63f44f1fdbd3a..a2a6a97550d4f05605ebbcce705fb8dba410d2ef 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Entity/MetadataPoolTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/Entity/MetadataPoolTest.php
@@ -8,7 +8,7 @@ namespace Magento\Framework\Model\Test\Unit\Entity;
 
 use Magento\Framework\Model\Entity\EntityHydrator;
 use Magento\Framework\EntityManager\MetadataPool;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\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 9126865f4b0dbc5b456bc7470e290a7e5ec7c5fd..1e8a740b8dcbb231a9cbbbf2bb210e674e8795ef 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/EntityManagerTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/EntityManagerTest.php
@@ -18,7 +18,7 @@ class EntityManagerTest extends \PHPUnit_Framework_TestCase
     protected $subject;
 
     /**
-     * @var \Magento\Framework\Model\Entity\EntityMetadata|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\EntityManager\EntityMetadata|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $metadata;
 
@@ -51,7 +51,7 @@ class EntityManagerTest extends \PHPUnit_Framework_TestCase
     {
         $this->markTestSkipped('Due to MAGETWO-48956');
         $this->metadata = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
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 6d5f86e262ac4b833d977f295c3b3b87b4f90a51..6691a3afd826bd751f22caf92b9935d258a120d1 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshot/AttributeProviderTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshot/AttributeProviderTest.php
@@ -7,7 +7,7 @@
 namespace Magento\Framework\Model\Test\Unit\EntitySnapshot;
 
 use Magento\Framework\DB\Adapter\AdapterInterface;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 use Magento\Framework\Model\EntitySnapshot\AttributeProvider;
 use Magento\Framework\Model\EntitySnapshot\AttributeProviderInterface;
 use Magento\Framework\EntityManager\MetadataPool;
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshotTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshotTest.php
index 9eaa91c73cca0bbdee41606ab01677c5391e2645..30448dc4dce8cdd7e8655041b5317408ff44ded6 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshotTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/EntitySnapshotTest.php
@@ -7,7 +7,7 @@
 namespace Magento\Framework\Model\Test\Unit;
 
 use Magento\Framework\Model\Entity\EntityHydrator;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 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 5d72b401a8ddc6f2757779518dcf1ee363c0f87e..9591dd59f8cca09a0dc1fcc0b65b8d16072de4b8 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Operation/ReadTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/Operation/ReadTest.php
@@ -11,7 +11,7 @@ use Magento\Framework\Model\Entity\Action\ReadMain;
 use Magento\Framework\Model\Entity\Action\ReadExtension;
 use Magento\Framework\Model\Entity\Action\ReadRelation;
 use Magento\Framework\Model\Operation\Read;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 use Magento\Framework\Model\Entity\HydratorInterface;
 
 /**
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 be174480381a0d28247b06b5d4a5fad270ba085f..aa492d6b7f1fa5ce52a445bc53e7a67274f2fe17 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
@@ -10,7 +10,7 @@ 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;
-use Magento\Framework\Model\Entity\EntityMetadata;
+use Magento\Framework\EntityManager\EntityMetadata;
 use Magento\Framework\Model\Operation\Write\Update;
 
 class UpdateTest extends \PHPUnit_Framework_TestCase
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 062b94c2c0076832600ebb31296755d5fa2c7805..a18851cb3610ede7a735717867121e1addb67ed1 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
@@ -44,7 +44,7 @@ class CreateEntityRowTest extends \PHPUnit_Framework_TestCase
             ->willReturn(1);
 
         $metadata = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
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 6e99b034add10118c4ba264dddf6b5ef81c9ff74..951d385a43e37c8d05edde122364aa7a24e0c2c6 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
@@ -40,7 +40,7 @@ class DeleteEntityRowTest extends \PHPUnit_Framework_TestCase
         );
 
         $metadata = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
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 07a0979b6be4b4525523ef2ca07831b4966f73ef..33036b8162e5d2a95e87328949f83e582fc91a5c 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
@@ -61,7 +61,7 @@ class ReadEntityRowTest extends \PHPUnit_Framework_TestCase
             ->willReturnArgument(0);
 
         $metadata = $this->getMock(
-            'Magento\Framework\Model\Entity\EntityMetadata',
+            'Magento\Framework\EntityManager\EntityMetadata',
             [],
             [],
             '',
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 062cf6dcd03b52927adb4cac70cd3b936180a614..741b9e3af8c16e971fc5fafb1262f027d38c0fee 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
@@ -50,7 +50,7 @@ class UpdateEntityRowTest extends \PHPUnit_Framework_TestCase
         $output['test_column_name'] = 'test_column_name';
         $expectedResult = true;
 
-        $entityMetadataMock = $this->getMockBuilder('Magento\Framework\Model\Entity\EntityMetadata')
+        $entityMetadataMock = $this->getMockBuilder('Magento\Framework\EntityManager\EntityMetadata')
             ->disableOriginalConstructor()
             ->getMock();
         $connectionMock = $this->getMockBuilder('Magento\Framework\DB\Adapter\AdapterInterface')
diff --git a/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php b/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php
index 11b22296b8527d1780ef273827530e5612c655c7..2d0aa2297b99a1a1cc546a002f8383896521a6b1 100644
--- a/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Fixtures/CatalogPriceRulesFixtureTest.php
@@ -73,7 +73,7 @@ class CatalogPriceRulesFixtureTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnValue('category_id'));
 
         $modelMock = $this->getMock('Magento\CatalogRule\Model\Rule', [], [], '', false);
-        $metadataMock = $this->getMock('\Magento\Framework\Model\Entity\EntityMetadata', [], [], '', false);
+        $metadataMock = $this->getMock('\Magento\Framework\EntityManager\EntityMetadata', [], [], '', false);
         $metadataPoolMock = $this->getMock('Magento\Framework\EntityManager\MetadataPool', [], [], '', false);
         $metadataMock->expects($this->once())
             ->method('getLinkField')