diff --git a/app/code/Magento/Eav/Model/Config.php b/app/code/Magento/Eav/Model/Config.php
index 36be7733dcd75a1fed3c7f63072f546d32378416..89d0bc93c80073ae3f305445f808305265ab9848 100644
--- a/app/code/Magento/Eav/Model/Config.php
+++ b/app/code/Magento/Eav/Model/Config.php
@@ -6,6 +6,8 @@
 namespace Magento\Eav\Model;
 
 use Magento\Eav\Model\Entity\Type;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\App\ObjectManager;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -92,6 +94,11 @@ class Config
      */
     protected $_universalFactory;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\App\CacheInterface $cache
      * @param \Magento\Eav\Model\Entity\TypeFactory $entityTypeFactory
@@ -105,13 +112,15 @@ class Config
         \Magento\Eav\Model\Entity\TypeFactory $entityTypeFactory,
         \Magento\Eav\Model\ResourceModel\Entity\Type\CollectionFactory $entityTypeCollectionFactory,
         \Magento\Framework\App\Cache\StateInterface $cacheState,
-        \Magento\Framework\Validator\UniversalFactory $universalFactory
+        \Magento\Framework\Validator\UniversalFactory $universalFactory,
+        SerializerInterface $serializer = null
     ) {
         $this->_cache = $cache;
         $this->_entityTypeFactory = $entityTypeFactory;
         $this->entityTypeCollectionFactory = $entityTypeCollectionFactory;
         $this->_cacheState = $cacheState;
         $this->_universalFactory = $universalFactory;
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
     }
 
     /**
@@ -278,7 +287,7 @@ class Config
         \Magento\Framework\Profiler::start('EAV: ' . __METHOD__, ['group' => 'EAV', 'method' => __METHOD__]);
 
         if ($this->isCacheEnabled() && ($cache = $this->_cache->load(self::ENTITIES_CACHE_ID))) {
-            $this->_entityTypeData = unserialize($cache);
+            $this->_entityTypeData = $this->serializer->unserialize($cache);
             foreach ($this->_entityTypeData as $typeCode => $data) {
                 $typeId = $data['entity_type_id'];
                 $this->_addEntityTypeReference($typeId, $typeCode);
@@ -302,7 +311,7 @@ class Config
 
         if ($this->isCacheEnabled()) {
             $this->_cache->save(
-                serialize($this->_entityTypeData),
+                $this->serializer->serialize($this->_entityTypeData),
                 self::ENTITIES_CACHE_ID,
                 [
                     \Magento\Eav\Model\Cache\Type::CACHE_TAG,
@@ -372,7 +381,7 @@ class Config
         }
         $cacheKey = self::ATTRIBUTES_CACHE_ID . $entityTypeCode;
         if ($this->isCacheEnabled() && ($attributes = $this->_cache->load($cacheKey))) {
-            $attributes = unserialize($attributes);
+            $attributes = $this->serializer->unserialize($attributes);
             if ($attributes) {
                 foreach ($attributes as $attribute) {
                     $this->_createAttribute($entityType, $attribute);
@@ -402,7 +411,7 @@ class Config
         }
         if ($this->isCacheEnabled()) {
             $this->_cache->save(
-                serialize($this->_attributeData[$entityTypeCode]),
+                $this->serializer->serialize($this->_attributeData[$entityTypeCode]),
                 $cacheKey,
                 [
                     \Magento\Eav\Model\Cache\Type::CACHE_TAG,
@@ -487,7 +496,7 @@ class Config
         }
 
         if ($this->isCacheEnabled() && ($attributes = $this->_cache->load($cacheKey))) {
-            $this->_attributeCodes[$cacheKey] = unserialize($attributes);
+            $this->_attributeCodes[$cacheKey] = $this->serializer->unserialize($attributes);
             return $this->_attributeCodes[$cacheKey];
         }
 
@@ -514,7 +523,7 @@ class Config
         $this->_attributeCodes[$cacheKey] = $attributes;
         if ($this->isCacheEnabled()) {
             $this->_cache->save(
-                serialize($attributes),
+                $this->serializer->serialize($attributes),
                 $cacheKey,
                 [
                     \Magento\Eav\Model\Cache\Type::CACHE_TAG,
diff --git a/app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute/Set.php b/app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute/Set.php
index 4e6e45f5d2270aa42e049ae2fe52c60bd1bce82b..b3e7bf2bc3925224cace683b4aba2fe57b29e63e 100644
--- a/app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute/Set.php
+++ b/app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute/Set.php
@@ -5,11 +5,8 @@
  */
 namespace Magento\Eav\Model\ResourceModel\Entity\Attribute;
 
