From d57c81ced2419cde9d8af2f55062a783ec6a7789 Mon Sep 17 00:00:00 2001
From: Anton Kaplya <anton.kaplya@magento.com>
Date: Tue, 22 Mar 2016 22:15:24 +0200
Subject: [PATCH] MAGETWO-50676: EntityManager introduction

---
 .../Unit/Model/Import/AdvancedPricingTest.php |  2 +-
 .../Test/Unit/Model/LinkManagementTest.php    |  4 +-
 .../Test/Unit/Model/OptionRepositoryTest.php  |  6 +--
 .../Model/Import/Product/Type/BundleTest.php  |  2 +-
 .../Command/ProductAttributesCleanUp.php      |  2 +-
 .../Indexer/Category/Flat/AbstractAction.php  |  2 +-
 .../Model/Product/Gallery/CreateHandler.php   |  2 +-
 .../Catalog/Model/ResourceModel/Category.php  | 10 ++---
 .../Catalog/Model/ResourceModel/Product.php   | 10 +++--
 .../Model/ResourceModel/Product/Gallery.php   |  2 +-
 .../Unit/Model/CategoryRepositoryTest.php     |  2 +-
 .../Model/Product/Option/RepositoryTest.php   |  2 +-
 .../Unit/Model/ProductLink/RepositoryTest.php |  2 +-
 .../Model/ResourceModel/Category/TreeTest.php |  2 +-
 .../ResourceModel/Product/GalleryTest.php     |  2 +-
 .../Product/Option/CollectionTest.php         |  2 +-
 .../Model/Import/Product/Type/OptionTest.php  |  2 +-
 .../Test/Unit/Model/Import/ProductTest.php    |  2 +-
 .../Indexer/Stock/DefaultStock.php            |  8 ++--
 .../Unit/Model/Indexer/IndexBuilderTest.php   |  2 +-
 .../Model/ResourceModel/ReadHandlerTest.php   |  2 +-
 .../Model/ResourceModel/SaveHandlerTest.php   |  2 +-
 .../Indexer/Fulltext/Action/DataProvider.php  |  2 +-
 .../Adapter/Mysql/Filter/PreprocessorTest.php |  2 +-
 .../Block/Relation/Store/SaveHandlerTest.php  |  2 +-
 .../Page/Relation/Store/SaveHandlerTest.php   |  2 +-
 .../Import/Product/Type/ConfigurableTest.php  |  2 +-
 .../Configurable/Attribute/Collection.php     |  2 +-
 .../Model/Attribute/LockValidatorTest.php     |  2 +-
 .../Model/Product/Type/ConfigurableTest.php   |  2 +-
 .../Product/Type/ConfigurableTest.php         |  4 +-
 .../Test/Unit/Model/LinkRepositoryTest.php    |  2 +-
 .../Model/Product/TypeHandler/LinkTest.php    |  2 +-
 .../Model/Product/TypeHandler/SampleTest.php  |  2 +-
 .../Test/Unit/Model/SampleRepositoryTest.php  |  2 +-
 .../Model/ResourceModel/ContextHandler.php    |  2 +-
 .../Eav/Model/ResourceModel/ReadHandler.php   | 10 ++++-
 .../Model/Import/Product/Type/GroupedTest.php |  2 +-
 .../Model/ResourceModel/ReadHandlerTest.php   |  2 +-
 .../Model/ResourceModel/SaveHandlerTest.php   |  6 +--
 .../Model/Product/Gallery/ReadHandlerTest.php |  2 +-
 .../Import/Product/Type/ConfigurableTest.php  |  2 +-
 .../Import/Product/Type/DownloadableTest.php  |  2 +-
 .../Framework/EntityManager/EntityManager.php | 40 +++++++++--------
 .../Framework/EntityManager/MetadataPool.php  |  2 +-
 .../EntityManager/Operation/Read.php          | 34 ++++++++++----
 .../Operation/Read/CheckIsExists.php          |  3 +-
 .../Operation/Read/ReadAttributes.php         |  5 ++-
 .../Operation/Read/ReadExtensions.php         |  5 ++-
 .../EntityManager/Operation/Write/Create.php  |  9 ++--
 .../Write/Create/CreateAttributes.php         |  5 ++-
 .../Write/Create/CreateExtensions.php         |  5 ++-
 .../Operation/Write/Create/CreateMain.php     |  4 +-
 .../Operation/Write/Create/ValidateCreate.php | 45 -------------------
 .../EntityManager/Operation/Write/Delete.php  |  9 ++--
 .../Write/Delete/DeleteAttributes.php         |  7 +--
 .../Write/Delete/DeleteExtensions.php         |  5 ++-
 .../Operation/Write/Delete/DeleteMain.php     |  3 +-
 .../Operation/Write/Delete/ValidateDelete.php | 45 -------------------
 .../EntityManager/Operation/Write/Update.php  |  9 ++--
 .../Write/Update/UpdateAttributes.php         |  7 +--
 .../Write/Update/UpdateExtensions.php         |  3 +-
 .../Operation/Write/Update/UpdateMain.php     |  5 ++-
 .../Operation/Write/Update/ValidateUpdate.php | 45 -------------------
 .../ResourceModel/Db/CreateEntityRow.php      |  2 +-
 .../ResourceModel/Db/DeleteEntityRow.php      |  2 +-
 .../ResourceModel/Db/UpdateEntityRow.php      |  2 +-
 .../Test/Unit/Entity/EntityMetadataTest.php   |  2 +-
 .../Test/Unit/Entity/MetadataPoolTest.php     |  2 +-
 .../Model/Test/Unit/EntityManagerTest.php     |  4 +-
 .../EntitySnapshot/AttributeProviderTest.php  |  2 +-
 .../Model/Test/Unit/EntitySnapshotTest.php    |  2 +-
 .../Model/Test/Unit/Operation/ReadTest.php    |  2 +-
 .../Test/Unit/Operation/Write/UpdateTest.php  |  2 +-
 .../ResourceModel/Db/CreateEntityRowTest.php  |  2 +-
 .../ResourceModel/Db/DeleteEntityRowTest.php  |  2 +-
 .../ResourceModel/Db/ReadEntityRowTest.php    |  2 +-
 .../ResourceModel/Db/UpdateEntityRowTest.php  |  2 +-
 .../Fixtures/CatalogPriceRulesFixtureTest.php |  2 +-
 79 files changed, 182 insertions(+), 273 deletions(-)
 delete mode 100644 lib/internal/Magento/Framework/EntityManager/Operation/Write/Create/ValidateCreate.php
 delete mode 100644 lib/internal/Magento/Framework/EntityManager/Operation/Write/Delete/ValidateDelete.php
 delete mode 100644 lib/internal/Magento/Framework/EntityManager/Operation/Write/Update/ValidateUpdate.php

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 c4f21dd420b..a289e9970b4 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 9bc4162b992..8e221ccf520 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 1a3f3154a6b..465ae18a688 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 f700948e513..2379ad7f107 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 8e82e443dda..d1b938296f9 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 96ae880b6fa..8b2f62ad2a0 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 044444d7e7c..94d45ddb353 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 3a4f7d8e350..a1a2a760c07 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 205e391ef99..7f49709a9e1 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 23ad576287d..53b65fcb93a 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 d42fc8b850a..f1120bc464e 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 1bf05cad658..94382310ded 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 26c676ae1fe..1f9139425e7 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 1e22aeb8058..e68c4130257 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 c93a7db2eb8..b42c9c8027d 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 f1a4add4532..349d3a5a41a 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 2da1f432bd9..c4c81329267 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 f4575adc7c0..f670158e9b7 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 30ea482cce9..eff5f716c8f 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 bcf6074b312..afcd54996b2 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 dd82c2d2e5b..811c095f5f8 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 e5438e0cac7..0aba546d5e9 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 45280f7508d..5a5529cb22a 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 88b80ddd776..39c29a0a0da 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 e4e61246df3..fb27ec0c908 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 519c3ec7d97..ef7be111839 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 46cfac08df0..8ce7489db93 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 f1b7238b383..c4de0612c5d 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 698cc19c681..b6dc8590270 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 456066de44a..edd105f0d1e 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 d6294ea386e..60efa376186 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 c2dba836c14..37e47ff43d6 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 d8723370e4b..53b3c1d9368 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 448ae470562..76fe7b1832e 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 d663c02c9c1..617847dcb44 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 24541ab6d51..6596d3e454b 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 4c57e093c04..8a9a8406777 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 86f8bc9c6ef..390d396ba47 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 71cf86f0e6f..681647d5d19 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 71fd7cece8a..a3041140a0a 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 fc8851e34e8..7869a012e46 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 5a03263f61e..1f7e0c9c71f 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 6178b028c33..8db369facf9 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 53e1abd4562..798d735f3e4 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 ee7753e395e..64547b22bc9 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 3e4c0d0f352..0aec0ea2149 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 1377036fa91..ed49054c9c3 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 4217992553f..123522ef439 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 9bd413cff8e..76fdeda8083 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 b6ba5b411d3..f9864acdcd2 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 564609bd8cf..80440562c9d 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 7706d1a5fd7..4a3ecf51430 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 31637ea41c7..6367e86b1c6 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 09946dec6a1..00000000000
--- 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 e86f5c99cae..6ae92b12749 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 9bbf27526c6..5db2a375d8f 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 6ceeea36500..8b32645dd7c 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 414580b9b8d..fe4907baee6 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 f2002cb54fb..00000000000
--- 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 d14abafa542..d5deaf7c4c8 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 16b640630d2..3bab8836d7c 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 5add30b2965..0492c84046c 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 c0266ab05d8..0f42227b009 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 eeb147c06f0..00000000000
--- 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 7c117a8cb79..27d683b8583 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 522787f70ac..7fc6bd248ee 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 456fd7d9e85..e22e19ef0e1 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 91e8cca4a34..26a97705415 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 63d2132c420..a2a6a97550d 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 9126865f4b0..1e8a740b8dc 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 6d5f86e262a..6691a3afd82 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 9eaa91c73cc..30448dc4dce 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 5d72b401a8d..9591dd59f8c 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 be174480381..aa492d6b7f1 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 062b94c2c00..a18851cb361 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 6e99b034add..951d385a43e 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 07a0979b6be..33036b8162e 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 062cf6dcd03..741b9e3af8c 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 11b22296b85..2d0aa2297b9 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')
-- 
GitLab