-/**
- * Eav attribute set resource model
- *
- * @author      Magento Core Team <core@magentocommerce.com>
- */
+use Magento\Framework\Serialize\SerializerInterface;
+
 class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 {
     /**
@@ -27,6 +24,11 @@ class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
      */
     protected $eavConfig;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
      * @param GroupFactory $attrGroupFactory
@@ -152,7 +154,7 @@ class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
         $cacheKey = self::ATTRIBUTES_CACHE_ID . $setId;
 
         if ($this->eavConfig->isCacheEnabled() && ($cache = $this->eavConfig->getCache()->load($cacheKey))) {
-            $setInfoData = unserialize($cache);
+            $setInfoData = $this->getSerializer()->unserialize($cache);
         } else {
             $attributeSetData = $this->fetchAttributeSetData($setId);
 
@@ -168,7 +170,7 @@ class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 
             if ($this->eavConfig->isCacheEnabled()) {
                 $this->eavConfig->getCache()->save(
-                    serialize($setInfoData),
+                    $this->getSerializer()->serialize($setInfoData),
                     $cacheKey,
                     [
                         \Magento\Eav\Model\Cache\Type::CACHE_TAG,
@@ -233,4 +235,19 @@ class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
         }
         return $connection->fetchAll($select, $bind);
     }
+
+    /**
+     * Get serializer
+     *
+     * @return SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if (null === $this->serializer) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/app/code/Magento/Eav/Plugin/Model/ResourceModel/Entity/Attribute.php b/app/code/Magento/Eav/Plugin/Model/ResourceModel/Entity/Attribute.php
index c76449b1223ed3369df37202da1415c7f14a5187..3452d452ac490c759c33e8e380acb0593de63125 100644
--- a/app/code/Magento/Eav/Plugin/Model/ResourceModel/Entity/Attribute.php
+++ b/app/code/Magento/Eav/Plugin/Model/ResourceModel/Entity/Attribute.php
@@ -5,6 +5,13 @@
  */
 namespace Magento\Eav\Plugin\Model\ResourceModel\Entity;
 
+use Magento\Framework\App\CacheInterface;
+use Magento\Framework\App\Cache\StateInterface;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute as AttributeResource;
+use Magento\Eav\Model\Cache\Type;
+use Magento\Eav\Model\Entity\Attribute as EntityAttribute;
+
 class Attribute
 {
     /**
@@ -12,52 +19,74 @@ class Attribute
      */
     const STORE_LABEL_ATTRIBUTE = 'EAV_STORE_LABEL_ATTRIBUTE';
 
-    /** @var \Magento\Framework\App\CacheInterface */
-    protected $cache;
+    /**
+     * @var CacheInterface
+     */
+    private $cache;
+
+    /**
+     * @var StateInterface
+     */
+    private $cacheState;
 
-    /** @var bool|null */
-    protected $isCacheEnabled = null;
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
 
     /**
-     * @param \Magento\Framework\App\CacheInterface $cache
-     * @param \Magento\Framework\App\Cache\StateInterface $cacheState
+     * @param CacheInterface $cache
+     * @param StateInterface $cacheState
+     * @param SerializerInterface $serializer
      * @codeCoverageIgnore
      */
     public function __construct(
-        \Magento\Framework\App\CacheInterface $cache,
-        \Magento\Framework\App\Cache\StateInterface $cacheState
+        CacheInterface $cache,
+        StateInterface $cacheState,
+        SerializerInterface $serializer
     ) {
         $this->cache = $cache;
-        $this->isCacheEnabled = $cacheState->isEnabled(\Magento\Eav\Model\Cache\Type::TYPE_IDENTIFIER);
+        $this->serializer = $serializer;
+        $this->cacheState = $cacheState;;
     }
 
     /**
-     * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute $subject
+     * @param AttributeResource $subject
      * @param callable $proceed
      * @param int $attributeId
      * @return array
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function aroundGetStoreLabelsByAttributeId(
-        \Magento\Eav\Model\ResourceModel\Entity\Attribute $subject,
+        AttributeResource $subject,
         \Closure $proceed,
         $attributeId
     ) {
         $cacheId = self::STORE_LABEL_ATTRIBUTE . $attributeId;
-        if ($this->isCacheEnabled && ($storeLabels = $this->cache->load($cacheId))) {
-            return unserialize($storeLabels);
+        if ($this->isCacheEnabled() && ($storeLabels = $this->cache->load($cacheId))) {
+            return $this->serializer->unserialize($storeLabels);
         }
         $storeLabels = $proceed($attributeId);
-        if ($this->isCacheEnabled) {
+        if ($this->isCacheEnabled()) {
             $this->cache->save(
-                serialize($storeLabels),
+                $this->serializer->serialize($storeLabels),
                 $cacheId,
                 [
-                    \Magento\Eav\Model\Cache\Type::CACHE_TAG,
-                    \Magento\Eav\Model\Entity\Attribute::CACHE_TAG
+                    Type::CACHE_TAG,
+                    EntityAttribute::CACHE_TAG
                 ]
             );
         }
         return $storeLabels;
     }
+
+    /**
+     * Check if cache is enabled
+     * 
+     * @return bool
+     */
+    private function isCacheEnabled()
+    {
+        return $this->cacheState->isEnabled(Type::TYPE_IDENTIFIER);
+    }
 }
diff --git a/app/code/Magento/Eav/Test/Unit/Model/ConfigTest.php b/app/code/Magento/Eav/Test/Unit/Model/ConfigTest.php
index f5fad571f205c14232676327269c52b3cb61370a..ff1e186de604a0b71b0bf765579f74fdd73aa4c4 100644
--- a/app/code/Magento/Eav/Test/Unit/Model/ConfigTest.php
+++ b/app/code/Magento/Eav/Test/Unit/Model/ConfigTest.php
@@ -3,11 +3,15 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Eav\Test\Unit\Model;
 
 use Magento\Framework\DataObject;
 use Magento\Eav\Model\Config;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Eav\Model\Entity\Type;
+use Magento\Eav\Model\Cache\Type as Cache;
+use Magento\Eav\Model\Entity\Attribute;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection;
 
 class ConfigTest extends \PHPUnit_Framework_TestCase
 {
@@ -34,19 +38,26 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \Magento\Framework\App\Cache\StateInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $stateMock;
+    protected $cacheStateMock;
 
     /**
      * @var \Magento\Framework\Validator\UniversalFactory|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $universalFactoryMock;
 
+    /**
+     * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
+
+    /**
+     * @var Type|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $typeMock;
+
     protected function setUp()
     {
-        $this->cacheMock = $this->getMockBuilder(\Magento\Framework\App\CacheInterface::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['load', 'getFrontend', 'save', 'remove', 'clean'])
-            ->getMock();
+        $this->cacheMock = $this->getMock(\Magento\Framework\App\CacheInterface::class);
         $this->typeFactoryMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\TypeFactory::class)
             ->setMethods(['create'])
             ->disableOriginalConstructor()
@@ -56,35 +67,44 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             ->setMethods(['create'])
             ->disableOriginalConstructor()
             ->getMock();
-        $this->stateMock = $this->getMockBuilder(\Magento\Framework\App\Cache\StateInterface::class)
-            ->setMethods(['isEnabled', 'setEnabled', 'persist'])
-            ->disableOriginalConstructor()
-            ->getMock();
+        $this->cacheStateMock = $this->getMock(\Magento\Framework\App\Cache\StateInterface::class);
         $this->universalFactoryMock = $this->getMockBuilder(\Magento\Framework\Validator\UniversalFactory::class)
             ->setMethods(['create'])
             ->disableOriginalConstructor()
             ->getMock();
 
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
+
+        $this->typeMock = $this->getMock(Type::class, [], [], '', false);
+
         $this->config = new Config(
             $this->cacheMock,
             $this->typeFactoryMock,
             $this->collectionFactoryMock,
-            $this->stateMock,
-            $this->universalFactoryMock
+            $this->cacheStateMock,
+            $this->universalFactoryMock,
+            $this->serializerMock
         );
     }
 
     /**
      * @param boolean $cacheEnabled
      * @param int $loadCalls
-     * @param string $cachedValue
+     * @param int $cachedValue
+     * @param int $unserializeCalls
      * @dataProvider getAttributeCacheDataProvider
      * @return void
      */
-    public function testGetAttributeCache($cacheEnabled, $loadCalls, $cachedValue)
+    public function testGetAttributeCache($cacheEnabled, $loadCalls, $unserializeCalls, $cachedValue)
     {
+        $attributeData = [
+            [
+                'attribute_code' => 'attribute_code_1',
+                'attribute_id' => 1
+            ]
+        ];
         $attributeCollectionMock = $this->getMockBuilder(
-            \Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection::class
+            Collection::class
         )->disableOriginalConstructor()
             ->setMethods(['getData', 'setEntityTypeFilter'])
             ->getMock();
@@ -96,29 +116,40 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             ->expects($this->any())
             ->method('getData')
             ->willReturn([]);
-        $entityAttributeMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute::class)
+        $entityAttributeMock = $this->getMockBuilder(Attribute::class)
             ->setMethods(['setData'])
             ->disableOriginalConstructor()
             ->getMock();
         $factoryCalls = [
-            [\Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection::class, [], $attributeCollectionMock],
-            [\Magento\Eav\Model\Entity\Attribute::class, [], $entityAttributeMock],
+            [
+                Collection::class,
+                [],
+                $attributeCollectionMock
+            ],
+            [
+                Attribute::class,
+                [],
+                $entityAttributeMock
+            ],
         ];
 
-        $this->stateMock
+        $this->cacheStateMock
             ->expects($this->atLeastOnce())
             ->method('isEnabled')
-            ->with(\Magento\Eav\Model\Cache\Type::TYPE_IDENTIFIER)
+            ->with(Cache::TYPE_IDENTIFIER)
             ->willReturn($cacheEnabled);
         $this->cacheMock
             ->expects($this->exactly($loadCalls))
             ->method('load')
             ->with(Config::ATTRIBUTES_CACHE_ID)
             ->willReturn($cachedValue);
+        $this->serializerMock
+            ->expects($this->exactly($unserializeCalls))
+            ->method('unserialize')
+            ->with($cachedValue)
+            ->willReturn($attributeData);
 
-        $collectionStub = new DataObject([
-            ['entity_type_code' => 'type_code_1', 'entity_type_id' => 1],
-        ]);
+        $collectionStub = new DataObject([$attributeData]);
         $this->collectionFactoryMock
             ->expects($this->any())
             ->method('create')
@@ -134,7 +165,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             ->method('create')
             ->will($this->returnValueMap($factoryCalls));
 
-        $entityType = $this->getMockBuilder(\Magento\Eav\Model\Entity\Type::class)
+        $entityType = $this->getMockBuilder(Type::class)
             ->setMethods(['getEntity', 'setData', 'getData'])
             ->disableOriginalConstructor()
             ->getMock();
@@ -151,38 +182,145 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             'cache-disabled' => [
                 false,
                 0,
+                0,
                 false,
             ],
             'cache-miss' => [
                 true,
                 1,
+                0,
                 false,
             ],
             'cached' => [
                 true,
                 1,
-                serialize(
-                    [
-                        ['attribute_code' => 'attribute_code_1', 'attribute_id' => 1],
-                    ]
-                ),
+                1,
+                'attribute serialzied data',
             ],
         ];
     }
 
     public function testClear()
     {
-        $this->cacheMock
-            ->expects($this->once())
+        $this->cacheMock->expects($this->once())
             ->method('clean')
             ->with(
                 $this->equalTo(
                     [
-                        \Magento\Eav\Model\Cache\Type::CACHE_TAG,
-                        \Magento\Eav\Model\Entity\Attribute::CACHE_TAG,
+                        Cache::CACHE_TAG,
+                        Attribute::CACHE_TAG,
                     ]
                 )
             );
         $this->config->clear();
     }
+
+    public function testGetEntityTypeInstanceOfTypePassed()
+    {
+        $this->assertEquals(
+            $this->typeMock,
+            $this->config->getEntityType($this->typeMock)
+        );
+    }
+
+    public function testGetEntityTypeCacheExists()
+    {
+        $entityTypeCode = 'catalog_product';
+        $data = [
+            $entityTypeCode => [
+                'entity_type_id' => 1
+            ]
+        ];
+        $serializedData = 'serialized data';
+        $this->cacheStateMock->expects($this->once())
+            ->method('isEnabled')
+            ->with(Cache::TYPE_IDENTIFIER)
+            ->willReturn(true);
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->with(Config::ENTITIES_CACHE_ID)
+            ->willReturn($serializedData);
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedData)
+            ->willReturn($data);
+        $this->typeMock->expects($this->exactly(2))
+            ->method('getId')
+            ->willReturn($data[$entityTypeCode]['entity_type_id']);
+        $this->typeMock->expects($this->once())
+            ->method('getEntityTypeCode')
+            ->willReturn($entityTypeCode);
+        $this->typeFactoryMock->expects($this->once())
+            ->method('create')
+            ->with(['data' => $data[$entityTypeCode]])
+            ->willReturn($this->typeMock);
+        $this->assertInstanceOf(
+            Type::class,
+            $this->config->getEntityType($entityTypeCode)
+        );
+    }
+
+    public function testGetEntityTypeCacheDoesNotExist()
+    {
+        $entityTypeCode = 'catalog_product';
+        $collectionData = [
+            [
+                'entity_type_id' => 1,
+                'entity_type_code' => $entityTypeCode
+            ]
+        ];
+        $data = [
+            $entityTypeCode => [
+                'entity_type_id' => 1,
+                'entity_type_code' => $entityTypeCode,
+                'attribute_model' => Attribute::class
+            ]
+        ];
+        $serializedData = 'serialized data';
+        $this->cacheStateMock->expects($this->once())
+            ->method('isEnabled')
+            ->with(Cache::TYPE_IDENTIFIER)
+            ->willReturn(true);
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->with(Config::ENTITIES_CACHE_ID)
+            ->willReturn(false);
+        $this->serializerMock->expects($this->never())
+            ->method('unserialize');
+        $attributeCollectionMock = $this->getMock(Collection::class, [], [], '', false);
+        $this->collectionFactoryMock->expects($this->once())
+            ->method('create')
+            ->willReturn($attributeCollectionMock);
+        $attributeCollectionMock->expects($this->once())
+            ->method('getData')
+            ->willReturn($collectionData);
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($data)
+            ->willReturn($serializedData);
+        $this->cacheMock->expects($this->once())
+            ->method('save')
+            ->with(
+                $serializedData,
+                Config::ENTITIES_CACHE_ID,
+                [
+                    Cache::CACHE_TAG,
+                    Attribute::CACHE_TAG
+                ]
+            );
+        $this->typeMock->expects($this->exactly(2))
+            ->method('getId')
+            ->willReturn($data[$entityTypeCode]['entity_type_id']);
+        $this->typeMock->expects($this->once())
+            ->method('getEntityTypeCode')
+            ->willReturn($entityTypeCode);
+        $this->typeFactoryMock->expects($this->once())
+            ->method('create')
+            ->with(['data' => $data[$entityTypeCode]])
+            ->willReturn($this->typeMock);
+        $this->assertInstanceOf(
+            Type::class,
+            $this->config->getEntityType($entityTypeCode)
+        );
+    }
 }
diff --git a/app/code/Magento/Eav/Test/Unit/Model/ResourceModel/Entity/Attribute/SetTest.php b/app/code/Magento/Eav/Test/Unit/Model/ResourceModel/Entity/Attribute/SetTest.php
index a380b14595eb24afb563dfccb94f867de55e5eff..e00a8ee97648c0768c7dac4c10359e1378856674 100644
--- a/app/code/Magento/Eav/Test/Unit/Model/ResourceModel/Entity/Attribute/SetTest.php
+++ b/app/code/Magento/Eav/Test/Unit/Model/ResourceModel/Entity/Attribute/SetTest.php
@@ -1,14 +1,14 @@
 <?php
 /** 
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Eav\Test\Unit\Model\ResourceModel\Entity\Attribute;
 
 use Magento\Eav\Model\ResourceModel\Entity\Attribute\Set;
- 
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Framework\Serialize\SerializerInterface;
+
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
@@ -49,11 +49,17 @@ class SetTest extends \PHPUnit_Framework_TestCase
      */
     protected $relationProcessor;
 
+    /**
+     * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
+
     /**
      * {@inheritdoc}
      */
     protected function setUp()
     {
+        $objectManager = new ObjectManager($this);
         $this->resourceMock = $this->getMockBuilder(\Magento\Framework\App\ResourceConnection::class)
             ->disableOriginalConstructor()
             ->setMethods(['getConnection', 'getTableName'])
@@ -81,31 +87,28 @@ class SetTest extends \PHPUnit_Framework_TestCase
             ->setMethods(['isCacheEnabled', 'getEntityType', 'getCache'])
             ->disableOriginalConstructor()
             ->getMock();
-        $this->model = $this->getMock(
+
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
+
+        $attributeGroupFactoryMock = $this->getMock(
+            \Magento\Eav\Model\ResourceModel\Entity\Attribute\GroupFactory::class,
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->model = $objectManager->getObject(
             \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set::class,
             [
-                'beginTransaction',
-                'getMainTable',
-                'getIdFieldName',
-                '_afterDelete',
-                'commit',
-                'rollBack',
-                '__wakeup'
-            ],
-            [
-                $contextMock,
-                $this->getMock(
-                    \Magento\Eav\Model\ResourceModel\Entity\Attribute\GroupFactory::class,
-                    [],
-                    [],
-                    '',
-                    false
-                ),
-                $this->eavConfigMock
-            ],
-            '',
-            true
+                'context' => $contextMock,
+                'attrGroupFactory' => $attributeGroupFactoryMock,
+                'eavConfig' => $this->eavConfigMock
+            ]
         );
+
+        $objectManager->setBackwardCompatibleProperty($this->model, 'serializer', $this->serializerMock);
+
         $this->typeMock = $this->getMock(\Magento\Eav\Model\Entity\Type::class, [], [], '', false);
         $this->objectMock = $this->getMock(
             \Magento\Framework\Model\AbstractModel::class,
@@ -123,7 +126,6 @@ class SetTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-
     }
 
     /**
@@ -182,6 +184,22 @@ class SetTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetSetInfoCacheMiss()
     {
+        $serializedData = 'serialized data';
+        $setElement = [
+            10000 => [
+                'group_id' => 10,
+                'group_sort' => 100,
+                'sort' => 1000
+            ]
+        ];
+        $setData = [
+            1 => $setElement,
+            2 => [],
+            3 => []
+        ];
+        $cached = [
+            1 => $setElement
+        ];
         $cacheMock = $this->getMockBuilder(\Magento\Framework\App\CacheInterface::class)
             ->disableOriginalConstructor()
             ->setMethods(['load', 'save', 'getFrontend', 'remove', 'clean'])
@@ -192,21 +210,15 @@ class SetTest extends \PHPUnit_Framework_TestCase
             ->method('load')
             ->with($cacheKey)
             ->willReturn(false);
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($cached)
+            ->willReturn($serializedData);
         $cacheMock
             ->expects($this->once())
             ->method('save')
             ->with(
-                serialize(
-                    [
-                        1 => [
-                            10000 => [
-                                'group_id' =>  10,
-                                'group_sort' =>  100,
-                                'sort' =>  1000
-                            ]
-                        ]
-                    ]
-                ),
+                $serializedData,
                 $cacheKey,
                 [\Magento\Eav\Model\Cache\Type::CACHE_TAG, \Magento\Eav\Model\Entity\Attribute::CACHE_TAG]
             );
@@ -242,17 +254,7 @@ class SetTest extends \PHPUnit_Framework_TestCase
         $this->resourceMock->expects($this->any())->method('getConnection')->willReturn($connectionMock);
         $this->resourceMock->expects($this->any())->method('getTableName')->willReturn('_TABLE_');
         $this->assertEquals(
-            [
-                1 => [
-                    10000 => [
-                        'group_id' =>  10,
-                        'group_sort' =>  100,
-                        'sort' =>  1000
-                    ]
-                ],
-                2 => [],
-                3 => []
-            ],
+            $setData,
             $this->model->getSetInfo([1, 2, 3], 1)
         );
     }
@@ -262,42 +264,41 @@ class SetTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetSetInfoCacheHit()
     {
-        $cached = [
-            1 => [
-                10000 => [
-                    'group_id' => 10,
-                    'group_sort' => 100,
-                    'sort' => 1000
-                ]
+        $setElement = [
+            10000 => [
+                'group_id' => 10,
+                'group_sort' => 100,
+                'sort' => 1000
             ]
         ];
-
+        $setData = [
+            1 => $setElement,
+            2 => [],
+            3 => []
+        ];
+        $cached = [
+            1 => $setElement
+        ];
+        $serializedData = 'serialized data';
         $this->resourceMock->expects($this->never())->method('getConnection');
         $this->eavConfigMock->expects($this->any())->method('isCacheEnabled')->willReturn(true);
         $cacheMock = $this->getMockBuilder(\Magento\Framework\App\CacheInterface::class)
             ->disableOriginalConstructor()
             ->setMethods(['load', 'save', 'getFrontend', 'remove', 'clean'])
             ->getMock();
-        $cacheMock
-            ->expects($this->once())
+        $cacheMock->expects($this->once())
             ->method('load')
             ->with(Set::ATTRIBUTES_CACHE_ID . 1)
-            ->willReturn(serialize($cached));
+            ->willReturn($serializedData);
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedData)
+            ->willReturn($cached);
 
         $this->eavConfigMock->expects($this->any())->method('getCache')->willReturn($cacheMock);
 
         $this->assertEquals(
-            [
-                1 => [
-                    10000 => [
-                        'group_id' =>  10,
-                        'group_sort' =>  100,
-                        'sort' =>  1000
-                    ]
-                ],
-                2 => [],
-                3 => []
-            ],
+            $setData,
             $this->model->getSetInfo([1, 2, 3], 1)
         );
     }
diff --git a/app/code/Magento/Eav/Test/Unit/Plugin/Model/ResourceModel/Entity/AttributeTest.php b/app/code/Magento/Eav/Test/Unit/Plugin/Model/ResourceModel/Entity/AttributeTest.php
index 7d4561259cf88f1fdaf4a5bb53ac2d2eac7408f7..67ea1912ccf8e07ac8410f7ede977b8da52dc330 100644
--- a/app/code/Magento/Eav/Test/Unit/Plugin/Model/ResourceModel/Entity/AttributeTest.php
+++ b/app/code/Magento/Eav/Test/Unit/Plugin/Model/ResourceModel/Entity/AttributeTest.php
@@ -3,111 +3,166 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
-// @codingStandardsIgnoreFile
-
 namespace Magento\Eav\Test\Unit\Plugin\Model\ResourceModel\Entity;
 
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\App\CacheInterface;
+use Magento\Framework\App\Cache\StateInterface;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute as AttributeResource;
+use Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute as AttributeResourcePlugin;
+use Magento\Eav\Model\Cache\Type;
+use Magento\Eav\Model\Entity\Attribute;
 
 class AttributeTest extends \PHPUnit_Framework_TestCase
 {
-    /** @var \Magento\Framework\App\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */
-    protected $cache;
+    /**
+     * @var CacheInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $cacheMock;
 
-    /** @var \Magento\Framework\App\Cache\StateInterface|\PHPUnit_Framework_MockObject_MockObject */
-    protected $cacheState;
+    /**
+     * @var StateInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $cacheStateMock;
+
+    /**
+     * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
+
+    /**
+     * @var AttributeResource|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $attributeResourceMock;
 
-    /** @var \Magento\Eav\Model\ResourceModel\Entity\Attribute|\PHPUnit_Framework_MockObject_MockObject */
-    protected $subject;
+    /**
+     * @var AttributeResourcePlugin
+     */
+    private $attributeResourcePlugin;
 
     protected function setUp()
     {
-        $this->cache = $this->getMock(\Magento\Framework\App\CacheInterface::class);
-        $this->cacheState = $this->getMock(\Magento\Framework\App\Cache\StateInterface::class);
-        $this->subject = $this->getMock(\Magento\Eav\Model\ResourceModel\Entity\Attribute::class, [], [], '', false);
+        $objectManager = new ObjectManager($this);
+        $this->cacheMock = $this->getMock(CacheInterface::class);
+        $this->cacheStateMock = $this->getMock(StateInterface::class);
+        $this->attributeResourceMock = $this->getMock(AttributeResource::class, [], [], '', false);
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
+        $this->attributeResourcePlugin = $objectManager->getObject(
+            AttributeResourcePlugin::class,
+            [
+                'cache' => $this->cacheMock,
+                'cacheState' => $this->cacheStateMock,
+                'serializer' => $this->serializerMock
+            ]
+        );
     }
 
-    public function testGetStoreLabelsByAttributeIdOnCacheDisabled()
+    public function testAroundGetStoreLabelsByAttributeIdCacheIsDisabled()
     {
-        $this->cache->expects($this->never())->method('load');
+        $attributeId = 1;
+        $this->cacheMock->expects($this->never())
+            ->method('load');
+        $this->cacheStateMock->expects($this->exactly(2))
+            ->method('isEnabled')
+            ->with(Type::TYPE_IDENTIFIER)
+            ->willReturn(false);
 
-        $this->assertEquals(
-            'attributeId',
-            $this->getAttribute(false)->aroundGetStoreLabelsByAttributeId(
-                $this->subject,
-                $this->mockPluginProceed('attributeId'),
-               'attributeId'
-            )
+        $isProceedCalled = false;
+        // @SuppressWarnings(PHPMD.UnusedFormalParameter)
+        $proceed = function($attributeId) use (&$isProceedCalled) {
+            $isProceedCalled = true;
+        };
+
+        $this->attributeResourcePlugin->aroundGetStoreLabelsByAttributeId(
+            $this->attributeResourceMock,
+            $proceed,
+            $attributeId
         );
+        $this->assertTrue($isProceedCalled);
     }
 
-    public function testGetStoreLabelsByAttributeIdFromCache()
+    public function testAroundGetStoreLabelsByAttributeIdCacheExists()
     {
         $attributeId = 1;
-        $attributes = ['k' => 'v'];
-        $cacheId = \Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute::STORE_LABEL_ATTRIBUTE . $attributeId;
-        $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(serialize($attributes));
+        $attributes = ['foo' => 'bar'];
+        $serializedAttributes = 'serialized attributes';
+        $cacheId = AttributeResourcePlugin::STORE_LABEL_ATTRIBUTE . $attributeId;
+        $this->cacheStateMock->expects($this->once())
+            ->method('isEnabled')
+            ->with(Type::TYPE_IDENTIFIER)
+            ->willReturn(true);
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->with($cacheId)
+            ->willReturn($serializedAttributes);
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedAttributes)
+            ->willReturn($attributes);
+
+        $isProceedCalled = false;
+        // @SuppressWarnings(PHPMD.UnusedFormalParameter)
+        $proceed = function($attributeId) use (&$isProceedCalled) {
+            $isProceedCalled = true;
+        };
 
         $this->assertEquals(
             $attributes,
-            $this->getAttribute(true)->aroundGetStoreLabelsByAttributeId(
-                $this->subject,
-                $this->mockPluginProceed(),
+            $this->attributeResourcePlugin->aroundGetStoreLabelsByAttributeId(
+                $this->attributeResourceMock,
+                $proceed,
                 $attributeId
             )
         );
+        $this->assertFalse($isProceedCalled);
     }
 
-    public function testGetStoreLabelsByAttributeIdWithCacheSave()
+    public function testAroundGetStoreLabelsByAttributeIdCacheDoesNotExist()
     {
         $attributeId = 1;
-        $cacheId = \Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute::STORE_LABEL_ATTRIBUTE . $attributeId;
-        $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(false);
-        $this->cache->expects($this->any())->method('save')->with(
-            serialize([$attributeId]),
-            $cacheId,
-            [
-                \Magento\Eav\Model\Cache\Type::CACHE_TAG,
-                \Magento\Eav\Model\Entity\Attribute::CACHE_TAG
-            ]
-        );
+        $attributes = ['foo' => 'bar'];
+        $serializedAttributes = 'serialized attributes';
+        $cacheId = AttributeResourcePlugin::STORE_LABEL_ATTRIBUTE . $attributeId;
+        $this->cacheStateMock->expects($this->exactly(2))
+            ->method('isEnabled')
+            ->with(Type::TYPE_IDENTIFIER)
+            ->willReturn(true);
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->with($cacheId)
+            ->willReturn(false);
+        $this->serializerMock->expects($this->never())
+            ->method('unserialize')
+            ->with($serializedAttributes)
+            ->willReturn($attributes);
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($attributes)
+            ->willReturn($serializedAttributes);
+        $this->cacheMock->expects($this->once())
+            ->method('save')
+            ->with(
+                $serializedAttributes,
+                $cacheId,
+                [
+                    Type::CACHE_TAG,
+                    Attribute::CACHE_TAG
+                ]
+            );
+
+        // @SuppressWarnings(PHPMD.UnusedFormalParameter)
+        $proceed = function($attributeId) use ($attributes) {
+            return $attributes;
+        };
 
         $this->assertEquals(
-            [$attributeId],
-            $this->getAttribute(true)->aroundGetStoreLabelsByAttributeId(
-                $this->subject,
-                $this->mockPluginProceed([$attributeId]),
+            $attributes,
+            $this->attributeResourcePlugin->aroundGetStoreLabelsByAttributeId(
+                $this->attributeResourceMock,
+                $proceed,
                 $attributeId
             )
         );
     }
-
-    /**
-     * @param bool $cacheEnabledFlag
-     * @return \Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute
-     */
-    protected function getAttribute($cacheEnabledFlag)
-    {
-        $this->cacheState->expects($this->any())->method('isEnabled')
-            ->with(\Magento\Eav\Model\Cache\Type::TYPE_IDENTIFIER)->willReturn($cacheEnabledFlag);
-        return (new ObjectManager($this))->getObject(
-            \Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute::class,
-            [
-                'cache' => $this->cache,
-                'cacheState' => $this->cacheState
-            ]
-        );
-    }
-
-    /**
-     * @param mixed $returnValue
-     * @return callable
-     */
-    protected function mockPluginProceed($returnValue = null)
-    {
-        return function () use ($returnValue) {
-            return $returnValue;
-        };
-    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Eav/Model/ConfigTest.php b/dev/tests/integration/testsuite/Magento/Eav/Model/ConfigTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..97b3cb473177149eb1d4abf391c26b76464a39eb
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Eav/Model/ConfigTest.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Eav\Model;
+
+use Magento\Eav\Model\Config;
+use Magento\TestFramework\ObjectManager;
+use Magento\TestFramework\Helper\Bootstrap;
+
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    private $config;
+    
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+    
+    protected function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+        $this->config = $this->objectManager->get(Config::class);
+    }
+
+    public function testGetEntityAttributeCodes()
+    {
+        $entityType = 'catalog_product';
+        $this->cleanAllCache();
+        $this->assertEquals(
+            $this->config->getEntityAttributeCodes($entityType),
+            $this->config->getEntityAttributeCodes($entityType)
+        );
+    }
+
+    private function cleanAllCache()
+    {
+        /** @var \Magento\Framework\App\Cache\Frontend\Pool $cachePool */
+        $cachePool = $this->objectManager->get(\Magento\Framework\App\Cache\Frontend\Pool::class);
+        /** @var \Magento\Framework\Cache\FrontendInterface $cacheType */
+        foreach ($cachePool as $cacheType) {
+            $cacheType->getBackend()->clean();
+        }
+    }
+}