diff --git a/app/code/Magento/Authorizenet/Model/Authorizenet.php b/app/code/Magento/Authorizenet/Model/Authorizenet.php
index 9ab3317a43bb97d950ab32196ce1f9596ba8f7e4..4408c68436707cbfae7332f32cf7d3c902b531f0 100644
--- a/app/code/Magento/Authorizenet/Model/Authorizenet.php
+++ b/app/code/Magento/Authorizenet/Model/Authorizenet.php
@@ -332,7 +332,7 @@ abstract class Authorizenet extends \Magento\Payment\Model\Method\Cc
                     ->setXCity($billing->getCity())
                     ->setXState($billing->getRegion())
                     ->setXZip($billing->getPostcode())
-                    ->setXCountry($billing->getCountry())
+                    ->setXCountry($billing->getCountryId())
                     ->setXPhone($billing->getTelephone())
                     ->setXFax($billing->getFax())
                     ->setXCustId($order->getCustomerId())
@@ -352,7 +352,7 @@ abstract class Authorizenet extends \Magento\Payment\Model\Method\Cc
                     ->setXShipToCity($shipping->getCity())
                     ->setXShipToState($shipping->getRegion())
                     ->setXShipToZip($shipping->getPostcode())
-                    ->setXShipToCountry($shipping->getCountry());
+                    ->setXShipToCountry($shipping->getCountryId());
             }
 
             $request->setXPoNum($payment->getPoNumber())
diff --git a/app/code/Magento/Authorizenet/Model/Directpost/Request.php b/app/code/Magento/Authorizenet/Model/Directpost/Request.php
index 8be7ed5da15ac1dd627ce691ef1cd6eaf9455824..4d5da3e76dc1c3eb4ff204e9ec388f9cece87865 100644
--- a/app/code/Magento/Authorizenet/Model/Directpost/Request.php
+++ b/app/code/Magento/Authorizenet/Model/Directpost/Request.php
@@ -123,7 +123,7 @@ class Request extends AuthorizenetRequest
                 ->setXCity(strval($billing->getCity()))
                 ->setXState(strval($billing->getRegion()))
                 ->setXZip(strval($billing->getPostcode()))
-                ->setXCountry(strval($billing->getCountry()))
+                ->setXCountry(strval($billing->getCountryId()))
                 ->setXPhone(strval($billing->getTelephone()))
                 ->setXFax(strval($billing->getFax()))
                 ->setXCustId(strval($billing->getCustomerId()))
@@ -151,7 +151,7 @@ class Request extends AuthorizenetRequest
             )->setXShipToZip(
                 strval($shipping->getPostcode())
             )->setXShipToCountry(
-                strval($shipping->getCountry())
+                strval($shipping->getCountryId())
             );
         }
 
diff --git a/app/code/Magento/Backend/App/Config.php b/app/code/Magento/Backend/App/Config.php
index 0edfd070faa5689b23b2577eda73e8b3dec860f5..f0bae2a9d3c6fc64d0f6a3b26ce60043c05b06da 100644
--- a/app/code/Magento/Backend/App/Config.php
+++ b/app/code/Magento/Backend/App/Config.php
@@ -10,57 +10,66 @@
 
 namespace Magento\Backend\App;
 
+use Magento\Config\App\Config\Type\System;
 use Magento\Framework\App\Config\ScopeConfigInterface;
 
 /**
- * Backend config accessor
+ * Backend config accessor.
  */
 class Config implements ConfigInterface
 {
     /**
-     * @var \Magento\Framework\App\Config\ScopePool
+     * @var \Magento\Framework\App\Config
      */
-    protected $_scopePool;
+    protected $appConfig;
 
     /**
-     * @param \Magento\Framework\App\Config\ScopePool $scopePool
+     * @var array
      */
-    public function __construct(\Magento\Framework\App\Config\ScopePool $scopePool)
+    private $data;
+
+    /**
+     * @param \Magento\Framework\App\Config $appConfig
+     * @return void
+     */
+    public function __construct(\Magento\Framework\App\Config $appConfig)
     {
-        $this->_scopePool = $scopePool;
+        $this->appConfig = $appConfig;
     }
 
     /**
-     * Retrieve config value by path and scope
-     *
-     * @param string $path
-     * @return mixed
+     * @inheritdoc
      */
     public function getValue($path)
     {
-        return $this->_scopePool->getScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT, null)->getValue($path);
+        if (isset($this->data[$path])) {
+            return $this->data[$path];
+        }
+
+        $configPath = ScopeConfigInterface::SCOPE_TYPE_DEFAULT;
+        if ($path) {
+            $configPath .= '/' . $path;
+        }
+        return $this->appConfig->get(System::CONFIG_TYPE, $configPath);
     }
 
     /**
-     * Set config value in the corresponding config scope
-     *
-     * @param string $path
-     * @param mixed $value
-     * @return void
+     * @inheritdoc
      */
     public function setValue($path, $value)
     {
-        $this->_scopePool->getScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT, null)->setValue($path, $value);
+        $this->data[$path] = $value;
     }
 
     /**
-     * Retrieve config flag
-     *
-     * @param string $path
-     * @return bool
+     * @inheritdoc
      */
     public function isSetFlag($path)
     {
-        return !!$this->_scopePool->getScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT, null)->getValue($path);
+        $configPath = ScopeConfigInterface::SCOPE_TYPE_DEFAULT;
+        if ($path) {
+            $configPath .= '/' . $path;
+        }
+        return (bool) $this->appConfig->get(System::CONFIG_TYPE, $configPath);
     }
 }
diff --git a/app/code/Magento/Backend/App/ConfigInterface.php b/app/code/Magento/Backend/App/ConfigInterface.php
index 4000b54cc983406a7e0707fe29a633f03d659e5a..5e73225a6aa694fff6f4afcb9ee6804b7faf9931 100644
--- a/app/code/Magento/Backend/App/ConfigInterface.php
+++ b/app/code/Magento/Backend/App/ConfigInterface.php
@@ -15,6 +15,8 @@ interface ConfigInterface
     /**
      * Retrieve config value by path
      *
+     * Path should looks like keys imploded by "/". For example scopes/stores/admin
+     *
      * @param string $path
      * @return mixed
      * @api
@@ -24,6 +26,7 @@ interface ConfigInterface
     /**
      * Set config value
      *
+     * @deprecated
      * @param string $path
      * @param mixed $value
      * @return void
@@ -34,6 +37,8 @@ interface ConfigInterface
     /**
      * Retrieve config flag
      *
+     * Path should looks like keys imploded by "/". For example scopes/stores/admin
+     *
      * @param string $path
      * @return bool
      * @api
diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Text.php b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Text.php
index 1427cec7604e88935f53d6c108d77bb58357bdfa..11aa6bf86257cad79ea7698e6c9fdf893ba7082b 100644
--- a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Text.php
+++ b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Text.php
@@ -3,14 +3,13 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+namespace Magento\Backend\Block\Widget\Grid\Column\Renderer;
+
+use Magento\Framework\DataObject;
 
 /**
  * Backend grid item renderer
- *
- * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Backend\Block\Widget\Grid\Column\Renderer;
-
 class Text extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
 {
     /**
@@ -21,30 +20,53 @@ class Text extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRe
     protected $_variablePattern = '/\\$([a-z0-9_]+)/i';
 
     /**
-     * Renders grid column
+     * Get value for the cel
      *
-     * @param \Magento\Framework\DataObject $row
-     * @return mixed
+     * @param DataObject $row
+     * @return string
      */
-    public function _getValue(\Magento\Framework\DataObject $row)
+    public function _getValue(DataObject $row)
     {
-        $format = $this->getColumn()->getFormat() ? $this->getColumn()->getFormat() : null;
-        $defaultValue = $this->getColumn()->getDefault();
-        if ($format === null) {
-            // If no format and it column not filtered specified return data as is.
-            $data = parent::_getValue($row);
-            $string = $data === null ? $defaultValue : $data;
-            return $this->escapeHtml($string);
-        } elseif (preg_match_all($this->_variablePattern, $format, $matches)) {
-            // Parsing of format string
-            $formattedString = $format;
-            foreach ($matches[0] as $matchIndex => $match) {
-                $value = $row->getData($matches[1][$matchIndex]);
-                $formattedString = str_replace($match, $value, $formattedString);
+        if (null === $this->getColumn()->getFormat()) {
+            return $this->getSimpleValue($row);
+        }
+        return $this->getFormattedValue($row);
+    }
+
+    /**
+     * Get simple value
+     *
+     * @param DataObject $row
+     * @return string
+     */
+    private function getSimpleValue(DataObject $row)
+    {
+        $data = parent::_getValue($row);
+        $value = null === $data ? $this->getColumn()->getDefault() : $data;
+        if (true === $this->getColumn()->getTranslate()) {
+            $value = __($value);
+        }
+        return $this->escapeHtml($value);
+    }
+
+    /**
+     * Replace placeholders in the string with values
+     *
+     * @param DataObject $row
+     * @return string
+     */
+    private function getFormattedValue(DataObject $row)
+    {
+        $value = $this->getColumn()->getFormat() ?: null;
+        if (true === $this->getColumn()->getTranslate()) {
+            $value = __($value);
+        }
+        if (preg_match_all($this->_variablePattern, $value, $matches)) {
+            foreach ($matches[0] as $index => $match) {
+                $replacement = $row->getData($matches[1][$index]);
+                $value = str_replace($match, $replacement, $value);
             }
-            return $formattedString;
-        } else {
-            return $this->escapeHtml($format);
         }
+        return $this->escapeHtml($value);
     }
 }
diff --git a/app/code/Magento/Backend/Model/Session/Quote.php b/app/code/Magento/Backend/Model/Session/Quote.php
index 12a4d4d138f5323f420dc56f5ba466e6efda0a46..6ca269488294a7d5036eedd9bacae42266ae8ea0 100644
--- a/app/code/Magento/Backend/Model/Session/Quote.php
+++ b/app/code/Magento/Backend/Model/Session/Quote.php
@@ -7,8 +7,6 @@ namespace Magento\Backend\Model\Session;
 
 use Magento\Customer\Api\CustomerRepositoryInterface;
 use Magento\Customer\Api\GroupManagementInterface;
-use Magento\Framework\App\ObjectManager;
-use Magento\Quote\Api\CartManagementInterface;
 
 /**
  * Adminhtml quote session
@@ -81,11 +79,6 @@ class Quote extends \Magento\Framework\Session\SessionManager
      */
     protected $quoteFactory;
 
-    /**
-     * @var \Magento\Quote\Api\CartManagementInterface;
-     */
-    private $cartManagement;
-
     /**
      * @param \Magento\Framework\App\Request\Http $request
      * @param \Magento\Framework\Session\SidResolverInterface $sidResolver
diff --git a/app/code/Magento/Backend/Model/Url.php b/app/code/Magento/Backend/Model/Url.php
index c1aa03a457cac21032566c9b0540f7b5972ab563..f09c9c04ee6bb942eb774b60837dbbe598a1426b 100644
--- a/app/code/Magento/Backend/Model/Url.php
+++ b/app/code/Magento/Backend/Model/Url.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\Backend\Model;
 
+use Magento\Framework\Url\HostChecker;
+use Magento\Framework\App\ObjectManager;
 
 /**
  * Class \Magento\Backend\Model\UrlInterface
@@ -77,6 +79,8 @@ class Url extends \Magento\Framework\Url implements \Magento\Backend\Model\UrlIn
     protected $_scope;
 
     /**
+     * Constructor
+     *
      * @param \Magento\Framework\App\Route\ConfigInterface $routeConfig
      * @param \Magento\Framework\App\RequestInterface $request
      * @param \Magento\Framework\Url\SecurityInfoInterface $urlSecurityInfo
@@ -96,7 +100,7 @@ class Url extends \Magento\Framework\Url implements \Magento\Backend\Model\UrlIn
      * @param \Magento\Store\Model\StoreFactory $storeFactory
      * @param \Magento\Framework\Data\Form\FormKey $formKey
      * @param array $data
-     *
+     * @param HostChecker|null $hostChecker
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -118,9 +122,11 @@ class Url extends \Magento\Framework\Url implements \Magento\Backend\Model\UrlIn
         \Magento\Framework\Encryption\EncryptorInterface $encryptor,
         \Magento\Store\Model\StoreFactory $storeFactory,
         \Magento\Framework\Data\Form\FormKey $formKey,
-        array $data = []
+        array $data = [],
+        HostChecker $hostChecker = null
     ) {
         $this->_encryptor = $encryptor;
+        $hostChecker = $hostChecker ?: ObjectManager::getInstance()->get(HostChecker::class);
         parent::__construct(
             $routeConfig,
             $request,
@@ -133,7 +139,8 @@ class Url extends \Magento\Framework\Url implements \Magento\Backend\Model\UrlIn
             $scopeConfig,
             $routeParamsPreprocessor,
             $scopeType,
-            $data
+            $data,
+            $hostChecker
         );
         $this->_backendHelper = $backendHelper;
         $this->_menuConfig = $menuConfig;
diff --git a/app/code/Magento/Backend/Test/Unit/App/ConfigTest.php b/app/code/Magento/Backend/Test/Unit/App/ConfigTest.php
index b2ece9e3ce2e5296e6b62176193778f13b221b82..7bff61aede734af0911499f4d581b3addff1799c 100644
--- a/app/code/Magento/Backend/Test/Unit/App/ConfigTest.php
+++ b/app/code/Magento/Backend/Test/Unit/App/ConfigTest.php
@@ -7,12 +7,18 @@ namespace Magento\Backend\Test\Unit\App;
 
 use Magento\Backend\App\Config;
 
+/**
+ * Test reading by path and reading flag from config
+ *
+ * @see \Magento\Backend\App\Config
+ * @package Magento\Backend\Test\Unit\App
+ */
 class ConfigTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Framework\App\Config\ScopePool|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\Config|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $sectionPool;
+    protected $appConfig;
 
     /**
      * @var Config
@@ -21,102 +27,64 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->sectionPool = $this->getMock(
-            \Magento\Framework\App\Config\ScopePool::class,
-            ['getScope', 'clean'],
+        $this->appConfig = $this->getMock(
+            \Magento\Framework\App\Config::class,
+            ['get'],
             [],
             '',
             false
         );
-        $this->model = new \Magento\Backend\App\Config($this->sectionPool);
+        $this->model = new \Magento\Backend\App\Config($this->appConfig);
     }
 
     public function testGetValue()
     {
         $expectedValue = 'some value';
         $path = 'some path';
-        $configData = $this->getConfigDataMock('getValue');
-        $configData->expects(
-            $this->once()
-        )->method(
-            'getValue'
-        )->with(
-            $this->equalTo($path)
-        )->will(
-            $this->returnValue($expectedValue)
-        );
-        $this->sectionPool->expects(
+        $this->appConfig->expects(
             $this->once()
         )->method(
-            'getScope'
+            'get'
         )->with(
-            $this->equalTo('default'),
+            $this->equalTo('system'),
+            $this->equalTo('default/' . $path),
             $this->isNull()
         )->will(
-            $this->returnValue($configData)
+            $this->returnValue($expectedValue)
         );
         $this->assertEquals($expectedValue, $this->model->getValue($path));
     }
 
-    public function testSetValue()
-    {
-        $value = 'some value';
-        $path = 'some path';
-        $configData = $this->getConfigDataMock('setValue');
-        $configData->expects($this->once())->method('setValue')->with($this->equalTo($path), $this->equalTo($value));
-        $this->sectionPool->expects(
-            $this->once()
-        )->method(
-            'getScope'
-        )->with(
-            $this->equalTo('default'),
-            $this->isNull()
-        )->will(
-            $this->returnValue($configData)
-        );
-        $this->model->setValue($path, $value);
-    }
-
     /**
+     * @param string $configPath
      * @param mixed $configValue
      * @param bool $expectedResult
      * @dataProvider isSetFlagDataProvider
      */
-    public function testIsSetFlag($configValue, $expectedResult)
+    public function testIsSetFlag($configPath, $configValue, $expectedResult)
     {
-        $path = 'some path';
-        $configData = $this->getConfigDataMock('getValue');
-        $configData->expects(
-            $this->once()
+        $this->appConfig->expects(
+            $this->any()
         )->method(
-            'getValue'
+            'get'
         )->with(
-            $this->equalTo($path)
+            $this->equalTo('system'),
+            $this->equalTo('default/' . $configPath)
         )->will(
             $this->returnValue($configValue)
         );
-        $this->sectionPool->expects(
-            $this->once()
-        )->method(
-            'getScope'
-        )->with(
-            $this->equalTo('default'),
-            $this->isNull()
-        )->will(
-            $this->returnValue($configData)
-        );
-        $this->assertEquals($expectedResult, $this->model->isSetFlag($path));
+        $this->assertEquals($expectedResult, $this->model->isSetFlag($configPath));
     }
 
     public function isSetFlagDataProvider()
     {
         return [
-            [0, false],
-            [true, true],
-            ['0', false],
-            ['', false],
-            ['some string', true],
-            [1, true]
+            ['a', 0, false],
+            ['b', true, true],
+            ['c', '0', false],
+            ['d', '', false],
+            ['e', 'some string', true],
+            ['f', 1, true]
         ];
     }
 
diff --git a/app/code/Magento/Backend/Test/Unit/Model/Session/QuoteTest.php b/app/code/Magento/Backend/Test/Unit/Model/Session/QuoteTest.php
index 5db3c2e41c04adf9bf5f2105df266167c5a77364..99d7fdfab21dedc37a5bc1b144b36f2acb073fbb 100644
--- a/app/code/Magento/Backend/Test/Unit/Model/Session/QuoteTest.php
+++ b/app/code/Magento/Backend/Test/Unit/Model/Session/QuoteTest.php
@@ -12,6 +12,11 @@ namespace Magento\Backend\Test\Unit\Model\Session;
  */
 class QuoteTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
@@ -92,11 +97,6 @@ class QuoteTest extends \PHPUnit_Framework_TestCase
      */
     protected $quoteFactoryMock;
 
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $cartManagementMock;
-
     /**
      * Set up
      *
@@ -105,6 +105,7 @@ class QuoteTest extends \PHPUnit_Framework_TestCase
      */
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->customerRepositoryMock = $this->getMockForAbstractClass(
             \Magento\Customer\Api\CustomerRepositoryInterface::class,
             [],
@@ -197,13 +198,6 @@ class QuoteTest extends \PHPUnit_Framework_TestCase
         );
 
         $this->quoteFactoryMock = $this->getMock(\Magento\Quote\Model\QuoteFactory::class, ['create'], [], '', false);
-        $this->cartManagementMock = $this->getMock(
-            \Magento\Quote\Api\CartManagementInterface::class,
-            [],
-            [],
-            '',
-            false
-        );
 
         $this->quote = $this->getMock(
             \Magento\Backend\Model\Session\Quote::class,
@@ -226,10 +220,6 @@ class QuoteTest extends \PHPUnit_Framework_TestCase
                 'quoteFactory' => $this->quoteFactoryMock
             ]
         );
-
-        $this->prepareObjectManager([
-            [\Magento\Quote\Api\CartManagementInterface::class, $this->cartManagementMock]
-        ]);
     }
 
     /**
@@ -416,19 +406,4 @@ class QuoteTest extends \PHPUnit_Framework_TestCase
             'customer ids same' => [66, 66, 'never'],
         ];
     }
-
-    /**
-     * @param array $map
-     * @deprecated
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())->method('get')->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/Backend/Test/Unit/Model/UrlTest.php b/app/code/Magento/Backend/Test/Unit/Model/UrlTest.php
index 2bc3d86e74d697cd64be58742ab2a5e3204e8b01..4eda145156c6dbf881eadf3d88981ffb9318d32c 100644
--- a/app/code/Magento/Backend/Test/Unit/Model/UrlTest.php
+++ b/app/code/Magento/Backend/Test/Unit/Model/UrlTest.php
@@ -3,16 +3,13 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
-// @codingStandardsIgnoreFile
-
-/**
- * Test class for \Magento\Backend\Model\Url
- */
 namespace Magento\Backend\Test\Unit\Model;
 
+use Magento\Framework\Url\HostChecker;
+
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * @codingStandardsIgnoreFile
  */
 class UrlTest extends \PHPUnit_Framework_TestCase
 {
@@ -21,10 +18,12 @@ class UrlTest extends \PHPUnit_Framework_TestCase
      */
     protected $_model;
 
+    /**
+     * @var string
+     */
     protected $_areaFrontName = 'backendArea';
 
     /**
-     * Mock menu model
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
     protected $_menuMock;
@@ -62,7 +61,7 @@ class UrlTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_paramsResolverMock;
+    protected $routeParamsResolverFactoryMock;
 
     /**
      * @var \Magento\Framework\Encryption\EncryptorInterface
@@ -75,6 +74,7 @@ class UrlTest extends \PHPUnit_Framework_TestCase
      */
     protected function setUp()
     {
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->_menuMock = $this->getMock(
             \Magento\Backend\Model\Menu::class,
             [],
@@ -141,25 +141,21 @@ class UrlTest extends \PHPUnit_Framework_TestCase
             false,
             false
         );
-        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->_encryptor = $this->getMock(\Magento\Framework\Encryption\Encryptor::class, null, [], '', false);
-        $this->_paramsResolverMock = $this->getMock(
+        $routeParamsResolver = $this->getMock(\Magento\Framework\Url\RouteParamsResolver::class, [], [], '', false);
+        $this->routeParamsResolverFactoryMock = $this->getMock(
             \Magento\Framework\Url\RouteParamsResolverFactory::class,
             [],
             [],
             '',
             false
         );
-        $this->_paramsResolverMock->expects(
-            $this->any()
-        )->method(
-            'create'
-        )->will(
-            $this->returnValue(
-                $this->getMock(\Magento\Framework\Url\RouteParamsResolver::class, [], [], '', false)
-            )
-        );
-        $this->_model = $helper->getObject(
+        $this->routeParamsResolverFactoryMock->expects($this->any())
+            ->method('create')
+            ->willReturn($routeParamsResolver);
+        /** @var HostChecker|\PHPUnit_Framework_MockObject_MockObject $hostCheckerMock */
+        $hostCheckerMock = $this->getMock(HostChecker::class, [], [], '', false);
+        $this->_model = $objectManager->getObject(
             \Magento\Backend\Model\Url::class,
             [
                 'scopeConfig' => $this->_scopeConfigMock,
@@ -168,31 +164,10 @@ class UrlTest extends \PHPUnit_Framework_TestCase
                 'menuConfig' => $this->_menuConfigMock,
                 'authSession' => $this->_authSessionMock,
                 'encryptor' => $this->_encryptor,
-                'routeParamsResolverFactory' => $this->_paramsResolverMock
+                'routeParamsResolverFactory' => $this->routeParamsResolverFactoryMock,
+                'hostChecker' => $hostCheckerMock
             ]
         );
-        $this->_paramsResolverMock->expects(
-            $this->any()
-        )->method(
-            'create'
-        )->will(
-            $this->returnValue(
-                $this->getMock(\Magento\Framework\Url\RouteParamsResolver::class, [], [], '', false)
-            )
-        );
-        $this->_model = $helper->getObject(
-            \Magento\Backend\Model\Url::class,
-            [
-                'scopeConfig' => $this->_scopeConfigMock,
-                'backendHelper' => $helperMock,
-                'formKey' => $this->_formKey,
-                'menuConfig' => $this->_menuConfigMock,
-                'authSession' => $this->_authSessionMock,
-                'encryptor' => $this->_encryptor,
-                'routeParamsResolverFactory' => $this->_paramsResolverMock
-            ]
-        );
-
         $this->_requestMock = $this->getMock(\Magento\Framework\App\Request\Http::class, [], [], '', false);
         $this->_model->setRequest($this->_requestMock);
     }
@@ -262,7 +237,7 @@ class UrlTest extends \PHPUnit_Framework_TestCase
             [
                 'backendHelper' => $helperMock,
                 'authSession' => $this->_authSessionMock,
-                'routeParamsResolverFactory' => $this->_paramsResolverMock
+                'routeParamsResolverFactory' => $this->routeParamsResolverFactoryMock
             ]
         );
         $urlModel->getAreaFrontName();
diff --git a/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml b/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml
index 3e61fec077c6e3fcfccfb62b5ecad98248e9b41d..decc26f331c8298d16b4a76d4a74d82c5808c651 100644
--- a/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml
+++ b/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml
@@ -48,6 +48,7 @@
                             <argument name="width" xsi:type="string">180</argument>
                             <argument name="align" xsi:type="string">left</argument>
                             <argument name="sortable" xsi:type="string">0</argument>
+                            <argument name="translate" xsi:type="boolean">true</argument>
                         </arguments>
                     </block>
                     <block class="Magento\Backend\Block\Widget\Grid\Column" as="description">
@@ -57,6 +58,7 @@
                             <argument name="type" xsi:type="string">text</argument>
                             <argument name="align" xsi:type="string">left</argument>
                             <argument name="sortable" xsi:type="string">0</argument>
+                            <argument name="translate" xsi:type="boolean">true</argument>
                         </arguments>
                     </block>
                     <block class="Magento\Backend\Block\Widget\Grid\Column" as="tags">
diff --git a/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js b/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js
index ea832acb537e0051e34f976c050c9b8bd7d289b7..14729714b4e608f8c422da8c220b9ea1ed115ffb 100644
--- a/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js
+++ b/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js
@@ -28,7 +28,7 @@ define([
             self.$selector = $('#' + self.selector);
             self.$container =  $('#' + self.container);
             self.$selector.on(
-                'setVaultNotActive',
+                'setVaultNotActive.' + self.getCode(),
                 function () {
                     self.$selector.off('submitOrder.' + self.getCode());
                 }
diff --git a/app/code/Magento/Bundle/Model/ResourceModel/Indexer/Price.php b/app/code/Magento/Bundle/Model/ResourceModel/Indexer/Price.php
index 7789f79d907f85d2402a82899af1de3f63db29de..4059f06bccded2f5dbaec98de627a0dc90407eb9 100644
--- a/app/code/Magento/Bundle/Model/ResourceModel/Indexer/Price.php
+++ b/app/code/Magento/Bundle/Model/ResourceModel/Indexer/Price.php
@@ -491,7 +491,7 @@ class Price extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\D
             null
         )->join(
             ['e' => $this->getTable('catalog_product_entity')],
-            "i.entity_id=e.$linkField",
+            "i.entity_id=e.entity_id",
             []
         )->where(
             'e.type_id=?',
@@ -502,7 +502,7 @@ class Price extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\D
 
         $select = $connection->select()->from(
             ['tp' => $this->getTable('catalog_product_entity_tier_price')],
-            [$linkField]
+            ['e.entity_id']
         )->join(
             ['e' => $this->getTable('catalog_product_entity')],
             "tp.{$linkField} = e.{$linkField}",
@@ -523,11 +523,11 @@ class Price extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\D
         )->columns(
             new \Zend_Db_Expr('MIN(tp.value)')
         )->group(
-            ["tp.{$linkField}", 'cg.customer_group_id', 'cw.website_id']
+            ['e.entity_id', 'cg.customer_group_id', 'cw.website_id']
         );
 
         if (!empty($entityIds)) {
-            $select->where("tp.{$linkField} IN(?)", $entityIds);
+            $select->where('e.entity_id IN(?)', $entityIds);
         }
 
         $query = $select->insertFromSelect($this->_getTierPriceIndexTable());
diff --git a/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php b/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php
index 2d0f1264b6b8a6fc6ad041b81812c942f739468c..6a99c02af9da63f9126b57c1349eb17d8df360be 100644
--- a/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php
+++ b/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php
@@ -9,7 +9,6 @@
 namespace Magento\BundleImportExport\Model\Import\Product\Type;
 
 use \Magento\Bundle\Model\Product\Price as BundlePrice;
-use \Magento\BundleImportExport\Model\Export\RowCustomizer;
 use \Magento\Catalog\Model\Product\Type\AbstractType;
 
 /**
@@ -55,20 +54,6 @@ class Bundle extends \Magento\CatalogImportExport\Model\Import\Product\Type\Abst
      */
     const SELECTION_PRICE_TYPE_PERCENT = 1;
 
-    /**
-     * Instance of database adapter.
-     *
-     * @var \Magento\Framework\DB\Adapter\AdapterInterface
-     */
-    protected $connection;
-
-    /**
-     * Instance of application resource.
-     *
-     * @var \Magento\Framework\App\ResourceConnection
-     */
-    protected $_resource;
-
     /**
      * Array of cached options.
      *
@@ -144,23 +129,6 @@ class Bundle extends \Magento\CatalogImportExport\Model\Import\Product\Type\Abst
         'multiselect' => 'multi',
     ];
 
-    /**
-     * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac
-     * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac
-     * @param \Magento\Framework\App\ResourceConnection $resource
-     * @param array $params
-     */
-    public function __construct(
-        \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac,
-        \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac,
-        \Magento\Framework\App\ResourceConnection $resource,
-        array $params
-    ) {
-        parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params);
-        $this->_resource = $resource;
-        $this->connection = $resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);
-    }
-
     /**
      * Parse selections.
      *
diff --git a/app/code/Magento/BundleImportExport/composer.json b/app/code/Magento/BundleImportExport/composer.json
index 2f5e3afdbff86ded9c88161ebea832c29b37f229..ad849b6f31182ab49fb3acaa64fd7ae1c92e40c5 100644
--- a/app/code/Magento/BundleImportExport/composer.json
+++ b/app/code/Magento/BundleImportExport/composer.json
@@ -7,7 +7,6 @@
         "magento/module-import-export": "100.2.*",
         "magento/module-catalog-import-export": "100.2.*",
         "magento/module-bundle": "100.2.*",
-        "magento/module-eav": "100.2.*",
         "magento/framework": "100.2.*"
     },
     "type": "magento2-module",
diff --git a/app/code/Magento/Catalog/Model/Attribute/Config/Data.php b/app/code/Magento/Catalog/Model/Attribute/Config/Data.php
index 032970a7461b60f8c3c2f900024c587fb1d22f63..1fac4e58c75c97fcc404cd0ca345e3ed1085f501 100644
--- a/app/code/Magento/Catalog/Model/Attribute/Config/Data.php
+++ b/app/code/Magento/Catalog/Model/Attribute/Config/Data.php
@@ -1,22 +1,31 @@
 <?php
 /**
- * Catalog attributes configuration data container. Provides catalog attributes configuration data.
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Catalog\Model\Attribute\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides catalog attributes configuration
+ */
 class Data extends \Magento\Framework\Config\Data
 {
     /**
+     * Constructor
+     *
      * @param \Magento\Catalog\Model\Attribute\Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Catalog\Model\Attribute\Config\Reader $reader,
-        \Magento\Framework\Config\CacheInterface $cache
+        \Magento\Framework\Config\CacheInterface $cache,
+        $cacheId = 'catalog_attributes',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, 'catalog_attributes');
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Config.php b/app/code/Magento/Catalog/Model/Config.php
index dec29a925cc4d491ddbaab53f249ce354c7df56c..70d11f2e282b4a4268bab2c56547668badf1735a 100644
--- a/app/code/Magento/Catalog/Model/Config.php
+++ b/app/code/Magento/Catalog/Model/Config.php
@@ -7,6 +7,7 @@
 // @codingStandardsIgnoreFile
 
 namespace Magento\Catalog\Model;
+use Magento\Framework\Serialize\SerializerInterface;
 
 /**
  * @SuppressWarnings(PHPMD.LongVariable)
@@ -132,6 +133,7 @@ class Config extends \Magento\Eav\Model\Config
      * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $setCollectionFactory
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Eav\Model\Config $eavConfig
+     * @param SerializerInterface $serializer
      *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
@@ -147,7 +149,8 @@ class Config extends \Magento\Eav\Model\Config
         \Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory $groupCollectionFactory,
         \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $setCollectionFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Eav\Model\Config $eavConfig
+        \Magento\Eav\Model\Config $eavConfig,
+        SerializerInterface $serializer = null
     ) {
         $this->_scopeConfig = $scopeConfig;
         $this->_configFactory = $configFactory;
@@ -157,7 +160,14 @@ class Config extends \Magento\Eav\Model\Config
         $this->_storeManager = $storeManager;
         $this->_eavConfig = $eavConfig;
 
-        parent::__construct($cache, $entityTypeFactory, $entityTypeCollectionFactory, $cacheState, $universalFactory);
+        parent::__construct(
+            $cache,
+            $entityTypeFactory,
+            $entityTypeCollectionFactory,
+            $cacheState,
+            $universalFactory,
+            $serializer
+        );
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Source/Countryofmanufacture.php b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Countryofmanufacture.php
index 7b45d162b5e98bf06251a8a6e55794b8626b25ef..8bcf01ba3db3867bb0babe3c5119097f1c860d5d 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Source/Countryofmanufacture.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Countryofmanufacture.php
@@ -35,6 +35,11 @@ class Countryofmanufacture extends AbstractSource implements OptionSourceInterfa
      */
     protected $_countryFactory;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializer;
+
     /**
      * Construct
      *
@@ -61,15 +66,30 @@ class Countryofmanufacture extends AbstractSource implements OptionSourceInterfa
     {
         $cacheKey = 'COUNTRYOFMANUFACTURE_SELECT_STORE_' . $this->_storeManager->getStore()->getCode();
         if ($cache = $this->_configCacheType->load($cacheKey)) {
-            $options = unserialize($cache);
+            $options = $this->getSerializer()->unserialize($cache);
         } else {
             /** @var \Magento\Directory\Model\Country $country */
             $country = $this->_countryFactory->create();
             /** @var \Magento\Directory\Model\ResourceModel\Country\Collection $collection */
             $collection = $country->getResourceCollection();
             $options = $collection->load()->toOptionArray();
-            $this->_configCacheType->save(serialize($options), $cacheKey);
+            $this->_configCacheType->save($this->getSerializer()->serialize($options), $cacheKey);
         }
         return $options;
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(\Magento\Framework\Serialize\SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/ProductOptions/Config.php b/app/code/Magento/Catalog/Model/ProductOptions/Config.php
index bd55304e03beface2791526e00d2731ca6285ce9..fa828832bf4a716eddf1eeabdea9befcf94b6ab3 100644
--- a/app/code/Magento/Catalog/Model/ProductOptions/Config.php
+++ b/app/code/Magento/Catalog/Model/ProductOptions/Config.php
@@ -5,20 +5,29 @@
  */
 namespace Magento\Catalog\Model\ProductOptions;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides product options configuration
+ */
 class Config extends \Magento\Framework\Config\Data implements
     \Magento\Catalog\Model\ProductOptions\ConfigInterface
 {
     /**
+     * Constructor
+     *
      * @param \Magento\Catalog\Model\ProductOptions\Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Catalog\Model\ProductOptions\Config\Reader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = 'product_options_config'
+        $cacheId = 'product_options_config',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/ProductTypes/Config.php b/app/code/Magento/Catalog/Model/ProductTypes/Config.php
index a80692cfaf945ced5b51fc9118b4a82b597dd9e3..f691e08a34b576e8416e3b07e60cd0d0243274da 100644
--- a/app/code/Magento/Catalog/Model/ProductTypes/Config.php
+++ b/app/code/Magento/Catalog/Model/ProductTypes/Config.php
@@ -5,19 +5,28 @@
  */
 namespace Magento\Catalog\Model\ProductTypes;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides product types configuration
+ */
 class Config extends \Magento\Framework\Config\Data implements \Magento\Catalog\Model\ProductTypes\ConfigInterface
 {
     /**
-     * @param \Magento\Catalog\Model\ProductTypes\Config\Reader $reader
+     * Constructor
+     *
+     * @param Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Catalog\Model\ProductTypes\Config\Reader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = 'product_types_config'
+        $cacheId = 'product_types_config',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php
index c24460981afbf8d6c6cccb79255031d8320b726f..1cf18fc998ef973c0e3735d72cf347430710beda 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php
@@ -17,6 +17,7 @@ use Magento\Framework\App\ObjectManager;
 use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Store\Model\Store;
 use Magento\Catalog\Model\Product\Gallery\ReadHandler as GalleryReadHandler;
+use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
 
 /**
  * Product collection
@@ -261,6 +262,8 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac
     private $metadataPool;
 
     /**
+     * Collection constructor
+     *
      * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
      * @param \Psr\Log\LoggerInterface $logger
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
@@ -280,7 +283,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac
      * @param \Magento\Customer\Model\Session $customerSession
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
      * @param GroupManagementInterface $groupManagement
-     * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
+     * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
+     * @param ProductLimitationFactory|null $productLimitationFactory
+     * @param MetadataPool|null $metadataPool
      *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
@@ -304,7 +309,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac
         \Magento\Customer\Model\Session $customerSession,
         \Magento\Framework\Stdlib\DateTime $dateTime,
         GroupManagementInterface $groupManagement,
-        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null
+        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
+        ProductLimitationFactory $productLimitationFactory = null,
+        MetadataPool $metadataPool = null
     ) {
         $this->moduleManager = $moduleManager;
         $this->_catalogProductFlatState = $catalogProductFlatState;
@@ -316,7 +323,11 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac
         $this->_resourceHelper = $resourceHelper;
         $this->dateTime = $dateTime;
         $this->_groupManagement = $groupManagement;
-        $this->_productLimitationFilters = $this->createLimitationFilters();
+        $productLimitationFactory = $productLimitationFactory ?: ObjectManager::getInstance()->get(
+            \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory::class
+        );
+        $this->_productLimitationFilters = $productLimitationFactory->create();
+        $this->metadataPool = $metadataPool ?: ObjectManager::getInstance()->get(MetadataPool::class);
         parent::__construct(
             $entityFactory,
             $logger,
@@ -2181,7 +2192,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac
         );
 
         $mediaGalleries = [];
-        $linkField = $this->getMetadataPool()->getMetadata(ProductInterface::class)->getLinkField();
+        $linkField = $this->getProductEntityMetadata()->getLinkField();
         $items = $this->getItems();
 
         $select->where('entity.' . $linkField . ' IN (?)', array_map(function ($item) {
@@ -2202,15 +2213,13 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac
     }
 
     /**
-     * Get MetadataPool instance
-     * @return MetadataPool
+     * Get product entity metadata
+     *
+     * @return \Magento\Framework\EntityManager\EntityMetadataInterface
      */
-    private function getMetadataPool()
+    public function getProductEntityMetadata()
     {
-        if (!$this->metadataPool) {
-            $this->metadataPool = ObjectManager::getInstance()->get(MetadataPool::class);
-        }
-        return $this->metadataPool;
+        return $this->metadataPool->getMetadata(ProductInterface::class);
     }
 
     /**
@@ -2334,13 +2343,4 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac
 
         return $this->_pricesCount;
     }
-
-    /**
-     * @return Collection\ProductLimitation
-     */
-    private function createLimitationFilters()
-    {
-        return \Magento\Framework\App\ObjectManager::getInstance()
-                ->create(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class);
-    }
 }
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php
index 239f94e1286b834ab218b1e71530342fd5810a73..116f454cd5e750a43a93a73139521b5aa15a50bc 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php
@@ -5,11 +5,6 @@
  */
 namespace Magento\Catalog\Model\ResourceModel\Product\Link\Product;
 
-use Magento\Catalog\Api\Data\ProductInterface;
-use Magento\Customer\Api\GroupManagementInterface;
-use Magento\Framework\App\ObjectManager;
-use Magento\Framework\EntityManager\MetadataPool;
-
 /**
  * Catalog product linked products collection
  *
@@ -53,80 +48,6 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
      */
     protected $_hasLinkFilter = false;
 
-    /**
-     * @var MetadataPool
-     */
-    private $metadataPool;
-
-    /**
-     * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
-     * @param \Psr\Log\LoggerInterface $logger
-     * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
-     * @param \Magento\Framework\Event\ManagerInterface $eventManager
-     * @param \Magento\Eav\Model\Config $eavConfig
-     * @param \Magento\Framework\App\ResourceConnection $resource
-     * @param \Magento\Eav\Model\EntityFactory $eavEntityFactory
-     * @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper
-     * @param \Magento\Framework\Validator\UniversalFactory $universalFactory
-     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Framework\Module\Manager $moduleManager
-     * @param \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState
-     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
-     * @param \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory
-     * @param \Magento\Catalog\Model\ResourceModel\Url $catalogUrl
-     * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
-     * @param \Magento\Customer\Model\Session $customerSession
-     * @param \Magento\Framework\Stdlib\DateTime $dateTime
-     * @param GroupManagementInterface $groupManagement
-     * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
-     * @SuppressWarnings(PHPMD.ExcessiveParameterList)
-     */
-    public function __construct(
-        \Magento\Framework\Data\Collection\EntityFactory $entityFactory,
-        \Psr\Log\LoggerInterface $logger,
-        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
-        \Magento\Framework\Event\ManagerInterface $eventManager,
-        \Magento\Eav\Model\Config $eavConfig,
-        \Magento\Framework\App\ResourceConnection $resource,
-        \Magento\Eav\Model\EntityFactory $eavEntityFactory,
-        \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper,
-        \Magento\Framework\Validator\UniversalFactory $universalFactory,
-        \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Framework\Module\Manager $moduleManager,
-        \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState,
-        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
-        \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory,
-        \Magento\Catalog\Model\ResourceModel\Url $catalogUrl,
-        \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
-        \Magento\Customer\Model\Session $customerSession,
-        \Magento\Framework\Stdlib\DateTime $dateTime,
-        GroupManagementInterface $groupManagement,
-        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null
-    ) {
-        parent::__construct(
-            $entityFactory,
-            $logger,
-            $fetchStrategy,
-            $eventManager,
-            $eavConfig,
-            $resource,
-            $eavEntityFactory,
-            $resourceHelper,
-            $universalFactory,
-            $storeManager,
-            $moduleManager,
-            $catalogProductFlatState,
-            $scopeConfig,
-            $productOptionFactory,
-            $catalogUrl,
-            $localeDate,
-            $customerSession,
-            $dateTime,
-            $groupManagement,
-            $connection
-        );
-    }
-
     /**
      * Declare link model and initialize type attributes join
      *
@@ -219,7 +140,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
             if (!is_array($products)) {
                 $products = [$products];
             }
-            $identifierField = $this->getMetadataPool()->getMetadata(ProductInterface::class)->getIdentifierField();
+            $identifierField = $this->getProductEntityMetadata()->getIdentifierField();
             $this->getSelect()->where("product_entity_table.$identifierField IN (?)", $products);
             $this->_hasLinkFilter = true;
         }
@@ -279,7 +200,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
             $connection->quoteInto('links.link_type_id = ?', $this->_linkTypeId),
         ];
         $joinType = 'join';
-        $linkField = $this->getMetadataPool()->getMetadata(ProductInterface::class)->getLinkField();
+        $linkField = $this->getProductEntityMetadata()->getLinkField();
         if ($this->getProduct() && $this->getProduct()->getId()) {
             $linkFieldId = $this->getProduct()->getData(
                 $linkField
@@ -422,19 +343,6 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
         return $this;
     }
 
-    /**
-     * Get MetadataPool instance
-     * @return MetadataPool
-     * @deprecated
-     */
-    private function getMetadataPool()
-    {
-        if (!$this->metadataPool) {
-            $this->metadataPool = ObjectManager::getInstance()->get(MetadataPool::class);
-        }
-        return $this->metadataPool;
-    }
-
     /**
      * Join Product To Links
      * @return void
@@ -442,11 +350,15 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
     private function joinProductsToLinks()
     {
         if ($this->_hasLinkFilter) {
-            $metaDataPool = $this->getMetadataPool()->getMetadata(ProductInterface::class);
+            $metaDataPool = $this->getProductEntityMetadata();
             $linkField = $metaDataPool->getLinkField();
             $entityTable = $metaDataPool->getEntityTable();
             $this->getSelect()
-                ->join(['product_entity_table' => $entityTable], "links.product_id = product_entity_table.$linkField", []);
+                ->join(
+                    ['product_entity_table' => $entityTable],
+                    "links.product_id = product_entity_table.$linkField",
+                    []
+                );
         }
     }
 }
diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php
index 2d50ead9d56d956a22e36305967b527c8be3a288..68280d5a1d5975714d2d91fd2b94eab08a82dfc6 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php
@@ -7,6 +7,7 @@ namespace Magento\Catalog\Model\ResourceModel\Product\Option;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Catalog product options collection
@@ -49,6 +50,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
      * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
+     * @param MetadataPool $metadataPool
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -59,10 +61,13 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         \Magento\Catalog\Model\ResourceModel\Product\Option\Value\CollectionFactory $optionValueCollectionFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
-        \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
+        \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null,
+        MetadataPool $metadataPool = null
     ) {
         $this->_optionValueCollectionFactory = $optionValueCollectionFactory;
         $this->_storeManager = $storeManager;
+        $this->metadataPool = $metadataPool ?: \Magento\Framework\App\ObjectManager::getInstance()
+            ->get(\Magento\Framework\EntityManager\MetadataPool::class);
         parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
     }
 
@@ -248,7 +253,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
             ['cpe' => $this->getTable('catalog_product_entity')],
             sprintf(
                 'cpe.%s = main_table.product_id',
-                $this->getMetadataPool()->getMetadata(ProductInterface::class)->getLinkField()
+                $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField()
             ),
             []
         );
@@ -318,18 +323,6 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         return $this->_reset();
     }
 
-    /**
-     * @return \Magento\Framework\EntityManager\MetadataPool
-     */
-    private function getMetadataPool()
-    {
-        if (null === $this->metadataPool) {
-            $this->metadataPool = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get(\Magento\Framework\EntityManager\MetadataPool::class);
-        }
-        return $this->metadataPool;
-    }
-
     /**
      * @return JoinProcessorInterface
      */
diff --git a/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php b/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php
index c1f37eca1c55c7b81cf4b14a034738c5211b7085..e441d703dcd9c52111541b14db1711706737b01f 100644
--- a/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php
+++ b/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php
@@ -41,9 +41,9 @@ class Suffix extends \Magento\Framework\App\Config\Value
     protected $resource;
 
     /**
-     * @var \Magento\Framework\App\Config\ScopePool
+     * @var \Magento\Framework\App\Config
      */
-    private $scopePool;
+    private $appConfig;
 
     /**
      * @param \Magento\Framework\Model\Context $context
@@ -83,17 +83,17 @@ class Suffix extends \Magento\Framework\App\Config\Value
     /**
      * Get instance of ScopePool
      *
-     * @return \Magento\Framework\App\Config\ScopePool
+     * @return \Magento\Framework\App\Config
      * @deprecated
      */
-    private function getScopePool()
+    private function getAppConfig()
     {
-        if ($this->scopePool === null) {
-            $this->scopePool = \Magento\Framework\App\ObjectManager::getInstance()->get(
-                \Magento\Framework\App\Config\ScopePool::class
+        if ($this->appConfig === null) {
+            $this->appConfig = \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\Framework\App\Config::class
             );
         }
-        return $this->scopePool;
+        return $this->appConfig;
     }
 
     /**
@@ -177,7 +177,7 @@ class Suffix extends \Magento\Framework\App\Config\Value
         if ($this->getValue() !== null) {
             $suffix = $this->getValue();
         } else {
-            $this->getScopePool()->clean();
+            $this->getAppConfig()->clean();
             $suffix = $this->_config->getValue($this->getPath());
         }
         foreach ($entities as $urlRewrite) {
diff --git a/app/code/Magento/Catalog/Model/Template/Filter.php b/app/code/Magento/Catalog/Model/Template/Filter.php
index cbabe53c3bca175b0a22f5aefba77fc0e1db00f6..3d9695c183fe3d63ba69dfd831971fced7da8980 100644
--- a/app/code/Magento/Catalog/Model/Template/Filter.php
+++ b/app/code/Magento/Catalog/Model/Template/Filter.php
@@ -14,6 +14,11 @@
  */
 namespace Magento\Catalog\Model\Template;
 
+/**
+ * Work with catalog(store, website) urls
+ *
+ * @package Magento\Catalog\Model\Template
+ */
 class Filter extends \Magento\Framework\Filter\Template
 {
     /**
diff --git a/app/code/Magento/Catalog/Plugin/Model/ResourceModel/Config.php b/app/code/Magento/Catalog/Plugin/Model/ResourceModel/Config.php
index 699feef76c67e281d237a177a4def197c449e750..69c693f4fd01abcb39577b49cffb4ceaab8bf08f 100644
--- a/app/code/Magento/Catalog/Plugin/Model/ResourceModel/Config.php
+++ b/app/code/Magento/Catalog/Plugin/Model/ResourceModel/Config.php
@@ -5,6 +5,9 @@
  */
 namespace Magento\Catalog\Plugin\Model\ResourceModel;
 
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Serialize\SerializerInterface;
+
 class Config
 {
     /**#@+
@@ -20,16 +23,24 @@ class Config
     /** @var bool|null */
     protected $isCacheEnabled = null;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\App\CacheInterface $cache
      * @param \Magento\Framework\App\Cache\StateInterface $cacheState
+     * @param SerializerInterface $serializer
      */
     public function __construct(
         \Magento\Framework\App\CacheInterface $cache,
-        \Magento\Framework\App\Cache\StateInterface $cacheState
+        \Magento\Framework\App\Cache\StateInterface $cacheState,
+        SerializerInterface $serializer = null
     ) {
         $this->cache = $cache;
         $this->isCacheEnabled = $cacheState->isEnabled(\Magento\Eav\Model\Cache\Type::TYPE_IDENTIFIER);
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
     }
 
     /**
@@ -43,12 +54,12 @@ class Config
     ) {
         $cacheId = self::PRODUCT_LISTING_ATTRIBUTES_CACHE_ID . $config->getEntityTypeId() . '_' . $config->getStoreId();
         if ($this->isCacheEnabled && ($attributes = $this->cache->load($cacheId))) {
-            return unserialize($attributes);
+            return $this->serializer->unserialize($attributes);
         }
         $attributes = $proceed();
         if ($this->isCacheEnabled) {
             $this->cache->save(
-                serialize($attributes),
+                $this->serializer->serialize($attributes),
                 $cacheId,
                 [
                     \Magento\Eav\Model\Cache\Type::CACHE_TAG,
@@ -71,12 +82,12 @@ class Config
         $cacheId = self::PRODUCT_LISTING_SORT_BY_ATTRIBUTES_CACHE_ID . $config->getEntityTypeId() . '_'
             . $config->getStoreId();
         if ($this->isCacheEnabled && ($attributes = $this->cache->load($cacheId))) {
-            return unserialize($attributes);
+            return $this->serializer->unserialize($attributes);
         }
         $attributes = $proceed();
         if ($this->isCacheEnabled) {
             $this->cache->save(
-                serialize($attributes),
+                $this->serializer->serialize($attributes),
                 $cacheId,
                 [
                     \Magento\Eav\Model\Cache\Type::CACHE_TAG,
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Source/CountryofmanufactureTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Source/CountryofmanufactureTest.php
index 2888a0a84f23069b34b1cb7045adad75ca921163..9ae3f94924855cbda533691292af8d110e7e07da 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Source/CountryofmanufactureTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Source/CountryofmanufactureTest.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\Catalog\Test\Unit\Model\Product\Attribute\Source;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
 class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -27,12 +29,34 @@ class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase
      */
     protected $objectManagerHelper;
 
+    /** @var \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture */
+    private $countryOfManufacture;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
+
     protected function setUp()
     {
         $this->storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class);
         $this->storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false);
         $this->cacheConfig = $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false);
         $this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->countryOfManufacture = $this->objectManagerHelper->getObject(
+            \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture::class,
+            [
+                'storeManager' => $this->storeManagerMock,
+                'configCacheType' => $this->cacheConfig,
+            ]
+        );
+
+        $this->serializerMock = $this->getMock(SerializerInterface::class, [], [], '', false);
+        $this->objectManagerHelper->setBackwardCompatibleProperty(
+            $this->countryOfManufacture,
+            'serializer',
+            $this->serializerMock
+        );
     }
 
     /**
@@ -51,15 +75,10 @@ class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase
             ->method('load')
             ->with($this->equalTo('COUNTRYOFMANUFACTURE_SELECT_STORE_store_code'))
             ->will($this->returnValue($cachedDataSrl));
-
-        $countryOfManufacture = $this->objectManagerHelper->getObject(
-            \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture::class,
-            [
-                'storeManager' => $this->storeManagerMock,
-                'configCacheType' => $this->cacheConfig,
-            ]
-        );
-        $this->assertEquals($cachedDataUnsrl, $countryOfManufacture->getAllOptions());
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->willReturn($cachedDataUnsrl);
+        $this->assertEquals($cachedDataUnsrl, $this->countryOfManufacture->getAllOptions());
     }
 
     /**
@@ -71,7 +90,7 @@ class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase
     {
         return
             [
-                ['cachedDataSrl' => 'a:1:{s:3:"key";s:4:"data";}', 'cachedDataUnsrl' => ['key' => 'data']]
+                ['cachedDataSrl' => json_encode(['key' => 'data']), 'cachedDataUnsrl' => ['key' => 'data']]
             ];
     }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductTypes/ConfigTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductTypes/ConfigTest.php
index af0c1625f9cb64ea69d807a9e36184288b1b1c39..852eb11c5cfb9f16946781d2ef12c2a6821659a1 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductTypes/ConfigTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductTypes/ConfigTest.php
@@ -8,22 +8,33 @@ namespace Magento\Catalog\Test\Unit\Model\ProductTypes;
 class ConfigTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
      */
-    protected $readerMock;
+    private $objectManager;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Catalog\Model\ProductTypes\Config\Reader|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cacheMock;
+    private $readerMock;
+
+    /**
+     * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $cacheMock;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
 
     /**
      * @var \Magento\Catalog\Model\ProductTypes\Config
      */
-    protected $model;
+    private $config;
 
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->readerMock = $this->getMock(
             \Magento\Catalog\Model\ProductTypes\Config\Reader::class,
             [],
@@ -32,19 +43,35 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             false
         );
         $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
     }
 
     /**
-     * @dataProvider getTypeDataProvider
-     *
      * @param array $value
      * @param mixed $expected
+     * @dataProvider getTypeDataProvider
      */
     public function testGetType($value, $expected)
     {
-        $this->cacheMock->expects($this->any())->method('load')->will($this->returnValue(serialize($value)));
-        $this->model = new \Magento\Catalog\Model\ProductTypes\Config($this->readerMock, $this->cacheMock, 'cache_id');
-        $this->assertEquals($expected, $this->model->getType('global'));
+        $this->cacheMock->expects($this->any())
+            ->method('load')
+            ->willReturn('serializedData');
+
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with('serializedData')
+            ->willReturn($value);
+
+        $this->config = $this->objectManager->getObject(
+            \Magento\Catalog\Model\ProductTypes\Config::class,
+            [
+                'reader' => $this->readerMock,
+                'cache' => $this->cacheMock,
+                'cacheId' => 'cache_id',
+                'serializer' => $this->serializerMock,
+            ]
+        );
+        $this->assertEquals($expected, $this->config->getType('global'));
     }
 
     public function getTypeDataProvider()
@@ -58,22 +85,43 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
     public function testGetAll()
     {
         $expected = ['Expected Data'];
-        $this->cacheMock->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->will(
-            $this->returnValue(serialize(['types' => $expected]))
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn(json_encode('"types":["Expected Data"]]'));
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->willReturn(['types' => $expected]);
+
+        $this->config = $this->objectManager->getObject(
+            \Magento\Catalog\Model\ProductTypes\Config::class,
+            [
+                'reader' => $this->readerMock,
+                'cache' => $this->cacheMock,
+                'cacheId' => 'cache_id',
+                'serializer' => $this->serializerMock,
+            ]
         );
-        $this->model = new \Magento\Catalog\Model\ProductTypes\Config($this->readerMock, $this->cacheMock, 'cache_id');
-        $this->assertEquals($expected, $this->model->getAll());
+        $this->assertEquals($expected, $this->config->getAll());
     }
 
     public function testIsProductSet()
     {
-        $this->cacheMock->expects($this->once())->method('load')->will($this->returnValue(serialize([])));
-        $this->model = new \Magento\Catalog\Model\ProductTypes\Config($this->readerMock, $this->cacheMock, 'cache_id');
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn('');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->willReturn([]);
 
-        $this->assertEquals(false, $this->model->isProductSet('typeId'));
+        $this->config = $this->objectManager->getObject(
+            \Magento\Catalog\Model\ProductTypes\Config::class,
+            [
+                'reader' => $this->readerMock,
+                'cache' => $this->cacheMock,
+                'cacheId' => 'cache_id',
+                'serializer' => $this->serializerMock,
+            ]
+        );
+        $this->assertEquals(false, $this->config->isProductSet('typeId'));
     }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/CollectionTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/CollectionTest.php
index b97b7d2f9842355af1195b7b0ce7ed1d4aa7e4e8..f19b2c15c8ab20142ad10b6d3ca23282633062db 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/CollectionTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/CollectionTest.php
@@ -3,18 +3,20 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Catalog\Test\Unit\Model\ResourceModel\Product;
 
-use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
 
 /**
- * Class CollectionTest
- *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class CollectionTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
@@ -55,6 +57,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
      */
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $entityFactory = $this->getMock(\Magento\Framework\Data\Collection\EntityFactory::class, [], [], '', false);
         $logger = $this->getMockBuilder(\Psr\Log\LoggerInterface::class)
             ->disableOriginalConstructor()
@@ -145,27 +148,14 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
         $this->entityMock->expects($this->once())->method('getDefaultAttributes')->willReturn([]);
         $this->entityMock->expects($this->any())->method('getTable')->willReturnArgument(0);
         $this->connectionMock->expects($this->atLeastOnce())->method('select')->willReturn($this->selectMock);
-        $helper = new ObjectManager($this);
 
-        $this->prepareObjectManager([
-            [
-                \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class,
-                $this->getMock(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class)
-            ],
-            [
-                \Magento\Catalog\Model\ResourceModel\Product\Gallery::class,
-                $this->galleryResourceMock
-            ],
-            [
-                \Magento\Framework\EntityManager\MetadataPool::class,
-                $this->metadataPoolMock
-            ],
-            [
-                \Magento\Catalog\Model\Product\Gallery\ReadHandler::class,
-                $this->galleryReadHandlerMock
-            ]
-        ]);
-        $this->collection = $helper->getObject(
+        $productLimitationMock = $this->getMock(
+            \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class
+        );
+        $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']);
+        $productLimitationFactoryMock->method('create')
+            ->willReturn($productLimitationMock);
+        $this->collection = $this->objectManager->getObject(
             \Magento\Catalog\Model\ResourceModel\Product\Collection::class,
             [
                 'entityFactory' => $entityFactory,
@@ -187,10 +177,22 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
                 'customerSession' => $customerSession,
                 'dateTime' => $dateTime,
                 'groupManagement' => $groupManagement,
-                'connection' => $this->connectionMock
+                'connection' => $this->connectionMock,
+                'productLimitationFactory' => $productLimitationFactoryMock,
+                'metadataPool' => $this->metadataPoolMock,
             ]
         );
         $this->collection->setConnection($this->connectionMock);
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->collection,
+            'mediaGalleryResource',
+            $this->galleryResourceMock
+        );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->collection,
+            'productGalleryReadHandler',
+            $this->galleryReadHandlerMock
+        );
     }
 
     public function testAddProductCategoriesFilter()
@@ -259,20 +261,4 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
 
         $this->assertSame($this->collection, $this->collection->addMediaGalleryData());
     }
-
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Link/Product/CollectionTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Link/Product/CollectionTest.php
index 3c92cde30012dc1a4fdc4736f1c68c6a7b071d5b..fe244d01eea80760fcab82b28169f3dda492f9b4 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Link/Product/CollectionTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Link/Product/CollectionTest.php
@@ -3,10 +3,10 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Catalog\Test\Unit\Model\ResourceModel\Product\Link\Product;
 
-use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+use \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
+use \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -17,8 +17,8 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Catalog\Model\ResourceModel\Product\Link\Product\Collection */
     protected $collection;
 
-    /** @var ObjectManagerHelper */
-    protected $objectManagerHelper;
+    /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */
+    private $objectManager;
 
     /** @var \Magento\Framework\Data\Collection\EntityFactory|\PHPUnit_Framework_MockObject_MockObject */
     protected $entityFactoryMock;
@@ -76,6 +76,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->entityFactoryMock = $this->getMock(
             \Magento\Framework\Data\Collection\EntityFactory::class,
             [],
@@ -133,14 +134,11 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
         $this->timezoneInterfaceMock = $this->getMock(\Magento\Framework\Stdlib\DateTime\TimezoneInterface::class);
         $this->sessionMock = $this->getMock(\Magento\Customer\Model\Session::class, [], [], '', false);
         $this->dateTimeMock = $this->getMock(\Magento\Framework\Stdlib\DateTime::class);
-        $this->objectManagerHelper = new ObjectManagerHelper($this);
-        $this->prepareObjectManager([
-            [\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class,
-                $this->getMock(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class)
-            ]
-        ]);
+        $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']);
+        $productLimitationFactoryMock->method('create')
+            ->willReturn($this->getMock(ProductLimitation::class));
 
-        $this->collection = $this->objectManagerHelper->getObject(
+        $this->collection = $this->objectManager->getObject(
             \Magento\Catalog\Model\ResourceModel\Product\Link\Product\Collection::class,
             [
                 'entityFactory' => $this->entityFactoryMock,
@@ -160,7 +158,8 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
                 'catalogUrl' => $this->urlMock,
                 'localeDate' => $this->timezoneInterfaceMock,
                 'customerSession' => $this->sessionMock,
-                'dateTime' => $this->dateTimeMock
+                'dateTime' => $this->dateTimeMock,
+                'productLimitationFactory' => $productLimitationFactoryMock,
             ]
         );
     }
@@ -175,20 +174,4 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
         $this->collection->setProduct($product);
         $this->assertEquals(33, $this->collection->getStoreId());
     }
-
-    /**
-     * @param $map
-     */
-    public function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
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 decf8e66f6738e19b98f0a95c782ce5b0e9def34..36afda6287fb92fd922957e1edf09e569f93b434 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
@@ -3,20 +3,22 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
-// @codingStandardsIgnoreFile
-
 namespace Magento\Catalog\Test\Unit\Model\ResourceModel\Product\Option;
 
 use \Magento\Catalog\Model\ResourceModel\Product\Option\Collection;
 use \Magento\Catalog\Model\ResourceModel\Product\Option\Value;
 
 /**
- * Class CollectionTest
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * @codingStandardsIgnoreFile
  */
 class CollectionTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\Framework\EntityManager\MetadataPool
      */
@@ -79,6 +81,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->entityFactoryMock = $this->getMock(
             \Magento\Framework\Data\Collection\EntityFactory::class, ['create'], [], '', false
         );
@@ -147,11 +150,6 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
         $this->metadataPoolMock->expects($this->any())->method('getMetadata')->willReturn($metadata);
         $this->selectMock->expects($this->exactly(2))->method('join');
 
-        $this->prepareObjectManager([
-            [\Magento\Framework\EntityManager\MetadataPool::class, $this->metadataPoolMock],
-            [\Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface::class, $this->joinProcessor]
-        ]);
-
         $this->collection = new Collection(
             $this->entityFactoryMock,
             $this->loggerMock,
@@ -160,7 +158,13 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
             $this->optionsFactoryMock,
             $this->storeManagerMock,
             null,
-            $this->resourceMock
+            $this->resourceMock,
+            $this->metadataPoolMock
+        );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->collection,
+            'joinProcessor',
+            $this->joinProcessor
         );
     }
 
@@ -168,20 +172,4 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
     {
         $this->collection->reset();
     }
-
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Plugin/Model/ResourceModel/ConfigTest.php b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/ResourceModel/ConfigTest.php
index 01f9964f2d83e80be6d13bde407f47014971b3b8..b6f0dcf52bb1ee7169cdb7667b0db52a91127ad1 100644
--- a/app/code/Magento/Catalog/Test/Unit/Plugin/Model/ResourceModel/ConfigTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/ResourceModel/ConfigTest.php
@@ -6,26 +6,29 @@
 
 namespace Magento\Catalog\Test\Unit\Plugin\Model\ResourceModel;
 
+use Magento\Catalog\Plugin\Model\ResourceModel\Config;
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 
 class ConfigTest extends \PHPUnit_Framework_TestCase
 {
-    /** @var \Magento\Catalog\Plugin\Model\ResourceModel\Config */
-    protected $config;
-
     /** @var \Magento\Framework\App\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */
-    protected $cache;
+    private $cache;
 
     /** @var \Magento\Framework\App\Cache\StateInterface|\PHPUnit_Framework_MockObject_MockObject */
-    protected $cacheState;
+    private $cacheState;
+
+    /** @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */
+    private $serializer;
 
     /** @var \Magento\Catalog\Model\ResourceModel\Config|\PHPUnit_Framework_MockObject_MockObject */
-    protected $subject;
+    private $subject;
 
     protected function setUp()
     {
         $this->cache = $this->getMock(\Magento\Framework\App\CacheInterface::class);
         $this->cacheState = $this->getMock(\Magento\Framework\App\Cache\StateInterface::class);
+        $this->serializer = $this->getMock(SerializerInterface::class);
         $this->subject = $this->getMock(\Magento\Catalog\Model\ResourceModel\Config::class, [], [], '', false);
     }
 
@@ -47,12 +50,17 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $entityTypeId = 'type';
         $storeId = 'store';
         $attributes = ['attributes'];
+        $serializedAttributes = '["attributes"]';
         $this->subject->expects($this->any())->method('getEntityTypeId')->willReturn($entityTypeId);
         $this->subject->expects($this->any())->method('getStoreId')->willReturn($storeId);
         $cacheId = \Magento\Catalog\Plugin\Model\ResourceModel\Config::PRODUCT_LISTING_ATTRIBUTES_CACHE_ID
             . $entityTypeId
             . '_' . $storeId;
-        $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(serialize($attributes));
+        $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn($serializedAttributes);
+        $this->serializer->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedAttributes)
+            ->willReturn($attributes);
 
         $this->assertEquals(
             $attributes,
@@ -68,14 +76,21 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $entityTypeId = 'type';
         $storeId = 'store';
         $attributes = ['attributes'];
+        $serializedAttributes = '["attributes"]';
         $this->subject->expects($this->any())->method('getEntityTypeId')->willReturn($entityTypeId);
         $this->subject->expects($this->any())->method('getStoreId')->willReturn($storeId);
         $cacheId = \Magento\Catalog\Plugin\Model\ResourceModel\Config::PRODUCT_LISTING_ATTRIBUTES_CACHE_ID
             . $entityTypeId
             . '_' . $storeId;
         $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(false);
+        $this->serializer->expects($this->never())
+            ->method('unserialize');
+        $this->serializer->expects($this->once())
+            ->method('serialize')
+            ->with($attributes)
+            ->willReturn($serializedAttributes);
         $this->cache->expects($this->any())->method('save')->with(
-            serialize($attributes),
+            $serializedAttributes,
             $cacheId,
             [
                 \Magento\Eav\Model\Cache\Type::CACHE_TAG,
@@ -110,11 +125,16 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $entityTypeId = 'type';
         $storeId = 'store';
         $attributes = ['attributes'];
+        $serializedAttributes = '["attributes"]';
         $this->subject->expects($this->any())->method('getEntityTypeId')->willReturn($entityTypeId);
         $this->subject->expects($this->any())->method('getStoreId')->willReturn($storeId);
         $cacheId = \Magento\Catalog\Plugin\Model\ResourceModel\Config::PRODUCT_LISTING_SORT_BY_ATTRIBUTES_CACHE_ID
             . $entityTypeId . '_' . $storeId;
-        $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(serialize($attributes));
+        $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn($serializedAttributes);
+        $this->serializer->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedAttributes)
+            ->willReturn($attributes);
 
         $this->assertEquals(
             $attributes,
@@ -130,13 +150,20 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $entityTypeId = 'type';
         $storeId = 'store';
         $attributes = ['attributes'];
+        $serializedAttributes = '["attributes"]';
         $this->subject->expects($this->any())->method('getEntityTypeId')->willReturn($entityTypeId);
         $this->subject->expects($this->any())->method('getStoreId')->willReturn($storeId);
         $cacheId = \Magento\Catalog\Plugin\Model\ResourceModel\Config::PRODUCT_LISTING_SORT_BY_ATTRIBUTES_CACHE_ID
             . $entityTypeId . '_' . $storeId;
         $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(false);
+        $this->serializer->expects($this->never())
+            ->method('unserialize');
+        $this->serializer->expects($this->once())
+            ->method('serialize')
+            ->with($attributes)
+            ->willReturn($serializedAttributes);
         $this->cache->expects($this->any())->method('save')->with(
-            serialize($attributes),
+            $serializedAttributes,
             $cacheId,
             [
                 \Magento\Eav\Model\Cache\Type::CACHE_TAG,
@@ -165,7 +192,8 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             \Magento\Catalog\Plugin\Model\ResourceModel\Config::class,
             [
                 'cache' => $this->cache,
-                'cacheState' => $this->cacheState
+                'cacheState' => $this->cacheState,
+                'serializer' => $this->serializer,
             ]
         );
     }
diff --git a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Categories.php b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Categories.php
index 0e46b5899851f477abaae8a0591c4e95e872ef3e..0ee761646616ee96f5dfff870593cd9869b221cc 100644
--- a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Categories.php
+++ b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Categories.php
@@ -11,6 +11,7 @@ use Magento\Framework\App\ObjectManager;
 use Magento\Framework\App\CacheInterface;
 use Magento\Framework\DB\Helper as DbHelper;
 use Magento\Catalog\Model\Category as CategoryModel;
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Framework\UrlInterface;
 use Magento\Framework\Stdlib\ArrayManager;
 
@@ -62,25 +63,33 @@ class Categories extends AbstractModifier
      */
     private $cacheManager;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param LocatorInterface $locator
      * @param CategoryCollectionFactory $categoryCollectionFactory
      * @param DbHelper $dbHelper
      * @param UrlInterface $urlBuilder
      * @param ArrayManager $arrayManager
+     * @param SerializerInterface $serializer
      */
     public function __construct(
         LocatorInterface $locator,
         CategoryCollectionFactory $categoryCollectionFactory,
         DbHelper $dbHelper,
         UrlInterface $urlBuilder,
-        ArrayManager $arrayManager
+        ArrayManager $arrayManager,
+        SerializerInterface $serializer = null
     ) {
         $this->locator = $locator;
         $this->categoryCollectionFactory = $categoryCollectionFactory;
         $this->dbHelper = $dbHelper;
         $this->urlBuilder = $urlBuilder;
         $this->arrayManager = $arrayManager;
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
     }
 
     /**
@@ -286,7 +295,7 @@ class Categories extends AbstractModifier
     {
         $categoryTree = $this->getCacheManager()->load(self::CATEGORY_TREE_ID . '_' . $filter);
         if ($categoryTree) {
-            return unserialize($categoryTree);
+            return $this->serializer->unserialize($categoryTree);
         }
 
         $storeId = $this->locator->getStore()->getId();
@@ -340,7 +349,7 @@ class Categories extends AbstractModifier
         }
         
         $this->getCacheManager()->save(
-            serialize($categoryById[CategoryModel::TREE_ROOT_ID]['optgroup']),
+            $this->serializer->serialize($categoryById[CategoryModel::TREE_ROOT_ID]['optgroup']),
             self::CATEGORY_TREE_ID . '_' . $filter,
             [
                 \Magento\Catalog\Model\Category::CACHE_TAG,
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php
index 0d19b9fcbedc85e4df47ab745759282f4824b060..ac39cea10cbe3b1046d8c93af5613ad6ec518b6f 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php
@@ -8,6 +8,7 @@ namespace Magento\CatalogImportExport\Model\Import\Product\Type;
 use Magento\Framework\App\ResourceConnection;
 use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface;
 use Magento\CatalogImportExport\Model\Import\Product;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Import entity abstract product type model
@@ -142,22 +143,27 @@ abstract class AbstractType
     private $productEntityLinkField;
 
     /**
+     * AbstractType constructor
+     *
      * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac
      * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac
-     * @param \Magento\Framework\App\ResourceConnection $resource
+     * @param ResourceConnection $resource
      * @param array $params
+     * @param MetadataPool|null $metadataPool
      * @throws \Magento\Framework\Exception\LocalizedException
      */
     public function __construct(
         \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac,
         \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac,
         \Magento\Framework\App\ResourceConnection $resource,
-        array $params
+        array $params,
+        MetadataPool $metadataPool = null
     ) {
         $this->_attrSetColFac = $attrSetColFac;
         $this->_prodAttrColFac = $prodAttrColFac;
         $this->_resource = $resource;
-        $this->_connection = $resource->getConnection();
+        $this->connection = $resource->getConnection();
+        $this->metadataPool = $metadataPool ?: $this->getMetadataPool();
         if ($this->isSuitable()) {
             if (!isset($params[0])
                 || !isset($params[1])
@@ -246,8 +252,8 @@ abstract class AbstractType
     {
         // temporary storage for attributes' parameters to avoid double querying inside the loop
         $entityId = $this->_entityModel->getEntityTypeId();
-        $entityAttributes = $this->_connection->fetchAll(
-            $this->_connection->select()->from(
+        $entityAttributes = $this->connection->fetchAll(
+            $this->connection->select()->from(
                 ['attr' => $this->_resource->getTableName('eav_entity_attribute')],
                 ['attr.attribute_id']
             )->joinLeft(
@@ -255,7 +261,7 @@ abstract class AbstractType
                 'set.attribute_set_id = attr.attribute_set_id',
                 ['set.attribute_set_name']
             )->where(
-                $this->_connection->quoteInto('attr.entity_type_id IN (?)', $entityId)
+                $this->connection->quoteInto('attr.entity_type_id IN (?)', $entityId)
             )
         );
         $absentKeys = [];
@@ -563,7 +569,7 @@ abstract class AbstractType
     protected function getProductEntityLinkField()
     {
         if (!$this->productEntityLinkField) {
-            $this->productEntityLinkField = $this->getMetadataPool()
+            $this->productEntityLinkField = $this->metadataPool
                 ->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class)
                 ->getLinkField();
         }
diff --git a/app/code/Magento/CatalogRule/Model/Rule.php b/app/code/Magento/CatalogRule/Model/Rule.php
index 0da658be4cc219597faf847785e76c87fb327590..4e8b95607de4b26a0bde1cbde918a93119ebdc4d 100644
--- a/app/code/Magento/CatalogRule/Model/Rule.php
+++ b/app/code/Magento/CatalogRule/Model/Rule.php
@@ -7,6 +7,8 @@ namespace Magento\CatalogRule\Model;
 
 use Magento\Catalog\Model\Product;
 use Magento\CatalogRule\Api\Data\RuleInterface;
+use Magento\Framework\Api\AttributeValueFactory;
+use Magento\Framework\Api\ExtensionAttributesFactory;
 use Magento\Framework\DataObject\IdentityInterface;
 
 /**
@@ -137,7 +139,8 @@ class Rule extends \Magento\Rule\Model\AbstractModel implements RuleInterface, I
     protected $ruleConditionConverter;
 
     /**
-     * Rule constructor.
+     * Rule constructor
+     *
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
      * @param \Magento\Framework\Data\FormFactory $formFactory
@@ -157,6 +160,8 @@ class Rule extends \Magento\Rule\Model\AbstractModel implements RuleInterface, I
      * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection
      * @param array $relatedCacheTypes
      * @param array $data
+     * @param ExtensionAttributesFactory|null $extensionFactory
+     * @param AttributeValueFactory|null $customAttributeFactory
      *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
@@ -179,7 +184,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel implements RuleInterface, I
         \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
         array $relatedCacheTypes = [],
-        array $data = []
+        array $data = [],
+        ExtensionAttributesFactory $extensionFactory = null,
+        AttributeValueFactory $customAttributeFactory = null
     ) {
         $this->_productCollectionFactory = $productCollectionFactory;
         $this->_storeManager = $storeManager;
@@ -201,7 +208,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel implements RuleInterface, I
             $localeDate,
             $resource,
             $resourceCollection,
-            $data
+            $data,
+            $extensionFactory,
+            $customAttributeFactory
         );
     }
 
diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php
index a624b87ebbe13efa061c7e97a8590e78bd5b70fe..b3f35dbe98e0dcc042ce4272337a6ea740147d70 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php
@@ -3,14 +3,9 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\CatalogRule\Test\Unit\Model;
 
-use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
-
 /**
- * Class RuleTest
- * @package Magento\CatalogRule\Test\Unit\Model
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class RuleTest extends \PHPUnit_Framework_TestCase
@@ -18,8 +13,8 @@ class RuleTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\CatalogRule\Model\Rule */
     protected $rule;
 
-    /** @var ObjectManagerHelper */
-    protected $objectManagerHelper;
+    /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */
+    private $objectManager;
 
     /** @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject */
     protected $storeManager;
@@ -63,6 +58,7 @@ class RuleTest extends \PHPUnit_Framework_TestCase
      */
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->storeManager = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class);
         $this->storeModel = $this->getMock(\Magento\Store\Model\Store::class, ['__wakeup', 'getId'], [], '', false);
         $this->combineFactory = $this->getMock(
@@ -128,20 +124,22 @@ class RuleTest extends \PHPUnit_Framework_TestCase
             false
         );
 
-        $this->objectManagerHelper = new ObjectManagerHelper($this);
-
-        $this->prepareObjectManager([
-            [
-                \Magento\Framework\Api\ExtensionAttributesFactory::class,
-                $this->getMock(\Magento\Framework\Api\ExtensionAttributesFactory::class, [], [], '', false)
-            ],
-            [
-                \Magento\Framework\Api\AttributeValueFactory::class,
-                $this->getMock(\Magento\Framework\Api\AttributeValueFactory::class, [], [], '', false)
-            ],
-        ]);
+        $extensionFactoryMock = $this->getMock(
+            \Magento\Framework\Api\ExtensionAttributesFactory::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $attributeValueFactoryMock = $this->getMock(
+            \Magento\Framework\Api\AttributeValueFactory::class,
+            [],
+            [],
+            '',
+            false
+        );
 
-        $this->rule = $this->objectManagerHelper->getObject(
+        $this->rule = $this->objectManager->getObject(
             \Magento\CatalogRule\Model\Rule::class,
             [
                 'storeManager' => $this->storeManager,
@@ -149,6 +147,8 @@ class RuleTest extends \PHPUnit_Framework_TestCase
                 'ruleProductProcessor' => $this->_ruleProductProcessor,
                 'productCollectionFactory' => $this->_productCollectionFactory,
                 'resourceIterator' => $this->_resourceIterator,
+                'extensionFactory' => $extensionFactoryMock,
+                'customAttributeFactory' => $attributeValueFactoryMock,
             ]
         );
     }
@@ -375,20 +375,4 @@ class RuleTest extends \PHPUnit_Framework_TestCase
         $expectedResult = 'form_namerule_conditions_fieldset_100';
         $this->assertEquals($expectedResult, $this->rule->getConditionsFieldSetId($formName));
     }
-
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php b/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php
index a8ada4d409f61d908639f2a628dc766678f182cf..f63e06efc18d5dc4d59d991d0d94b7d915416dde 100644
--- a/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php
+++ b/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php
@@ -9,10 +9,12 @@ use Magento\Catalog\Model\Product;
 use Magento\Framework\Api\FilterBuilder;
 use Magento\Framework\Api\Search\SearchCriteriaBuilder;
 use Magento\Framework\Api\Search\SearchResultFactory;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Search\Adapter\Mysql\TemporaryStorage;
 use Magento\Framework\Search\Request\EmptyRequestDataException;
 use Magento\Framework\Search\Request\NonExistingRequestNameException;
+use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
 
 /**
  * Collection Advanced
@@ -54,7 +56,8 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
     private $filterBuilder;
 
     /**
-     * Collection constructor.
+     * Collection constructor
+     *
      * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
      * @param \Psr\Log\LoggerInterface $logger
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
@@ -77,8 +80,11 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
      * @param \Magento\CatalogSearch\Model\Advanced\Request\Builder $requestBuilder
      * @param \Magento\Search\Model\SearchEngine $searchEngine
      * @param \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory $temporaryStorageFactory
-     * @param \Zend_Db_Adapter_Abstract $connection
-     * @param SearchResultFactory $searchResultFactory
+     * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
+     * @param SearchResultFactory|null $searchResultFactory
+     * @param ProductLimitationFactory|null $productLimitationFactory
+     * @param MetadataPool|null $metadataPool
+     *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -104,8 +110,10 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
         \Magento\CatalogSearch\Model\Advanced\Request\Builder $requestBuilder,
         \Magento\Search\Model\SearchEngine $searchEngine,
         \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory $temporaryStorageFactory,
-        $connection = null,
-        SearchResultFactory $searchResultFactory = null
+        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
+        SearchResultFactory $searchResultFactory = null,
+        ProductLimitationFactory $productLimitationFactory = null,
+        MetadataPool $metadataPool = null
     ) {
         $this->requestBuilder = $requestBuilder;
         $this->searchEngine = $searchEngine;
@@ -134,7 +142,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
             $customerSession,
             $dateTime,
             $groupManagement,
-            $connection
+            $connection,
+            $productLimitationFactory,
+            $metadataPool
         );
     }
 
diff --git a/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php b/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php
index 8a9e2b1917407d42089c1a1b5958eee0d51d8a25..bc7568a471160dbb9376e9a4482a5b0ef43ca28e 100644
--- a/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php
+++ b/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php
@@ -7,6 +7,7 @@ namespace Magento\CatalogSearch\Model\ResourceModel\Fulltext;
 
 use Magento\CatalogSearch\Model\Search\RequestGenerator;
 use Magento\Framework\DB\Select;
+use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Framework\Exception\StateException;
 use Magento\Framework\Search\Adapter\Mysql\TemporaryStorage;
 use Magento\Framework\Search\Response\QueryResponse;
@@ -15,6 +16,7 @@ use Magento\Framework\Search\Request\NonExistingRequestNameException;
 use Magento\Framework\Api\Search\SearchResultFactory;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\App\ObjectManager;
+use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
 
 /**
  * Fulltext Collection
@@ -94,6 +96,8 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
     private $filterBuilder;
 
     /**
+     * Collection constructor
+     *
      * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
      * @param \Psr\Log\LoggerInterface $logger
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
@@ -117,9 +121,12 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
      * @param \Magento\Framework\Search\Request\Builder $requestBuilder
      * @param \Magento\Search\Model\SearchEngine $searchEngine
      * @param \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory $temporaryStorageFactory
-     * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
+     * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
      * @param string $searchRequestName
-     * @param SearchResultFactory $searchResultFactory
+     * @param SearchResultFactory|null $searchResultFactory
+     * @param ProductLimitationFactory|null $productLimitationFactory
+     * @param MetadataPool|null $metadataPool
+     *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -148,7 +155,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
         \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory $temporaryStorageFactory,
         \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
         $searchRequestName = 'catalog_view_container',
-        SearchResultFactory $searchResultFactory = null
+        SearchResultFactory $searchResultFactory = null,
+        ProductLimitationFactory $productLimitationFactory = null,
+        MetadataPool $metadataPool = null
     ) {
         $this->queryFactory = $catalogSearchData;
         if ($searchResultFactory === null) {
@@ -175,7 +184,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
             $customerSession,
             $dateTime,
             $groupManagement,
-            $connection
+            $connection,
+            $productLimitationFactory,
+            $metadataPool
         );
         $this->requestBuilder = $requestBuilder;
         $this->searchEngine = $searchEngine;
diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Advanced/CollectionTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Advanced/CollectionTest.php
index 96580c6764e9387e522a8c6d3a92d43e45869594..4b04e7d66ab569ab3d2e6219cef4e2b69268d8e0 100644
--- a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Advanced/CollectionTest.php
+++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Advanced/CollectionTest.php
@@ -7,7 +7,7 @@ namespace Magento\CatalogSearch\Test\Unit\Model\ResourceModel\Advanced;
 
 use Magento\Catalog\Model\Product;
 use Magento\CatalogSearch\Test\Unit\Model\ResourceModel\BaseCollectionTest;
-use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+use \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
 
 /**
  * Tests Magento\CatalogSearch\Model\ResourceModel\Advanced\Collection
@@ -16,6 +16,11 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHe
  */
 class CollectionTest extends BaseCollectionTest
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\CatalogSearch\Model\ResourceModel\Advanced\Collection
      */
@@ -51,8 +56,7 @@ class CollectionTest extends BaseCollectionTest
      */
     protected function setUp()
     {
-        $helper = new ObjectManagerHelper($this);
-
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->eavConfig = $this->getMock(\Magento\Eav\Model\Config::class, [], [], '', false);
         $storeManager = $this->getStoreManager();
         $universalFactory = $this->getUniversalFactory();
@@ -67,13 +71,14 @@ class CollectionTest extends BaseCollectionTest
         );
         $this->search = $this->getMock(\Magento\Search\Api\SearchInterface::class, [], [], '', false);
 
-        $this->prepareObjectManager([
-            [\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class,
-                $this->getMock(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class)
-            ],
-        ]);
+        $productLimitationMock = $this->getMock(
+            \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class
+        );
+        $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']);
+        $productLimitationFactoryMock->method('create')
+            ->willReturn($productLimitationMock);
 
-        $this->advancedCollection = $helper->getObject(
+        $this->advancedCollection = $this->objectManager->getObject(
             \Magento\CatalogSearch\Model\ResourceModel\Advanced\Collection::class,
             [
                 'eavConfig' => $this->eavConfig,
@@ -83,6 +88,7 @@ class CollectionTest extends BaseCollectionTest
                 'filterBuilder' => $this->filterBuilder,
                 'temporaryStorageFactory' => $this->temporaryStorageFactory,
                 'search' => $this->search,
+                'productLimitationFactory' => $productLimitationFactoryMock,
             ]
         );
     }
@@ -150,20 +156,4 @@ class CollectionTest extends BaseCollectionTest
             ->getMock();
         return $criteriaBuilder;
     }
-
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Fulltext/CollectionTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Fulltext/CollectionTest.php
index 84430c56476c05463043670d024b79b3482affcb..5e56a253563592a55b80b00d26432028d9f4c5fa 100644
--- a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Fulltext/CollectionTest.php
+++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Fulltext/CollectionTest.php
@@ -8,12 +8,18 @@ namespace Magento\CatalogSearch\Test\Unit\Model\ResourceModel\Fulltext;
 use Magento\CatalogSearch\Test\Unit\Model\ResourceModel\BaseCollectionTest;
 use Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory;
 use PHPUnit_Framework_MockObject_MockObject as MockObject;
+use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class CollectionTest extends BaseCollectionTest
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\Framework\Search\Adapter\Mysql\TemporaryStorage|\PHPUnit_Framework_MockObject_MockObject
      */
@@ -64,22 +70,19 @@ class CollectionTest extends BaseCollectionTest
      */
     protected function setUp()
     {
-        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->storeManager = $this->getStoreManager();
         $this->universalFactory = $this->getUniversalFactory();
         $this->scopeConfig = $this->getScopeConfig();
         $this->criteriaBuilder = $this->getCriteriaBuilder();
         $this->filterBuilder = $this->getFilterBuilder();
 
-        $this->prepareObjectManager(
-            [
-                [
-                    \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class,
-                    $this->getMock(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class)
-                ],
-            ]
+        $productLimitationMock = $this->getMock(
+            \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class
         );
+        $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']);
+        $productLimitationFactoryMock->method('create')
+            ->willReturn($productLimitationMock);
 
         $this->temporaryStorage = $this->getMockBuilder(\Magento\Framework\Search\Adapter\Mysql\TemporaryStorage::class)
             ->disableOriginalConstructor()
@@ -92,13 +95,14 @@ class CollectionTest extends BaseCollectionTest
             ->method('create')
             ->willReturn($this->temporaryStorage);
 
-        $this->model = $helper->getObject(
+        $this->model = $this->objectManager->getObject(
             \Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection::class,
             [
                 'storeManager' => $this->storeManager,
                 'universalFactory' => $this->universalFactory,
                 'scopeConfig' => $this->scopeConfig,
-                'temporaryStorageFactory' => $temporaryStorageFactory
+                'temporaryStorageFactory' => $temporaryStorageFactory,
+                'productLimitationFactory' => $productLimitationFactoryMock
             ]
         );
 
@@ -110,6 +114,13 @@ class CollectionTest extends BaseCollectionTest
         $this->model->setFilterBuilder($this->filterBuilder);
     }
 
+    protected function tearDown()
+    {
+        $reflectionProperty = new \ReflectionProperty(\Magento\Framework\App\ObjectManager::class, '_instance');
+        $reflectionProperty->setAccessible(true);
+        $reflectionProperty->setValue(null);
+    }
+
     /**
      * @expectedException \Exception
      * @expectedExceptionCode 333
@@ -208,22 +219,6 @@ class CollectionTest extends BaseCollectionTest
         return $filterBuilder;
     }
 
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
-
     protected function createFilter()
     {
         $filter = $this->getMockBuilder(\Magento\Framework\Api\Filter::class)
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/View.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/View.php
index ea28b20f3f8f6d58211377bd9b16034d8f04a23c..01ef3e4ff8be217883ae1109e1d778b03dc316e2 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/View.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/View.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\CatalogUrlRewrite\Model\Category\Plugin\Store;
 
+use Magento\Catalog\Model\Category;
 use Magento\Catalog\Model\CategoryFactory;
 use Magento\Catalog\Model\ProductFactory;
 use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
@@ -13,6 +14,13 @@ use Magento\Framework\Model\AbstractModel;
 use Magento\UrlRewrite\Model\UrlPersistInterface;
 use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
 
+/**
+ * Plugin which is listening store resource model and on save or on delete replace catalog url rewrites
+ *
+ * @see \Magento\Store\Model\ResourceModel\Store
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * @package Magento\CatalogUrlRewrite\Model\Category\Plugin\Store
+ */
 class View
 {
     /** @var UrlPersistInterface */
@@ -30,6 +38,11 @@ class View
     /** @var ProductUrlRewriteGenerator */
     protected $productUrlRewriteGenerator;
 
+    /**
+     * @var AbstractModel
+     */
+    private $origStore;
+
     /**
      * @param UrlPersistInterface $urlPersist
      * @param CategoryFactory $categoryFactory
@@ -52,34 +65,48 @@ class View
     }
 
     /**
-     * Perform updating url for categories and products assigned to the store view
-     *
-     * @param \Magento\Store\Model\ResourceModel\Store $subject
-     * @param \Magento\Store\Model\ResourceModel\Store $result
+     * @param \Magento\Store\Model\ResourceModel\Store $object
      * @param AbstractModel $store
+     * @return void
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function beforeSave(
+        \Magento\Store\Model\ResourceModel\Store $object,
+        AbstractModel $store
+    ) {
+        $this->origStore = $store;
+    }
+
+    /**
+     * Regenerate urls on store after save
+     *
+     * @param \Magento\Store\Model\ResourceModel\Store $object
+     * @param \Magento\Store\Model\ResourceModel\Store $store
      * @return \Magento\Store\Model\ResourceModel\Store
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function afterSave(
-        \Magento\Store\Model\ResourceModel\Store $subject,
-        \Magento\Store\Model\ResourceModel\Store $result,
-        AbstractModel $store
+        \Magento\Store\Model\ResourceModel\Store $object,
+        \Magento\Store\Model\ResourceModel\Store $store
     ) {
-        if ($store->isObjectNew() || $store->dataHasChangedFor('group_id')) {
-            if (!$store->isObjectNew()) {
-                $this->urlPersist->deleteByData([UrlRewrite::STORE_ID => $store->getId()]);
+        if ($this->origStore->isObjectNew() || $this->origStore->dataHasChangedFor('group_id')) {
+            if (!$this->origStore->isObjectNew()) {
+                $this->urlPersist->deleteByData([UrlRewrite::STORE_ID => $this->origStore->getId()]);
             }
 
             $this->urlPersist->replace(
-                $this->generateCategoryUrls($store->getRootCategoryId(), $store->getId())
+                $this->generateCategoryUrls($this->origStore->getRootCategoryId(), $this->origStore->getId())
             );
 
             $this->urlPersist->replace(
-                $this->generateProductUrls($store->getWebsiteId(), $store->getOrigData('website_id'), $store->getId())
+                $this->generateProductUrls(
+                    $this->origStore->getWebsiteId(),
+                    $this->origStore->getOrigData('website_id'),
+                    $this->origStore->getId()
+                )
             );
         }
-
-        return $result;
+        return $store;
     }
 
     /**
@@ -101,7 +128,6 @@ class View
             ->addCategoryIds()
             ->addAttributeToSelect(['name', 'url_path', 'url_key', 'visibility'])
             ->addWebsiteFilter($websiteIds);
-
         foreach ($collection as $product) {
             $product->setStoreId($storeId);
             /** @var \Magento\Catalog\Model\Product $product */
@@ -110,7 +136,6 @@ class View
                 $this->productUrlRewriteGenerator->generate($product)
             );
         }
-
         return $urls;
     }
 
@@ -131,7 +156,6 @@ class View
                 $this->categoryUrlRewriteGenerator->generate($category)
             );
         }
-
         return $urls;
     }
 
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Store/ViewTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Store/ViewTest.php
index d30c2dde6e033fd3f3d10300ed59aa7a6c249916..ac2e42ebea7834a8b35cff1ee26dd2a936479ce3 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Store/ViewTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Store/ViewTest.php
@@ -137,6 +137,17 @@ class ViewTest extends \PHPUnit_Framework_TestCase
 
     public function testAfterSave()
     {
+        $origStoreMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $reflectionStore = new \ReflectionClass($this->plugin);
+        $origStore = $reflectionStore->getProperty('origStore');
+        $origStore->setAccessible(true);
+        $origStore->setValue($this->plugin, $origStoreMock);
+        $origStoreMock->expects($this->atLeastOnce())
+            ->method('isObjectNew')
+            ->willReturn(true);
+
         $this->abstractModelMock->expects($this->any())
             ->method('isObjectNew')
             ->willReturn(true);
diff --git a/app/code/Magento/CatalogWidget/Block/Product/Widget/Conditions.php b/app/code/Magento/CatalogWidget/Block/Product/Widget/Conditions.php
index d57db33131b9d3cbe16f60119b9e97b82d72cdad..9a407b118461c19e0db02b92ad2b16a8eb8f5816 100644
--- a/app/code/Magento/CatalogWidget/Block/Product/Widget/Conditions.php
+++ b/app/code/Magento/CatalogWidget/Block/Product/Widget/Conditions.php
@@ -85,7 +85,7 @@ class Conditions extends Template implements RendererInterface
         $widget = $this->registry->registry('current_widget_instance');
         if ($widget) {
             $widgetParameters = $widget->getWidgetParameters();
-        } elseif($widgetOptions = $this->getLayout()->getBlock('wysiwyg_widget.options')) {
+        } elseif ($widgetOptions = $this->getLayout()->getBlock('wysiwyg_widget.options')) {
             $widgetParameters = $widgetOptions->getWidgetValues();
         }
 
@@ -100,6 +100,7 @@ class Conditions extends Template implements RendererInterface
     public function render(AbstractElement $element)
     {
         $this->element = $element;
+        $this->rule->getConditions()->setJsFormObject($this->getHtmlId());
         return $this->toHtml();
     }
 
diff --git a/app/code/Magento/CatalogWidget/Model/Rule.php b/app/code/Magento/CatalogWidget/Model/Rule.php
index 8258d3f1a8b4ff603650d99cc0dc7d38940cbd15..06bc8cba74dd6a86a84a959464f93bbc52ecbd45 100644
--- a/app/code/Magento/CatalogWidget/Model/Rule.php
+++ b/app/code/Magento/CatalogWidget/Model/Rule.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\CatalogWidget\Model;
 
+use Magento\Framework\Api\AttributeValueFactory;
+use Magento\Framework\Api\ExtensionAttributesFactory;
 
 /**
  * Class Rule
@@ -17,6 +19,8 @@ class Rule extends \Magento\Rule\Model\AbstractModel
     protected $conditionsFactory;
 
     /**
+     * Rule constructor
+     *
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
      * @param \Magento\Framework\Data\FormFactory $formFactory
@@ -25,6 +29,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel
      * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection
      * @param array $data
+     * @param ExtensionAttributesFactory|null $extensionFactory
+     * @param AttributeValueFactory|null $customAttributeFactory
+     *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -35,7 +42,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel
         \Magento\CatalogWidget\Model\Rule\Condition\CombineFactory $conditionsFactory,
         \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
-        array $data = []
+        array $data = [],
+        ExtensionAttributesFactory $extensionFactory = null,
+        AttributeValueFactory $customAttributeFactory = null
     ) {
         $this->conditionsFactory = $conditionsFactory;
         parent::__construct(
@@ -45,7 +54,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel
             $localeDate,
             $resource,
             $resourceCollection,
-            $data
+            $data,
+            $extensionFactory,
+            $customAttributeFactory
         );
     }
 
diff --git a/app/code/Magento/CatalogWidget/Test/Unit/Block/Product/Widget/ConditionsTest.php b/app/code/Magento/CatalogWidget/Test/Unit/Block/Product/Widget/ConditionsTest.php
index 8d87c0ebf0d21768bbe05f5903aded09011e1663..b825e92bab1c2ef2eea4d2c08cd8da1ac1e9e192 100644
--- a/app/code/Magento/CatalogWidget/Test/Unit/Block/Product/Widget/ConditionsTest.php
+++ b/app/code/Magento/CatalogWidget/Test/Unit/Block/Product/Widget/ConditionsTest.php
@@ -15,6 +15,7 @@ use Magento\Framework\View\Element\BlockInterface;
 
 /**
  * Test class for \Magento\CatalogWidget\Block\Product\Widget\Conditions
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class ConditionsTest extends \PHPUnit_Framework_TestCase
 {
@@ -175,4 +176,116 @@ class ConditionsTest extends \PHPUnit_Framework_TestCase
             ]
         );
     }
+
+    /**
+     * @return void
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     */
+    public function testRender()
+    {
+        $data = ['area' => 'backend'];
+        $abstractElementMock = $this->getMock(
+            \Magento\Framework\Data\Form\Element\AbstractElement::class,
+            ['getContainer'],
+            [],
+            '',
+            false
+        );
+        $eventManagerMock = $this->getMock(
+            \Magento\Framework\Event\ManagerInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $scopeConfigMock = $this->getMock(
+            \Magento\Framework\App\Config\ScopeConfigInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $fieldsetMock = $this->getMock(
+            \Magento\Framework\Data\Form\Element\Fieldset::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $combineMock = $this->getMock(
+            \Magento\Rule\Model\Condition\Combine::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $resolverMock = $this->getMock(
+            \Magento\Framework\View\Element\Template\File\Resolver::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $filesystemMock = $this->getMock(
+            \Magento\Framework\Filesystem::class,
+            ['getDirectoryRead'],
+            [],
+            '',
+            false
+        );
+        $validatorMock = $this->getMock(
+            \Magento\Framework\View\Element\Template\File\Validator::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $templateEnginePoolMock = $this->getMock(
+            \Magento\Framework\View\TemplateEnginePool::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $templateEngineMock = $this->getMock(
+            \Magento\Framework\View\TemplateEngineInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $directoryReadMock = $this->getMock(
+            \Magento\Framework\Filesystem\Directory\ReadInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->ruleMock->expects($this->once())->method('getConditions')->willReturn($combineMock);
+        $combineMock->expects($this->once())->method('setJsFormObject')->willReturnSelf();
+        $abstractElementMock->expects($this->any())->method('getContainer')->willReturn($fieldsetMock);
+        $filesystemMock->expects($this->once())->method('getDirectoryRead')->willReturn($directoryReadMock);
+        $validatorMock->expects($this->once())->method('isValid')->willReturn(true);
+        $this->contextMock->expects($this->once())->method('getEnginePool')->willReturn($templateEnginePoolMock);
+        $templateEnginePoolMock->expects($this->once())->method('get')->willReturn($templateEngineMock);
+        $templateEngineMock->expects($this->once())->method('render')->willReturn('html');
+
+        $this->widgetConditions = $this->objectManagerHelper->getObject(
+            Conditions::class,
+            [
+                'context' => $this->contextMock,
+                'registry' => $this->registryMock,
+                'rule' => $this->ruleMock,
+                '_eventManager' => $eventManagerMock,
+                '_filesystem' => $filesystemMock,
+                '_scopeConfig' => $scopeConfigMock,
+                'validator' => $validatorMock,
+                'resolver' => $resolverMock,
+                'data' => $data
+            ]
+        );
+
+        $this->assertEquals($this->widgetConditions->render($abstractElementMock), 'html');
+    }
 }
diff --git a/app/code/Magento/CatalogWidget/Test/Unit/Model/RuleTest.php b/app/code/Magento/CatalogWidget/Test/Unit/Model/RuleTest.php
index afcc540a375458a6fc0be2f0740b7e4d0ff58c23..a6468cc77a47f093a7f95f1694f10f4812ce0e1c 100644
--- a/app/code/Magento/CatalogWidget/Test/Unit/Model/RuleTest.php
+++ b/app/code/Magento/CatalogWidget/Test/Unit/Model/RuleTest.php
@@ -3,13 +3,15 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\CatalogWidget\Test\Unit\Model;
 
-use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
-
 class RuleTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\CatalogWidget\Model\Rule
      */
@@ -22,25 +24,13 @@ class RuleTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->combineFactory = $this->getMockBuilder(\Magento\CatalogWidget\Model\Rule\Condition\CombineFactory::class)
             ->setMethods(['create'])
             ->disableOriginalConstructor()
             ->getMock();
 
-        $objectManagerHelper = new ObjectManagerHelper($this);
-
-        $this->prepareObjectManager([
-            [
-                \Magento\Framework\Api\ExtensionAttributesFactory::class,
-                $this->getMock(\Magento\Framework\Api\ExtensionAttributesFactory::class, [], [], '', false)
-            ],
-            [
-                \Magento\Framework\Api\AttributeValueFactory::class,
-                $this->getMock(\Magento\Framework\Api\AttributeValueFactory::class, [], [], '', false)
-            ],
-        ]);
-
-        $this->rule = $objectManagerHelper->getObject(
+        $this->rule = $this->objectManager->getObject(
             \Magento\CatalogWidget\Model\Rule::class,
             [
                 'conditionsFactory' => $this->combineFactory
@@ -62,20 +52,4 @@ class RuleTest extends \PHPUnit_Framework_TestCase
     {
         $this->assertNull($this->rule->getActionsInstance());
     }
-
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/Checkout/Test/Unit/Model/ShippingInformationManagementTest.php b/app/code/Magento/Checkout/Test/Unit/Model/ShippingInformationManagementTest.php
index 04d347ec237a9435964a5f4fcce784708c4365a4..402a0c8228356a7ae8a148d7626e06bb5dc15a27 100644
--- a/app/code/Magento/Checkout/Test/Unit/Model/ShippingInformationManagementTest.php
+++ b/app/code/Magento/Checkout/Test/Unit/Model/ShippingInformationManagementTest.php
@@ -11,6 +11,11 @@ namespace Magento\Checkout\Test\Unit\Model;
  */
 class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
@@ -31,26 +36,6 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase
      */
     protected $quoteRepositoryMock;
 
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $addressValidatorMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $loggerMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $addressRepositoryMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $scopeConfigMock;
-
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
@@ -61,11 +46,6 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase
      */
     protected $quoteMock;
 
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $totalsCollectorMock;
-
     /**
      * @var \Magento\Checkout\Model\ShippingInformationManagement
      */
@@ -103,6 +83,7 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->paymentMethodManagementMock = $this->getMock(\Magento\Quote\Api\PaymentMethodManagementInterface::class);
         $this->paymentDetailsFactoryMock = $this->getMock(
             \Magento\Checkout\Model\PaymentDetailsFactory::class,
@@ -113,18 +94,6 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase
         );
         $this->cartTotalsRepositoryMock = $this->getMock(\Magento\Quote\Api\CartTotalRepositoryInterface::class);
         $this->quoteRepositoryMock = $this->getMock(\Magento\Quote\Api\CartRepositoryInterface::class);
-        $this->addressValidatorMock = $this->getMock(
-            \Magento\Quote\Model\QuoteAddressValidator::class,
-            [],
-            [],
-            '',
-            false
-        );
-        $this->loggerMock = $this->getMock(\Psr\Log\LoggerInterface::class);
-        $this->addressRepositoryMock = $this->getMock(\Magento\Customer\Api\AddressRepositoryInterface::class);
-        $this->scopeConfigMock = $this->getMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
-        $this->totalsCollectorMock =
-            $this->getMock(\Magento\Quote\Model\Quote\TotalsCollector::class, [], [], '', false);
         $this->shippingAddressMock = $this->getMock(
             \Magento\Quote\Model\Quote\Address::class,
             [
@@ -175,22 +144,29 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase
         $this->shippingFactoryMock =
             $this->getMock(\Magento\Quote\Model\ShippingFactory::class, ['create'], [], '', false);
 
-        $this->prepareObjectManager([
-            [\Magento\Quote\Model\ShippingAssignmentFactory::class, $this->shippingAssignmentFactoryMock],
-            [\Magento\Quote\Api\Data\CartExtensionFactory::class, $this->cartExtensionFactoryMock],
-            [\Magento\Quote\Model\ShippingFactory::class, $this->shippingFactoryMock],
-        ]);
-
-        $this->model = new \Magento\Checkout\Model\ShippingInformationManagement(
-            $this->paymentMethodManagementMock,
-            $this->paymentDetailsFactoryMock,
-            $this->cartTotalsRepositoryMock,
-            $this->quoteRepositoryMock,
-            $this->addressValidatorMock,
-            $this->loggerMock,
-            $this->addressRepositoryMock,
-            $this->scopeConfigMock,
-            $this->totalsCollectorMock
+        $this->model = $this->objectManager->getObject(
+            \Magento\Checkout\Model\ShippingInformationManagement::class,
+            [
+                'paymentMethodManagement' => $this->paymentMethodManagementMock,
+                'paymentDetailsFactory' => $this->paymentDetailsFactoryMock,
+                'cartTotalsRepository' => $this->cartTotalsRepositoryMock,
+                'quoteRepository' => $this->quoteRepositoryMock,
+            ]
+        );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->model,
+            'shippingAssignmentFactory',
+            $this->shippingAssignmentFactoryMock
+        );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->model,
+            'cartExtensionFactory',
+            $this->cartExtensionFactoryMock
+        );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->model,
+            'shippingFactory',
+            $this->shippingFactoryMock
         );
     }
 
@@ -457,20 +433,4 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase
             $this->model->saveAddressInformation($cartId, $addressInformationMock)
         );
     }
-
-    /**
-     * @param array $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php b/app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php
index cb0b184051b0f94cb1ffa625de0bfe8d8fcce660..90760f3b43247f18935d9fdeecea4a080ee38fff 100644
--- a/app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php
@@ -6,6 +6,8 @@
 namespace Magento\Cms\Test\Unit\Model\Template;
 
 /**
+ * Work with catalog(store, website) urls
+ *
  * @covers \Magento\Cms\Model\Template\Filter
  */
 class FilterTest extends \PHPUnit_Framework_TestCase
diff --git a/app/code/Magento/Config/App/Config/Source/ModularConfigSource.php b/app/code/Magento/Config/App/Config/Source/ModularConfigSource.php
new file mode 100644
index 0000000000000000000000000000000000000000..b86c9144fac40416f4e4b13aa91a4638cabf7cb2
--- /dev/null
+++ b/app/code/Magento/Config/App/Config/Source/ModularConfigSource.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\App\Config\Source;
+
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\DataObject;
+use Magento\Framework\App\Config\Initial\Reader;
+
+/**
+ * Class for retrieving initial configuration from modules
+ */
+class ModularConfigSource implements ConfigSourceInterface
+{
+    /**
+     * @var Reader
+     */
+    private $reader;
+
+    /**
+     * @param Reader $reader
+     */
+    public function __construct(Reader $reader)
+    {
+        $this->reader = $reader;
+    }
+
+    /**
+     * Get initial data
+     *
+     * @param string $path Format is scope type and scope code separated by slash: e.g. "type/code"
+     * @return array
+     */
+    public function get($path = '')
+    {
+        $data = new DataObject($this->reader->read());
+        if ($path !== '') {
+            $path = '/' . $path;
+        }
+        return $data->getData('data' . $path) ?: [];
+    }
+}
diff --git a/app/code/Magento/Config/App/Config/Source/RuntimeConfigSource.php b/app/code/Magento/Config/App/Config/Source/RuntimeConfigSource.php
new file mode 100644
index 0000000000000000000000000000000000000000..7cd3a8ef76d4e06f1168e01de49c2645c931dc58
--- /dev/null
+++ b/app/code/Magento/Config/App/Config/Source/RuntimeConfigSource.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\App\Config\Source;
+
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\DataObject;
+use Magento\Config\Model\ResourceModel\Config\Data\CollectionFactory;
+use Magento\Framework\App\Config\Scope\Converter;
+
+/**
+ * Class for retrieving runtime configuration from database.
+ */
+class RuntimeConfigSource implements ConfigSourceInterface
+{
+    /**
+     * @var CollectionFactory
+     */
+    private $collectionFactory;
+
+    /**
+     * @var Converter
+     */
+    private $converter;
+
+    /**
+     * @var ScopeCodeResolver
+     */
+    private $scopeCodeResolver;
+
+    /**
+     * @param CollectionFactory $collectionFactory
+     * @param ScopeCodeResolver $scopeCodeResolver
+     * @param Converter $converter
+     */
+    public function __construct(
+        CollectionFactory $collectionFactory,
+        ScopeCodeResolver $scopeCodeResolver,
+        Converter $converter
+    ) {
+        $this->collectionFactory = $collectionFactory;
+        $this->converter = $converter;
+        $this->scopeCodeResolver = $scopeCodeResolver;
+    }
+
+    /**
+     * Get initial data.
+     *
+     * @param string $path Format is scope type and scope code separated by slash: e.g. "type/code"
+     * @return array
+     */
+    public function get($path = '')
+    {
+        $data = new DataObject($this->loadConfig());
+        return $data->getData($path) ?: [];
+    }
+
+    /**
+     * Load config from database.
+     *
+     * Load collection from db and presents it in array with path keys, like:
+     * * scope/key/key *
+     *
+     * @return array
+     */
+    private function loadConfig()
+    {
+        try {
+            $collection = $this->collectionFactory->create();
+        } catch (\DomainException $e) {
+            $collection = [];
+        }
+        $config = [];
+        foreach ($collection as $item) {
+            if ($item->getScope() === ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
+                $config[$item->getScope()][$item->getPath()] = $item->getValue();
+            } else {
+                $code = $this->scopeCodeResolver->resolve($item->getScope(), $item->getScopeId());
+                $config[$item->getScope()][$code][$item->getPath()] = $item->getValue();
+            }
+        }
+
+        foreach ($config as $scope => &$item) {
+            if ($scope === ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
+                $item = $this->converter->convert($item);
+            } else {
+                foreach ($item as &$scopeItems) {
+                    $scopeItems = $this->converter->convert($scopeItems);
+                }
+            }
+        }
+        return $config;
+    }
+}
diff --git a/app/code/Magento/Config/App/Config/Type/System.php b/app/code/Magento/Config/App/Config/Type/System.php
new file mode 100644
index 0000000000000000000000000000000000000000..4a3c6da8379153a240e4869592fcef31788df608
--- /dev/null
+++ b/app/code/Magento/Config/App/Config/Type/System.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\App\Config\Type;
+
+use Magento\Framework\App\Config\ConfigTypeInterface;
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\App\Config\Spi\PostProcessorInterface;
+use Magento\Framework\Cache\FrontendInterface;
+use Magento\Framework\DataObject;
+use Magento\Framework\Serialize\Serializer\Serialize;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Store\Model\Config\Processor\Fallback;
+
+/**
+ * Class process source, cache them and retrieve value by path
+ *
+ * @package Magento\Config\App\Config\Type
+ */
+class System implements ConfigTypeInterface
+{
+    const CACHE_TAG = 'config_scopes';
+
+    const CONFIG_TYPE = 'system';
+
+    /**
+     * @var ConfigSourceInterface
+     */
+    private $source;
+
+    /**
+     * @var DataObject[]
+     */
+    private $data;
+
+    /**
+     * @var PostProcessorInterface
+     */
+    private $postProcessor;
+
+    /**
+     * @var FrontendInterface
+     */
+    private $cache;
+
+    /**
+     * @var int
+     */
+    private $cachingNestedLevel;
+
+    /**
+     * @var Fallback
+     */
+    private $fallback;
+
+    /**
+     * @var Serialize
+     */
+    private $serializer;
+
+    /**
+     * System constructor.
+     * @param ConfigSourceInterface $source
+     * @param PostProcessorInterface $postProcessor
+     * @param Fallback $fallback
+     * @param FrontendInterface $cache
+     * @param int $cachingNestedLevel
+     * @param Serialize $serializer
+     */
+    public function __construct(
+        ConfigSourceInterface $source,
+        PostProcessorInterface $postProcessor,
+        Fallback $fallback,
+        FrontendInterface $cache,
+        Serialize $serializer,
+        $cachingNestedLevel = 1
+    ) {
+        $this->source = $source;
+        $this->postProcessor = $postProcessor;
+        $this->cache = $cache;
+        $this->cachingNestedLevel = $cachingNestedLevel;
+        $this->fallback = $fallback;
+        $this->serializer = $serializer;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function get($path = '')
+    {
+        if ($path === null) {
+            $path = '';
+        }
+        if (!$this->data) {
+            $data = $this->cache->load(self::CONFIG_TYPE);
+            if (!$data) {
+                $data = $this->fallback->process($this->source->get());
+                $this->data = new DataObject($data);
+                //Placeholder processing need system config - so we need to save intermediate result
+                $data = $this->postProcessor->process($data);
+                $this->data = new DataObject($data);
+                $this->cache->save(
+                    $this->serializer->serialize($this->data->getData()),
+                    self::CONFIG_TYPE,
+                    [self::CACHE_TAG]
+                );
+            } else {
+                $this->data = new DataObject($this->serializer->unserialize($data));
+            }
+        }
+
+        return $this->data->getData($path);
+    }
+
+    /**
+     * Clean cache and global variables cache
+     *
+     * @return void
+     */
+    public function clean()
+    {
+        $this->data = null;
+        $this->cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_TAG, [self::CACHE_TAG]);
+    }
+}
diff --git a/app/code/Magento/Config/Block/System/Config/Form.php b/app/code/Magento/Config/Block/System/Config/Form.php
index 9ac2016d8897a667a1c19a3d9995c633ae96371a..d1a0da2a700a3f628c83ac2d61029bc915cd3ba6 100644
--- a/app/code/Magento/Config/Block/System/Config/Form.php
+++ b/app/code/Magento/Config/Block/System/Config/Form.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\Config\Block\System\Config;
 
+use Magento\Config\App\Config\Type\System;
+use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
+use Magento\Framework\App\DeploymentConfig;
+use Magento\Framework\App\ObjectManager;
+
 /**
  * System config form block
  *
@@ -96,6 +101,16 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
      */
     protected $_fieldFactory;
 
+    /**
+     * @var SettingChecker
+     */
+    private $settingChecker;
+
+    /**
+     * @var DeploymentConfig
+     */
+    private $appConfig;
+
     /**
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -129,6 +144,18 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         ];
     }
 
+    /**
+     * @deprecated
+     * @return SettingChecker
+     */
+    private function getSettingChecker()
+    {
+        if ($this->settingChecker === null) {
+            $this->settingChecker = ObjectManager::getInstance()->get(SettingChecker::class);
+        }
+        return $this->settingChecker;
+    }
+
     /**
      * Initialize objects required to render config form
      *
@@ -305,25 +332,27 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         $labelPrefix = ''
     ) {
         $inherit = true;
-        $data = null;
-        if (array_key_exists($path, $this->_configData)) {
-            $data = $this->_configData[$path];
-            $inherit = false;
-            
-            if ($field->hasBackendModel()) {
-                $backendModel = $field->getBackendModel();
-                $backendModel->setPath($path)
-                    ->setValue($data)
-                    ->setWebsite($this->getWebsiteCode())
-                    ->setStore($this->getStoreCode())
-                    ->afterLoad();
-                $data = $backendModel->getValue();
+        $data = $this->getAppConfigDataValue($path);
+        if ($data === null) {
+            if (array_key_exists($path, $this->_configData)) {
+                $data = $this->_configData[$path];
+                $inherit = false;
+
+                if ($field->hasBackendModel()) {
+                    $backendModel = $field->getBackendModel();
+                    $backendModel->setPath($path)
+                        ->setValue($data)
+                        ->setWebsite($this->getWebsiteCode())
+                        ->setStore($this->getStoreCode())
+                        ->afterLoad();
+                    $data = $backendModel->getValue();
+                }
+
+            } elseif ($field->getConfigPath() !== null) {
+                $data = $this->getConfigValue($field->getConfigPath());
+            } else {
+                $data = $this->getConfigValue($path);
             }
-            
-        } elseif ($field->getConfigPath() !== null) {
-            $data = $this->getConfigValue($field->getConfigPath());
-        } else {
-            $data = $this->getConfigValue($path);
         }
         $fieldRendererClass = $field->getFrontendModel();
         if ($fieldRendererClass) {
@@ -344,6 +373,9 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         $sharedClass = $this->_getSharedCssClass($field);
         $requiresClass = $this->_getRequiresCssClass($field, $fieldPrefix);
 
+        $isReadOnly = $this->getSettingChecker()->isReadOnly($path, $this->getScope(), $this->getScopeCode());
+        $canUseDefault = $this->canUseDefaultValue($field->showInDefault());
+        $canUseWebsite = $this->canUseWebsiteValue($field->showInWebsite());
         $formField = $fieldset->addField(
             $elementId,
             $field->getType(),
@@ -360,9 +392,11 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
                 'scope' => $this->getScope(),
                 'scope_id' => $this->getScopeId(),
                 'scope_label' => $this->getScopeLabel($field),
-                'can_use_default_value' => $this->canUseDefaultValue($field->showInDefault()),
-                'can_use_website_value' => $this->canUseWebsiteValue($field->showInWebsite()),
-                'can_restore_to_default' => $this->isCanRestoreToDefault($field->canRestore())
+                'can_use_default_value' => $canUseDefault,
+                'can_use_website_value' => $canUseWebsite,
+                'can_restore_to_default' => $this->isCanRestoreToDefault($field->canRestore()),
+                'disabled' => $isReadOnly,
+                'is_disable_inheritance' => $isReadOnly
             ]
         );
         $field->populateInput($formField);
@@ -689,4 +723,39 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         }
         return $requiresClass;
     }
+
+    /**
+     * Retrieve Deployment Configuration object.
+     *
+     * @deprecated
+     * @return DeploymentConfig
+     */
+    private function getAppConfig()
+    {
+        if ($this->appConfig === null) {
+            $this->appConfig = ObjectManager::getInstance()->get(DeploymentConfig::class);
+        }
+        return $this->appConfig;
+    }
+
+    /**
+     * Retrieve deployment config data value by path
+     *
+     * @param string $path
+     * @return null|string
+     */
+    private function getAppConfigDataValue($path)
+    {
+        $appConfig = $this->getAppConfig()->get(System::CONFIG_TYPE);
+        $scope = $this->getScope();
+        $scopeId = $this->getScopeId();
+        if ($scope === 'default') {
+            $data = isset($appConfig[$scope][$path]) ? $appConfig[$scope][$path] : null;
+        } else {
+            $data = isset($appConfig[$scope][$scopeId][$path])
+                ? $appConfig[$scope][$scopeId][$path]
+                : null;
+        }
+        return $data;
+    }
 }
diff --git a/app/code/Magento/Config/Block/System/Config/Form/Field.php b/app/code/Magento/Config/Block/System/Config/Form/Field.php
index 0af9706b9372863887defb27b100a1631786f637..fe0d17e87bd5e1c05cec4047e9a200918d19b45a 100644
--- a/app/code/Magento/Config/Block/System/Config/Form/Field.php
+++ b/app/code/Magento/Config/Block/System/Config/Form/Field.php
@@ -15,6 +15,8 @@
 namespace Magento\Config\Block\System\Config\Form;
 
 /**
+ * Render field html element in Stores Configuration
+ *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  * @SuppressWarnings(PHPMD.NumberOfChildren)
  */
@@ -97,6 +99,7 @@ class Field extends \Magento\Backend\Block\Template implements \Magento\Framewor
         $htmlId = $element->getHtmlId();
         $namePrefix = preg_replace('#\[value\](\[\])?$#', '', $element->getName());
         $checkedHtml = $element->getInherit() == 1 ? 'checked="checked"' : '';
+        $disabled = $element->getIsDisableInheritance() == true ? ' disabled="disabled"' : '';
 
         $html = '<td class="use-default">';
         $html .= '<input id="' .
@@ -105,7 +108,7 @@ class Field extends \Magento\Backend\Block\Template implements \Magento\Framewor
             $namePrefix .
             '[inherit]" type="checkbox" value="1"' .
             ' class="checkbox config-inherit" ' .
-            $checkedHtml .
+            $checkedHtml . $disabled .
             ' onclick="toggleValueElements(this, Element.previous(this.parentNode))" /> ';
         $html .= '<label for="' . $htmlId . '_inherit" class="inherit">' . $this->_getInheritCheckboxLabel(
             $element
diff --git a/app/code/Magento/Config/Model/Config/Backend/Store.php b/app/code/Magento/Config/Model/Config/Backend/Store.php
index d33f5e5143daa665918a200ef9500c18eb8cd5d8..02f4ab96b5e5e1ae92851a0c7f3f48d0fcde246b 100644
--- a/app/code/Magento/Config/Model/Config/Backend/Store.php
+++ b/app/code/Magento/Config/Model/Config/Backend/Store.php
@@ -45,11 +45,6 @@ class Store extends \Magento\Framework\App\Config\Value
      */
     public function afterSave()
     {
-        $this->_mutableConfig->setValue(
-            \Magento\Store\Model\Store::XML_PATH_STORE_IN_URL,
-            $this->getValue(),
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
-        );
         $this->_cacheManager->clean();
         return parent::afterSave();
     }
diff --git a/app/code/Magento/Config/Model/Config/Loader.php b/app/code/Magento/Config/Model/Config/Loader.php
index 7ce3254a475746f3de1e4635dab55fed9eaedde4..4b10ffd6ea9d839cb013902356cb9e9134d2dde3 100644
--- a/app/code/Magento/Config/Model/Config/Loader.php
+++ b/app/code/Magento/Config/Model/Config/Loader.php
@@ -9,6 +9,11 @@
  */
 namespace Magento\Config\Model\Config;
 
+/**
+ * Class which can read config by paths
+ *
+ * @package Magento\Config\Model\Config
+ */
 class Loader
 {
     /**
diff --git a/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php b/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..48b82086ad8b10d3b0241d2502b6199ab2584ab1
--- /dev/null
+++ b/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Model\Config\Reader\Source\Deployed;
+
+use Magento\Config\Model\Config\Reader;
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\DeploymentConfig;
+use Magento\Framework\App\ObjectManager;
+
+/**
+ * Class for checking settings that defined in config file
+ */
+class SettingChecker
+{
+    /**
+     * @var DeploymentConfig
+     */
+    private $config;
+
+    /**
+     * @var ScopeCodeResolver
+     */
+    private $scopeCodeResolver;
+
+    /**
+     * @param DeploymentConfig $config
+     * @param ScopeCodeResolver $scopeCodeResolver
+     */
+    public function __construct(
+        DeploymentConfig $config,
+        ScopeCodeResolver $scopeCodeResolver
+    ) {
+        $this->config = $config;
+        $this->scopeCodeResolver = $scopeCodeResolver;
+    }
+
+    /**
+     * Resolve path by scope and scope code
+     *
+     * @param string $scope
+     * @param string $scopeCode
+     * @return string
+     */
+    private function resolvePath($scope, $scopeCode)
+    {
+        $scopePath = 'system/' . $scope;
+
+        if ($scope != ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
+            $scopePath .= '/' . $this->scopeCodeResolver->resolve($scope, $scopeCode);
+        }
+
+        return $scopePath;
+    }
+
+    /**
+     * Check that setting defined in deployed configuration
+     *
+     * @param string $path
+     * @param string $scope
+     * @param string $scopeCode
+     * @return boolean
+     */
+    public function isReadOnly($path, $scope, $scopeCode)
+    {
+        $config = $this->config->get($this->resolvePath($scope, $scopeCode) . "/" . $path);
+        return $config !== null;
+    }
+}
diff --git a/app/code/Magento/Config/Model/Config/Structure/Data.php b/app/code/Magento/Config/Model/Config/Structure/Data.php
index 414addf5b6f06ba4518897f0f7c6440156863bb7..6c926e7c1da1a79e8043944117b6230e5bf5517d 100644
--- a/app/code/Magento/Config/Model/Config/Structure/Data.php
+++ b/app/code/Magento/Config/Model/Config/Structure/Data.php
@@ -5,21 +5,30 @@
  */
 namespace Magento\Config\Model\Config\Structure;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides configuration
+ */
 class Data extends \Magento\Framework\Config\Data\Scoped
 {
     /**
+     * Constructor
+     *
      * @param Reader $reader
      * @param \Magento\Framework\Config\ScopeInterface $configScope
      * @param \Magento\Framework\Config\CacheInterface $cache
      * @param string $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         Reader $reader,
         \Magento\Framework\Config\ScopeInterface $configScope,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId
+        $cacheId,
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $configScope, $cache, $cacheId);
+        parent::__construct($reader, $configScope, $cache, $cacheId, $serializer);
     }
 
     /**
diff --git a/app/code/Magento/Config/Test/Unit/App/Config/Source/ModularConfigSourceTest.php b/app/code/Magento/Config/Test/Unit/App/Config/Source/ModularConfigSourceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..204bafcd0261c2bb283a978fab372c6afbf0d7b8
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/App/Config/Source/ModularConfigSourceTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\App\Config\Source;
+
+use Magento\Config\App\Config\Source\ModularConfigSource;
+use Magento\Framework\App\Config\Initial\Reader;
+
+/**
+ * Test config source that is retrieved from config.xml
+ *
+ * @package Magento\Config\Test\Unit\App\Config\Source
+ */
+class ModularConfigSourceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Reader|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $reader;
+
+    /**
+     * @var ModularConfigSource
+     */
+    private $source;
+
+    public function setUp()
+    {
+        $this->reader = $this->getMockBuilder(Reader::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->source = new ModularConfigSource($this->reader);
+    }
+
+    public function testGet()
+    {
+        $this->reader->expects($this->once())
+            ->method('read')
+            ->willReturn(['data' => ['path' => 'value']]);
+        $this->assertEquals('value', $this->source->get('path'));
+    }
+}
diff --git a/app/code/Magento/Config/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php b/app/code/Magento/Config/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a750bdb32744f23bf6172d1c1034998cb7f66759
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\App\Config\Source;
+
+use Magento\Config\App\Config\Source\RuntimeConfigSource;
+use Magento\Config\Model\ResourceModel\Config\Data\CollectionFactory;
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\Config\Value;
+
+/**
+ * Test Class for retrieving runtime configuration from database.
+ * @package Magento\Config\Test\Unit\App\Config\Source
+ */
+class RuntimeConfigSourceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionFactory;
+
+    /**
+     * @var ScopeCodeResolver|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scopeCodeResolver;
+
+    /**
+     * @var Converter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $converter;
+
+    /**
+     * @var Value|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $configItem;
+
+    /**
+     * @var Value|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $configItemTwo;
+
+    /**
+     * @var RuntimeConfigSource
+     */
+    private $configSource;
+
+    public function setUp()
+    {
+        $this->collectionFactory = $this->getMockBuilder(CollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->scopeCodeResolver = $this->getMockBuilder(ScopeCodeResolver::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->converter = $this->getMockBuilder(Converter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->configItem = $this->getMockBuilder(Value::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getScope', 'getPath', 'getValue'])
+            ->getMock();
+        $this->configItemTwo = $this->getMockBuilder(Value::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getScope', 'getPath', 'getValue', 'getScopeId'])
+            ->getMock();
+        $this->configSource = new RuntimeConfigSource(
+            $this->collectionFactory,
+            $this->scopeCodeResolver,
+            $this->converter
+        );
+    }
+
+    public function testGet()
+    {
+        $scope = 'websites';
+        $scopeCode = 'myWebsites';
+        $this->collectionFactory->expects($this->once())
+            ->method('create')
+            ->willReturn([$this->configItem, $this->configItemTwo]);
+        $this->configItem->expects($this->exactly(2))
+            ->method('getScope')
+            ->willReturn(ScopeConfigInterface::SCOPE_TYPE_DEFAULT);
+        $this->configItem->expects($this->once())
+            ->method('getPath')
+            ->willReturn('dev/test/setting');
+        $this->configItem->expects($this->once())
+            ->method('getValue')
+            ->willReturn(true);
+
+        $this->configItemTwo->expects($this->exactly(3))
+            ->method('getScope')
+            ->willReturn($scope);
+        $this->configItemTwo->expects($this->once())
+            ->method('getScopeId')
+            ->willReturn($scopeCode);
+        $this->configItemTwo->expects($this->once())
+            ->method('getPath')
+            ->willReturn('dev/test/setting2');
+        $this->configItemTwo->expects($this->once())
+            ->method('getValue')
+            ->willReturn(false);
+        $this->scopeCodeResolver->expects($this->once())
+            ->method('resolve')
+            ->with($scope, $scopeCode)
+            ->willReturnArgument(1);
+        $this->converter->expects($this->exactly(2))
+            ->method('convert')
+            ->withConsecutive(
+                [['dev/test/setting' => true]],
+                [['dev/test/setting2' => false]]
+            )
+            ->willReturnOnConsecutiveCalls(
+                ['dev/test/setting' => true],
+                ['dev/test/setting2' => false]
+            );
+
+        $this->assertEquals(
+            [
+                'default' => [
+                    'dev/test/setting' => true
+                ],
+                'websites' => [
+                    'myWebsites' => [
+                        'dev/test/setting2' => false
+                    ]
+                ]
+            ],
+            $this->configSource->get()
+        );
+    }
+}
diff --git a/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php b/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..be541228bf6d88a5ad7e459ba77a34e896c863a1
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php
@@ -0,0 +1,141 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\App\Config\Type;
+
+use Magento\Config\App\Config\Type\System;
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\App\Config\Spi\PostProcessorInterface;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Cache\FrontendInterface;
+use Magento\Framework\Serialize\Serializer\Serialize;
+use Magento\Store\Model\Config\Processor\Fallback;
+
+/**
+ * Test how Class process source, cache them and retrieve value by path
+ * @package Magento\Config\Test\Unit\App\Config\Type
+ */
+class SystemTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $source;
+
+    /**
+     * @var PostProcessorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $postProcessor;
+
+    /**
+     * @var Fallback|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $fallback;
+
+    /**
+     * @var FrontendInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $cache;
+
+    /**
+     * @var System
+     */
+    private $configType;
+
+    /**
+     * @var Serialize|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializer;
+
+    public function setUp()
+    {
+        $this->source = $this->getMockBuilder(ConfigSourceInterface::class)
+            ->getMockForAbstractClass();
+        $this->postProcessor = $this->getMockBuilder(PostProcessorInterface::class)
+            ->getMockForAbstractClass();
+        $this->fallback = $this->getMockBuilder(Fallback::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->cache = $this->getMockBuilder(FrontendInterface::class)
+            ->getMockForAbstractClass();
+        $this->serializer = $this->getMockBuilder(Serialize::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->configType = new System(
+            $this->source,
+            $this->postProcessor,
+            $this->fallback,
+            $this->cache,
+            $this->serializer
+        );
+    }
+
+    /**
+     * @param bool $isCached
+     * @dataProvider getDataProvider
+     */
+    public function testGet($isCached)
+    {
+        $path = 'default/dev/unsecure/url';
+        $url = 'http://magento.test/';
+        $data = [
+            'default' => [
+                'dev' => [
+                    'unsecure' => [
+                        'url' => $url
+                    ]
+                ]
+            ]
+        ];
+
+        $this->cache->expects($this->once())
+            ->method('load')
+            ->with(System::CONFIG_TYPE)
+            ->willReturn($isCached ? $data : null);
+
+        if ($isCached) {
+            $this->serializer->expects($this->once())
+                ->method('unserialize')
+                ->willReturn($data);
+        }
+
+        if (!$isCached) {
+            $this->serializer->expects($this->once())
+                ->method('serialize')
+                ->willReturn(serialize($data));
+            $this->source->expects($this->once())
+                ->method('get')
+                ->willReturn($data);
+            $this->fallback->expects($this->once())
+                ->method('process')
+                ->with($data)
+                ->willReturnArgument(0);
+            $this->postProcessor->expects($this->once())
+                ->method('process')
+                ->with($data)
+                ->willReturnArgument(0);
+            $this->cache->expects($this->once())
+                ->method('save')
+                ->with(
+                    serialize($data),
+                    System::CONFIG_TYPE,
+                    [System::CACHE_TAG]
+                );
+        }
+
+        $this->assertEquals($url, $this->configType->get($path));
+    }
+
+    /**
+     * @return array
+     */
+    public function getDataProvider()
+    {
+        return [
+            [true],
+            [false]
+        ];
+    }
+}
diff --git a/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/FieldTest.php b/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/FieldTest.php
index ccd5beb12cdf74197dfd9c63bdd8839e80d8f02c..f0643fc3b1c73c46c0a2c899b8769ea8142adfb4 100644
--- a/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/FieldTest.php
+++ b/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/FieldTest.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\Config\Test\Unit\Block\System\Config\Form;
 
+/**
+ * Test how class render field html element in Stores Configuration
+ *
+ * @package Magento\Config\Test\Unit\Block\System\Config\Form
+ */
 class FieldTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -69,6 +74,7 @@ class FieldTest extends \PHPUnit_Framework_TestCase
                 'getScope',
                 'getScopeLabel',
                 'getInherit',
+                'getIsDisableInheritance',
                 'getCanUseWebsiteValue',
                 'getCanUseDefaultValue',
                 'setDisabled',
@@ -185,6 +191,7 @@ class FieldTest extends \PHPUnit_Framework_TestCase
         $this->_elementMock->expects($this->any())->method('getCanUseWebsiteValue')->will($this->returnValue(true));
         $this->_elementMock->expects($this->any())->method('getCanUseDefaultValue')->will($this->returnValue(true));
         $this->_elementMock->expects($this->once())->method('setDisabled')->with(true);
+        $this->_elementMock->expects($this->once())->method('getIsDisableInheritance')->willReturn(true);
 
         $expected = '<td class="use-default">';
         $expected .= '<input id="' .
@@ -192,7 +199,7 @@ class FieldTest extends \PHPUnit_Framework_TestCase
             '_inherit" name="' .
             $this->_testData['name'] .
             '[inherit]" type="checkbox" value="1"' .
-            ' class="checkbox config-inherit" checked="checked"' .
+            ' class="checkbox config-inherit" checked="checked"' . ' disabled="disabled"' .
             ' onclick="toggleValueElements(this, Element.previous(this.parentNode))" /> ';
 
         $expected .= '<label for="' . $this->_testData['htmlId'] . '_inherit" class="inherit">Use Website</label>';
diff --git a/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php b/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php
index 788c7788cccd19f880c72c43b8c6f47e00c545d6..2c671914f264b04ec34508d919a23c67bf64abad 100644
--- a/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php
+++ b/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php
@@ -8,6 +8,15 @@
 
 namespace Magento\Config\Test\Unit\Block\System\Config;
 
+use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
+use Magento\Framework\App\DeploymentConfig;
+
+/**
+ * Test System config form block
+ *
+ * @package Magento\Config\Test\Unit\Block\System\Config
+ */
+
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
@@ -178,6 +187,20 @@ class FormTest extends \PHPUnit_Framework_TestCase
         $this->_objectBuilder = $this->getMockBuilder(\Magento\Config\Block\System\Config\Form::class)
             ->setConstructorArgs($objectArguments)
             ->setMethods(['something']);
+        $deploymentConfigMock = $this->getMockBuilder(DeploymentConfig::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $deploymentConfigMock->expects($this->any())
+            ->method('get')
+            ->willReturn([]);
+
+        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
+        $objectManagerMock->expects($this->any())
+            ->method('get')
+            ->willReturnMap([
+                [DeploymentConfig::class, $deploymentConfigMock]
+            ]);
+        \Magento\Framework\App\ObjectManager::setInstance($objectManagerMock);
         $this->object = $helper->getObject(\Magento\Config\Block\System\Config\Form::class, $data);
         $this->object->setData('scope_id', 1);
     }
@@ -549,10 +572,12 @@ class FormTest extends \PHPUnit_Framework_TestCase
             'field_config' => 'fieldData',
             'scope' => 'stores',
             'scope_id' => 1,
-            'scope_label' => '[GLOBAL]',
+            'scope_label' => __('[GLOBAL]'),
             'can_use_default_value' => false,
             'can_use_website_value' => false,
             'can_restore_to_default' => false,
+            'disabled' => false,
+            'is_disable_inheritance' => false
         ];
 
         $formFieldMock->expects($this->once())->method('setRenderer')->with($fieldRendererMock);
@@ -571,6 +596,18 @@ class FormTest extends \PHPUnit_Framework_TestCase
 
         $fieldMock->expects($this->once())->method('populateInput');
 
+
+        $settingChecker = $this->getMockBuilder(SettingChecker::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $settingChecker->expects($this->once())
+            ->method('isReadOnly')
+            ->willReturn(false);
+        $reflection = new \ReflectionClass(get_class($this->object));
+        $reflectionProperty = $reflection->getProperty('settingChecker');
+        $reflectionProperty->setAccessible(true);
+        $reflectionProperty->setValue($this->object, $settingChecker);
+
         $this->object->initFields($fieldsetMock, $groupMock, $sectionMock, $fieldPrefix, $labelPrefix);
     }
 
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/LoaderTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/LoaderTest.php
index 6047aa4c06afb4dfd7e1dab451aa8c93e4010755..69d4b01526a216f1e97b588fd14af0f9066ac3a3 100644
--- a/app/code/Magento/Config/Test/Unit/Model/Config/LoaderTest.php
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/LoaderTest.php
@@ -5,6 +5,9 @@
  */
 namespace Magento\Config\Test\Unit\Model\Config;
 
+/**
+ * @package Magento\Config\Test\Unit\Model\Config
+ */
 class LoaderTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -32,7 +35,6 @@ class LoaderTest extends \PHPUnit_Framework_TestCase
             false
         );
         $this->_model = new \Magento\Config\Model\Config\Loader($this->_configValueFactory);
-
         $this->_configCollection = $this->getMock(
             \Magento\Config\Model\ResourceModel\Config\Data\Collection::class,
             [],
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2e746eae410f414788a7b5277e331be7075e6655
--- /dev/null
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Config\Test\Unit\Model\Config\Reader\Source\Deployed;
+
+use Magento\Config\Model\Config\Reader;
+use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker;
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\Framework\App\Config;
+use Magento\Framework\App\DeploymentConfig;
+
+/**
+ * Test class for checking settings that defined in config file
+ *
+ * @package Magento\Config\Test\Unit\Model\Config\Reader\Source\Deployed
+ */
+class SettingCheckerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $config;
+
+    /**
+     * @var SettingChecker
+     */
+    private $checker;
+
+    /**
+     * @var ScopeCodeResolver | \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scopeCodeResolver;
+
+    public function setUp()
+    {
+        $this->config = $this->getMockBuilder(DeploymentConfig::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->scopeCodeResolver = $this->getMockBuilder(ScopeCodeResolver::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->checker = new SettingChecker($this->config, $this->scopeCodeResolver);
+    }
+
+    public function testIsDefined()
+    {
+        $path = 'general/web/locale';
+        $scope = 'website';
+        $scopeCode = 'myWebsite';
+        $scopeCodeId = '4';
+
+        $this->config->expects($this->once())
+            ->method('get')
+            ->willReturn([
+                $scope => [
+                    $scopeCode => [
+                        $path => 'value'
+                    ],
+                ],
+            ]);
+
+        $this->scopeCodeResolver->expects($this->once())
+            ->method('resolve')
+            ->with($scope, $scopeCodeId)
+            ->willReturn($scopeCode);
+
+        $this->assertTrue($this->checker->isReadOnly($path, $scope, $scopeCodeId));
+    }
+}
diff --git a/app/code/Magento/Config/composer.json b/app/code/Magento/Config/composer.json
index b14dd825b0d12d819fd511222e80de12a7cf8c3a..ab9c95e1166536ebb71adf36a1b5f1b9aea06b68 100644
--- a/app/code/Magento/Config/composer.json
+++ b/app/code/Magento/Config/composer.json
@@ -11,6 +11,9 @@
         "magento/module-backend": "100.2.*",
         "magento/module-media-storage": "100.2.*"
     },
+    "suggest": {
+        "magento/module-deploy": "100.2.*"
+    },
     "type": "magento2-module",
     "version": "100.2.0-dev",
     "license": [
diff --git a/app/code/Magento/Config/etc/di.xml b/app/code/Magento/Config/etc/di.xml
index 9a72ebcb16609caa28ce328c2b3c2ebcb43c9e0d..4f9eae24b55f611db54f3f5423c3944f7d93a7f6 100644
--- a/app/code/Magento/Config/etc/di.xml
+++ b/app/code/Magento/Config/etc/di.xml
@@ -69,4 +69,97 @@
             <argument name="resourceCollection" xsi:type="object">Magento\Config\Model\ResourceModel\Config\Data\Collection\Proxy</argument>
         </arguments>
     </type>
+    <type name="Magento\Framework\App\Config">
+        <arguments>
+            <argument name="types" xsi:type="array">
+                <item name="system" xsi:type="object">Magento\Config\App\Config\Type\System</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Config\App\Config\Type\System">
+        <arguments>
+            <argument name="source" xsi:type="object">systemConfigSourceAggregatedProxy</argument>
+            <argument name="postProcessor" xsi:type="object">systemConfigPostProcessorCompositeProxy</argument>
+            <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument>
+        </arguments>
+    </type>
+    <virtualType name="modulesDataProviderProxy" type="Magento\Framework\App\Config\InitialConfigSource\Proxy">
+        <arguments>
+            <argument name="instanceName" xsi:type="string">modulesDataProvider</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="modulesDataProvider" type="Magento\Framework\App\Config\InitialConfigSource">
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Framework\App\DeploymentConfig\Reader</argument>
+            <argument name="configType" xsi:type="const">Magento\Framework\Config\ConfigOptionsListConstants::KEY_MODULES</argument>
+            <argument name="fileKey" xsi:type="const">Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="systemConfigPostProcessorCompositeProxy" type="Magento\Framework\App\Config\PostProcessorComposite\Proxy">
+        <arguments>
+            <argument name="instanceName" xsi:type="string">systemConfigPostProcessorComposite</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="systemConfigSourceAggregatedProxy" type="Magento\Framework\App\Config\ConfigSourceAggregated\Proxy">
+        <arguments>
+            <argument name="instanceName" xsi:type="string">systemConfigSourceAggregated</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="systemConfigPostProcessorComposite" type="Magento\Framework\App\Config\PostProcessorComposite">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="placeholder" xsi:type="object">Magento\Store\Model\Config\Processor\Placeholder</item>
+                <item name="metadata" xsi:type="object">Magento\Framework\App\Config\MetadataConfigTypeProcessor</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="systemConfigSourceAggregated" type="Magento\Framework\App\Config\ConfigSourceAggregated">
+        <arguments>
+            <argument name="sources" xsi:type="array">
+                <item name="modular" xsi:type="array">
+                    <item name="source" xsi:type="object">Magento\Config\App\Config\Source\ModularConfigSource</item>
+                    <item name="sortOrder" xsi:type="string">10</item>
+                </item>
+                <item name="dynamic" xsi:type="array">
+                    <item name="source" xsi:type="object">Magento\Config\App\Config\Source\RuntimeConfigSource</item>
+                    <item name="sortOrder" xsi:type="string">100</item>
+                </item>
+                <item name="initial" xsi:type="array">
+                    <item name="source" xsi:type="object">systemConfigInitialDataProvider</item>
+                    <item name="sortOrder" xsi:type="string">1000</item>
+                </item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="systemConfigInitialDataProvider" type="Magento\Framework\App\Config\InitialConfigSource">
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Framework\App\DeploymentConfig\Reader</argument>
+            <argument name="configType" xsi:type="const">Magento\Config\App\Config\Type\System::CONFIG_TYPE</argument>
+            <argument name="fileKey" xsi:type="const">Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="appDumpSystemSource" type="Magento\Framework\App\Config\ConfigSourceAggregated">
+        <arguments>
+            <argument name="sources" xsi:type="array">
+                <item name="initial" xsi:type="array">
+                    <item name="source" xsi:type="object">systemConfigInitialDataProvider</item>
+                    <item name="sortOrder" xsi:type="string">10</item>
+                </item>
+                <item name="dynamic" xsi:type="array">
+                    <item name="source" xsi:type="object">Magento\Config\App\Config\Source\RuntimeConfigSource</item>
+                    <item name="sortOrder" xsi:type="string">1000</item>
+                </item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Deploy\Console\Command\App\ApplicationDumpCommand">
+        <arguments>
+            <argument name="sources" xsi:type="array">
+                <item name="system" xsi:type="array">
+                    <item name="source" xsi:type="object">appDumpSystemSource</item>
+                    <item name="namespace" xsi:type="const">Magento\Config\App\Config\Type\System::CONFIG_TYPE</item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
index 29e670e9f7f4fc95ccc51974d484dc0d802c13e2..9eedf22fbc1ae721fa6f453617c2a68ad6ea32e2 100644
--- a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
@@ -12,6 +12,7 @@ namespace Magento\ConfigurableImportExport\Model\Import\Product\Type;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\CatalogImportExport\Model\Import\Product as ImportProduct;
+use Magento\Framework\EntityManager\MetadataPool;
 
 /**
  * Importing configurable products
@@ -140,6 +141,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
      * Instance of database adapter.
      *
      * @var \Magento\Framework\DB\Adapter\AdapterInterface
+     * @deprecated
      */
     protected $_connection;
 
@@ -200,6 +202,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
      * @param \Magento\Catalog\Model\ProductTypes\ConfigInterface $productTypesConfig
      * @param \Magento\ImportExport\Model\ResourceModel\Helper $resourceHelper
      * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $_productColFac
+     * @param MetadataPool $metadataPool
      */
     public function __construct(
         \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac,
@@ -208,12 +211,12 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
         array $params,
         \Magento\Catalog\Model\ProductTypes\ConfigInterface $productTypesConfig,
         \Magento\ImportExport\Model\ResourceModel\Helper $resourceHelper,
-        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $_productColFac
+        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $_productColFac,
+        MetadataPool $metadataPool = null
     ) {
-        parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params);
+        parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params, $metadataPool);
         $this->_productTypesConfig = $productTypesConfig;
         $this->_resourceHelper = $resourceHelper;
-        $this->_resource = $resource;
         $this->_productColFac = $_productColFac;
         $this->_connection = $this->_entityModel->getConnection();
     }
@@ -379,14 +382,14 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
         if (!empty($productIds)) {
             $mainTable = $this->_resource->getTableName('catalog_product_super_attribute');
             $optionTable = $this->_resource->getTableName('eav_attribute_option');
-            $select = $this->_connection->select()->from(
+            $select = $this->connection->select()->from(
                 ['m' => $mainTable],
                 ['product_id', 'attribute_id', 'product_super_attribute_id']
             )->joinLeft(
                 ['o' => $optionTable],
-                $this->_connection->quoteIdentifier(
+                $this->connection->quoteIdentifier(
                     'o.attribute_id'
-                ) . ' = ' . $this->_connection->quoteIdentifier(
+                ) . ' = ' . $this->connection->quoteIdentifier(
                     'o.attribute_id'
                 ),
                 ['option_id']
@@ -395,7 +398,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
                 $productIds
             );
 
-            foreach ($this->_connection->fetchAll($select) as $row) {
+            foreach ($this->connection->fetchAll($select) as $row) {
                 $attrId = $row['attribute_id'];
                 $productId = $row['product_id'];
                 if ($row['option_id']) {
@@ -448,8 +451,8 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
                     'product_id' => $this->_productSuperData['assoc_entity_ids'][$assocId],
                     'parent_id' => $this->_productSuperData['product_id'],
                 ];
-                $subEntityId = $this->_connection->fetchOne(
-                    $this->_connection->select()->from(
+                $subEntityId = $this->connection->fetchOne(
+                    $this->connection->select()->from(
                         ['cpe' => $this->_resource->getTableName('catalog_product_entity')], ['entity_id']
                     )->where($metadata->getLinkField() . ' = ?', $assocId)
                 );
@@ -557,10 +560,10 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
             && !empty($this->_productSuperData['product_id'])
             && !empty($this->_simpleIdsToDelete)
         ) {
-            $quoted = $this->_connection->quoteInto('IN (?)', [$this->_productSuperData['product_id']]);
-            $quotedChildren = $this->_connection->quoteInto('IN (?)', $this->_simpleIdsToDelete);
-            $this->_connection->delete($linkTable, "parent_id {$quoted} AND product_id {$quotedChildren}");
-            $this->_connection->delete($relationTable, "parent_id {$quoted} AND child_id {$quotedChildren}");
+            $quoted = $this->connection->quoteInto('IN (?)', [$this->_productSuperData['product_id']]);
+            $quotedChildren = $this->connection->quoteInto('IN (?)', $this->_simpleIdsToDelete);
+            $this->connection->delete($linkTable, "parent_id {$quoted} AND product_id {$quotedChildren}");
+            $this->connection->delete($relationTable, "parent_id {$quoted} AND child_id {$quotedChildren}");
         }
         return $this;
     }
@@ -587,16 +590,16 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
             }
         }
         if ($mainData) {
-            $this->_connection->insertOnDuplicate($mainTable, $mainData);
+            $this->connection->insertOnDuplicate($mainTable, $mainData);
         }
         if ($this->_superAttributesData['labels']) {
-            $this->_connection->insertOnDuplicate($labelTable, $this->_superAttributesData['labels']);
+            $this->connection->insertOnDuplicate($labelTable, $this->_superAttributesData['labels']);
         }
         if ($this->_superAttributesData['super_link']) {
-            $this->_connection->insertOnDuplicate($linkTable, $this->_superAttributesData['super_link']);
+            $this->connection->insertOnDuplicate($linkTable, $this->_superAttributesData['super_link']);
         }
         if ($this->_superAttributesData['relation']) {
-            $this->_connection->insertOnDuplicate($relationTable, $this->_superAttributesData['relation']);
+            $this->connection->insertOnDuplicate($relationTable, $this->_superAttributesData['relation']);
         }
         return $this;
     }
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 8ce7489db932ef9f21eb5eb1ae21d6341e1658c9..4cc4e6648a0ef8d63c6ae13e28c547b6e9019155 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
@@ -312,15 +312,10 @@ class ConfigurableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst
                 'prodAttrColFac' => $this->attrCollectionFactory,
                 'params' => $this->params,
                 'resource' => $this->resource,
-                'productColFac' => $this->productCollectionFactory
+                'productColFac' => $this->productCollectionFactory,
+                'metadataPool' => $metadataPoolMock,
             ]
         );
-        $reflection = new \ReflectionClass(
-            \Magento\ConfigurableImportExport\Model\Import\Product\Type\Configurable::class
-        );
-        $reflectionProperty = $reflection->getProperty('metadataPool');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->configurable, $metadataPoolMock);
     }
 
     /**
diff --git a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php
index 5216f13355970c153c05fa239fd1e9272354d6bb..44a4d468cd0978b1c46eee68a9b3ff384147ffea 100644
--- a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php
+++ b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php
@@ -7,10 +7,6 @@
  */
 namespace Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Product;
 
-use Magento\Customer\Api\GroupManagementInterface;
-use Magento\Framework\EntityManager\MetadataPool;
-use Magento\Catalog\Api\Data\ProductInterface;
-
 /**
  * Class Collection
  *
@@ -25,84 +21,6 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
      */
     protected $_linkTable;
 
-    /**
-     * @var MetadataPool
-     */
-    private $metadataPool;
-
-    /**
-     * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
-     * @param \Psr\Log\LoggerInterface $logger
-     * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
-     * @param \Magento\Framework\Event\ManagerInterface $eventManager
-     * @param \Magento\Eav\Model\Config $eavConfig
-     * @param \Magento\Framework\App\ResourceConnection $resource
-     * @param \Magento\Eav\Model\EntityFactory $eavEntityFactory
-     * @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper
-     * @param \Magento\Framework\Validator\UniversalFactory $universalFactory
-     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Framework\Module\Manager $moduleManager
-     * @param \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState
-     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
-     * @param \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory
-     * @param \Magento\Catalog\Model\ResourceModel\Url $catalogUrl
-     * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
-     * @param \Magento\Customer\Model\Session $customerSession
-     * @param \Magento\Framework\Stdlib\DateTime $dateTime
-     * @param GroupManagementInterface $groupManagement
-     * @param MetadataPool $metadataPool
-     * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
-     *
-     * @SuppressWarnings(PHPMD.ExcessiveParameterList)
-     */
-    public function __construct(
-        \Magento\Framework\Data\Collection\EntityFactory $entityFactory,
-        \Psr\Log\LoggerInterface $logger,
-        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
-        \Magento\Framework\Event\ManagerInterface $eventManager,
-        \Magento\Eav\Model\Config $eavConfig,
-        \Magento\Framework\App\ResourceConnection $resource,
-        \Magento\Eav\Model\EntityFactory $eavEntityFactory,
-        \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper,
-        \Magento\Framework\Validator\UniversalFactory $universalFactory,
-        \Magento\Store\Model\StoreManagerInterface $storeManager,
-        \Magento\Framework\Module\Manager $moduleManager,
-        \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState,
-        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
-        \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory,
-        \Magento\Catalog\Model\ResourceModel\Url $catalogUrl,
-        \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
-        \Magento\Customer\Model\Session $customerSession,
-        \Magento\Framework\Stdlib\DateTime $dateTime,
-        GroupManagementInterface $groupManagement,
-        MetadataPool $metadataPool,
-        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null
-    ) {
-        $this->metadataPool = $metadataPool;
-        parent::__construct(
-            $entityFactory,
-            $logger,
-            $fetchStrategy,
-            $eventManager,
-            $eavConfig,
-            $resource,
-            $eavEntityFactory,
-            $resourceHelper,
-            $universalFactory,
-            $storeManager,
-            $moduleManager,
-            $catalogProductFlatState,
-            $scopeConfig,
-            $productOptionFactory,
-            $catalogUrl,
-            $localeDate,
-            $customerSession,
-            $dateTime,
-            $groupManagement,
-            $connection
-        );
-    }
-
     /**
      * Assign link table name
      *
@@ -139,7 +57,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
      */
     public function setProductFilter($product)
     {
-        $metadata = $this->metadataPool->getMetadata(ProductInterface::class);
+        $metadata = $this->getProductEntityMetadata();
 
         $this->getSelect()->where('link_table.parent_id = ?', $product->getData($metadata->getLinkField()));
         return $this;
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Initialization/Helper/Plugin/UpdateConfigurationsTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Initialization/Helper/Plugin/UpdateConfigurationsTest.php
index def49f42fa960b738fe952be4a2d18bada61ffd2..79d77c66e0d05427c9a89e6fb14cbee7cbc3327e 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Initialization/Helper/Plugin/UpdateConfigurationsTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Initialization/Helper/Plugin/UpdateConfigurationsTest.php
@@ -13,6 +13,11 @@ use Magento\ConfigurableProduct\Model\Product\VariationHandler;
 use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper as ProductInitializationHelper;
 use Magento\Catalog\Model\Product;
 
+/**
+ * Class UpdateConfigurationsTest
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * @package Magento\ConfigurableProduct\Test\Unit\Controller\Adminhtml\Product\Initialization\Helper\Plugin
+ */
 class UpdateConfigurationsTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -69,10 +74,14 @@ class UpdateConfigurationsTest extends \PHPUnit_Framework_TestCase
         );
     }
 
-    public function testAfterInitialize()
+    /**
+     * Prepare configurable matrix
+     *
+     * @return array
+     */
+    private function getConfigurableMatrix()
     {
-        $productMock = $this->getProductMock();
-        $configurableMatrix = [
+        return [
             [
                 'newProduct' => true,
                 'id' => 'product1'
@@ -109,6 +118,12 @@ class UpdateConfigurationsTest extends \PHPUnit_Framework_TestCase
                 'weight' => '5.55',
             ],
         ];
+    }
+
+    public function testAfterInitialize()
+    {
+        $productMock = $this->getProductMock();
+        $configurableMatrix = $this->getConfigurableMatrix();
         $configurations = [
             'product2' => [
                 'status' => 'simple2_status',
diff --git a/app/code/Magento/Cron/Model/Config/Data.php b/app/code/Magento/Cron/Model/Config/Data.php
index d09b830d1b539240dce0e81300bc72b4adf46acc..bcfaef37ece7b70b0ca9afe976ccf196aae179b1 100644
--- a/app/code/Magento/Cron/Model/Config/Data.php
+++ b/app/code/Magento/Cron/Model/Config/Data.php
@@ -3,29 +3,32 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+namespace Magento\Cron\Model\Config;
+
+use Magento\Framework\Serialize\SerializerInterface;
 
 /**
- * Prepare cron jobs data
+ * Provides cron configuration
  */
-namespace Magento\Cron\Model\Config;
-
 class Data extends \Magento\Framework\Config\Data
 {
     /**
-     * Initialize parameters
+     * Constructor
      *
-     * @param \Magento\Cron\Model\Config\Reader\Xml $reader
-     * @param \Magento\Framework\Config\CacheInterface        $cache
-     * @param \Magento\Cron\Model\Config\Reader\Db  $dbReader
-     * @param string                               $cacheId
+     * @param Reader\Xml $reader
+     * @param \Magento\Framework\Config\CacheInterface $cache
+     * @param Reader\Db $dbReader
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Cron\Model\Config\Reader\Xml $reader,
         \Magento\Framework\Config\CacheInterface $cache,
         \Magento\Cron\Model\Config\Reader\Db $dbReader,
-        $cacheId = 'crontab_config_cache'
+        $cacheId = 'crontab_config_cache',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
         $this->merge($dbReader->get());
     }
 
diff --git a/app/code/Magento/Cron/Model/Config/Reader/Db.php b/app/code/Magento/Cron/Model/Config/Reader/Db.php
index 1a58c14470038f7d81568cbbdb9c7407683967bd..9602775f18106aaf02ff6f70f0d44e2e8aa4912b 100644
--- a/app/code/Magento/Cron/Model/Config/Reader/Db.php
+++ b/app/code/Magento/Cron/Model/Config/Reader/Db.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\Cron\Model\Config\Reader;
 
+use Magento\Framework\App\Config;
+
 /**
  * Reader for cron parameters from data base storage
  */
@@ -22,17 +24,22 @@ class Db
      */
     protected $_reader;
 
+    /**
+     * @var Config
+     */
+    private $config;
+
     /**
      * Initialize parameters
      *
-     * @param \Magento\Framework\App\Config\Scope\ReaderInterface $defaultReader
+     * @param Config $config
      * @param \Magento\Cron\Model\Config\Converter\Db $converter
      */
     public function __construct(
-        \Magento\Framework\App\Config\Scope\ReaderInterface $defaultReader,
+        Config $config,
         \Magento\Cron\Model\Config\Converter\Db $converter
     ) {
-        $this->_reader = $defaultReader;
+        $this->config = $config;
         $this->_converter = $converter;
     }
 
@@ -43,6 +50,6 @@ class Db
      */
     public function get()
     {
-        return $this->_converter->convert($this->_reader->read());
+        return $this->_converter->convert($this->config->get('system/default'));
     }
 }
diff --git a/app/code/Magento/Cron/Model/Groups/Config/Data.php b/app/code/Magento/Cron/Model/Groups/Config/Data.php
index 29b70b90195bc49e27013d74a3532de44e076cbf..82c35abff22b08bdb3ff29edbd084eebc19a184c 100644
--- a/app/code/Magento/Cron/Model/Groups/Config/Data.php
+++ b/app/code/Magento/Cron/Model/Groups/Config/Data.php
@@ -3,25 +3,30 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+namespace Magento\Cron\Model\Groups\Config;
+
+use Magento\Framework\Serialize\SerializerInterface;
 
 /**
- * Prepare cron jobs data
+ * Provides cron groups configuration
  */
-namespace Magento\Cron\Model\Groups\Config;
-
 class Data extends \Magento\Framework\Config\Data
 {
     /**
+     * Constructor
+     *
      * @param \Magento\Cron\Model\Groups\Config\Reader\Xml $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Cron\Model\Groups\Config\Reader\Xml $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = 'cron_groups_config_cache'
+        $cacheId = 'cron_groups_config_cache',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 
     /**
diff --git a/app/code/Magento/Cron/Test/Unit/Model/Config/DataTest.php b/app/code/Magento/Cron/Test/Unit/Model/Config/DataTest.php
index 1803deb002f6d20cec2ebaa83298e549d1f85477..e25fdfe71d2d105f1c956dc4ea3cfe9dac1088f3 100644
--- a/app/code/Magento/Cron/Test/Unit/Model/Config/DataTest.php
+++ b/app/code/Magento/Cron/Test/Unit/Model/Config/DataTest.php
@@ -30,19 +30,18 @@ class DataTest extends \PHPUnit_Framework_TestCase
             'job2' => ['schedule' => '* * * * *', 'instance' => 'JobModel2', 'method' => 'method2'],
         ];
 
-        $cache->expects(
-            $this->any()
-        )->method(
-            'load'
-        )->with(
-            $this->equalTo('test_cache_id')
-        )->will(
-            $this->returnValue(serialize($jobs))
-        );
+        $cache->expects($this->any())
+            ->method('load')
+            ->with('test_cache_id')
+            ->willReturn(json_encode($jobs));
 
         $dbReader->expects($this->once())->method('get')->will($this->returnValue($dbReaderData));
 
-        $configData = new \Magento\Cron\Model\Config\Data($reader, $cache, $dbReader, 'test_cache_id');
+        $serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
+        $serializerMock->method('unserialize')
+            ->willReturn($jobs);
+
+        $configData = new \Magento\Cron\Model\Config\Data($reader, $cache, $dbReader, 'test_cache_id', $serializerMock);
 
         $expected = [
             'job1' => ['schedule' => '* * * * *', 'instance' => 'JobModel1', 'method' => 'method1'],
diff --git a/app/code/Magento/Cron/Test/Unit/Model/Config/Reader/DbTest.php b/app/code/Magento/Cron/Test/Unit/Model/Config/Reader/DbTest.php
index e93978d9683664f9378be0be1142667cac1dae99..6205c993524e4492912a3b96921b2958d8bcc984 100644
--- a/app/code/Magento/Cron/Test/Unit/Model/Config/Reader/DbTest.php
+++ b/app/code/Magento/Cron/Test/Unit/Model/Config/Reader/DbTest.php
@@ -5,12 +5,20 @@
  */
 namespace Magento\Cron\Test\Unit\Model\Config\Reader;
 
+use Magento\Framework\App\Config;
+use Magento\GoogleAdwords\Block\Code;
+
+/**
+ * Test reading for cron parameters from data base storage
+ *
+ * @package Magento\Cron\Test\Unit\Model\Config\Reader
+ */
 class DbTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Store\Model\Config\Reader\DefaultReader|\PHPUnit_Framework_MockObject_MockObject
+     * @var Config | \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_defaultReader;
+    protected $config;
 
     /**
      * @var \Magento\Cron\Model\Config\Converter\Db|\PHPUnit_Framework_MockObject_MockObject
@@ -27,11 +35,11 @@ class DbTest extends \PHPUnit_Framework_TestCase
      */
     protected function setUp()
     {
-        $this->_defaultReader = $this->getMockBuilder(
-            \Magento\Store\Model\Config\Reader\DefaultReader::class
-        )->disableOriginalConstructor()->getMock();
+        $this->config = $this->getMockBuilder(Config::class)
+            ->disableOriginalConstructor()
+            ->getMock();
         $this->_converter = new \Magento\Cron\Model\Config\Converter\Db();
-        $this->_reader = new \Magento\Cron\Model\Config\Reader\Db($this->_defaultReader, $this->_converter);
+        $this->_reader = new \Magento\Cron\Model\Config\Reader\Db($this->config, $this->_converter);
     }
 
     /**
@@ -42,7 +50,7 @@ class DbTest extends \PHPUnit_Framework_TestCase
         $job1 = ['schedule' => ['cron_expr' => '* * * * *']];
         $job2 = ['schedule' => ['cron_expr' => '1 1 1 1 1']];
         $data = ['crontab' => ['default' => ['jobs' => ['job1' => $job1, 'job2' => $job2]]]];
-        $this->_defaultReader->expects($this->once())->method('read')->will($this->returnValue($data));
+        $this->config->expects($this->once())->method('get')->with('system/default')->will($this->returnValue($data));
         $expected = [
             'default' => [
                 'job1' => ['schedule' => $job1['schedule']['cron_expr']],
diff --git a/app/code/Magento/Cron/etc/di.xml b/app/code/Magento/Cron/etc/di.xml
index 740eff2aed432694f9e4ef836ef799c1ab9eb19a..d5624e96765c58bd699eebc29c14c7fe76037b7a 100644
--- a/app/code/Magento/Cron/etc/di.xml
+++ b/app/code/Magento/Cron/etc/di.xml
@@ -8,11 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
     <preference for="Magento\Cron\Model\ConfigInterface" type="Magento\Cron\Model\Config" />
     <preference for="Magento\Framework\Shell\CommandRendererInterface" type="Magento\Framework\Shell\CommandRenderer" />
-    <type name="Magento\Cron\Model\Config\Reader\Db">
-        <arguments>
-            <argument name="defaultReader" xsi:type="object">Magento\Store\Model\Config\Reader\DefaultReader</argument>
-        </arguments>
-    </type>
     <type name="Magento\Config\Model\Config\Structure\Converter">
         <plugin name="cron_backend_config_structure_converter_plugin" type="Magento\Cron\Model\Backend\Config\Structure\Converter" />
     </type>
diff --git a/app/code/Magento/Customer/Model/Address/Config.php b/app/code/Magento/Customer/Model/Address/Config.php
index cd76fd253f499ea9a951cee0bd6b27d15016706a..18a043bc019bb26b5732d2dc2f2d5359be96648c 100644
--- a/app/code/Magento/Customer/Model/Address/Config.php
+++ b/app/code/Magento/Customer/Model/Address/Config.php
@@ -7,12 +7,11 @@ namespace Magento\Customer\Model\Address;
 
 use Magento\Framework\Config\Data as ConfigData;
 use Magento\Framework\DataObject;
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Store\Model\ScopeInterface;
 
 /**
- * Customer address config
- *
- * @author     Magento Core Team <core@magentocommerce.com>
+ * Customer address configuration
  */
 class Config extends ConfigData
 {
@@ -23,7 +22,7 @@ class Config extends ConfigData
     const DEFAULT_ADDRESS_FORMAT = 'oneline';
 
     /**
-     * Customer Address Templates per store
+     * Customer address templates per store
      *
      * @var array
      */
@@ -37,8 +36,7 @@ class Config extends ConfigData
     protected $_store = null;
 
     /**
-     * Default types per store
-     * Using for invalid code
+     * Default types per store, used for invalid code
      *
      * @var array
      */
@@ -60,12 +58,15 @@ class Config extends ConfigData
     protected $_scopeConfig;
 
     /**
-     * @param \Magento\Customer\Model\Address\Config\Reader $reader
+     * Constructor
+     *
+     * @param Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Customer\Helper\Address $addressHelper
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Customer\Model\Address\Config\Reader $reader,
@@ -73,9 +74,10 @@ class Config extends ConfigData
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Customer\Helper\Address $addressHelper,
         \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
-        $cacheId = 'address_format'
+        $cacheId = 'address_format',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
         $this->_storeManager = $storeManager;
         $this->_addressHelper = $addressHelper;
         $this->_scopeConfig = $scopeConfig;
diff --git a/app/code/Magento/Customer/Model/Customer/NotificationStorage.php b/app/code/Magento/Customer/Model/Customer/NotificationStorage.php
index 93cb2e24d40f3fcee1f50409b9d999e33f28e00c..67ee60971d98ac7c2cd089428ad923a4580dfd78 100644
--- a/app/code/Magento/Customer/Model/Customer/NotificationStorage.php
+++ b/app/code/Magento/Customer/Model/Customer/NotificationStorage.php
@@ -6,6 +6,7 @@
 namespace Magento\Customer\Model\Customer;
 
 use Magento\Framework\Cache\FrontendInterface;
+use Magento\Framework\Serialize\SerializerInterface;
 
 class NotificationStorage
 {
@@ -19,6 +20,16 @@ class NotificationStorage
     /**
      * @param FrontendInterface $cache
      */
+
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * NotificationStorage constructor.
+     * @param FrontendInterface $cache
+     */
     public function __construct(FrontendInterface $cache)
     {
         $this->cache = $cache;
@@ -34,7 +45,7 @@ class NotificationStorage
     public function add($notificationType, $customerId)
     {
         $this->cache->save(
-            serialize([
+            $this->getSerializer()->serialize([
                 'customer_id' => $customerId,
                 'notification_type' => $notificationType
             ]),
@@ -77,4 +88,19 @@ class NotificationStorage
     {
         return 'notification_' . $notificationType . '_' . $customerId;
     }
+
+    /**
+     * Get serializer
+     *
+     * @return SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/app/code/Magento/Customer/Test/Unit/Model/Address/ConfigTest.php b/app/code/Magento/Customer/Test/Unit/Model/Address/ConfigTest.php
index 5c2aeec636cecf90bc4d6abf383dcaef53190c89..2b4a93084c7ac40ec5909d484079245f161c35f3 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/Address/ConfigTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/Address/ConfigTest.php
@@ -10,122 +10,110 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_readerMock;
+    protected $addressHelperMock;
 
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_cacheMock;
+    protected $storeMock;
 
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_storeManagerMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_addressHelperMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_storeMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_scopeConfigMock;
+    protected $scopeConfigMock;
 
     /**
      * @var \Magento\Customer\Model\Address\Config
      */
-    protected $_model;
-
-    /**
-     * @var string
-     */
-    protected $_cacheId = 'cache_id';
+    protected $model;
 
     protected function setUp()
     {
-        $this->_storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false);
-        $this->_scopeConfigMock = $this->getMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
+        $cacheId = 'cache_id';
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false);
+        $this->scopeConfigMock = $this->getMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
 
-        $this->_readerMock = $this->getMock(
+        $readerMock = $this->getMock(
             \Magento\Customer\Model\Address\Config\Reader::class,
             [],
             [],
             '',
             false
         );
-        $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
-        $this->_storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManager::class, [], [], '', false);
-        $this->_storeManagerMock->expects(
+        $cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+        $storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManager::class, [], [], '', false);
+        $storeManagerMock->expects(
             $this->once()
         )->method(
             'getStore'
         )->will(
-            $this->returnValue($this->_storeMock)
+            $this->returnValue($this->storeMock)
         );
 
-        $this->_addressHelperMock = $this->getMock(\Magento\Customer\Helper\Address::class, [], [], '', false);
+        $this->addressHelperMock = $this->getMock(\Magento\Customer\Helper\Address::class, [], [], '', false);
 
-        $this->_cacheMock->expects(
+        $cacheMock->expects(
             $this->once()
         )->method(
             'load'
         )->with(
-            $this->_cacheId
+            $cacheId
         )->will(
             $this->returnValue(false)
         );
 
         $fixtureConfigData = require __DIR__ . '/Config/_files/formats_merged.php';
 
-        $this->_readerMock->expects($this->once())->method('read')->will($this->returnValue($fixtureConfigData));
-
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'save'
-        )->with(
-            serialize($fixtureConfigData),
-            $this->_cacheId
-        );
-
-        $this->_model = new \Magento\Customer\Model\Address\Config(
-            $this->_readerMock,
-            $this->_cacheMock,
-            $this->_storeManagerMock,
-            $this->_addressHelperMock,
-            $this->_scopeConfigMock,
-            $this->_cacheId
+        $readerMock->expects($this->once())->method('read')->will($this->returnValue($fixtureConfigData));
+
+        $cacheMock->expects($this->once())
+            ->method('save')
+            ->with(
+                json_encode($fixtureConfigData),
+                $cacheId
+            );
+
+        $serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
+        $serializerMock->method('serialize')
+            ->willReturn(json_encode($fixtureConfigData));
+        $serializerMock->method('unserialize')
+            ->willReturn($fixtureConfigData);
+
+        $this->model = $objectManagerHelper->getObject(
+            \Magento\Customer\Model\Address\Config::class,
+            [
+                'reader' => $readerMock,
+                'cache' => $cacheMock,
+                'storeManager' => $storeManagerMock,
+                'scopeConfig' => $this->scopeConfigMock,
+                'cacheId' => $cacheId,
+                'serializer' => $serializerMock,
+                'addressHelper' => $this->addressHelperMock,
+            ]
         );
     }
 
     public function testGetStore()
     {
-        $this->assertEquals($this->_storeMock, $this->_model->getStore());
+        $this->assertEquals($this->storeMock, $this->model->getStore());
     }
 
     public function testSetStore()
     {
-        $this->_model->setStore($this->_storeMock);
-
-        //no call to $_storeManagerMock's method
-        $this->assertEquals($this->_storeMock, $this->_model->getStore());
+        $this->model->setStore($this->storeMock);
+        $this->assertEquals($this->storeMock, $this->model->getStore());
     }
 
     public function testGetFormats()
     {
-        $this->_storeMock->expects($this->once())->method('getId');
+        $this->storeMock->expects($this->once())->method('getId');
 
-        $this->_scopeConfigMock->expects($this->any())->method('getValue')->will($this->returnValue('someValue'));
+        $this->scopeConfigMock->expects($this->any())->method('getValue')->will($this->returnValue('someValue'));
 
         $rendererMock = $this->getMock(\Magento\Framework\DataObject::class);
 
-        $this->_addressHelperMock->expects(
+        $this->addressHelperMock->expects(
             $this->any()
         )->method(
             'getRenderer'
@@ -160,6 +148,6 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         );
         $expectedResult = [$firstExpected, $secondExpected];
 
-        $this->assertEquals($expectedResult, $this->_model->getFormats());
+        $this->assertEquals($expectedResult, $this->model->getFormats());
     }
 }
diff --git a/app/code/Magento/Customer/Test/Unit/Model/Customer/NotificationStorageTest.php b/app/code/Magento/Customer/Test/Unit/Model/Customer/NotificationStorageTest.php
index 0d2b32f747a80a1f564755a21f47771b5673d27f..644d0a2d7012227ae6a30cfd2e7b3b9ceb8dbd9d 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/Customer/NotificationStorageTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/Customer/NotificationStorageTest.php
@@ -7,81 +7,87 @@ namespace Magento\Customer\Test\Unit\Model\Customer;
 
 use Magento\Customer\Model\Customer\NotificationStorage;
 
-/**
- * Class NotificationStorageTest
- *
- * Test for class \Magento\Customer\Model\Customer\NotificationStorage
- */
 class NotificationStorageTest extends \PHPUnit_Framework_TestCase
 {
 
     /**
-     * @var NotificationStorage|\PHPUnit_Framework_MockObject_MockObject
+     * @var NotificationStorage
      */
-    protected $model;
+    private $notificationStorage;
 
     /**
      * @var \Magento\Framework\Cache\FrontendInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cache;
+    private $cacheMock;
 
     /**
-     * Set up
-     *
-     * @return void
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
+    private $serializerMock;
+
     protected function setUp()
     {
-        $this->cache = $this->getMockBuilder(\Magento\Framework\Cache\FrontendInterface::class)
-            ->getMockForAbstractClass();
-        $this->model = new NotificationStorage($this->cache);
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->cacheMock = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class);
+        $this->notificationStorage = $objectManager->getObject(
+            NotificationStorage::class,
+            ['cache' => $this->cacheMock]
+        );
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
+        $objectManager->setBackwardCompatibleProperty($this->notificationStorage, 'serializer', $this->serializerMock);
     }
 
     public function testAdd()
     {
         $customerId = 1;
         $notificationType = 'some_type';
-        $this->cache->expects($this->once())
+        $data = [
+            'customer_id' => $customerId,
+            'notification_type' => $notificationType
+        ];
+        $serializedData = 'serialized data';
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($data)
+            ->willReturn($serializedData);
+        $this->cacheMock->expects($this->once())
             ->method('save')
             ->with(
-                serialize([
-                    'customer_id' => $customerId,
-                    'notification_type' => $notificationType
-                ]),
+                $serializedData,
                 $this->getCacheKey($notificationType, $customerId)
             );
-        $this->model->add($notificationType, $customerId);
+        $this->notificationStorage->add($notificationType, $customerId);
     }
 
     public function testIsExists()
     {
         $customerId = 1;
         $notificationType = 'some_type';
-        $this->cache->expects($this->once())
+        $this->cacheMock->expects($this->once())
             ->method('test')
             ->with($this->getCacheKey($notificationType, $customerId))
             ->willReturn(true);
-        $this->assertTrue($this->model->isExists($notificationType, $customerId));
+        $this->assertTrue($this->notificationStorage->isExists($notificationType, $customerId));
     }
 
     public function testRemove()
     {
         $customerId = 1;
         $notificationType = 'some_type';
-        $this->cache->expects($this->once())
+        $this->cacheMock->expects($this->once())
             ->method('remove')
             ->with($this->getCacheKey($notificationType, $customerId));
-        $this->model->remove($notificationType, $customerId);
+        $this->notificationStorage->remove($notificationType, $customerId);
     }
 
     /**
-     * Retrieve cache key
+     * Get cache key
      *
      * @param string $notificationType
      * @param string $customerId
      * @return string
      */
-    protected function getCacheKey($notificationType, $customerId)
+    private function getCacheKey($notificationType, $customerId)
     {
         return 'notification_' . $notificationType . '_' . $customerId;
     }
diff --git a/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php b/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..b4e4fef8fb2f941eaa56cc33b2df65f783fa0413
--- /dev/null
+++ b/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Deploy\Console\Command\App;
+
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Framework\App\DeploymentConfig\Writer;
+use Magento\Framework\Config\File\ConfigFilePool;
+use Magento\Framework\Console\Cli;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Command for dump application state
+ */
+class ApplicationDumpCommand extends Command
+{
+    /**
+     * @var Writer
+     */
+    private $writer;
+
+    /**
+     * @var SourceInterface[]
+     */
+    private $sources;
+
+    /**
+     * ApplicationDumpCommand constructor.
+     *
+     * @param Writer $writer
+     * @param array $sources
+     */
+    public function __construct(
+        Writer $writer,
+        array $sources
+    ) {
+        parent::__construct();
+        $this->writer = $writer;
+        $this->sources = $sources;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->setName('app:config:dump');
+        $this->setDescription('Create dump of application');
+        parent::configure();
+    }
+
+    /**
+     * Dump Application
+     *
+     * @param InputInterface $input
+     * @param OutputInterface $output
+     * @return boolean
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $dump = [];
+        foreach ($this->sources as $sourceData) {
+            /** @var SourceInterface $source */
+            $source = $sourceData['source'];
+            $namespace = $sourceData['namespace'];
+            $dump[$namespace] = $source->get();
+        }
+
+        $this->writer
+            ->saveConfig(
+                [ConfigFilePool::APP_CONFIG => $dump],
+                true,
+                ConfigFilePool::LOCAL
+            );
+        $output->writeln('<info>Done.</info>');
+        return  Cli::RETURN_SUCCESS;
+    }
+}
diff --git a/app/code/Magento/Deploy/Model/Deploy/LocaleDeploy.php b/app/code/Magento/Deploy/Model/Deploy/LocaleDeploy.php
index aa112a700133185cf06980fb6b465de509630371..c879a512d26c29c99c0152eda2e7fab148422fd8 100644
--- a/app/code/Magento/Deploy/Model/Deploy/LocaleDeploy.php
+++ b/app/code/Magento/Deploy/Model/Deploy/LocaleDeploy.php
@@ -6,11 +6,13 @@
 
 namespace Magento\Deploy\Model\Deploy;
 
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\App\Utility\Files;
 use Magento\Framework\App\View\Asset\Publisher;
 use Magento\Framework\View\Asset\ContentProcessorException;
 use Magento\Framework\View\Asset\PreProcessor\AlternativeSourceInterface;
 use Magento\Framework\View\Design\Theme\ThemeProviderInterface;
+use Magento\Framework\View\Design\Theme\ListInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 use Magento\Framework\Config\Theme;
 use Magento\Deploy\Console\Command\DeployStaticOptionsInterface as Options;
@@ -20,6 +22,8 @@ use Psr\Log\LoggerInterface;
 use Magento\Framework\Console\Cli;
 
 /**
+ * Class which allows deploy by locales
+ *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  * @SuppressWarnings(PHPMD.TooManyFields)
  */
@@ -115,6 +119,11 @@ class LocaleDeploy implements DeployInterface
      */
     private $alternativeSources;
 
+    /**
+     * @var ListInterface
+     */
+    private $themeList;
+
     /**
      * @var array
      */
@@ -242,7 +251,10 @@ class LocaleDeploy implements DeployInterface
     private function deployRequireJsConfig($area, $themePath)
     {
         if (!$this->getOption(Options::DRY_RUN) && !$this->getOption(Options::NO_JAVASCRIPT)) {
-            $design = $this->designFactory->create()->setDesignTheme($themePath, $area);
+
+            /** @var \Magento\Framework\View\Design\ThemeInterface $theme */
+            $theme = $this->getThemeList()->getThemeByFullPath($area . '/' . $themePath);
+            $design = $this->designFactory->create()->setDesignTheme($theme, $area);
             $assetRepo = $this->assetRepoFactory->create(['design' => $design]);
             /** @var \Magento\RequireJs\Model\FileManager $fileManager */
             $fileManager = $this->fileManagerFactory->create(
@@ -450,4 +462,16 @@ class LocaleDeploy implements DeployInterface
         }
         return $ancestorThemeFullPath;
     }
+
+    /**
+     * @deprecated
+     * @return ListInterface
+     */
+    private function getThemeList()
+    {
+        if ($this->themeList === null) {
+            $this->themeList = ObjectManager::getInstance()->get(ListInterface::class);
+        }
+        return $this->themeList;
+    }
 }
diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php b/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..686cf19d8f3113371339c29187c51ceae3cbf313
--- /dev/null
+++ b/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Deploy\Test\Unit\Console\Command;
+
+use Magento\Deploy\Console\Command\App\ApplicationDumpCommand;
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Framework\App\DeploymentConfig\Writer;
+use Magento\Framework\Config\File\ConfigFilePool;
+use Magento\Framework\Console\Cli;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Test command for dump application state
+ */
+class ApplicationDumpCommandTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var InputInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $input;
+
+    /**
+     * @var OutputInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $output;
+
+    /**
+     * @var Writer|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $writer;
+
+    /**
+     * @var SourceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $source;
+
+    /**
+     * @var ApplicationDumpCommand
+     */
+    private $command;
+
+    public function setUp()
+    {
+        $this->input = $this->getMockBuilder(InputInterface::class)
+            ->getMockForAbstractClass();
+        $this->output = $this->getMockBuilder(OutputInterface::class)
+            ->getMockForAbstractClass();
+        $this->writer = $this->getMockBuilder(Writer::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->source = $this->getMockBuilder(SourceInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->command = new ApplicationDumpCommand($this->writer, [[
+            'namespace' => 'system',
+            'source' => $this->source
+        ]]);
+    }
+
+    public function testExport()
+    {
+        $dump = [
+            'system' => ['systemDATA']
+        ];
+        $data = [ConfigFilePool::APP_CONFIG => $dump];
+        $this->source
+            ->expects($this->once())
+            ->method('get')
+            ->willReturn(['systemDATA']);
+        $this->output->expects($this->once())
+            ->method('writeln')
+            ->with('<info>Done.</info>');
+        $this->writer->expects($this->once())
+            ->method('saveConfig')
+            ->with($data);
+        $method = new \ReflectionMethod(ApplicationDumpCommand::class, 'execute');
+        $method->setAccessible(true);
+        $this->assertEquals(
+            Cli::RETURN_SUCCESS,
+            $method->invokeArgs(
+                $this->command,
+                [$this->input, $this->output]
+            )
+        );
+    }
+}
diff --git a/app/code/Magento/Deploy/Test/Unit/Model/Deploy/LocaleDeployTest.php b/app/code/Magento/Deploy/Test/Unit/Model/Deploy/LocaleDeployTest.php
index 757da133ddbc3df30eac5a590c1c8dbf00fd002a..f43c8f111146c500fd824c67f3b128a5b6110574 100644
--- a/app/code/Magento/Deploy/Test/Unit/Model/Deploy/LocaleDeployTest.php
+++ b/app/code/Magento/Deploy/Test/Unit/Model/Deploy/LocaleDeployTest.php
@@ -5,210 +5,134 @@
  */
 namespace Magento\Deploy\Test\Unit\Model\Deploy;
 
+use Magento\Deploy\Model\Deploy\LocaleDeploy;
 use Magento\Framework\App\Utility\Files;
 use Magento\Framework\App\View\Asset\Publisher;
 use Magento\Framework\Translate\Js\Config;
 use Magento\Framework\View\Asset\Minification;
 use Magento\Framework\View\Asset\Repository;
 use Magento\Framework\View\Asset\RepositoryFactory;
+use Magento\RequireJs\Model\FileManagerFactory;
+use Magento\Framework\RequireJs\ConfigFactory;
+use Magento\Framework\View\Asset\Bundle\Manager;
+use Magento\Framework\View\Design\Theme\ThemeProviderInterface;
+use Magento\Framework\View\DesignInterfaceFactory;
+use Magento\Framework\Locale\ResolverInterface;
+use Magento\Framework\View\Design\Theme\ListInterface;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 
 /**
+ * Test class which allows deploy by locales
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class LocaleDeployTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|Config
+     * @var string
      */
-    private $jsTranslationMock;
+    private $area;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|Minification
+     * @var string
      */
-    private $minificationMock;
+    private $locale;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|RepositoryFactory
+     * @var string
      */
-    private $assetRepoFactoryMock;
+    private $themePath;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\RequireJs\Model\FileManagerFactory
+     * @var \Magento\Deploy\Model\Deploy\LocaleDeploy
      */
-    private $fileManagerFactoryMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\RequireJs\ConfigFactory
-     */
-    private $configFactoryMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\View\Asset\Bundle\Manager
-     */
-    private $bundleManagerMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|Files
-     */
-    private $filesUtilMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\View\DesignInterfaceFactory
-     */
-    private $designFactoryMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Locale\ResolverInterface
-     */
-    private $localeResolverMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|OutputInterface
-     */
-    private $outputMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|LoggerInterface
-     */
-    private $loggerMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    private $assetRepoMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    private $assetPublisherMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    private $themeProviderMock;
+    private $model;
 
     protected function setUp()
     {
-        $this->outputMock = $this->getMock(OutputInterface::class, [], [], '', false);
-        $this->loggerMock = $this->getMock(LoggerInterface::class, [], [], '', false);
-        $this->filesUtilMock = $this->getMock(Files::class, [], [], '', false);
-        $this->assetRepoMock = $this->getMock(Repository::class, [], [], '', false);
-        $this->minificationMock = $this->getMock(Minification::class, [], [], '', false);
-        $this->jsTranslationMock = $this->getMock(Config::class, [], [], '', false);
-        $this->assetPublisherMock = $this->getMock(Publisher::class, [], [], '', false);
-        $this->assetRepoFactoryMock = $this->getMock(
-            RepositoryFactory::class,
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->fileManagerFactoryMock = $this->getMock(
-            \Magento\RequireJs\Model\FileManagerFactory::class,
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->configFactoryMock = $this->getMock(
-            \Magento\Framework\RequireJs\ConfigFactory::class,
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->bundleManagerMock = $this->getMock(
-            \Magento\Framework\View\Asset\Bundle\Manager::class,
-            [],
-            [],
-            '',
-            false
-        );
-        $this->themeProviderMock = $this->getMock(
-            \Magento\Framework\View\Design\Theme\ThemeProviderInterface::class,
-            [],
-            [],
-            '',
-            false
-        );
-        $this->designFactoryMock = $this->getMock(
-            \Magento\Framework\View\DesignInterfaceFactory::class,
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->localeResolverMock = $this->getMock(
-            \Magento\Framework\Locale\ResolverInterface::class,
-            [],
-            [],
-            '',
-            false
-        );
-    }
-
-    public function testDeploy()
-    {
-        $area = 'adminhtml';
-        $themePath = '/theme/path';
-        $locale = 'en_US';
-
+        $this->area = 'adminhtml';
+        $this->themePath = '/theme/path';
+        $this->locale = 'en_US';
+
+        $outputMock = $this->getMock(OutputInterface::class, [], [], '', false);
+        $jsTranslationMock = $this->getMock(Config::class, [], [], '', false);
+        $jsTranslationMock->expects($this->once())->method('dictionaryEnabled')->willReturn(false);
+        $minificationMock = $this->getMock(Minification::class, [], [], '', false);
+        $minificationMock->expects($this->once())->method('isEnabled')->with('js')->willReturn(true);
+
+        $themeMock = $this->getMockBuilder(\Magento\Framework\View\Design\ThemeInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
         $designMock = $this->getMock(\Magento\Framework\View\DesignInterface::class, [], [], '', false);
+        $designMock->expects($this->once())->method('setDesignTheme')->with($themeMock, $this->area)->willReturnSelf();
         $assetRepoMock = $this->getMock(Repository::class, [], [], '', false);
-        $requireJsConfigMock = $this->getMock(\Magento\Framework\RequireJs\Config::class, [], [], '', false);
-        $fileManagerMock = $this->getMock(\Magento\RequireJs\Model\FileManager::class, [], [], '', false);
-
-        $model = $this->getModel([\Magento\Deploy\Console\Command\DeployStaticOptionsInterface::NO_JAVASCRIPT => 0]);
-
-        $this->localeResolverMock->expects($this->once())->method('setLocale')->with($locale);
-        $this->designFactoryMock->expects($this->once())->method('create')->willReturn($designMock);
-        $designMock->expects($this->once())->method('setDesignTheme')->with($themePath, $area)->willReturnSelf();
-        $this->assetRepoFactoryMock->expects($this->once())->method('create')->with(['design' => $designMock])
+        $assetRepoFactoryMock = $this->getMock(RepositoryFactory::class, ['create'], [], '', false);
+        $assetRepoFactoryMock->expects($this->once())
+            ->method('create')
+            ->with(['design' => $designMock])
             ->willReturn($assetRepoMock);
-        $this->configFactoryMock->expects($this->once())->method('create')->willReturn($requireJsConfigMock);
-        $this->fileManagerFactoryMock->expects($this->once())->method('create')->willReturn($fileManagerMock);
 
+        $fileManagerMock = $this->getMock(\Magento\RequireJs\Model\FileManager::class, [], [], '', false);
         $fileManagerMock->expects($this->once())->method('createRequireJsConfigAsset')->willReturnSelf();
-        $this->filesUtilMock->expects($this->once())->method('getStaticPreProcessingFiles')->willReturn([]);
-        $this->filesUtilMock->expects($this->once())->method('getStaticLibraryFiles')->willReturn([]);
-
-        $this->jsTranslationMock->expects($this->once())->method('dictionaryEnabled')->willReturn(false);
-        $this->minificationMock->expects($this->once())->method('isEnabled')->with('js')->willReturn(true);
         $fileManagerMock->expects($this->once())->method('createMinResolverAsset')->willReturnSelf();
+        $fileManagerFactoryMock = $this->getMock(FileManagerFactory::class, ['create'], [], '', false);
+        $fileManagerFactoryMock->expects($this->once())->method('create')->willReturn($fileManagerMock);
 
-        $this->bundleManagerMock->expects($this->once())->method('flush');
-
-        $this->assertEquals(
-            \Magento\Framework\Console\Cli::RETURN_SUCCESS,
-            $model->deploy($area, $themePath, $locale)
+        $requireJsConfigMock = $this->getMock(\Magento\Framework\RequireJs\Config::class, [], [], '', false);
+        $configFactoryMock = $this->getMock(ConfigFactory::class, ['create'], [], '', false);
+        $configFactoryMock->expects($this->once())->method('create')->willReturn($requireJsConfigMock);
+
+        $assetPublisherMock = $this->getMock(Publisher::class, [], [], '', false);
+
+        $bundleManagerMock = $this->getMock(Manager::class, [], [], '', false);
+        $bundleManagerMock->expects($this->once())->method('flush');
+
+        $themeProviderMock = $this->getMock(ThemeProviderInterface::class, [], [], '', false);
+        $loggerMock = $this->getMock(LoggerInterface::class, [], [], '', false);
+
+        $filesUtilMock = $this->getMock(Files::class, [], [], '', false);
+        $filesUtilMock->expects($this->once())->method('getStaticPreProcessingFiles')->willReturn([]);
+        $filesUtilMock->expects($this->once())->method('getStaticLibraryFiles')->willReturn([]);
+
+        $designFactoryMock = $this->getMock(DesignInterfaceFactory::class, ['create'], [], '', false);
+        $designFactoryMock->expects($this->once())->method('create')->willReturn($designMock);
+
+        $localeResolverMock = $this->getMock(ResolverInterface::class, [], [], '', false);
+        $localeResolverMock->expects($this->once())->method('setLocale')->with($this->locale);
+
+        $themeList = $this->getMock(ListInterface::class, [], [], '', false);
+        $themeList->expects($this->once())->method('getThemeByFullPath')
+            ->with($this->area . '/' . $this->themePath)
+            ->willReturn($themeMock);
+
+        $this->model = new LocaleDeploy(
+            $outputMock,
+            $jsTranslationMock,
+            $minificationMock,
+            $assetRepoMock,
+            $assetRepoFactoryMock,
+            $fileManagerFactoryMock,
+            $configFactoryMock,
+            $assetPublisherMock,
+            $bundleManagerMock,
+            $themeProviderMock,
+            $loggerMock,
+            $filesUtilMock,
+            $designFactoryMock,
+            $localeResolverMock,
+            [],
+            [\Magento\Deploy\Console\Command\DeployStaticOptionsInterface::NO_JAVASCRIPT => 0]
         );
+        $property = new \ReflectionProperty(get_class($this->model), 'themeList');
+        $property->setAccessible(true);
+        $property->setValue($this->model, $themeList);
     }
 
-    /**
-     * @param array $options
-     * @return \Magento\Deploy\Model\Deploy\LocaleDeploy
-     */
-    private function getModel($options = [])
+    public function testDeploy()
     {
-        return new \Magento\Deploy\Model\Deploy\LocaleDeploy(
-            $this->outputMock,
-            $this->jsTranslationMock,
-            $this->minificationMock,
-            $this->assetRepoMock,
-            $this->assetRepoFactoryMock,
-            $this->fileManagerFactoryMock,
-            $this->configFactoryMock,
-            $this->assetPublisherMock,
-            $this->bundleManagerMock,
-            $this->themeProviderMock,
-            $this->loggerMock,
-            $this->filesUtilMock,
-            $this->designFactoryMock,
-            $this->localeResolverMock,
-            [],
-            $options
+        $this->assertEquals(
+            \Magento\Framework\Console\Cli::RETURN_SUCCESS,
+            $this->model->deploy($this->area, $this->themePath, $this->locale)
         );
     }
 }
diff --git a/app/code/Magento/Deploy/etc/di.xml b/app/code/Magento/Deploy/etc/di.xml
index 52c880c28d0a71ad7eaeb34b6c2096c6c7b5060a..f230238364ab788907753388d9594e2eece7c97d 100644
--- a/app/code/Magento/Deploy/etc/di.xml
+++ b/app/code/Magento/Deploy/etc/di.xml
@@ -23,9 +23,9 @@
     <type name="Magento\Framework\Console\CommandListInterface">
         <arguments>
             <argument name="commands" xsi:type="array">
-                <item name="staticContentDeployCommand" xsi:type="object">Magento\Deploy\Console\Command\DeployStaticContentCommand</item>
                 <item name="setModeCommand" xsi:type="object">Magento\Deploy\Console\Command\SetModeCommand</item>
                 <item name="showModeCommand" xsi:type="object">Magento\Deploy\Console\Command\ShowModeCommand</item>
+                <item name="dumpApplicationCommand" xsi:type="object">\Magento\Deploy\Console\Command\App\ApplicationDumpCommand</item>
             </argument>
         </arguments>
     </type>
diff --git a/app/code/Magento/Directory/Block/Data.php b/app/code/Magento/Directory/Block/Data.php
index 627e34d9ff40455e277b5813319837f764cd937b..3c8b682d1a1e8ad1dd066bd5300373f5a05c8859 100644
--- a/app/code/Magento/Directory/Block/Data.php
+++ b/app/code/Magento/Directory/Block/Data.php
@@ -5,6 +5,9 @@
  */
 namespace Magento\Directory\Block;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class Data extends \Magento\Framework\View\Element\Template
 {
     /**
@@ -32,6 +35,11 @@ class Data extends \Magento\Framework\View\Element\Template
      */
     protected $directoryHelper;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\View\Element\Template\Context $context
      * @param \Magento\Directory\Helper\Data $directoryHelper
@@ -110,12 +118,12 @@ class Data extends \Magento\Framework\View\Element\Template
         $cacheKey = 'DIRECTORY_COUNTRY_SELECT_STORE_' . $this->_storeManager->getStore()->getCode();
         $cache = $this->_configCacheType->load($cacheKey);
         if ($cache) {
-            $options = unserialize($cache);
+            $options = $this->getSerializer()->unserialize($cache);
         } else {
             $options = $this->getCountryCollection()
                 ->setForegroundCountries($this->getTopDestinations())
                 ->toOptionArray();
-            $this->_configCacheType->save(serialize($options), $cacheKey);
+            $this->_configCacheType->save($this->getSerializer()->serialize($options), $cacheKey);
         }
         $html = $this->getLayout()->createBlock(
             \Magento\Framework\View\Element\Html\Select::class
@@ -160,10 +168,10 @@ class Data extends \Magento\Framework\View\Element\Template
         $cacheKey = 'DIRECTORY_REGION_SELECT_STORE' . $this->_storeManager->getStore()->getId();
         $cache = $this->_configCacheType->load($cacheKey);
         if ($cache) {
-            $options = unserialize($cache);
+            $options = $this->getSerializer()->unserialize($cache);
         } else {
             $options = $this->getRegionCollection()->toOptionArray();
-            $this->_configCacheType->save(serialize($options), $cacheKey);
+            $this->_configCacheType->save($this->getSerializer()->serialize($options), $cacheKey);
         }
         $html = $this->getLayout()->createBlock(
             \Magento\Framework\View\Element\Html\Select::class
@@ -224,4 +232,19 @@ class Data extends \Magento\Framework\View\Element\Template
         \Magento\Framework\Profiler::stop('TEST: ' . __METHOD__);
         return $regionsJs;
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(\Magento\Framework\Serialize\SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/app/code/Magento/Directory/Model/Country/Postcode/Config/Data.php b/app/code/Magento/Directory/Model/Country/Postcode/Config/Data.php
index 879eccd9879193691809706008a3b1dee922d54f..c24da536e779c1b6f6e78716be2dc6e253a6057d 100644
--- a/app/code/Magento/Directory/Model/Country/Postcode/Config/Data.php
+++ b/app/code/Magento/Directory/Model/Country/Postcode/Config/Data.php
@@ -5,16 +5,27 @@
  */
 namespace Magento\Directory\Model\Country\Postcode\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides country postcodes configuration
+ */
 class Data extends \Magento\Framework\Config\Data
 {
     /**
-     * @param \Magento\Directory\Model\Country\Postcode\Config\Reader $reader
+     * Constructor
+     *
+     * @param Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Directory\Model\Country\Postcode\Config\Reader $reader,
-        \Magento\Framework\Config\CacheInterface $cache
+        \Magento\Framework\Config\CacheInterface $cache,
+        $cacheId = 'country_postcodes',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, 'country_postcodes');
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 }
diff --git a/app/code/Magento/Directory/Test/Unit/Block/DataTest.php b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php
index 165a369b119b9b9d9ebb0fff9fcb69069ce34924..8bad1c1efee375eabe08ebe0e94b4bfc86ee4fad 100644
--- a/app/code/Magento/Directory/Test/Unit/Block/DataTest.php
+++ b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php
@@ -9,10 +9,9 @@ use Magento\Directory\Block\Data;
 use Magento\Directory\Helper\Data as HelperData;
 use Magento\Directory\Model\ResourceModel\Country\Collection as CountryCollection;
 use Magento\Directory\Model\ResourceModel\Country\CollectionFactory as CountryCollectionFactory;
-use Magento\Directory\Model\ResourceModel\Region\CollectionFactory as RegionCollectionFactory;
 use Magento\Framework\App\Cache\Type\Config;
 use Magento\Framework\App\Config\ScopeConfigInterface;
-use Magento\Framework\Json\EncoderInterface;
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Framework\View\Element\Template\Context;
 use Magento\Framework\View\LayoutInterface;
 use Magento\Store\Model\ScopeInterface;
@@ -25,117 +24,114 @@ use Magento\Store\Model\StoreManagerInterface;
 class DataTest extends \PHPUnit_Framework_TestCase
 {
     /** @var  Data */
-    protected $model;
+    private $block;
 
     /** @var  Context |\PHPUnit_Framework_MockObject_MockObject */
-    protected $context;
+    private $contextMock;
 
     /** @var  HelperData |\PHPUnit_Framework_MockObject_MockObject */
-    protected $helperData;
-
-    /** @var  EncoderInterface |\PHPUnit_Framework_MockObject_MockObject */
-    protected $jsonEncoder;
+    private $helperDataMock;
 
     /** @var  Config |\PHPUnit_Framework_MockObject_MockObject */
-    protected $cacheTypeConfig;
-
-    /** @var  RegionCollectionFactory |\PHPUnit_Framework_MockObject_MockObject */
-    protected $regionCollectionFactory;
+    private $cacheTypeConfigMock;
 
     /** @var  CountryCollectionFactory |\PHPUnit_Framework_MockObject_MockObject */
-    protected $countryCollectionFactory;
+    private $countryCollectionFactoryMock;
 
     /** @var  ScopeConfigInterface |\PHPUnit_Framework_MockObject_MockObject */
-    protected $scopeConfig;
+    private $scopeConfigMock;
 
     /** @var  StoreManagerInterface |\PHPUnit_Framework_MockObject_MockObject */
-    protected $storeManager;
+    private $storeManagerMock;
 
     /** @var  Store |\PHPUnit_Framework_MockObject_MockObject */
-    protected $store;
+    private $storeMock;
 
     /** @var  CountryCollection |\PHPUnit_Framework_MockObject_MockObject */
-    protected $countryCollection;
+    private $countryCollectionMock;
 
     /** @var  LayoutInterface |\PHPUnit_Framework_MockObject_MockObject */
-    protected $layout;
+    private $layoutMock;
+
+    /** @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */
+    private $serializerMock;
 
     protected function setUp()
     {
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->prepareContext();
 
-        $this->helperData = $this->getMockBuilder(\Magento\Directory\Helper\Data::class)
+        $this->helperDataMock = $this->getMockBuilder(\Magento\Directory\Helper\Data::class)
             ->disableOriginalConstructor()
             ->getMock();
 
-        $this->jsonEncoder = $this->getMockBuilder(\Magento\Framework\Json\EncoderInterface::class)
-            ->getMockForAbstractClass();
-
-        $this->cacheTypeConfig = $this->getMockBuilder(\Magento\Framework\App\Cache\Type\Config::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $this->regionCollectionFactory = $this->getMockBuilder(
-            \Magento\Directory\Model\ResourceModel\Region\CollectionFactory::class
-        )
+        $this->cacheTypeConfigMock = $this->getMockBuilder(\Magento\Framework\App\Cache\Type\Config::class)
             ->disableOriginalConstructor()
             ->getMock();
 
         $this->prepareCountryCollection();
 
-        $this->model = new Data(
-            $this->context,
-            $this->helperData,
-            $this->jsonEncoder,
-            $this->cacheTypeConfig,
-            $this->regionCollectionFactory,
-            $this->countryCollectionFactory
+        $this->block = $objectManagerHelper->getObject(
+            Data::class,
+            [
+                'context' => $this->contextMock,
+                'directoryHelper' => $this->helperDataMock,
+                'configCacheType' => $this->cacheTypeConfigMock,
+                'countryCollectionFactory' => $this->countryCollectionFactoryMock
+            ]
+        );
+
+        $this->serializerMock = $this->getMock(SerializerInterface::class, [], [], '', false);
+        $objectManagerHelper->setBackwardCompatibleProperty(
+            $this->block,
+            'serializer',
+            $this->serializerMock
         );
     }
 
     protected function prepareContext()
     {
-        $this->store = $this->getMockBuilder(\Magento\Store\Model\Store::class)
+        $this->storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
             ->disableOriginalConstructor()
             ->getMock();
 
-        $this->scopeConfig = $this->getMockBuilder(\Magento\Framework\App\Config\ScopeConfigInterface::class)
+        $this->scopeConfigMock = $this->getMockBuilder(\Magento\Framework\App\Config\ScopeConfigInterface::class)
             ->getMockForAbstractClass();
 
-        $this->storeManager = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
+        $this->storeManagerMock = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
             ->getMockForAbstractClass();
 
-        $this->storeManager->expects($this->any())
+        $this->storeManagerMock->expects($this->any())
             ->method('getStore')
-            ->willReturn($this->store);
+            ->willReturn($this->storeMock);
 
-        $this->layout = $this->getMockBuilder(\Magento\Framework\View\LayoutInterface::class)
+        $this->layoutMock = $this->getMockBuilder(\Magento\Framework\View\LayoutInterface::class)
             ->getMockForAbstractClass();
 
-        $this->context = $this->getMockBuilder(\Magento\Framework\View\Element\Template\Context::class)
+        $this->contextMock = $this->getMockBuilder(\Magento\Framework\View\Element\Template\Context::class)
             ->disableOriginalConstructor()
             ->getMock();
 
-        $this->context->expects($this->any())
+        $this->contextMock->expects($this->any())
             ->method('getScopeConfig')
-            ->willReturn($this->scopeConfig);
+            ->willReturn($this->scopeConfigMock);
 
-        $this->context->expects($this->any())
+        $this->contextMock->expects($this->any())
             ->method('getStoreManager')
-            ->willReturn($this->storeManager);
+            ->willReturn($this->storeManagerMock);
 
-        $this->context->expects($this->any())
+        $this->contextMock->expects($this->any())
             ->method('getLayout')
-            ->willReturn($this->layout);
+            ->willReturn($this->layoutMock);
     }
 
     protected function prepareCountryCollection()
     {
-        $this->countryCollection = $this->getMockBuilder(
+        $this->countryCollectionMock = $this->getMockBuilder(
             \Magento\Directory\Model\ResourceModel\Country\Collection::class
         )->disableOriginalConstructor()->getMock();
 
-        $this->countryCollectionFactory = $this->getMockBuilder(
+        $this->countryCollectionFactoryMock = $this->getMockBuilder(
             \Magento\Directory\Model\ResourceModel\Country\CollectionFactory::class
         )
             ->disableOriginalConstructor()
@@ -144,9 +140,9 @@ class DataTest extends \PHPUnit_Framework_TestCase
             ])
             ->getMock();
 
-        $this->countryCollectionFactory->expects($this->any())
+        $this->countryCollectionFactoryMock->expects($this->any())
             ->method('create')
-            ->willReturn($this->countryCollection);
+            ->willReturn($this->countryCollectionMock);
     }
 
     /**
@@ -166,46 +162,50 @@ class DataTest extends \PHPUnit_Framework_TestCase
         $options,
         $resultHtml
     ) {
-        $this->helperData->expects($this->once())
+        $this->helperDataMock->expects($this->once())
             ->method('getDefaultCountry')
             ->willReturn($defaultCountry);
 
-        $this->store->expects($this->once())
+        $this->storeMock->expects($this->once())
             ->method('getCode')
             ->willReturn($storeCode);
 
-        $this->cacheTypeConfig->expects($this->once())
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->willReturn('serializedData');
+
+        $this->cacheTypeConfigMock->expects($this->once())
             ->method('load')
             ->with('DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode)
             ->willReturn(false);
-        $this->cacheTypeConfig->expects($this->once())
+        $this->cacheTypeConfigMock->expects($this->once())
             ->method('save')
-            ->with(serialize($options), 'DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode)
+            ->with('serializedData', 'DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode)
             ->willReturnSelf();
 
-        $this->scopeConfig->expects($this->once())
+        $this->scopeConfigMock->expects($this->once())
             ->method('getValue')
             ->with('general/country/destinations', ScopeInterface::SCOPE_STORE)
             ->willReturn($destinations);
 
-        $this->countryCollection->expects($this->once())
+        $this->countryCollectionMock->expects($this->once())
             ->method('loadByStore')
             ->willReturnSelf();
-        $this->countryCollection->expects($this->any())
+        $this->countryCollectionMock->expects($this->any())
             ->method('setForegroundCountries')
             ->with($expectedDestinations)
             ->willReturnSelf();
-        $this->countryCollection->expects($this->once())
+        $this->countryCollectionMock->expects($this->once())
             ->method('toOptionArray')
             ->willReturn($options);
 
         $elementHtmlSelect = $this->mockElementHtmlSelect($defaultCountry, $options, $resultHtml);
 
-        $this->layout->expects($this->once())
+        $this->layoutMock->expects($this->once())
             ->method('createBlock')
             ->willReturn($elementHtmlSelect);
 
-        $this->assertEquals($resultHtml, $this->model->getCountryHtmlSelect());
+        $this->assertEquals($resultHtml, $this->block->getCountryHtmlSelect());
     }
 
     /**
diff --git a/app/code/Magento/Directory/Test/Unit/Model/Country/Postcode/Config/DataTest.php b/app/code/Magento/Directory/Test/Unit/Model/Country/Postcode/Config/DataTest.php
index c4681d88d28e73dba119810e1e29ca0133dc2fbb..57c86ab58c91b84ba7d22465a3bb382011bd1912 100644
--- a/app/code/Magento/Directory/Test/Unit/Model/Country/Postcode/Config/DataTest.php
+++ b/app/code/Magento/Directory/Test/Unit/Model/Country/Postcode/Config/DataTest.php
@@ -8,31 +8,54 @@ namespace Magento\Directory\Test\Unit\Model\Country\Postcode\Config;
 class DataTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Directory\Model\Country\Postcode\Config\Reader|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $readerMock;
+    private $readerMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\Cache\Type\Config|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cacheMock;
+    private $cacheMock;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
 
     protected function setUp()
     {
-        $this->readerMock = $this->getMockBuilder(
-            \Magento\Directory\Model\Country\Postcode\Config\Reader::class
-        )->disableOriginalConstructor()->getMock();
-        $this->cacheMock = $this->getMockBuilder(
-            \Magento\Framework\App\Cache\Type\Config::class
-        )->disableOriginalConstructor()->getMock();
+        $this->readerMock = $this->getMock(
+            \Magento\Directory\Model\Country\Postcode\Config\Reader::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->cacheMock = $this->getMock(
+            \Magento\Framework\App\Cache\Type\Config::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
     }
 
     public function testGet()
     {
         $expected = ['someData' => ['someValue', 'someKey' => 'someValue']];
-        $this->cacheMock->expects($this->any())->method('load')->will($this->returnValue(serialize($expected)));
-        $configData = new \Magento\Directory\Model\Country\Postcode\Config\Data($this->readerMock, $this->cacheMock);
-
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn(json_encode($expected));
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->willReturn($expected);
+        $configData = new \Magento\Directory\Model\Country\Postcode\Config\Data(
+            $this->readerMock,
+            $this->cacheMock,
+            'country_postcodes',
+            $this->serializerMock
+        );
         $this->assertEquals($expected, $configData->get());
     }
 }
diff --git a/app/code/Magento/DownloadableImportExport/Model/Import/Product/Type/Downloadable.php b/app/code/Magento/DownloadableImportExport/Model/Import/Product/Type/Downloadable.php
index a641093f5454033fe4c628587e23f47b4d1ac9df..7a447aa90eea8f6eb39100e0218bbc90302a715f 100644
--- a/app/code/Magento/DownloadableImportExport/Model/Import/Product/Type/Downloadable.php
+++ b/app/code/Magento/DownloadableImportExport/Model/Import/Product/Type/Downloadable.php
@@ -7,7 +7,7 @@
  */
 namespace Magento\DownloadableImportExport\Model\Import\Product\Type;
 
-use Magento\CatalogImportExport\Model\Import\Product;
+use Magento\Framework\EntityManager\MetadataPool;
 use \Magento\Store\Model\Store;
 
 /**
@@ -244,7 +244,7 @@ class Downloadable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
     protected $downloadableHelper;
 
     /**
-     * Constructor
+     * Downloadable constructor
      *
      * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac
      * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac
@@ -252,7 +252,7 @@ class Downloadable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
      * @param array $params
      * @param \Magento\DownloadableImportExport\Helper\Uploader $uploaderHelper
      * @param \Magento\DownloadableImportExport\Helper\Data $downloadableHelper
-     * @throws \Magento\Framework\Exception\LocalizedException
+     * @param MetadataPool $metadataPool
      */
     public function __construct(
         \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac,
@@ -260,12 +260,12 @@ class Downloadable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
         \Magento\Framework\App\ResourceConnection $resource,
         array $params,
         \Magento\DownloadableImportExport\Helper\Uploader $uploaderHelper,
-        \Magento\DownloadableImportExport\Helper\Data $downloadableHelper
+        \Magento\DownloadableImportExport\Helper\Data $downloadableHelper,
+        MetadataPool $metadataPool = null
     ) {
-        parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params);
+        parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params, $metadataPool);
         $this->parameters = $this->_entityModel->getParameters();
         $this->_resource = $resource;
-        $this->connection = $resource->getConnection('write');
         $this->uploaderHelper = $uploaderHelper;
         $this->downloadableHelper = $downloadableHelper;
     }
diff --git a/app/code/Magento/DownloadableImportExport/Test/Unit/Model/Import/Product/Type/DownloadableTest.php b/app/code/Magento/DownloadableImportExport/Test/Unit/Model/Import/Product/Type/DownloadableTest.php
index d3cd979b31a9118250062408205c38c7a7c8adb7..c4799bcc42ae9c8d81b6ec321370e8684265a654 100644
--- a/app/code/Magento/DownloadableImportExport/Test/Unit/Model/Import/Product/Type/DownloadableTest.php
+++ b/app/code/Magento/DownloadableImportExport/Test/Unit/Model/Import/Product/Type/DownloadableTest.php
@@ -710,10 +710,6 @@ class DownloadableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst
             ->getMock(\Magento\Framework\EntityManager\MetadataPool::class, ['getLinkField'], [], '', false);
         $metadataPoolMock->expects($this->any())->method('getMetadata')->willReturnSelf();
 
-        $this->prepareObjectManager([
-            [\Magento\Framework\EntityManager\MetadataPool::class, $metadataPoolMock],
-        ]);
-
         $this->downloadableModelMock = $this->objectManagerHelper->getObject(
             \Magento\DownloadableImportExport\Model\Import\Product\Type\Downloadable::class,
             [
@@ -722,7 +718,8 @@ class DownloadableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst
                 'resource' => $this->resourceMock,
                 'params' => $this->paramsArray,
                 'uploaderHelper' => $this->uploaderHelper,
-                'downloadableHelper' => $this->downloadableHelper
+                'downloadableHelper' => $this->downloadableHelper,
+                'metadataPool' => $metadataPoolMock,
             ]
         );
         $this->entityModelMock->expects($this->once())->method('getNewSku')->will($this->returnValue($newSku));
@@ -870,20 +867,4 @@ class DownloadableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst
         $reflectionProperty->setValue($object, $value);
         return $object;
     }
-
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/Eav/Model/Config.php b/app/code/Magento/Eav/Model/Config.php
index 36be7733dcd75a1fed3c7f63072f546d32378416..0d0237a1f6732cd06f540caa0c4f114947afeb6e 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,12 +94,18 @@ class Config
      */
     protected $_universalFactory;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\App\CacheInterface $cache
      * @param \Magento\Eav\Model\Entity\TypeFactory $entityTypeFactory
      * @param \Magento\Eav\Model\ResourceModel\Entity\Type\CollectionFactory $entityTypeCollectionFactory
      * @param \Magento\Framework\App\Cache\StateInterface $cacheState
      * @param \Magento\Framework\Validator\UniversalFactory $universalFactory
+     * @param SerializerInterface $serializer
      * @codeCoverageIgnore
      */
     public function __construct(
@@ -105,13 +113,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 +288,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 +312,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 +382,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 +412,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 +497,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 +524,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/Entity/Attribute/Config.php b/app/code/Magento/Eav/Model/Entity/Attribute/Config.php
index ae5c2f5e2339fd7b16f071c333971c3707a211e4..1bc5bba6d5e79fdfbd9cf5343f21f299121ceb43 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Config.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Config.php
@@ -5,20 +5,28 @@
  */
 namespace Magento\Eav\Model\Entity\Attribute;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides EAV attributes configuration
+ */
 class Config extends \Magento\Framework\Config\Data
 {
     /**
-     * @param \Magento\Eav\Model\Entity\Attribute\Config\Reader $reader
+     * Constructor
+     *
+     * @param Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
-     * @codeCoverageIgnore
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Eav\Model\Entity\Attribute\Config\Reader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = "eav_attributes"
+        $cacheId = 'eav_attributes',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 
     /**
diff --git a/app/code/Magento/Eav/Model/Entity/AttributeCache.php b/app/code/Magento/Eav/Model/Entity/AttributeCache.php
index 865fc5ebb5b1e0f26b3b75108be0115c11a7682a..f4f52e154cdd1cb1970ff07913cd273b0a5c77b2 100644
--- a/app/code/Magento/Eav/Model/Entity/AttributeCache.php
+++ b/app/code/Magento/Eav/Model/Entity/AttributeCache.php
@@ -9,6 +9,7 @@ namespace Magento\Eav\Model\Entity;
 use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
 use Magento\Framework\App\CacheInterface;
 use Magento\Framework\App\Cache\StateInterface;
+use Magento\Framework\Serialize\SerializerInterface;
 
 /**
  * Class AttributeCache
@@ -120,7 +121,7 @@ class AttributeCache
                 [
                     \Magento\Eav\Model\Cache\Type::CACHE_TAG,
                     \Magento\Eav\Model\Entity\Attribute::CACHE_TAG,
-                    \Magento\Framework\App\Config\ScopePool::CACHE_TAG
+                    \Magento\Config\App\Config\Type\System::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..56bad8bf75e11e8329f895d62f5ccb9e5faa3148 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/Entity/Attribute/ConfigTest.php b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/ConfigTest.php
index 78dbc6bed34c31e5025cb366c2200457e4303b1d..5ae74a16b27a90b0bbf53b3ab13ad2a4cf398efe 100644
--- a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/ConfigTest.php
+++ b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/ConfigTest.php
@@ -32,7 +32,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
     protected $_cacheId;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Eav\Model\Entity\Attribute|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_attribute;
 
@@ -54,20 +54,20 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         );
         $this->_cacheMock = $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false);
         $this->_cacheId = 'eav_attributes';
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            $this->equalTo($this->_cacheId)
-        )->will(
-            $this->returnValue(serialize([]))
-        );
+        $this->_cacheMock->expects($this->once())
+            ->method('load')
+            ->with($this->_cacheId)
+            ->willReturn('');
+
+        $serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
+        $serializerMock->method('unserialize')
+            ->willReturn([]);
 
         $this->_model = new \Magento\Eav\Model\Entity\Attribute\Config(
             $this->_readerMock,
             $this->_cacheMock,
-            $this->_cacheId
+            $this->_cacheId,
+            $serializerMock
         );
     }
 
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..3fa739d4096a8eedb0b2aaaa69b6c0f1adf93c30 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/app/code/Magento/Email/Model/Template/Config/Data.php b/app/code/Magento/Email/Model/Template/Config/Data.php
index c7f4054bf311efbf55add66d4794981a42a1e459..1f6a4beb166e0da25283b8b29efff85c3b24ba58 100644
--- a/app/code/Magento/Email/Model/Template/Config/Data.php
+++ b/app/code/Magento/Email/Model/Template/Config/Data.php
@@ -1,22 +1,31 @@
 <?php
 /**
- * Email templates configuration data container. Provides email templates configuration data.
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Email\Model\Template\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides email templates configuration
+ */
 class Data extends \Magento\Framework\Config\Data
 {
     /**
+     * Constructor
+     *
      * @param \Magento\Email\Model\Template\Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Email\Model\Template\Config\Reader $reader,
-        \Magento\Framework\Config\CacheInterface $cache
+        \Magento\Framework\Config\CacheInterface $cache,
+        $cacheId = 'email_templates',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, 'email_templates');
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 }
diff --git a/app/code/Magento/Email/Model/Template/Css/Processor.php b/app/code/Magento/Email/Model/Template/Css/Processor.php
index ae7d083750863d2d7dbd5869341bbee772544421..0386a9ace5ea5a7b5d9c93075224d1031017f28f 100644
--- a/app/code/Magento/Email/Model/Template/Css/Processor.php
+++ b/app/code/Magento/Email/Model/Template/Css/Processor.php
@@ -8,6 +8,9 @@ namespace Magento\Email\Model\Template\Css;
 use Magento\Framework\View\Asset\NotationResolver\Variable;
 use Magento\Framework\View\Asset\Repository;
 
+/**
+ * Class for processing css placeholders
+ */
 class Processor
 {
     /**
diff --git a/app/code/Magento/Email/Model/Template/Filter.php b/app/code/Magento/Email/Model/Template/Filter.php
index d9409d62f159cfd7c2ab1e6c32aae6d07a33b8fc..658b2977fdf738207d07ddcb5d4774c6fe9cb72c 100644
--- a/app/code/Magento/Email/Model/Template/Filter.php
+++ b/app/code/Magento/Email/Model/Template/Filter.php
@@ -216,31 +216,6 @@ class Filter extends \Magento\Framework\Filter\Template
         parent::__construct($string, $variables);
     }
 
-    /**
-     * @deprecated
-     * @return Css\Processor
-     */
-    private function getCssProcessor()
-    {
-        if (!$this->cssProcessor) {
-            $this->cssProcessor = ObjectManager::getInstance()->get(Css\Processor::class);
-        }
-        return $this->cssProcessor;
-    }
-
-    /**
-     * @deprecated
-     * @param string $dirType
-     * @return ReadInterface
-     */
-    private function getPubDirectory($dirType)
-    {
-        if (!$this->pubDirectory) {
-            $this->pubDirectory = ObjectManager::getInstance()->get(Filesystem::class)->getDirectoryRead($dirType);
-        }
-        return $this->pubDirectory;
-    }
-
     /**
      * Set use absolute links flag
      *
@@ -333,6 +308,31 @@ class Filter extends \Magento\Framework\Filter\Template
         return $this;
     }
 
+    /**
+     * @deprecated
+     * @return Css\Processor
+     */
+    private function getCssProcessor()
+    {
+        if (!$this->cssProcessor) {
+            $this->cssProcessor = ObjectManager::getInstance()->get(Css\Processor::class);
+        }
+        return $this->cssProcessor;
+    }
+
+    /**
+     * @deprecated
+     * @param string $dirType
+     * @return ReadInterface
+     */
+    private function getPubDirectory($dirType)
+    {
+        if (!$this->pubDirectory) {
+            $this->pubDirectory = ObjectManager::getInstance()->get(Filesystem::class)->getDirectoryRead($dirType);
+        }
+        return $this->pubDirectory;
+    }
+
     /**
      * Get design parameters
      *
diff --git a/app/code/Magento/ImportExport/Model/Export/Config.php b/app/code/Magento/ImportExport/Model/Export/Config.php
index 267a7e6c7a9e1ef161aff935377848e19faf72c2..2d7b2c7a3af253e7ef7d80d13de45a95007f6c5a 100644
--- a/app/code/Magento/ImportExport/Model/Export/Config.php
+++ b/app/code/Magento/ImportExport/Model/Export/Config.php
@@ -5,19 +5,28 @@
  */
 namespace Magento\ImportExport\Model\Export;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides export configuration
+ */
 class Config extends \Magento\Framework\Config\Data implements \Magento\ImportExport\Model\Export\ConfigInterface
 {
     /**
-     * @param \Magento\ImportExport\Model\Export\Config\Reader $reader
+     * Constructor
+     *
+     * @param Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\ImportExport\Model\Export\Config\Reader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = 'export_config_cache'
+        $cacheId = 'export_config_cache',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 
     /**
diff --git a/app/code/Magento/ImportExport/Model/Import/Config.php b/app/code/Magento/ImportExport/Model/Import/Config.php
index 0652dd03d9ff43944ef9e7cb10fa1671c7048987..a1ec492da3e9630d0166d52f6eae28a564897c12 100644
--- a/app/code/Magento/ImportExport/Model/Import/Config.php
+++ b/app/code/Magento/ImportExport/Model/Import/Config.php
@@ -5,19 +5,28 @@
  */
 namespace Magento\ImportExport\Model\Import;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides import configuration
+ */
 class Config extends \Magento\Framework\Config\Data implements \Magento\ImportExport\Model\Import\ConfigInterface
 {
     /**
-     * @param \Magento\ImportExport\Model\Import\Config\Reader $reader
+     * Constructor
+     *
+     * @param Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\ImportExport\Model\Import\Config\Reader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = 'import_config_cache'
+        $cacheId = 'import_config_cache',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 
     /**
diff --git a/app/code/Magento/ImportExport/Test/Unit/Model/Export/ConfigTest.php b/app/code/Magento/ImportExport/Test/Unit/Model/Export/ConfigTest.php
index 797c9f7a1ae32a8464114e3f144bfc7b679fb54e..0b1e542f85b9deb9dc3c24a7cb0497ba4d9d5168 100644
--- a/app/code/Magento/ImportExport/Test/Unit/Model/Export/ConfigTest.php
+++ b/app/code/Magento/ImportExport/Test/Unit/Model/Export/ConfigTest.php
@@ -8,35 +8,41 @@ namespace Magento\ImportExport\Test\Unit\Model\Export;
 class ConfigTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\ImportExport\Model\Export\Config\Reader|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_readerMock;
+    private $readerMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_configScopeMock;
+    private $cacheMock;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
 
     /**
      * @var string
      */
-    protected $_cacheId = 'some_id';
+    private $cacheId = 'some_id';
 
     /**
      * @var \Magento\ImportExport\Model\Export\Config
      */
-    protected $_model;
+    private $model;
 
     protected function setUp()
     {
-        $this->_readerMock = $this->getMock(
+        $this->readerMock = $this->getMock(
             \Magento\ImportExport\Model\Export\Config\Reader::class,
             [],
             [],
             '',
             false
         );
-        $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+        $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
     }
 
     /**
@@ -46,22 +52,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetEntities($value, $expected)
     {
-        $this->_configScopeMock->expects(
+        $this->cacheMock->expects(
             $this->any()
         )->method(
             'load'
         )->with(
-            $this->_cacheId
+            $this->cacheId
         )->will(
             $this->returnValue(false)
         );
-        $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($value));
-        $this->_model = new \Magento\ImportExport\Model\Export\Config(
-            $this->_readerMock,
-            $this->_configScopeMock,
-            $this->_cacheId
+        $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($value));
+        $this->model = new \Magento\ImportExport\Model\Export\Config(
+            $this->readerMock,
+            $this->cacheMock,
+            $this->cacheId,
+            $this->serializerMock
         );
-        $this->assertEquals($expected, $this->_model->getEntities('entities'));
+        $this->assertEquals($expected, $this->model->getEntities('entities'));
     }
 
     public function getEntitiesDataProvider()
@@ -80,22 +87,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetEntityTypes($configData, $entity, $expectedResult)
     {
-        $this->_configScopeMock->expects(
+        $this->cacheMock->expects(
             $this->any()
         )->method(
             'load'
         )->with(
-            $this->_cacheId
+            $this->cacheId
         )->will(
             $this->returnValue(false)
         );
-        $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($configData));
-        $this->_model = new \Magento\ImportExport\Model\Export\Config(
-            $this->_readerMock,
-            $this->_configScopeMock,
-            $this->_cacheId
+        $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($configData));
+        $this->model = new \Magento\ImportExport\Model\Export\Config(
+            $this->readerMock,
+            $this->cacheMock,
+            $this->cacheId,
+            $this->serializerMock
         );
-        $this->assertEquals($expectedResult, $this->_model->getEntityTypes($entity));
+        $this->assertEquals($expectedResult, $this->model->getEntityTypes($entity));
     }
 
     public function getEntityTypesDataProvider()
@@ -133,22 +141,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetFileFormats($value, $expected)
     {
-        $this->_configScopeMock->expects(
+        $this->cacheMock->expects(
             $this->any()
         )->method(
             'load'
         )->with(
-            $this->_cacheId
+            $this->cacheId
         )->will(
             $this->returnValue(false)
         );
-        $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($value));
-        $this->_model = new \Magento\ImportExport\Model\Export\Config(
-            $this->_readerMock,
-            $this->_configScopeMock,
-            $this->_cacheId
+        $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($value));
+        $this->model = new \Magento\ImportExport\Model\Export\Config(
+            $this->readerMock,
+            $this->cacheMock,
+            $this->cacheId,
+            $this->serializerMock
         );
-        $this->assertEquals($expected, $this->_model->getFileFormats('fileFormats'));
+        $this->assertEquals($expected, $this->model->getFileFormats('fileFormats'));
     }
 
     public function getFileFormatsDataProvider()
diff --git a/app/code/Magento/ImportExport/Test/Unit/Model/Import/ConfigTest.php b/app/code/Magento/ImportExport/Test/Unit/Model/Import/ConfigTest.php
index 1530c0b4a4d00d00944b6f57c41e1b5410ee9d16..60cd1f50238a46f746ad9e8107f7fd612d4f593b 100644
--- a/app/code/Magento/ImportExport/Test/Unit/Model/Import/ConfigTest.php
+++ b/app/code/Magento/ImportExport/Test/Unit/Model/Import/ConfigTest.php
@@ -8,35 +8,41 @@ namespace Magento\ImportExport\Test\Unit\Model\Import;
 class ConfigTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\ImportExport\Model\Import\Config\Reader|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_readerMock;
+    protected $readerMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_configScopeMock;
+    protected $cacheMock;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializerMock;
 
     /**
      * @var string
      */
-    protected $_cacheId = 'some_id';
+    protected $cacheId = 'some_id';
 
     /**
      * @var \Magento\ImportExport\Model\Import\Config
      */
-    protected $_model;
+    protected $model;
 
     protected function setUp()
     {
-        $this->_readerMock = $this->getMock(
+        $this->readerMock = $this->getMock(
             \Magento\ImportExport\Model\Import\Config\Reader::class,
             [],
             [],
             '',
             false
         );
-        $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+        $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
     }
 
     /**
@@ -46,22 +52,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetEntities($value, $expected)
     {
-        $this->_configScopeMock->expects(
+        $this->cacheMock->expects(
             $this->any()
         )->method(
             'load'
         )->with(
-            $this->_cacheId
+            $this->cacheId
         )->will(
             $this->returnValue(false)
         );
-        $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($value));
-        $this->_model = new \Magento\ImportExport\Model\Import\Config(
-            $this->_readerMock,
-            $this->_configScopeMock,
-            $this->_cacheId
+        $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($value));
+        $this->model = new \Magento\ImportExport\Model\Import\Config(
+            $this->readerMock,
+            $this->cacheMock,
+            $this->cacheId,
+            $this->serializerMock
         );
-        $this->assertEquals($expected, $this->_model->getEntities('entities'));
+        $this->assertEquals($expected, $this->model->getEntities('entities'));
     }
 
     public function getEntitiesDataProvider()
@@ -80,22 +87,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetEntityTypes($configData, $entity, $expectedResult)
     {
-        $this->_configScopeMock->expects(
+        $this->cacheMock->expects(
             $this->any()
         )->method(
             'load'
         )->with(
-            $this->_cacheId
+            $this->cacheId
         )->will(
             $this->returnValue(false)
         );
-        $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($configData));
-        $this->_model = new \Magento\ImportExport\Model\Import\Config(
-            $this->_readerMock,
-            $this->_configScopeMock,
-            $this->_cacheId
+        $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($configData));
+        $this->model = new \Magento\ImportExport\Model\Import\Config(
+            $this->readerMock,
+            $this->cacheMock,
+            $this->cacheId,
+            $this->serializerMock
         );
-        $this->assertEquals($expectedResult, $this->_model->getEntityTypes($entity));
+        $this->assertEquals($expectedResult, $this->model->getEntityTypes($entity));
     }
 
     public function getEntityTypesDataProvider()
diff --git a/app/code/Magento/Indexer/Model/Config/Data.php b/app/code/Magento/Indexer/Model/Config/Data.php
index 68a390a8c06b761b710b0ab950b56528a4228d22..3cedaa51ef4bb4952799321d5032e90c154b4feb 100644
--- a/app/code/Magento/Indexer/Model/Config/Data.php
+++ b/app/code/Magento/Indexer/Model/Config/Data.php
@@ -5,6 +5,12 @@
  */
 namespace Magento\Indexer\Model\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\App\ObjectManager;
+
+/**
+ * Provides indexer configuration
+ */
 class Data extends \Magento\Framework\Config\Data
 {
     /**
@@ -13,22 +19,26 @@ class Data extends \Magento\Framework\Config\Data
     protected $stateCollection;
 
     /**
+     * Constructor
+     *
      * @param \Magento\Framework\Indexer\Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
      * @param \Magento\Indexer\Model\ResourceModel\Indexer\State\Collection $stateCollection
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Indexer\Config\Reader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
         \Magento\Indexer\Model\ResourceModel\Indexer\State\Collection $stateCollection,
-        $cacheId = 'indexer_config'
+        $cacheId = 'indexer_config',
+        SerializerInterface $serializer = null
     ) {
         $this->stateCollection = $stateCollection;
 
         $isCacheExists = $cache->test($cacheId);
 
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
 
         if (!$isCacheExists) {
             $this->deleteNonexistentStates();
diff --git a/app/code/Magento/Indexer/Test/Unit/Model/Config/DataTest.php b/app/code/Magento/Indexer/Test/Unit/Model/Config/DataTest.php
index 5e0f7c314cf31d2189a0540b66d87b983f8dd0e9..e16c21b8f112592e759cca7489a685ae59aa5dbe 100644
--- a/app/code/Magento/Indexer/Test/Unit/Model/Config/DataTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Model/Config/DataTest.php
@@ -37,6 +37,11 @@ class DataTest extends \PHPUnit_Framework_TestCase
      */
     protected $indexers = ['indexer1' => [], 'indexer3' => []];
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
+
     protected function setUp()
     {
         $this->reader = $this->getMock(\Magento\Framework\Indexer\Config\Reader::class, ['read'], [], '', false);
@@ -56,20 +61,22 @@ class DataTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
     }
 
     public function testConstructorWithCache()
     {
+        $serializedData = 'serialized data';
         $this->cache->expects($this->once())->method('test')->with($this->cacheId)->will($this->returnValue(true));
-        $this->cache->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            $this->cacheId
-        )->will(
-            $this->returnValue(serialize($this->indexers))
-        );
+        $this->cache->expects($this->once())
+            ->method('load')
+            ->with($this->cacheId)
+            ->willReturn($serializedData);
+
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedData)
+            ->willReturn($this->indexers);
 
         $this->stateCollection->expects($this->never())->method('getItems');
 
@@ -77,7 +84,8 @@ class DataTest extends \PHPUnit_Framework_TestCase
             $this->reader,
             $this->cache,
             $this->stateCollection,
-            $this->cacheId
+            $this->cacheId,
+            $this->serializerMock
         );
     }
 
@@ -116,7 +124,8 @@ class DataTest extends \PHPUnit_Framework_TestCase
             $this->reader,
             $this->cache,
             $this->stateCollection,
-            $this->cacheId
+            $this->cacheId,
+            $this->serializerMock
         );
     }
 }
diff --git a/app/code/Magento/Indexer/view/adminhtml/layout/indexer_indexer_list_grid.xml b/app/code/Magento/Indexer/view/adminhtml/layout/indexer_indexer_list_grid.xml
index 6def568e9cbbd83fec74955430834f7538418ab9..63ef028238393bbbbcebaeff4c50caa1e94b44db 100644
--- a/app/code/Magento/Indexer/view/adminhtml/layout/indexer_indexer_list_grid.xml
+++ b/app/code/Magento/Indexer/view/adminhtml/layout/indexer_indexer_list_grid.xml
@@ -46,6 +46,7 @@
                             <argument name="index" xsi:type="string">title</argument>
                             <argument name="sortable" xsi:type="string">0</argument>
                             <argument name="column_css_class" xsi:type="string">indexer-title</argument>
+                            <argument name="translate" xsi:type="boolean">true</argument>
                         </arguments>
                     </block>
                     <block class="Magento\Backend\Block\Widget\Grid\Column" as="indexer_description">
@@ -54,6 +55,7 @@
                             <argument name="index" xsi:type="string">description</argument>
                             <argument name="sortable" xsi:type="string">0</argument>
                             <argument name="column_css_class" xsi:type="string">indexer-description</argument>
+                            <argument name="translate" xsi:type="boolean">true</argument>
                         </arguments>
                     </block>
                     <block class="Magento\Backend\Block\Widget\Grid\Column" as="indexer_mode">
diff --git a/app/code/Magento/OfflineShipping/Model/Quote/Address/FreeShipping.php b/app/code/Magento/OfflineShipping/Model/Quote/Address/FreeShipping.php
index d2febaccb2fdf3644774f89626e6224bf6e89415..cf9eed3e84d26860792c4d3751e138ad84863eb8 100644
--- a/app/code/Magento/OfflineShipping/Model/Quote/Address/FreeShipping.php
+++ b/app/code/Magento/OfflineShipping/Model/Quote/Address/FreeShipping.php
@@ -5,8 +5,6 @@
  */
 namespace Magento\OfflineShipping\Model\Quote\Address;
 
-use Magento\Quote\Model\Quote\Address;
-
 class FreeShipping implements \Magento\Quote\Model\Quote\Address\FreeShippingInterface
 {
     /**
@@ -48,7 +46,8 @@ class FreeShipping implements \Magento\Quote\Model\Quote\Address\FreeShippingInt
             $quote->getCustomerGroupId(),
             $quote->getCouponCode()
         );
-
+        $shippingAddress = $quote->getShippingAddress();
+        $shippingAddress->setFreeShipping(0);
         /** @var \Magento\Quote\Api\Data\CartItemInterface $item */
         foreach ($items as $item) {
             if ($item->getNoDiscount()) {
@@ -66,10 +65,14 @@ class FreeShipping implements \Magento\Quote\Model\Quote\Address\FreeShippingInt
             $itemFreeShipping = (bool)$item->getFreeShipping();
             $addressFreeShipping = $addressFreeShipping && $itemFreeShipping;
 
+            if ($addressFreeShipping && !$item->getAddress()->getFreeShipping()) {
+                $item->getAddress()->setFreeShipping(true);
+            }
+
             /** Parent free shipping we apply to all children*/
             $this->applyToChildren($item, $itemFreeShipping);
         }
-        return $addressFreeShipping;
+        return (bool)$shippingAddress->getFreeShipping();
     }
 
     /**
diff --git a/app/code/Magento/OfflineShipping/Test/Unit/Model/Quote/Address/FreeShippingTest.php b/app/code/Magento/OfflineShipping/Test/Unit/Model/Quote/Address/FreeShippingTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..27f3c375c91c5a70de74c3ed620838ec358144db
--- /dev/null
+++ b/app/code/Magento/OfflineShipping/Test/Unit/Model/Quote/Address/FreeShippingTest.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\OfflineShipping\Test\Unit\Model\Quote\Address;
+
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+
+class FreeShippingTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\OfflineShipping\Model\Quote\Address\FreeShipping
+     */
+    private $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Store\Model\StoreManagerInterface
+     */
+    private $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\OfflineShipping\Model\SalesRule\Calculator
+     */
+    private $calculatorMock;
+
+    protected function setUp()
+    {
+        $this->storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class);
+        $this->calculatorMock = $this->getMock(
+            \Magento\OfflineShipping\Model\SalesRule\Calculator::class,
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->model = new \Magento\OfflineShipping\Model\Quote\Address\FreeShipping(
+            $this->storeManagerMock,
+            $this->calculatorMock
+        );
+    }
+
+    public function testIsFreeShippingIfNoItems()
+    {
+        $quoteMock = $this->getMock(\Magento\Quote\Model\Quote::class, [], [], '', false);
+        $this->assertFalse($this->model->isFreeShipping($quoteMock, []));
+    }
+
+    public function testIsFreeShipping()
+    {
+        $storeId = 100;
+        $websiteId = 200;
+        $customerGroupId = 300;
+        $objectManagerMock = new ObjectManagerHelper($this);
+        $quoteMock = $this->getMock(
+            \Magento\Quote\Model\Quote::class,
+            ['getShippingAddress', 'getStoreId', 'getCustomerGroupId', 'getCouponCode'],
+            [],
+            '',
+            false
+        );
+        $itemMock = $this->getMock(
+            \Magento\Quote\Model\Quote\Item::class,
+            [
+                'getNoDiscount',
+                'getParentItemId',
+                'getFreeShipping',
+                'getAddress',
+                'isChildrenCalculated',
+                'getHasChildren',
+                'getChildren'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $quoteMock->expects($this->once())->method('getStoreId')->willReturn($storeId);
+        $storeMock = $this->getMock(\Magento\Store\Api\Data\StoreInterface::class);
+        $storeMock->expects($this->once())->method('getWebsiteId')->willReturn($websiteId);
+        $this->storeManagerMock->expects($this->once())->method('getStore')->with($storeId)->willReturn($storeMock);
+
+        $quoteMock->expects($this->once())->method('getCustomerGroupId')->willReturn($customerGroupId);
+        $quoteMock->expects($this->once())->method('getCouponCode')->willReturn(null);
+
+        $this->calculatorMock->expects($this->once())
+            ->method('init')
+            ->with($websiteId, $customerGroupId, null)
+            ->willReturnSelf();
+
+        $itemMock->expects($this->once())->method('getNoDiscount')->willReturn(false);
+        $itemMock->expects($this->once())->method('getParentItemId')->willReturn(false);
+        $this->calculatorMock->expects($this->exactly(2))->method('processFreeShipping')->willReturnSelf();
+        $itemMock->expects($this->once())->method('getFreeShipping')->willReturn(true);
+
+        $addressMock = $objectManagerMock->getObject(\Magento\Quote\Model\Quote\Address::class);
+        $quoteMock->expects($this->once())->method('getShippingAddress')->willReturn($addressMock);
+        $itemMock->expects($this->exactly(2))->method('getAddress')->willReturn($addressMock);
+
+        $itemMock->expects($this->once())->method('getHasChildren')->willReturn(true);
+        $itemMock->expects($this->once())->method('isChildrenCalculated')->willReturn(true);
+
+        $childMock = $this->getMock(\Magento\Quote\Model\Quote\Item::class, ['setFreeShipping'], [], '', false);
+        $childMock->expects($this->once())->method('setFreeShipping')->with(true)->willReturnSelf();
+        $itemMock->expects($this->once())->method('getChildren')->willReturn([$childMock]);
+
+        $this->assertTrue($this->model->isFreeShipping($quoteMock, [$itemMock]));
+    }
+}
diff --git a/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/RepositoryTest.php b/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/RepositoryTest.php
index dae3d56aa04b093c76d33f671606e2acfedb57af..c6e5241282cd0e9212ad342b0d48ee6da006ed51 100644
--- a/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/RepositoryTest.php
+++ b/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/RepositoryTest.php
@@ -12,6 +12,11 @@ namespace Magento\Quote\Test\Unit\Model\Quote\Item;
  */
 class RepositoryTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\Quote\Api\CartItemRepositoryInterface
      */
@@ -68,6 +73,7 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->quoteRepositoryMock = $this->getMock(\Magento\Quote\Api\CartRepositoryInterface::class);
         $this->productRepositoryMock = $this->getMock(\Magento\Catalog\Api\ProductRepositoryInterface::class);
         $this->itemDataFactoryMock =
@@ -100,12 +106,6 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $this->prepareObjectManager([
-            [
-                \Magento\Quote\Model\Quote\Item\CartItemOptionsProcessor::class,
-                $this->optionsProcessorMock
-            ]
-        ]);
 
         $this->repository = new \Magento\Quote\Model\Quote\Item\Repository(
             $this->quoteRepositoryMock,
@@ -113,6 +113,11 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             $this->itemDataFactoryMock,
             ['custom_options' => $this->customOptionProcessor]
         );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->repository,
+            'cartItemOptionsProcessor',
+            $this->optionsProcessorMock
+        );
     }
 
     /**
@@ -246,20 +251,4 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
 
         $this->assertTrue($this->repository->deleteById($cartId, $itemId));
     }
-
-    /**
-     * @param array $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/Quote/Test/Unit/Model/ShippingAddressManagementTest.php b/app/code/Magento/Quote/Test/Unit/Model/ShippingAddressManagementTest.php
index abae7bae110e6521fbf7b708270eb32cb6792c69..d8e65de847457e243a02d9535196e4c42f0499f8 100644
--- a/app/code/Magento/Quote/Test/Unit/Model/ShippingAddressManagementTest.php
+++ b/app/code/Magento/Quote/Test/Unit/Model/ShippingAddressManagementTest.php
@@ -104,12 +104,6 @@ class ShippingAddressManagementTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $this->prepareObjectManager([
-            [
-                \Magento\Quote\Model\Quote\Validator\MinimumOrderAmount\ValidationMessage::class,
-                $this->amountErrorMessageMock
-            ]
-        ]);
 
         $this->service = $this->objectManager->getObject(
             \Magento\Quote\Model\ShippingAddressManagement::class,
@@ -122,6 +116,11 @@ class ShippingAddressManagementTest extends \PHPUnit_Framework_TestCase
                 'addressRepository' => $this->addressRepository
             ]
         );
+        $this->objectManager->setBackwardCompatibleProperty(
+            $this->service,
+            'minimumAmountErrorMessage',
+            $this->amountErrorMessageMock
+        );
     }
 
     /**
@@ -375,20 +374,4 @@ class ShippingAddressManagementTest extends \PHPUnit_Framework_TestCase
 
         $this->service->get('cartId');
     }
-
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php
index f4945508fe722c9308002cbc2b49a4123eacde77..f066bb53b51accc86b7a0141423334aa417739a1 100644
--- a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php
+++ b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php
@@ -7,6 +7,8 @@ namespace Magento\Review\Model\ResourceModel\Review\Product;
 
 use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
 use Magento\Framework\DB\Select;
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
 
 /**
  * Review Product Collection
@@ -59,7 +61,8 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
     protected $_voteFactory;
 
     /**
-     * Collection constructor.
+     * Collection constructor
+     *
      * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
      * @param \Psr\Log\LoggerInterface $logger
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
@@ -81,7 +84,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
      * @param \Magento\Customer\Api\GroupManagementInterface $groupManagement
      * @param \Magento\Review\Model\RatingFactory $ratingFactory
      * @param \Magento\Review\Model\Rating\Option\VoteFactory $voteFactory
-     * @param mixed $connection
+     * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
+     * @param ProductLimitationFactory|null $productLimitationFactory
+     * @param MetadataPool|null $metadataPool
      *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
@@ -107,7 +112,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
         \Magento\Customer\Api\GroupManagementInterface $groupManagement,
         \Magento\Review\Model\RatingFactory $ratingFactory,
         \Magento\Review\Model\Rating\Option\VoteFactory $voteFactory,
-        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null
+        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
+        ProductLimitationFactory $productLimitationFactory = null,
+        MetadataPool $metadataPool = null
     ) {
         $this->_ratingFactory = $ratingFactory;
         $this->_voteFactory = $voteFactory;
@@ -131,7 +138,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
             $customerSession,
             $dateTime,
             $groupManagement,
-            $connection
+            $connection,
+            $productLimitationFactory,
+            $metadataPool
         );
     }
 
diff --git a/app/code/Magento/Review/Test/Unit/Model/ResourceModel/Review/Product/CollectionTest.php b/app/code/Magento/Review/Test/Unit/Model/ResourceModel/Review/Product/CollectionTest.php
index b1a1b9a69c7ff9905954385d7d685b87f9e2d273..8c51535a7f6ab9e40c1186315d9302eba760cc23 100644
--- a/app/code/Magento/Review/Test/Unit/Model/ResourceModel/Review/Product/CollectionTest.php
+++ b/app/code/Magento/Review/Test/Unit/Model/ResourceModel/Review/Product/CollectionTest.php
@@ -5,11 +5,18 @@
  */
 namespace Magento\Review\Test\Unit\Model\ResourceModel\Review\Product;
 
+use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
+
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class CollectionTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\Review\Model\ResourceModel\Review\Product\Collection
      */
@@ -74,16 +81,23 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
             false
         );
         $fetchStrategy->expects($this->any())->method('fetchAll')->will($this->returnValue([]));
-        $this->model = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))
-            ->getObject(
-                \Magento\Review\Model\ResourceModel\Review\Product\Collection::class,
-                [
-                    'universalFactory' => $universalFactory,
-                    'storeManager' => $storeManager,
-                    'eavConfig' => $eavConfig,
-                    'fetchStrategy' => $fetchStrategy
-                ]
-            );
+        $productLimitationMock = $this->getMock(
+            \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class
+        );
+        $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']);
+        $productLimitationFactoryMock->method('create')
+            ->willReturn($productLimitationMock);
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->model = $this->objectManager->getObject(
+            \Magento\Review\Model\ResourceModel\Review\Product\Collection::class,
+            [
+                'universalFactory' => $universalFactory,
+                'storeManager' => $storeManager,
+                'eavConfig' => $eavConfig,
+                'fetchStrategy' => $fetchStrategy,
+                'productLimitationFactory' => $productLimitationFactoryMock
+            ]
+        );
     }
 
     /**
diff --git a/app/code/Magento/Rss/Model/Rss.php b/app/code/Magento/Rss/Model/Rss.php
index 0f228cb9a21c2f6c8ca64a2692f309bbfaced855..af716613bd2612cce965c386e1bb8eac107a4222 100644
--- a/app/code/Magento/Rss/Model/Rss.php
+++ b/app/code/Magento/Rss/Model/Rss.php
@@ -5,13 +5,10 @@
  */
 namespace Magento\Rss\Model;
 
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\App\Rss\DataProviderInterface;
+use Magento\Framework\Serialize\SerializerInterface;
 
-/**
- * Auth session model
- *
- * @author      Magento Core Team <core@magentocommerce.com>
- */
 class Rss
 {
     /**
@@ -25,11 +22,22 @@ class Rss
     protected $cache;
 
     /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * Rss constructor
+     *
      * @param \Magento\Framework\App\CacheInterface $cache
+     * @param SerializerInterface|null $serializer
      */
-    public function __construct(\Magento\Framework\App\CacheInterface $cache)
-    {
+    public function __construct(
+        \Magento\Framework\App\CacheInterface $cache,
+        SerializerInterface $serializer = null
+    ) {
         $this->cache = $cache;
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
     }
 
     /**
@@ -46,14 +54,14 @@ class Rss
         }
 
         if ($cache) {
-            return unserialize($cache);
+            return $this->serializer->unserialize($cache);
         }
 
         $data = $this->dataProvider->getRssData();
 
         if ($this->dataProvider->getCacheKey() && $this->dataProvider->getCacheLifetime()) {
             $this->cache->save(
-                serialize($data),
+                $this->serializer->serialize($data),
                 $this->dataProvider->getCacheKey(),
                 ['rss'],
                 $this->dataProvider->getCacheLifetime()
diff --git a/app/code/Magento/Rss/Test/Unit/Model/RssTest.php b/app/code/Magento/Rss/Test/Unit/Model/RssTest.php
index 7a12c4818e71a16a7ffc1b4f41cff78cb547798f..0c5eb303935ff37c084fb0e27803e2ef40a17f95 100644
--- a/app/code/Magento/Rss/Test/Unit/Model/RssTest.php
+++ b/app/code/Magento/Rss/Test/Unit/Model/RssTest.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Rss\Test\Unit\Model;
 
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
 
 class RssTest extends \PHPUnit_Framework_TestCase
@@ -40,17 +41,23 @@ class RssTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \Magento\Framework\App\CacheInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cacheInterface;
+    private $cacheMock;
+
+    /**
+     * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
 
     protected function setUp()
     {
-        $this->cacheInterface = $this->getMock(\Magento\Framework\App\CacheInterface::class);
-
+        $this->cacheMock = $this->getMock(\Magento\Framework\App\CacheInterface::class);
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
         $this->objectManagerHelper = new ObjectManagerHelper($this);
         $this->rss = $this->objectManagerHelper->getObject(
             \Magento\Rss\Model\Rss::class,
             [
-                'cache' => $this->cacheInterface
+                'cache' => $this->cacheMock,
+                'serializer' => $this->serializerMock
             ]
         );
     }
@@ -64,8 +71,18 @@ class RssTest extends \PHPUnit_Framework_TestCase
 
         $this->rss->setDataProvider($dataProvider);
 
-        $this->cacheInterface->expects($this->once())->method('load')->will($this->returnValue(false));
-        $this->cacheInterface->expects($this->once())->method('save')->will($this->returnValue(true));
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->with('cache_key')
+            ->will($this->returnValue(false));
+        $this->cacheMock->expects($this->once())
+            ->method('save')
+            ->with('serializedData')
+            ->will($this->returnValue(true));
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($this->feedData)
+            ->willReturn('serializedData');
 
         $this->assertEquals($this->feedData, $this->rss->getFeeds());
     }
@@ -79,9 +96,15 @@ class RssTest extends \PHPUnit_Framework_TestCase
 
         $this->rss->setDataProvider($dataProvider);
 
-        $this->cacheInterface->expects($this->once())->method('load')
-            ->will($this->returnValue(serialize($this->feedData)));
-        $this->cacheInterface->expects($this->never())->method('save');
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->with('cache_key')
+            ->will($this->returnValue('serializedData'));
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with('serializedData')
+            ->willReturn($this->feedData);
+        $this->cacheMock->expects($this->never())->method('save');
 
         $this->assertEquals($this->feedData, $this->rss->getFeeds());
     }
diff --git a/app/code/Magento/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php
index 45f0c092c4aece714653feec67abdaf36b2def0c..73e3db2c8a35895c8943284a62377d1a4e03d592 100644
--- a/app/code/Magento/Rule/Model/AbstractModel.php
+++ b/app/code/Magento/Rule/Model/AbstractModel.php
@@ -3,9 +3,11 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Rule\Model;
 
+use Magento\Framework\Api\AttributeValueFactory;
+use Magento\Framework\Api\ExtensionAttributesFactory;
+
 /**
  * Abstract Rule entity data model
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -76,7 +78,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible
     protected $_localeDate;
 
     /**
-     * AbstractModel constructor.
+     * AbstractModel constructor
      *
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -85,6 +87,8 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible
      * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection
      * @param array $data
+     * @param ExtensionAttributesFactory|null $extensionFactory
+     * @param AttributeValueFactory|null $customAttributeFactory
      */
     public function __construct(
         \Magento\Framework\Model\Context $context,
@@ -93,15 +97,17 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
-        array $data = []
+        array $data = [],
+        ExtensionAttributesFactory $extensionFactory = null,
+        AttributeValueFactory $customAttributeFactory = null
     ) {
         $this->_formFactory = $formFactory;
         $this->_localeDate = $localeDate;
         parent::__construct(
             $context,
             $registry,
-            $this->getExtensionFactory(),
-            $this->getCustomAttributeFactory(),
+            $extensionFactory ?: $this->getExtensionFactory(),
+            $customAttributeFactory ?: $this->getCustomAttributeFactory(),
             $resource,
             $resourceCollection,
             $data
diff --git a/app/code/Magento/Sales/Block/Status/Grid/Column/State.php b/app/code/Magento/Sales/Block/Status/Grid/Column/State.php
index cd049799e7b497b5b657bd03122a2dcf4e2986ab..ae9ea20fd35fd110e796d87564409cadcd8fe57e 100644
--- a/app/code/Magento/Sales/Block/Status/Grid/Column/State.php
+++ b/app/code/Magento/Sales/Block/Status/Grid/Column/State.php
@@ -49,8 +49,9 @@ class State extends \Magento\Backend\Block\Widget\Grid\Column
      */
     public function decorateState($value, $row, $column, $isExport)
     {
+        $status = $row->getStatus();
         if ($value) {
-            $cell = $value . '[' . $this->_config->getStateLabel($value) . ']';
+            $cell = $value . '[' . $this->_config->getStateLabelByStateAndStatus($value, $status) . ']';
         } else {
             $cell = $value;
         }
diff --git a/app/code/Magento/Sales/Model/Config/Data.php b/app/code/Magento/Sales/Model/Config/Data.php
index 6d3d3a2ac123459bb1734a8f0456c98442e216c2..b6a1b43012f9e8ba55c4440d78cde41a0d6e2dfc 100644
--- a/app/code/Magento/Sales/Model/Config/Data.php
+++ b/app/code/Magento/Sales/Model/Config/Data.php
@@ -3,24 +3,29 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+namespace Magento\Sales\Model\Config;
+
+use Magento\Framework\Serialize\SerializerInterface;
 
 /**
- * Sales configuration data container
+ * Provides sales configuration
  */
-namespace Magento\Sales\Model\Config;
-
 class Data extends \Magento\Framework\Config\Data
 {
     /**
-     * @param \Magento\Sales\Model\Config\Reader $reader
+     * Constructor
+     *
+     * @param Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Sales\Model\Config\Reader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = 'sales_totals_config_cache'
+        $cacheId = 'sales_totals_config_cache',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 }
diff --git a/app/code/Magento/Sales/Model/Order/Config.php b/app/code/Magento/Sales/Model/Order/Config.php
index 8c6f2e55f55acfa9ea8b0c26e25efac97f330f30..535e2975ee13da8458cba83666ba49abb942a89a 100644
--- a/app/code/Magento/Sales/Model/Order/Config.php
+++ b/app/code/Magento/Sales/Model/Order/Config.php
@@ -256,4 +256,22 @@ class Config
         }
         return $this->statuses[(bool) $visibility];
     }
+
+    /**
+     * Retrieve label by state  and status
+     *
+     * @param string $state
+     * @param string $status
+     * @return \Magento\Framework\Phrase|string
+     */
+    public function getStateLabelByStateAndStatus($state, $status)
+    {
+        foreach ($this->_getCollection() as $item) {
+            if ($item->getData('state') == $state && $item->getData('status') == $status) {
+                $label = $item->getData('label');
+                return __($label);
+            }
+        }
+        return $state;
+    }
 }
diff --git a/app/code/Magento/Sales/Setup/UpgradeSchema.php b/app/code/Magento/Sales/Setup/UpgradeSchema.php
index d35825242fb291a41961eb882ad93f7d24c58ee9..288e8085a0dab51947905ed0254e69c8479e79ff 100644
--- a/app/code/Magento/Sales/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Sales/Setup/UpgradeSchema.php
@@ -76,8 +76,9 @@ class UpgradeSchema implements UpgradeSchemaInterface
                 'sales_shipment_grid',
             ];
             foreach ($tables as $table) {
-                $setup->getConnection()->modifyColumn(
-                    $setup->getTable($table),
+                $salesConnection = $setup->getConnection(self::$connectionName);
+                $salesConnection->modifyColumn(
+                    $installer->getTable($table, self::$connectionName),
                     'customer_group_id',
                     ['type' => 'integer']
                 );
diff --git a/app/code/Magento/Sales/Test/Unit/Block/Status/Grid/Column/StateTest.php b/app/code/Magento/Sales/Test/Unit/Block/Status/Grid/Column/StateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..59e7accb583d051a62821276a3c6521c8abb54f2
--- /dev/null
+++ b/app/code/Magento/Sales/Test/Unit/Block/Status/Grid/Column/StateTest.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Sales\Test\Unit\Block\Status\Grid\Column;
+
+class StateTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var  \Magento\Sales\Block\Status\Grid\Column\State
+     */
+    private $stateColumn;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $orderStatusCollectionFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $configMock;
+
+    protected function setUp()
+    {
+        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->orderStatusCollectionFactoryMock = $this->getMock(
+            \Magento\Sales\Model\ResourceModel\Order\Status\CollectionFactory::class,
+            ['create'],
+            [],
+            '',
+            false,
+            false
+        );
+        $this->configMock = $helper->getObject(
+            \Magento\Sales\Model\Order\Config::class,
+            [
+                'orderStatusCollectionFactory' => $this->orderStatusCollectionFactoryMock
+            ]
+        );
+        $this->stateColumn = $helper
+            ->getObject(
+                \Magento\Sales\Block\Status\Grid\Column\State::class,
+                [
+                    'config' => $this->configMock,
+                ]
+            );
+    }
+
+    public function testDecorateState()
+    {
+        $rowMock = $this->getMock(\Magento\Sales\Model\Order\Status::class, [], [], '', false);
+        $rowMock->expects($this->any())->method('getStatus')->willReturn('fraud');
+        $columnMock = $this->getMock(\Magento\Backend\Block\Widget\Grid\Column::class, [], [], '', false);
+        $statuses = [
+            new \Magento\Framework\DataObject(
+                [
+                    'status' => 'fraud',
+                    'state' => 'processing',
+                    'label' => 'Suspected Fraud',
+                ]
+            ),
+            new \Magento\Framework\DataObject(
+                [
+                    'status' => 'processing',
+                    'state' => 'processing',
+                    'label' => 'Processing',
+                ]
+            )
+        ];
+        $collectionMock = $this->getMock(
+            \Magento\Sales\Model\ResourceModel\Order\Status\Collection::class,
+            ['create', 'joinStates'],
+            [],
+            '',
+            false,
+            false
+        );
+        $this->orderStatusCollectionFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($collectionMock));
+        $collectionMock->expects($this->once())
+            ->method('joinStates')
+            ->will($this->returnValue($statuses));
+
+        $result = $this->stateColumn->decorateState('processing', $rowMock, $columnMock, false);
+        $this->assertSame('processing[processing]', $result);
+    }
+}
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Config/DataTest.php b/app/code/Magento/Sales/Test/Unit/Model/Config/DataTest.php
index 722fdb2b9495fd86413eeda76a8abc041a0722dc..0c342ff115eaff8d761c8b1ac7c395b724daefb2 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Config/DataTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Config/DataTest.php
@@ -7,31 +7,56 @@ namespace Magento\Sales\Test\Unit\Model\Config;
 
 class DataTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_readerMock;
+    private $_readerMock;
 
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_cacheMock;
+    private $_cacheMock;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
 
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->_readerMock = $this->getMockBuilder(
             \Magento\Sales\Model\Config\Reader::class
         )->disableOriginalConstructor()->getMock();
         $this->_cacheMock = $this->getMockBuilder(
             \Magento\Framework\App\Cache\Type\Config::class
         )->disableOriginalConstructor()->getMock();
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
     }
 
     public function testGet()
     {
         $expected = ['someData' => ['someValue', 'someKey' => 'someValue']];
-        $this->_cacheMock->expects($this->any())->method('load')->will($this->returnValue(serialize($expected)));
-        $configData = new \Magento\Sales\Model\Config\Data($this->_readerMock, $this->_cacheMock);
+        $this->_cacheMock->expects($this->once())
+            ->method('load');
+
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->willReturn($expected);
+
+        $configData = $this->objectManager->getObject(
+            \Magento\Sales\Model\Config\Data::class,
+            [
+                'reader' => $this->_readerMock,
+                'cache' => $this->_cacheMock,
+                'serializer' => $this->serializerMock,
+            ]
+        );
 
         $this->assertEquals($expected, $configData->get());
     }
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/ConfigTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/ConfigTest.php
index 1f29235efaef29a790daccd7cf16447d9254adac..7ee4f745cde8f75de23147c956ca0bf039ab2e3a 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/ConfigTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/ConfigTest.php
@@ -5,8 +5,6 @@
  */
 namespace Magento\Sales\Test\Unit\Model\Order;
 
-use \Magento\Sales\Model\Order\Config;
-
 /**
  * Class ConfigTest
  */
@@ -95,4 +93,40 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $result = $this->salesConfig->getInvisibleOnFrontStatuses();
         $this->assertSame($expectedResult, $result);
     }
+
+    public function testGetStateLabelByStateAndStatus()
+    {
+        $statuses = [
+            new \Magento\Framework\DataObject(
+                [
+                    'status' => 'fraud',
+                    'state' => 'processing',
+                    'label' => 'Suspected Fraud',
+                ]
+            ),
+            new \Magento\Framework\DataObject(
+                [
+                    'status' => 'processing',
+                    'state' => 'processing',
+                    'label' => 'Processing',
+                ]
+            )
+        ];
+        $collectionMock = $this->getMock(
+            \Magento\Sales\Model\ResourceModel\Order\Status\Collection::class,
+            ['create', 'joinStates'],
+            [],
+            '',
+            false,
+            false
+        );
+        $this->orderStatusCollectionFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($collectionMock));
+        $collectionMock->expects($this->once())
+            ->method('joinStates')
+            ->will($this->returnValue($statuses));
+        $result = $this->salesConfig->getStateLabelByStateAndStatus('processing', 'fraud');
+        $this->assertSame('Suspected Fraud', $result->getText());
+    }
 }
diff --git a/app/code/Magento/SalesRule/Model/ResourceModel/Rule.php b/app/code/Magento/SalesRule/Model/ResourceModel/Rule.php
index 78cc3e1c39c275055811fb38db1474634c2b0386..0398508eccf3ef621afb1a0b1cb0f0753128bd14 100644
--- a/app/code/Magento/SalesRule/Model/ResourceModel/Rule.php
+++ b/app/code/Magento/SalesRule/Model/ResourceModel/Rule.php
@@ -5,12 +5,11 @@
  */
 namespace Magento\SalesRule\Model\ResourceModel;
 
+use Magento\Framework\App\ObjectManager;
 use \Magento\SalesRule\Model\Rule as SalesRule;
 use Magento\Framework\Model\AbstractModel;
-use Magento\Framework\DB\Select;
 use Magento\Rule\Model\ResourceModel\AbstractResource;
 use Magento\Framework\EntityManager\EntityManager;
-use Magento\SalesRule\Api\Data\RuleInterface;
 
 /**
  * Sales Rule resource model
@@ -56,16 +55,21 @@ class Rule extends AbstractResource
      * @param \Magento\Framework\Stdlib\StringUtils $string
      * @param \Magento\SalesRule\Model\ResourceModel\Coupon $resourceCoupon
      * @param string $connectionName
+     * @param \Magento\Framework\DataObject|null $associatedEntityMapInstance
      */
     public function __construct(
         \Magento\Framework\Model\ResourceModel\Db\Context $context,
         \Magento\Framework\Stdlib\StringUtils $string,
         \Magento\SalesRule\Model\ResourceModel\Coupon $resourceCoupon,
-        $connectionName = null
+        $connectionName = null,
+        \Magento\Framework\DataObject $associatedEntityMapInstance = null
     ) {
         $this->string = $string;
         $this->_resourceCoupon = $resourceCoupon;
-        $this->_associatedEntitiesMap = $this->getAssociatedEntitiesMap();
+        $associatedEntitiesMapInstance = $associatedEntityMapInstance ?: ObjectManager::getInstance()->get(
+            \Magento\SalesRule\Model\ResourceModel\Rule\AssociatedEntityMap::class
+        );
+        $this->_associatedEntitiesMap = $associatedEntitiesMapInstance->getData();
         parent::__construct($context, $connectionName);
     }
 
@@ -380,20 +384,6 @@ class Rule extends AbstractResource
         return $this;
     }
 
-    /**
-     * @return array
-     * @deprecated
-     */
-    private function getAssociatedEntitiesMap()
-    {
-        if (!$this->_associatedEntitiesMap) {
-            $this->_associatedEntitiesMap = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get(\Magento\SalesRule\Model\ResourceModel\Rule\AssociatedEntityMap::class)
-                ->getData();
-        }
-        return $this->_associatedEntitiesMap;
-    }
-
     /**
      * @return \Magento\Framework\EntityManager\EntityManager
      * @deprecated
diff --git a/app/code/Magento/SalesRule/Model/Rule.php b/app/code/Magento/SalesRule/Model/Rule.php
index 3253c040ac9f90398cf7388870fca5598980309a..033c0ebd5be90b523bed4da381aa059ba8d7d3a9 100644
--- a/app/code/Magento/SalesRule/Model/Rule.php
+++ b/app/code/Magento/SalesRule/Model/Rule.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\SalesRule\Model;
 
+use Magento\Framework\Api\AttributeValueFactory;
+use Magento\Framework\Api\ExtensionAttributesFactory;
 use Magento\Quote\Model\Quote\Address;
 
 /**
@@ -171,6 +173,8 @@ class Rule extends \Magento\Rule\Model\AbstractModel
     protected $_storeManager;
 
     /**
+     * Rule constructor
+     *
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
      * @param \Magento\Framework\Data\FormFactory $formFactory
@@ -184,6 +188,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel
      * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection
      * @param array $data
+     * @param ExtensionAttributesFactory|null $extensionFactory
+     * @param AttributeValueFactory|null $customAttributeFactory
+     *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -199,7 +206,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
-        array $data = []
+        array $data = [],
+        ExtensionAttributesFactory $extensionFactory = null,
+        AttributeValueFactory $customAttributeFactory = null
     ) {
         $this->_couponFactory = $couponFactory;
         $this->_codegenFactory = $codegenFactory;
@@ -214,7 +223,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel
             $localeDate,
             $resource,
             $resourceCollection,
-            $data
+            $data,
+            $extensionFactory,
+            $customAttributeFactory
         );
     }
 
diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/RuleTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/RuleTest.php
index 5c60007543916f163f5e13ea8c83bf1a0e178be7..763e77f94f7a277c592a294c426b4f1478e51248 100644
--- a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/RuleTest.php
+++ b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/RuleTest.php
@@ -3,16 +3,18 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\SalesRule\Test\Unit\Model\ResourceModel;
 
-use Magento\SalesRule\Api\Data\RuleInterface;
-
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class RuleTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\SalesRule\Model\ResourceModel\Rule
      */
@@ -60,7 +62,7 @@ class RuleTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->rule = $this->getMockBuilder(\Magento\SalesRule\Model\Rule::class)
             ->disableOriginalConstructor()
             ->getMock();
@@ -117,7 +119,13 @@ class RuleTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $associatedEntitiesMap = $this->getMock(\Magento\Framework\DataObject::class, [], [], '', false);
+        $associatedEntitiesMap = $this->getMock(
+            \Magento\Framework\DataObject::class,
+            ['getData'],
+            [],
+            '',
+            false
+        );
         $associatedEntitiesMap->expects($this->once())
             ->method('getData')
             ->willReturn(
@@ -135,19 +143,13 @@ class RuleTest extends \PHPUnit_Framework_TestCase
                 ]
             );
 
-        $this->prepareObjectManager([
-            [
-                \Magento\SalesRule\Model\ResourceModel\Rule\AssociatedEntityMap::class,
-                $associatedEntitiesMap
-            ],
-        ]);
-
-        $this->model = $objectManager->getObject(
+        $this->model = $this->objectManager->getObject(
             \Magento\SalesRule\Model\ResourceModel\Rule::class,
             [
                 'context' => $context,
                 'connectionName' => $connectionName,
                 'entityManager' => $this->entityManager,
+                'associatedEntityMapInstance' => $associatedEntitiesMap
             ]
         );
     }
@@ -184,20 +186,4 @@ class RuleTest extends \PHPUnit_Framework_TestCase
             ->with($this->rule);
         $this->assertEquals($this->model->delete($this->rule), $this->model);
     }
-
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/RuleTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/RuleTest.php
index f3d16c188fdf9dec8d2404d52fd01047a5deed6f..48cd2ab7c4850450d5c62986619877531fc382b4 100644
--- a/app/code/Magento/SalesRule/Test/Unit/Model/RuleTest.php
+++ b/app/code/Magento/SalesRule/Test/Unit/Model/RuleTest.php
@@ -3,7 +3,6 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\SalesRule\Test\Unit\Model;
 
 class RuleTest extends \PHPUnit_Framework_TestCase
@@ -57,17 +56,6 @@ class RuleTest extends \PHPUnit_Framework_TestCase
             ->setMethods(['create'])
             ->getMock();
 
-        $this->prepareObjectManager([
-            [
-                \Magento\Framework\Api\ExtensionAttributesFactory::class,
-                $this->getMock(\Magento\Framework\Api\ExtensionAttributesFactory::class, [], [], '', false)
-            ],
-            [
-                \Magento\Framework\Api\AttributeValueFactory::class,
-                $this->getMock(\Magento\Framework\Api\AttributeValueFactory::class, [], [], '', false)
-            ],
-        ]);
-
         $this->model = $objectManager->getObject(
             \Magento\SalesRule\Model\Rule::class,
             [
@@ -179,20 +167,4 @@ class RuleTest extends \PHPUnit_Framework_TestCase
         $expectedResult = 'form_namerule_actions_fieldset_100';
         $this->assertEquals($expectedResult, $this->model->getActionsFieldSetId($formName));
     }
-
-    /**
-     * @param $map
-     */
-    private function prepareObjectManager($map)
-    {
-        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf();
-        $objectManagerMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap($map));
-        $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class);
-        $reflectionProperty = $reflectionClass->getProperty('_instance');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($objectManagerMock);
-    }
 }
diff --git a/app/code/Magento/Search/Model/SearchEngine/Config/Data.php b/app/code/Magento/Search/Model/SearchEngine/Config/Data.php
index 18a3b620eee18d1905d9c0cc533d358e05044c53..d128a9d50025d8f69437284ba2d42a5ae5f022ff 100644
--- a/app/code/Magento/Search/Model/SearchEngine/Config/Data.php
+++ b/app/code/Magento/Search/Model/SearchEngine/Config/Data.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\Search\Model\SearchEngine\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides search engine configuration
+ */
 class Data extends \Magento\Framework\Config\Data
 {
     /**
@@ -12,13 +17,15 @@ class Data extends \Magento\Framework\Config\Data
      *
      * @param \Magento\Framework\Search\SearchEngine\Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Search\SearchEngine\Config\Reader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = 'search_engine_config_cache'
+        $cacheId = 'search_engine_config_cache',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 }
diff --git a/app/code/Magento/Store/App/Config/Source/RuntimeConfigSource.php b/app/code/Magento/Store/App/Config/Source/RuntimeConfigSource.php
new file mode 100644
index 0000000000000000000000000000000000000000..015ba1d6ef63392cf3c4ac6ec7d6f38a1777c80b
--- /dev/null
+++ b/app/code/Magento/Store/App/Config/Source/RuntimeConfigSource.php
@@ -0,0 +1,197 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\App\Config\Source;
+
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\App\DeploymentConfig;
+use Magento\Store\Model\ResourceModel\Website\CollectionFactory as WebsiteCollectionFactory;
+use Magento\Store\Model\ResourceModel\Group\CollectionFactory as GroupCollectionFactory;
+use Magento\Store\Model\ResourceModel\Store\CollectionFactory as StoreCollectionFactory;
+use Magento\Store\Model\WebsiteFactory;
+use Magento\Store\Model\GroupFactory;
+use Magento\Store\Model\StoreFactory;
+
+/**
+ * Class RuntimeConfigSource
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class RuntimeConfigSource implements ConfigSourceInterface
+{
+    /**
+     * @var WebsiteCollectionFactory
+     */
+    private $websiteCollectionFactory;
+
+    /**
+     * @var GroupCollectionFactory
+     */
+    private $groupCollectionFactory;
+
+    /**
+     * @var StoreCollectionFactory
+     */
+    private $storeCollectionFactory;
+
+    /**
+     * @var DeploymentConfig
+     */
+    private $deploymentConfig;
+
+    /**
+     * @var WebsiteFactory
+     */
+    private $websiteFactory;
+
+    /**
+     * @var GroupFactory
+     */
+    private $groupFactory;
+
+    /**
+     * @var StoreFactory
+     */
+    private $storeFactory;
+
+    /**
+     * DynamicDataProvider constructor.
+     *
+     * @param WebsiteCollectionFactory $websiteCollectionFactory
+     * @param GroupCollectionFactory $groupCollectionFactory
+     * @param StoreCollectionFactory $storeCollectionFactory
+     * @param WebsiteFactory $websiteFactory
+     * @param GroupFactory $groupFactory
+     * @param StoreFactory $storeFactory
+     * @param DeploymentConfig $deploymentConfig
+     */
+    public function __construct(
+        WebsiteCollectionFactory $websiteCollectionFactory,
+        GroupCollectionFactory $groupCollectionFactory,
+        StoreCollectionFactory $storeCollectionFactory,
+        WebsiteFactory $websiteFactory,
+        GroupFactory $groupFactory,
+        StoreFactory $storeFactory,
+        DeploymentConfig $deploymentConfig
+    ) {
+        $this->websiteCollectionFactory = $websiteCollectionFactory;
+        $this->groupCollectionFactory = $groupCollectionFactory;
+        $this->storeCollectionFactory = $storeCollectionFactory;
+        $this->deploymentConfig = $deploymentConfig;
+        $this->websiteFactory = $websiteFactory;
+        $this->groupFactory = $groupFactory;
+        $this->storeFactory = $storeFactory;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function get($path = '')
+    {
+        if (strpos($path, '/') === false) {
+            $scopePool = $path;
+            $scopeCode = null;
+        } else {
+            list($scopePool, $scopeCode) = explode('/', $path);
+        }
+
+        $data = [];
+        if ($this->canUseDatabase()) {
+            switch ($scopePool) {
+                case 'websites':
+                    $data = $this->getWebsitesData($scopeCode);
+                    break;
+                case 'groups':
+                    $data = $this->getGroupsData($scopeCode);
+                    break;
+                case 'stores':
+                    $data = $this->getStoresData($scopeCode);
+                    break;
+                default:
+                    $data = [
+                        'websites' => $this->getWebsitesData(),
+                        'groups' => $this->getGroupsData(),
+                        'stores' => $this->getStoresData(),
+                    ];
+                    break;
+            }
+        }
+
+        return $data;
+    }
+
+    /**
+     * @param string|null $code
+     * @return array
+     */
+    private function getWebsitesData($code = null)
+    {
+        if ($code) {
+            $website = $this->websiteFactory->create();
+            $website->load($code);
+            $data = $website->getData();
+        } else {
+            $collection = $this->websiteCollectionFactory->create();
+            $collection->setLoadDefault(true);
+            $data = [];
+            foreach ($collection as $website) {
+                $data[$website->getCode()] = $website->getData();
+            }
+        }
+        return $data;
+    }
+
+    /**
+     * @param string|null $id
+     * @return array
+     */
+    private function getGroupsData($id = null)
+    {
+        if ($id) {
+            $group = $this->groupFactory->create();
+            $group->load($id);
+            $data = $group->getData();
+        } else {
+            $collection = $this->groupCollectionFactory->create();
+            $collection->setLoadDefault(true);
+            $data = [];
+            foreach ($collection as $group) {
+                $data[$group->getId()] = $group->getData();
+            }
+        }
+        return $data;
+    }
+
+    /**
+     * @param string|null $code
+     * @return array
+     */
+    private function getStoresData($code = null)
+    {
+        if ($code) {
+            $store = $this->storeFactory->create();
+            $store->load($code, 'code');
+            $data = $store->getData();
+        } else {
+            $collection = $this->storeCollectionFactory->create();
+            $collection->setLoadDefault(true);
+            $data = [];
+            foreach ($collection as $store) {
+                $data[$store->getCode()] = $store->getData();
+            }
+            return $data;
+        }
+        return $data;
+    }
+
+    /**
+     * Check whether db connection is available and can be used
+     *
+     * @return bool
+     */
+    private function canUseDatabase()
+    {
+        return $this->deploymentConfig->get('db');
+    }
+}
diff --git a/app/code/Magento/Store/App/Config/Type/Scopes.php b/app/code/Magento/Store/App/Config/Type/Scopes.php
new file mode 100644
index 0000000000000000000000000000000000000000..1c9ac59442163945f6aab2739807afdd74be7673
--- /dev/null
+++ b/app/code/Magento/Store/App/Config/Type/Scopes.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\App\Config\Type;
+
+use Magento\Framework\App\Config\ConfigTypeInterface;
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\DataObject;
+
+/**
+ * Merge and hold scopes data from different sources
+ *
+ * @package Magento\Store\App\Config\Type
+ */
+class Scopes implements ConfigTypeInterface
+{
+    const CONFIG_TYPE = 'scopes';
+
+    /**
+     * @var ConfigSourceInterface
+     */
+    private $source;
+
+    /**
+     * @var DataObject[]
+     */
+    private $data;
+
+    /**
+     * System constructor.
+     * @param ConfigSourceInterface $source
+     */
+    public function __construct(
+        ConfigSourceInterface $source
+    ) {
+        $this->source = $source;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function get($path = '')
+    {
+        if (!$this->data) {
+            $this->data = new DataObject($this->source->get());
+        }
+
+        return $this->data->getData($path);
+    }
+
+    /**
+     * Clean cache
+     *
+     * @return void
+     */
+    public function clean()
+    {
+        $this->data = null;
+    }
+}
diff --git a/app/code/Magento/Store/Model/Config/Converter.php b/app/code/Magento/Store/Model/Config/Converter.php
index 9cc898e58207a890e7f8eaaf3730a01e88f83181..939544399d517f7adc73da6f8ee1ac32948721eb 100644
--- a/app/code/Magento/Store/Model/Config/Converter.php
+++ b/app/code/Magento/Store/Model/Config/Converter.php
@@ -7,21 +7,11 @@
  */
 namespace Magento\Store\Model\Config;
 
+/**
+ * Class Converter.
+ */
 class Converter extends \Magento\Framework\App\Config\Scope\Converter
 {
-    /**
-     * @var \Magento\Store\Model\Config\Processor\Placeholder
-     */
-    protected $_processor;
-
-    /**
-     * @param \Magento\Store\Model\Config\Processor\Placeholder $processor
-     */
-    public function __construct(\Magento\Store\Model\Config\Processor\Placeholder $processor)
-    {
-        $this->_processor = $processor;
-    }
-
     /**
      * Convert config data
      *
@@ -31,7 +21,6 @@ class Converter extends \Magento\Framework\App\Config\Scope\Converter
      */
     public function convert($source, $initialConfig = [])
     {
-        $config = array_replace_recursive($initialConfig, parent::convert($source));
-        return $this->_processor->process($config);
+        return array_replace_recursive($initialConfig, parent::convert($source));
     }
 }
diff --git a/app/code/Magento/Store/Model/Config/Placeholder.php b/app/code/Magento/Store/Model/Config/Placeholder.php
new file mode 100644
index 0000000000000000000000000000000000000000..af313c82b949aeaf177655c08d3af4003a3ae2e0
--- /dev/null
+++ b/app/code/Magento/Store/Model/Config/Placeholder.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Placeholder configuration values processor. Replace placeholders in configuration with config values
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model\Config;
+
+class Placeholder
+{
+    /**
+     * @var \Magento\Framework\App\RequestInterface
+     */
+    protected $request;
+
+    /**
+     * @var string[]
+     */
+    protected $urlPaths;
+
+    /**
+     * @var string
+     */
+    protected $urlPlaceholder;
+
+    /**
+     * @param \Magento\Framework\App\RequestInterface $request
+     * @param string[] $urlPaths
+     * @param string $urlPlaceholder
+     */
+    public function __construct(\Magento\Framework\App\RequestInterface $request, $urlPaths, $urlPlaceholder)
+    {
+        $this->request = $request;
+        $this->urlPaths = $urlPaths;
+        $this->urlPlaceholder = $urlPlaceholder;
+    }
+
+    /**
+     * Replace placeholders with config values
+     *
+     * @param array $data
+     * @return array
+     */
+    public function process(array $data = [])
+    {
+        foreach (array_keys($data) as $key) {
+            $this->_processData($data, $key);
+        }
+        return $data;
+    }
+
+    /**
+     * Process array data recursively
+     *
+     * @param array &$data
+     * @param string $path
+     * @return void
+     */
+    protected function _processData(&$data, $path)
+    {
+        $configValue = $this->_getValue($path, $data);
+        if (is_array($configValue)) {
+            foreach (array_keys($configValue) as $key) {
+                $this->_processData($data, $path . '/' . $key);
+            }
+        } else {
+            $this->_setValue($data, $path, $this->_processPlaceholders($configValue, $data));
+        }
+    }
+
+    /**
+     * Replace placeholders with config values
+     *
+     * @param string $value
+     * @param array $data
+     * @return string
+     */
+    protected function _processPlaceholders($value, $data)
+    {
+        $placeholder = $this->_getPlaceholder($value);
+        if ($placeholder) {
+            $url = false;
+            if ($placeholder == 'unsecure_base_url') {
+                $url = $this->_getValue($this->urlPaths['unsecureBaseUrl'], $data);
+            } elseif ($placeholder == 'secure_base_url') {
+                $url = $this->_getValue($this->urlPaths['secureBaseUrl'], $data);
+            }
+
+            if ($url) {
+                $value = str_replace('{{' . $placeholder . '}}', $url, $value);
+            } elseif (strpos($value, $this->urlPlaceholder) !== false) {
+                $distroBaseUrl = $this->request->getDistroBaseUrl();
+                $value = str_replace($this->urlPlaceholder, $distroBaseUrl, $value);
+            }
+
+            if (null !== $this->_getPlaceholder($value)) {
+                $value = $this->_processPlaceholders($value, $data);
+            }
+        }
+        return $value;
+    }
+
+    /**
+     * Get placeholder from value
+     *
+     * @param string $value
+     * @return string|null
+     */
+    protected function _getPlaceholder($value)
+    {
+        if (is_string($value) && preg_match('/{{(.*)}}.*/', $value, $matches)) {
+            $placeholder = $matches[1];
+            if ($placeholder == 'unsecure_base_url' || $placeholder == 'secure_base_url' || strpos(
+                $value,
+                $this->urlPlaceholder
+            ) !== false
+            ) {
+                return $placeholder;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Get array value by path
+     *
+     * @param string $path
+     * @param array $data
+     * @return array|null
+     */
+    protected function _getValue($path, array $data)
+    {
+        $keys = explode('/', $path);
+        foreach ($keys as $key) {
+            if (is_array($data) && (isset($data[$key]) || array_key_exists($key, $data))) {
+                $data = $data[$key];
+            } else {
+                return null;
+            }
+        }
+        return $data;
+    }
+
+    /**
+     * Set array value by path
+     *
+     * @param array &$container
+     * @param string $path
+     * @param string $value
+     * @return void
+     */
+    protected function _setValue(array &$container, $path, $value)
+    {
+        $segments = explode('/', $path);
+        $currentPointer = & $container;
+        foreach ($segments as $segment) {
+            if (!isset($currentPointer[$segment])) {
+                $currentPointer[$segment] = [];
+            }
+            $currentPointer = & $currentPointer[$segment];
+        }
+        $currentPointer = $value;
+    }
+}
diff --git a/app/code/Magento/Store/Model/Config/Processor/Fallback.php b/app/code/Magento/Store/Model/Config/Processor/Fallback.php
new file mode 100644
index 0000000000000000000000000000000000000000..612f0514e77c13d9b7600478af0f1ff9fcaddf69
--- /dev/null
+++ b/app/code/Magento/Store/Model/Config/Processor/Fallback.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model\Config\Processor;
+
+use Magento\Framework\App\Config\Spi\PostProcessorInterface;
+use Magento\Store\App\Config\Type\Scopes;
+
+/**
+ * Fallback throguh different scopes and merge them
+ *
+ * @package Magento\Store\Model\Config\Processor
+ */
+class Fallback implements PostProcessorInterface
+{
+    /**
+     * @var Scopes
+     */
+    private $scopes;
+
+    /**
+     * Fallback constructor.
+     * @param Scopes $scopes
+     */
+    public function __construct(Scopes $scopes)
+    {
+        $this->scopes = $scopes;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function process(array $data)
+    {
+        $defaultConfig = isset($data['default']) ? $data['default'] : [];
+        $result = [
+            'default' => $defaultConfig,
+            'websites' => [],
+            'stores' => []
+        ];
+
+        $websitesConfig = isset($data['websites']) ? $data['websites'] : [];
+        $result['websites'] = $this->prepareWebsitesConfig($defaultConfig, $websitesConfig);
+
+        $storesConfig = isset($data['stores']) ? $data['stores'] : [];
+        $result['stores'] = $this->prepareStoresConfig($defaultConfig, $websitesConfig, $storesConfig);
+
+        return $result;
+    }
+
+    /**
+     * Prepare website data from Config/Type/Scopes
+     *
+     * @param array $defaultConfig
+     * @param array $websitesConfig
+     * @return array
+     */
+    private function prepareWebsitesConfig(array $defaultConfig, array $websitesConfig)
+    {
+        $result = [];
+        foreach ($this->scopes->get('websites') as $websiteData) {
+            $code = $websiteData['code'];
+            $id = $websiteData['website_id'];
+            $websiteConfig = isset($websitesConfig[$code]) ? $websitesConfig[$code] : [];
+            $result[$code] = array_replace_recursive($defaultConfig, $websiteConfig);
+            $result[$id] = $result[$code];
+        }
+        return $result;
+    }
+
+    /**
+     * Prepare stores data from Config/Type/Scopes
+     *
+     * @param array $defaultConfig
+     * @param array $websitesConfig
+     * @param array $storesConfig
+     * @return array
+     */
+    private function prepareStoresConfig(array $defaultConfig, array $websitesConfig, array $storesConfig)
+    {
+        $result = [];
+        foreach ($this->scopes->get('stores') as $storeData) {
+            $code = $storeData['code'];
+            $id = $storeData['store_id'];
+            $websiteConfig = [];
+            if (isset($storeData['website_id'])) {
+                $websiteConfig = $this->getWebsiteConfig($websitesConfig, $storeData['website_id']);
+            }
+            $storeConfig = isset($storesConfig[$code]) ? $storesConfig[$code] : [];
+            $result[$code] = array_replace_recursive($defaultConfig, $websiteConfig, $storeConfig);
+            $result[$id] = $result[$code];
+        }
+        return $result;
+    }
+
+    /**
+     * Retrieve Website Config
+     *
+     * @param array $websites
+     * @param int $id
+     * @return array
+     */
+    private function getWebsiteConfig(array $websites, $id)
+    {
+        foreach ($this->scopes->get('websites') as $websiteData) {
+            if ($websiteData['website_id'] == $id) {
+                $code = $websiteData['code'];
+                return isset($websites[$code]) ? $websites[$code] : [];
+            }
+        }
+        return [];
+    }
+}
diff --git a/app/code/Magento/Store/Model/Config/Processor/Placeholder.php b/app/code/Magento/Store/Model/Config/Processor/Placeholder.php
index ac150267053885b7c8b6e863155aa164cd17d6da..3695a9a9d66ce05de260bae5d60649a602e5a68d 100644
--- a/app/code/Magento/Store/Model/Config/Processor/Placeholder.php
+++ b/app/code/Magento/Store/Model/Config/Processor/Placeholder.php
@@ -7,159 +7,44 @@
  */
 namespace Magento\Store\Model\Config\Processor;
 
-class Placeholder
-{
-    /**
-     * @var \Magento\Framework\App\RequestInterface
-     */
-    protected $request;
-
-    /**
-     * @var string[]
-     */
-    protected $urlPaths;
-
-    /**
-     * @var string
-     */
-    protected $urlPlaceholder;
-
-    /**
-     * @param \Magento\Framework\App\RequestInterface $request
-     * @param string[] $urlPaths
-     * @param string $urlPlaceholder
-     */
-    public function __construct(\Magento\Framework\App\RequestInterface $request, $urlPaths, $urlPlaceholder)
-    {
-        $this->request = $request;
-        $this->urlPaths = $urlPaths;
-        $this->urlPlaceholder = $urlPlaceholder;
-    }
-
-    /**
-     * Replace placeholders with config values
-     *
-     * @param array $data
-     * @return array
-     */
-    public function process(array $data = [])
-    {
-        foreach (array_keys($data) as $key) {
-            $this->_processData($data, $key);
-        }
-        return $data;
-    }
-
-    /**
-     * Process array data recursively
-     *
-     * @param array &$data
-     * @param string $path
-     * @return void
-     */
-    protected function _processData(&$data, $path)
-    {
-        $configValue = $this->_getValue($path, $data);
-        if (is_array($configValue)) {
-            foreach (array_keys($configValue) as $key) {
-                $this->_processData($data, $path . '/' . $key);
-            }
-        } else {
-            $this->_setValue($data, $path, $this->_processPlaceholders($configValue, $data));
-        }
-    }
+use Magento\Framework\App\Config\Spi\PostProcessorInterface;
+use Magento\Store\Model\Config\Placeholder as ConfigPlaceholder;
 
+/**
+ * Placeholder configuration values processor. Replace placeholders in configuration with config values
+ * @package Magento\Store\Model\Config\Processor
+ */
+class Placeholder implements PostProcessorInterface
+{
     /**
-     * Replace placeholders with config values
-     *
-     * @param string $value
-     * @param array $data
-     * @return string
+     * @var ConfigPlaceholder
      */
-    protected function _processPlaceholders($value, $data)
-    {
-        $placeholder = $this->_getPlaceholder($value);
-        if ($placeholder) {
-            $url = false;
-            if ($placeholder == 'unsecure_base_url') {
-                $url = $this->_getValue($this->urlPaths['unsecureBaseUrl'], $data);
-            } elseif ($placeholder == 'secure_base_url') {
-                $url = $this->_getValue($this->urlPaths['secureBaseUrl'], $data);
-            }
-
-            if ($url) {
-                $value = str_replace('{{' . $placeholder . '}}', $url, $value);
-            } elseif (strpos($value, $this->urlPlaceholder) !== false) {
-                $distroBaseUrl = $this->request->getDistroBaseUrl();
-                $value = str_replace($this->urlPlaceholder, $distroBaseUrl, $value);
-            }
-
-            if (null !== $this->_getPlaceholder($value)) {
-                $value = $this->_processPlaceholders($value, $data);
-            }
-        }
-        return $value;
-    }
+    private $configPlaceholder;
 
     /**
-     * Get placeholder from value
-     *
-     * @param string $value
-     * @return string|null
+     * Placeholder constructor.
+     * @param ConfigPlaceholder $configPlaceholder
      */
-    protected function _getPlaceholder($value)
+    public function __construct(ConfigPlaceholder $configPlaceholder)
     {
-        if (is_string($value) && preg_match('/{{(.*)}}.*/', $value, $matches)) {
-            $placeholder = $matches[1];
-            if ($placeholder == 'unsecure_base_url' || $placeholder == 'secure_base_url' || strpos(
-                $value,
-                $this->urlPlaceholder
-            ) !== false
-            ) {
-                return $placeholder;
-            }
-        }
-        return null;
+        $this->configPlaceholder = $configPlaceholder;
     }
 
     /**
-     * Get array value by path
-     *
-     * @param string $path
-     * @param array $data
-     * @return array|null
+     * @inheritdoc
      */
-    protected function _getValue($path, array $data)
+    public function process(array $data)
     {
-        $keys = explode('/', $path);
-        foreach ($keys as $key) {
-            if (is_array($data) && (isset($data[$key]) || array_key_exists($key, $data))) {
-                $data = $data[$key];
+        foreach ($data as $scope => &$scopeData) {
+            if ($scope === 'default') {
+                $scopeData = $this->configPlaceholder->process($scopeData);
             } else {
-                return null;
+                foreach ($scopeData as &$sData) {
+                    $sData = $this->configPlaceholder->process($sData);
+                }
             }
         }
-        return $data;
-    }
 
-    /**
-     * Set array value by path
-     *
-     * @param array &$container
-     * @param string $path
-     * @param string $value
-     * @return void
-     */
-    protected function _setValue(array &$container, $path, $value)
-    {
-        $segments = explode('/', $path);
-        $currentPointer = & $container;
-        foreach ($segments as $segment) {
-            if (!isset($currentPointer[$segment])) {
-                $currentPointer[$segment] = [];
-            }
-            $currentPointer = & $currentPointer[$segment];
-        }
-        $currentPointer = $value;
+        return $data;
     }
 }
diff --git a/app/code/Magento/Store/Model/Config/Reader/DefaultReader.php b/app/code/Magento/Store/Model/Config/Reader/DefaultReader.php
deleted file mode 100644
index 6436f1895a67525919767a0cc0025736f82d5c02..0000000000000000000000000000000000000000
--- a/app/code/Magento/Store/Model/Config/Reader/DefaultReader.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * Default configuration reader
- *
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Store\Model\Config\Reader;
-
-use Magento\Framework\App\Config\ScopeConfigInterface;
-use Magento\Framework\Exception\LocalizedException;
-
-class DefaultReader implements \Magento\Framework\App\Config\Scope\ReaderInterface
-{
-    /**
-     * @var \Magento\Framework\App\Config\Initial
-     */
-    protected $_initialConfig;
-
-    /**
-     * @var \Magento\Framework\App\Config\Scope\Converter
-     */
-    protected $_converter;
-
-    /**
-     * @var \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory
-     */
-    protected $_collectionFactory;
-
-    /**
-     * @param \Magento\Framework\App\Config\Initial $initialConfig
-     * @param \Magento\Framework\App\Config\Scope\Converter $converter
-     * @param \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory
-     */
-    public function __construct(
-        \Magento\Framework\App\Config\Initial $initialConfig,
-        \Magento\Framework\App\Config\Scope\Converter $converter,
-        \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory
-    ) {
-        $this->_initialConfig = $initialConfig;
-        $this->_converter = $converter;
-        $this->_collectionFactory = $collectionFactory;
-    }
-
-    /**
-     * Read configuration data
-     *
-     * @param null|string $scope
-     * @throws LocalizedException Exception is thrown when scope other than default is given
-     * @return array
-     */
-    public function read($scope = null)
-    {
-        $scope = $scope === null ? ScopeConfigInterface::SCOPE_TYPE_DEFAULT : $scope;
-        if ($scope !== ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
-            throw new \Magento\Framework\Exception\LocalizedException(__("Only default scope allowed"));
-        }
-
-        $config = $this->_initialConfig->getData($scope);
-
-        $collection = $this->_collectionFactory->create(
-            ['scope' => $scope]
-        );
-        $dbDefaultConfig = [];
-        foreach ($collection as $item) {
-            $dbDefaultConfig[$item->getPath()] = $item->getValue();
-        }
-        $dbDefaultConfig = $this->_converter->convert($dbDefaultConfig);
-        $config = array_replace_recursive($config, $dbDefaultConfig);
-
-        return $config;
-    }
-}
diff --git a/app/code/Magento/Store/Model/Config/Reader/ReaderPool.php b/app/code/Magento/Store/Model/Config/Reader/ReaderPool.php
deleted file mode 100644
index 55bbe33c3a93c4354d2d06304218d63c0cbece04..0000000000000000000000000000000000000000
--- a/app/code/Magento/Store/Model/Config/Reader/ReaderPool.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Store\Model\Config\Reader;
-
-class ReaderPool implements \Magento\Framework\App\Config\Scope\ReaderPoolInterface
-{
-    /**
-     * List of readers
-     *
-     * @var array
-     */
-    protected $_readers = [];
-
-    /**
-     * @param \Magento\Framework\App\Config\Scope\ReaderInterface[] $readers
-     */
-    public function __construct(
-        array $readers
-    ) {
-        $this->_readers = $readers;
-    }
-
-    /**
-     * Retrieve reader by scope type
-     *
-     * @param string $scopeType
-     * @return mixed
-     */
-    public function getReader($scopeType)
-    {
-        return $this->_readers[$scopeType];
-    }
-}
diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/DefaultScope.php b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/DefaultScope.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f25a29856a78fbcbb3df02853bf30c9ab5fcb30
--- /dev/null
+++ b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/DefaultScope.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model\Config\Reader\Source\Dynamic;
+
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory;
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+
+/**
+ * Class for retrieving configuration from DB by default scope
+ */
+class DefaultScope implements SourceInterface
+{
+    /**
+     * @var ScopedFactory
+     */
+    private $collectionFactory;
+
+    /**
+     * @var Converter
+     */
+    private $converter;
+
+    /**
+     * @param ScopedFactory $collectionFactory
+     * @param Converter $converter
+     */
+    public function __construct(
+        ScopedFactory $collectionFactory,
+        Converter $converter
+    ) {
+        $this->collectionFactory = $collectionFactory;
+        $this->converter = $converter;
+    }
+
+    /**
+     * Retrieve config by default scope
+     *
+     * @param string|null $scopeCode
+     * @return array
+     */
+    public function get($scopeCode = null)
+    {
+        try {
+            $collection = $this->collectionFactory->create(
+                ['scope' => ScopeConfigInterface::SCOPE_TYPE_DEFAULT]
+            );
+        } catch (\DomainException $e) {
+            $collection = [];
+        }
+        $config = [];
+        foreach ($collection as $item) {
+            $config[$item->getPath()] = $item->getValue();
+        }
+        return $this->converter->convert($config);
+    }
+}
diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Store.php b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Store.php
new file mode 100644
index 0000000000000000000000000000000000000000..e1d0eaf51e05c27fb792e0c856073d1846bd38ba
--- /dev/null
+++ b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Store.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model\Config\Reader\Source\Dynamic;
+
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory;
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Store\Model\ScopeInterface;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\Store\Model\WebsiteFactory;
+
+/**
+ * Class for retrieving configuration from DB by store scope
+ */
+class Store implements SourceInterface
+{
+    /**
+     * @var ScopedFactory
+     */
+    private $collectionFactory;
+
+    /**
+     * @var Converter
+     */
+    private $converter;
+
+    /**
+     * @var WebsiteFactory
+     */
+    private $websiteFactory;
+
+    /**
+     * @var Website
+     */
+    private $websiteSource;
+
+    /**
+     * @var StoreManagerInterface
+     */
+    private $storeManager;
+
+    /**
+     * @param ScopedFactory $collectionFactory
+     * @param Converter $converter
+     * @param WebsiteFactory $websiteFactory
+     * @param Website $websiteSource
+     * @param StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        ScopedFactory $collectionFactory,
+        Converter $converter,
+        WebsiteFactory $websiteFactory,
+        Website $websiteSource,
+        StoreManagerInterface $storeManager
+    ) {
+        $this->collectionFactory = $collectionFactory;
+        $this->converter = $converter;
+        $this->websiteFactory = $websiteFactory;
+        $this->websiteSource = $websiteSource;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * Retrieve config by store scope
+     *
+     * @param string|null $scopeCode
+     * @return array
+     */
+    public function get($scopeCode = null)
+    {
+        try {
+            $store = $this->storeManager->getStore($scopeCode);
+            $collection = $this->collectionFactory->create(
+                ['scope' => ScopeInterface::SCOPE_STORES, 'scopeId' => $store->getId()]
+            );
+
+            $config = [];
+            foreach ($collection as $item) {
+                $config[$item->getPath()] = $item->getValue();
+            }
+            return $this->converter->convert(array_replace_recursive(
+                $this->websiteSource->get($store->getWebsiteId()),
+                $this->converter->convert($config)
+            ));
+        } catch (\DomainException $e) {
+            return [];
+        }
+    }
+}
diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Website.php b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Website.php
new file mode 100644
index 0000000000000000000000000000000000000000..0edd12fd2809876f600244319cdc98ffa88231d3
--- /dev/null
+++ b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Website.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model\Config\Reader\Source\Dynamic;
+
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory;
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Store\Model\ScopeInterface;
+use Magento\Store\Model\WebsiteFactory;
+
+/**
+ * Class for retrieving configuration from DB by website scope
+ */
+class Website implements SourceInterface
+{
+    /**
+     * @var ScopedFactory
+     */
+    private $collectionFactory;
+
+    /**
+     * @var Converter
+     */
+    private $converter;
+
+    /**
+     * @var WebsiteFactory
+     */
+    private $websiteFactory;
+
+    /**
+     * @var DefaultScope
+     */
+    private $defaultScope;
+
+    /**
+     * @param ScopedFactory $collectionFactory
+     * @param Converter $converter
+     * @param WebsiteFactory $websiteFactory
+     * @param DefaultScope $defaultScope
+     */
+    public function __construct(
+        ScopedFactory $collectionFactory,
+        Converter $converter,
+        WebsiteFactory $websiteFactory,
+        DefaultScope $defaultScope
+    ) {
+        $this->collectionFactory = $collectionFactory;
+        $this->converter = $converter;
+        $this->websiteFactory = $websiteFactory;
+        $this->defaultScope = $defaultScope;
+    }
+
+    /**
+     * Retrieve config by website scope
+     *
+     * @param string|null $scopeCode
+     * @return array
+     */
+    public function get($scopeCode = null)
+    {
+        try {
+            $website = $this->websiteFactory->create();
+            $website->load($scopeCode);
+            $collection = $this->collectionFactory->create(
+                ['scope' => ScopeInterface::SCOPE_WEBSITES, 'scopeId' => $website->getId()]
+            );
+            $config = [];
+            foreach ($collection as $item) {
+                $config[$item->getPath()] = $item->getValue();
+            }
+            return array_replace_recursive($this->defaultScope->get(), $this->converter->convert($config));
+        } catch (\DomainException $e) {
+            return [];
+        }
+    }
+}
diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Initial/DefaultScope.php b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/DefaultScope.php
new file mode 100644
index 0000000000000000000000000000000000000000..071599d2df56b8b1e5b52c42777abe43eab165a0
--- /dev/null
+++ b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/DefaultScope.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model\Config\Reader\Source\Initial;
+
+use Magento\Framework\App\Config\Initial;
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+
+/**
+ * Class for retrieving configuration from initial by default scope
+ */
+class DefaultScope implements SourceInterface
+{
+    /**
+     * @var Initial
+     */
+    private $initialConfig;
+
+    /**
+     * @var Converter
+     */
+    private $converter;
+
+    /**
+     * @param Initial $initialConfig
+     * @param Converter $converter
+     */
+    public function __construct(
+        Initial $initialConfig,
+        Converter $converter
+    ) {
+        $this->initialConfig = $initialConfig;
+        $this->converter = $converter;
+    }
+
+    /**
+     * Retrieve config by default scope
+     *
+     * @param string|null $scopeCode
+     * @return array
+     */
+    public function get($scopeCode = null)
+    {
+        return $this->converter->convert($this->initialConfig->getData(ScopeConfigInterface::SCOPE_TYPE_DEFAULT));
+    }
+}
diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Store.php b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Store.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a36fa76ed335f0e768df1a3aecad4b627b9b987
--- /dev/null
+++ b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Store.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model\Config\Reader\Source\Initial;
+
+use Magento\Framework\App\Config\Initial;
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Store\Model\StoreManagerInterface;
+
+/**
+ * Class for retrieving configuration from initial config by store scope
+ */
+class Store implements SourceInterface
+{
+    /**
+     * @var Initial
+     */
+    private $initialConfig;
+
+    /**
+     * @var Website
+     */
+    private $websiteSource;
+
+    /**
+     * @var StoreManagerInterface
+     */
+    private $storeManager;
+
+    /**
+     * @var Converter
+     */
+    private $converter;
+
+    /**
+     * @param Initial $initialConfig
+     * @param Website $website
+     * @param StoreManagerInterface $storeManager
+     * @param Converter $converter
+     */
+    public function __construct(
+        Initial $initialConfig,
+        Website $website,
+        StoreManagerInterface $storeManager,
+        Converter $converter
+    ) {
+        $this->initialConfig = $initialConfig;
+        $this->websiteSource = $website;
+        $this->storeManager = $storeManager;
+        $this->converter = $converter;
+    }
+
+    /**
+     * Retrieve config by store scope
+     *
+     * @param string|null $scopeCode
+     * @return array
+     */
+    public function get($scopeCode = null)
+    {
+        try {
+            /** @var \Magento\Store\Model\Store $store */
+            $store = $this->storeManager->getStore($scopeCode);
+            return $this->converter->convert(array_replace_recursive(
+                $this->websiteSource->get($store->getData('website_code')),
+                $this->initialConfig->getData("stores|{$scopeCode}")
+            ));
+        } catch (\Exception $e) {
+            return [];
+        }
+    }
+}
diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Website.php b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Website.php
new file mode 100644
index 0000000000000000000000000000000000000000..efd85e83a593e52b8886d903b8145903f33fe95d
--- /dev/null
+++ b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Website.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model\Config\Reader\Source\Initial;
+
+use Magento\Framework\App\Config\Initial;
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Framework\App\Config\Scope\Converter;
+
+/**
+ * Class for retrieving configuration from initial config by website scope
+ */
+class Website implements SourceInterface
+{
+    /**
+     * @var Initial
+     */
+    private $initialConfig;
+
+    /**
+     * @var DefaultScope
+     */
+    private $defaultScope;
+
+    /**
+     * @var Converter
+     */
+    private $converter;
+
+    /**
+     * @param Initial $initialConfig
+     * @param DefaultScope $defaultScope
+     * @param Converter $converter
+     */
+    public function __construct(
+        Initial $initialConfig,
+        DefaultScope $defaultScope,
+        Converter $converter
+    ) {
+        $this->initialConfig = $initialConfig;
+        $this->defaultScope = $defaultScope;
+        $this->converter = $converter;
+    }
+
+    /**
+     * Retrieve config by website scope
+     *
+     * @param string|null $scopeCode
+     * @return array
+     */
+    public function get($scopeCode = null)
+    {
+        return $this->converter->convert(array_replace_recursive(
+            $this->defaultScope->get(),
+            $this->initialConfig->getData("websites|{$scopeCode}")
+        ));
+    }
+}
diff --git a/app/code/Magento/Store/Model/Config/Reader/Store.php b/app/code/Magento/Store/Model/Config/Reader/Store.php
deleted file mode 100644
index 8b4eb2d67365158cfc242b83eda77970f2abf999..0000000000000000000000000000000000000000
--- a/app/code/Magento/Store/Model/Config/Reader/Store.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Store\Model\Config\Reader;
-
-use Magento\Framework\Exception\NoSuchEntityException;
-
-class Store implements \Magento\Framework\App\Config\Scope\ReaderInterface
-{
-    /**
-     * @var \Magento\Framework\App\Config\Initial
-     */
-    protected $_initialConfig;
-
-    /**
-     * @var \Magento\Framework\App\Config\ScopePool
-     */
-    protected $_scopePool;
-
-    /**
-     * @var \Magento\Store\Model\Config\Converter
-     */
-    protected $_converter;
-
-    /**
-     * @var \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory
-     */
-    protected $_collectionFactory;
-
-    /**
-     * @var \Magento\Store\Model\StoreManagerInterface
-     */
-    protected $_storeManager;
-
-    /**
-     * @param \Magento\Framework\App\Config\Initial $initialConfig
-     * @param \Magento\Framework\App\Config\ScopePool $scopePool
-     * @param \Magento\Store\Model\Config\Converter $converter
-     * @param \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory
-     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
-     */
-    public function __construct(
-        \Magento\Framework\App\Config\Initial $initialConfig,
-        \Magento\Framework\App\Config\ScopePool $scopePool,
-        \Magento\Store\Model\Config\Converter $converter,
-        \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory,
-        \Magento\Store\Model\StoreManagerInterface $storeManager
-    ) {
-        $this->_initialConfig = $initialConfig;
-        $this->_scopePool = $scopePool;
-        $this->_converter = $converter;
-        $this->_collectionFactory = $collectionFactory;
-        $this->_storeManager = $storeManager;
-    }
-
-    /**
-     * Read configuration by code
-     *
-     * @param null|string $code
-     * @return array
-     * @throws NoSuchEntityException
-     */
-    public function read($code = null)
-    {
-        $store = $this->_storeManager->getStore($code);
-
-        $websiteConfig = $this->_scopePool->getScope(
-            \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITE,
-            $store->getWebsite()->getCode()
-        )->getSource();
-        $config = array_replace_recursive($websiteConfig, $this->_initialConfig->getData("stores|{$code}"));
-
-        $collection = $this->_collectionFactory->create(
-            ['scope' => \Magento\Store\Model\ScopeInterface::SCOPE_STORES, 'scopeId' => $store->getId()]
-        );
-        $dbStoreConfig = [];
-        foreach ($collection as $item) {
-            $dbStoreConfig[$item->getPath()] = $item->getValue();
-        }
-        return $this->_converter->convert($dbStoreConfig, $config);
-    }
-}
diff --git a/app/code/Magento/Store/Model/Config/Reader/Website.php b/app/code/Magento/Store/Model/Config/Reader/Website.php
deleted file mode 100644
index 3ae30ea86a506afb22c1790d687efd2a835bd005..0000000000000000000000000000000000000000
--- a/app/code/Magento/Store/Model/Config/Reader/Website.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Store\Model\Config\Reader;
-
-use Magento\Framework\App\Config\ScopeConfigInterface;
-
-class Website implements \Magento\Framework\App\Config\Scope\ReaderInterface
-{
-    /**
-     * @var \Magento\Framework\App\Config\Initial
-     */
-    protected $_initialConfig;
-
-    /**
-     * @var \Magento\Framework\App\Config\ScopePool
-     */
-    protected $_scopePool;
-
-    /**
-     * @var \Magento\Framework\App\Config\Scope\Converter
-     */
-    protected $_converter;
-
-    /**
-     * @var \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory
-     */
-    protected $_collectionFactory;
-
-    /**
-     * @var \Magento\Store\Model\WebsiteFactory
-     */
-    protected $_websiteFactory;
-
-    /**
-     * @param \Magento\Framework\App\Config\Initial $initialConfig
-     * @param \Magento\Framework\App\Config\ScopePool $scopePool
-     * @param \Magento\Framework\App\Config\Scope\Converter $converter
-     * @param \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory
-     * @param \Magento\Store\Model\WebsiteFactory $websiteFactory
-     */
-    public function __construct(
-        \Magento\Framework\App\Config\Initial $initialConfig,
-        \Magento\Framework\App\Config\ScopePool $scopePool,
-        \Magento\Framework\App\Config\Scope\Converter $converter,
-        \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory,
-        \Magento\Store\Model\WebsiteFactory $websiteFactory
-    ) {
-        $this->_initialConfig = $initialConfig;
-        $this->_scopePool = $scopePool;
-        $this->_converter = $converter;
-        $this->_collectionFactory = $collectionFactory;
-        $this->_websiteFactory = $websiteFactory;
-    }
-
-    /**
-     * Read configuration by code
-     *
-     * @param string $code
-     * @return array
-     */
-    public function read($code = null)
-    {
-        $config = array_replace_recursive(
-            $this->_scopePool->getScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT)->getSource(),
-            $this->_initialConfig->getData("websites|{$code}")
-        );
-
-        $website = $this->_websiteFactory->create();
-        $website->load($code);
-        $collection = $this->_collectionFactory->create(
-            ['scope' => \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITES, 'scopeId' => $website->getId()]
-        );
-        $dbWebsiteConfig = [];
-        foreach ($collection as $configValue) {
-            $dbWebsiteConfig[$configValue->getPath()] = $configValue->getValue();
-        }
-        $dbWebsiteConfig = $this->_converter->convert($dbWebsiteConfig);
-
-        if (count($dbWebsiteConfig)) {
-            $config = array_replace_recursive($config, $dbWebsiteConfig);
-        }
-
-        return $config;
-    }
-}
diff --git a/app/code/Magento/Store/Model/Group.php b/app/code/Magento/Store/Model/Group.php
index cd6044dd7f78632bbcc629c91bbef11ff7d612af..f95d0aaded312e0ce0355238f23c16033a9817fc 100644
--- a/app/code/Magento/Store/Model/Group.php
+++ b/app/code/Magento/Store/Model/Group.php
@@ -442,7 +442,7 @@ class Group extends \Magento\Framework\Model\AbstractExtensibleModel implements
      */
     public function getIdentities()
     {
-        return [self::CACHE_TAG . '_' . $this->getId()];
+        return [self::CACHE_TAG];
     }
 
     /**
diff --git a/app/code/Magento/Store/Model/GroupRepository.php b/app/code/Magento/Store/Model/GroupRepository.php
index 3cc833138b241386413d2563306def2f9679d4ad..dadcc6fb24e68e9e474c0a3e992f01b77f07712f 100644
--- a/app/code/Magento/Store/Model/GroupRepository.php
+++ b/app/code/Magento/Store/Model/GroupRepository.php
@@ -5,8 +5,15 @@
  */
 namespace Magento\Store\Model;
 
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\App\Config;
 
+/**
+ * Information Expert in store groups handling
+ *
+ * @package Magento\Store\Model
+ */
 class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface
 {
     /**
@@ -29,6 +36,11 @@ class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface
      */
     protected $groupCollectionFactory;
 
+    /**
+     * @var Config
+     */
+    private $appConfig;
+
     /**
      * @param GroupFactory $groupFactory
      * @param \Magento\Store\Model\ResourceModel\Group\CollectionFactory $groupCollectionFactory
@@ -49,8 +61,21 @@ class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface
         if (isset($this->entities[$id])) {
             return $this->entities[$id];
         }
-        $group = $this->groupFactory->create();
-        $group->load($id);
+
+        $groupData = [];
+        $groups = $this->getAppConfig()->get('scopes', 'groups', []);
+        if ($groups) {
+            foreach ($groups as $data) {
+                if (isset($data['group_id']) && $data['group_id'] == $id) {
+                    $groupData = $data;
+                    break;
+                }
+            }
+        }
+        $group = $this->groupFactory->create([
+            'data' => $groupData
+        ]);
+
         if (null === $group->getId()) {
             throw new NoSuchEntityException();
         }
@@ -64,14 +89,16 @@ class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface
     public function getList()
     {
         if (!$this->allLoaded) {
-            /** @var \Magento\Store\Model\ResourceModel\Group\Collection $groupCollection */
-            $groupCollection = $this->groupCollectionFactory->create();
-            $groupCollection->setLoadDefault(true);
-            foreach ($groupCollection as $item) {
-                $this->entities[$item->getId()] = $item;
+            $groups = $this->getAppConfig()->get('scopes', 'groups', []);
+            foreach ($groups as $data) {
+                $group = $this->groupFactory->create([
+                    'data' => $data
+                ]);
+                $this->entities[$group->getId()] = $group;
             }
             $this->allLoaded = true;
         }
+
         return $this->entities;
     }
 
@@ -83,4 +110,18 @@ class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface
         $this->entities = [];
         $this->allLoaded = false;
     }
+
+    /**
+     * Retrieve application config.
+     *
+     * @deprecated
+     * @return Config
+     */
+    private function getAppConfig()
+    {
+        if (!$this->appConfig) {
+            $this->appConfig = ObjectManager::getInstance()->get(Config::class);
+        }
+        return $this->appConfig;
+    }
 }
diff --git a/app/code/Magento/Store/Model/Store.php b/app/code/Magento/Store/Model/Store.php
index 270b621407d4697c3612f54dc0059ecb16cb1903..ccd1aed947d787e37ee5126e227542856ed3d73d 100644
--- a/app/code/Magento/Store/Model/Store.php
+++ b/app/code/Magento/Store/Model/Store.php
@@ -1036,6 +1036,18 @@ class Store extends AbstractExtensibleModel implements
         return $this->_getData('website_id');
     }
 
+    /**
+     * Reinit Stores on after save
+     *
+     * @deprecated
+     * @return $this
+     */
+    public function afterSave()
+    {
+        $this->_storeManager->reinitStores();
+        return parent::afterSave();
+    }
+
     /**
      * @inheritdoc
      */
@@ -1272,7 +1284,7 @@ class Store extends AbstractExtensibleModel implements
      */
     public function getIdentities()
     {
-        return [self::CACHE_TAG . '_' . $this->getId()];
+        return [self::CACHE_TAG];
     }
 
     /**
diff --git a/app/code/Magento/Store/Model/StoreManager.php b/app/code/Magento/Store/Model/StoreManager.php
index c34f4e1bd2a58d370e92a34295ae4a60647133c1..13840b120636773dd108adcdf4a9f590e629383d 100644
--- a/app/code/Magento/Store/Model/StoreManager.php
+++ b/app/code/Magento/Store/Model/StoreManager.php
@@ -10,6 +10,8 @@ use Magento\Store\Api\StoreResolverInterface;
 use Magento\Store\Model\ResourceModel\StoreWebsiteRelation;
 
 /**
+ * Service contract, which manage scopes
+ *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class StoreManager implements
@@ -198,9 +200,12 @@ class StoreManager implements
             $website = $websiteId;
         } elseif ($websiteId === true) {
             $website = $this->websiteRepository->getDefault();
-        } else {
+        } elseif (is_numeric($websiteId)) {
             $website = $this->websiteRepository->getById($websiteId);
+        } else {
+            $website = $this->websiteRepository->get($websiteId);
         }
+
         return $website;
     }
 
@@ -228,6 +233,7 @@ class StoreManager implements
      */
     public function reinitStores()
     {
+        $this->scopeConfig->clean();
         $this->currentStoreId = null;
         $this->storeRepository->clean();
         $this->websiteRepository->clean();
diff --git a/app/code/Magento/Store/Model/StoreRepository.php b/app/code/Magento/Store/Model/StoreRepository.php
index 47e185f48cc52532909d34dcb53a1ad66704765c..c9e7a0ebc9d313d0a3a0fcb8d29631105ff2371a 100644
--- a/app/code/Magento/Store/Model/StoreRepository.php
+++ b/app/code/Magento/Store/Model/StoreRepository.php
@@ -5,8 +5,15 @@
  */
 namespace Magento\Store\Model;
 
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\App\Config;
 
+/**
+ * Information Expert in stores handling
+ *
+ * @package Magento\Store\Model
+ */
 class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface
 {
     /**
@@ -34,6 +41,11 @@ class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface
      */
     protected $allLoaded = false;
 
+    /**
+     * @var Config
+     */
+    private $appConfig;
+
     /**
      * @param StoreFactory $storeFactory
      * @param \Magento\Store\Model\ResourceModel\Store\CollectionFactory $storeCollectionFactory
@@ -54,8 +66,12 @@ class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface
         if (isset($this->entities[$code])) {
             return $this->entities[$code];
         }
-        $store = $this->storeFactory->create();
-        $store->load($code, 'code');
+
+        $storeData = $this->getAppConfig()->get('scopes', "stores/$code", []);
+        $store = $this->storeFactory->create([
+            'data' => $storeData
+        ]);
+
         if ($store->getId() === null) {
             throw new NoSuchEntityException(__('Requested store is not found'));
         }
@@ -85,11 +101,23 @@ class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface
         if (isset($this->entitiesById[$id])) {
             return $this->entitiesById[$id];
         }
-        $store = $this->storeFactory->create();
-        $store->load($id);
+
+        $storeData = [];
+        $stores = $this->getAppConfig()->get('scopes', "stores", []);
+        foreach ($stores as $data) {
+            if (isset($data['store_id']) && $data['store_id'] == $id) {
+                $storeData = $data;
+                break;
+            }
+        }
+        $store = $this->storeFactory->create([
+            'data' => $storeData
+        ]);
+
         if ($store->getId() === null) {
             throw new NoSuchEntityException(__('Requested store is not found'));
         }
+
         $this->entitiesById[$id] = $store;
         $this->entities[$store->getCode()] = $store;
         return $store;
@@ -113,19 +141,35 @@ class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface
      */
     public function getList()
     {
-        if (!$this->allLoaded) {
-            /** @var $storeCollection \Magento\Store\Model\ResourceModel\Store\Collection */
-            $storeCollection = $this->storeCollectionFactory->create();
-            $storeCollection->setLoadDefault(true);
-            foreach ($storeCollection as $item) {
-                $this->entities[$item->getCode()] = $item;
-                $this->entitiesById[$item->getId()] = $item;
-            }
-            $this->allLoaded = true;
+        if ($this->allLoaded) {
+            return $this->entities;
         }
+        $stores = $this->getAppConfig()->get('scopes', "stores", []);
+        foreach ($stores as $data) {
+            $store = $this->storeFactory->create([
+                'data' => $data
+            ]);
+            $this->entities[$store->getCode()] = $store;
+            $this->entitiesById[$store->getId()] = $store;
+        }
+        $this->allLoaded = true;
         return $this->entities;
     }
 
+    /**
+     * Retrieve application config.
+     *
+     * @deprecated
+     * @return Config
+     */
+    private function getAppConfig()
+    {
+        if (!$this->appConfig) {
+            $this->appConfig = ObjectManager::getInstance()->get(Config::class);
+        }
+        return $this->appConfig;
+    }
+
     /**
      * {@inheritdoc}
      */
diff --git a/app/code/Magento/Store/Model/StoreResolver.php b/app/code/Magento/Store/Model/StoreResolver.php
index a19d75d9f47e06364afe9d2aa1dd3dab950e2a60..cfb57849f25a83fd8c1f971e1b9bbf7870c2765c 100644
--- a/app/code/Magento/Store/Model/StoreResolver.php
+++ b/app/code/Magento/Store/Model/StoreResolver.php
@@ -5,8 +5,7 @@
  */
 namespace Magento\Store\Model;
 
-use Magento\Framework\Exception\NoSuchEntityException;
-use Magento\Store\Api\StoreCookieManagerInterface;
+use Magento\Framework\Serialize\SerializerInterface;
 
 class StoreResolver implements \Magento\Store\Api\StoreResolverInterface
 {
@@ -21,7 +20,7 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface
     protected $storeRepository;
 
     /**
-     * @var StoreCookieManagerInterface
+     * @var \Magento\Store\Api\StoreCookieManagerInterface
      */
     protected $storeCookieManager;
 
@@ -31,7 +30,7 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface
     protected $cache;
 
     /**
-     * @var StoreResolver\ReaderList
+     * @var \Magento\Store\Model\StoreResolver\ReaderList
      */
     protected $readerList;
 
@@ -50,21 +49,26 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface
      */
     protected $request;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Store\Api\StoreRepositoryInterface $storeRepository
-     * @param StoreCookieManagerInterface $storeCookieManager
+     * @param \Magento\Store\Api\StoreCookieManagerInterface $storeCookieManager
      * @param \Magento\Framework\App\RequestInterface $request
      * @param \Magento\Framework\Cache\FrontendInterface $cache
-     * @param StoreResolver\ReaderList $readerList
+     * @param \Magento\Store\Model\StoreResolver\ReaderList $readerList
      * @param string $runMode
      * @param null $scopeCode
      */
     public function __construct(
         \Magento\Store\Api\StoreRepositoryInterface $storeRepository,
-        StoreCookieManagerInterface $storeCookieManager,
+        \Magento\Store\Api\StoreCookieManagerInterface $storeCookieManager,
         \Magento\Framework\App\RequestInterface $request,
         \Magento\Framework\Cache\FrontendInterface $cache,
-        StoreResolver\ReaderList $readerList,
+        \Magento\Store\Model\StoreResolver\ReaderList $readerList,
         $runMode = ScopeInterface::SCOPE_STORE,
         $scopeCode = null
     ) {
@@ -94,7 +98,7 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface
         if ($storeCode) {
             try {
                 $store = $this->getRequestedStoreByCode($storeCode);
-            } catch (NoSuchEntityException $e) {
+            } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
                 $store = $this->getDefaultStoreById($defaultStoreId);
             }
 
@@ -117,10 +121,10 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface
         $cacheKey = 'resolved_stores_' . md5($this->runMode . $this->scopeCode);
         $cacheData = $this->cache->load($cacheKey);
         if ($cacheData) {
-            $storesData = unserialize($cacheData);
+            $storesData = $this->getSerializer()->unserialize($cacheData);
         } else {
             $storesData = $this->readStoresData();
-            $this->cache->save(serialize($storesData), $cacheKey, [self::CACHE_TAG]);
+            $this->cache->save($this->getSerializer()->serialize($storesData), $cacheKey, [self::CACHE_TAG]);
         }
         return $storesData;
     }
@@ -141,14 +145,14 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface
      *
      * @param string $storeCode
      * @return \Magento\Store\Api\Data\StoreInterface
-     * @throws NoSuchEntityException
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
     protected function getRequestedStoreByCode($storeCode)
     {
         try {
             $store = $this->storeRepository->getActiveStoreByCode($storeCode);
         } catch (StoreIsInactiveException $e) {
-            throw new NoSuchEntityException(__('Requested store is inactive'));
+            throw new \Magento\Framework\Exception\NoSuchEntityException(__('Requested store is inactive'));
         }
 
         return $store;
@@ -159,16 +163,31 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface
      *
      * @param int $id
      * @return \Magento\Store\Api\Data\StoreInterface
-     * @throws NoSuchEntityException
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
     protected function getDefaultStoreById($id)
     {
         try {
             $store = $this->storeRepository->getActiveStoreById($id);
         } catch (StoreIsInactiveException $e) {
-            throw new NoSuchEntityException(__('Default store is inactive'));
+            throw new \Magento\Framework\Exception\NoSuchEntityException(__('Default store is inactive'));
         }
 
         return $store;
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/app/code/Magento/Store/Model/Website.php b/app/code/Magento/Store/Model/Website.php
index 1370cea5cf42bf5217938d2769820f48e9b929c9..a3a6b6dbc3f7f425fc3527e8a27ef355cca74066 100644
--- a/app/code/Magento/Store/Model/Website.php
+++ b/app/code/Magento/Store/Model/Website.php
@@ -652,7 +652,7 @@ class Website extends \Magento\Framework\Model\AbstractExtensibleModel implement
      */
     public function getIdentities()
     {
-        return [self::CACHE_TAG . '_' . $this->getId()];
+        return [self::CACHE_TAG];
     }
 
     /**
diff --git a/app/code/Magento/Store/Model/WebsiteRepository.php b/app/code/Magento/Store/Model/WebsiteRepository.php
index 0aeb65f47cdb4af0c464f2a00323c83560471b1d..dffcef921bc22194cd762eea74a96e1fb2d4b22c 100644
--- a/app/code/Magento/Store/Model/WebsiteRepository.php
+++ b/app/code/Magento/Store/Model/WebsiteRepository.php
@@ -5,9 +5,16 @@
  */
 namespace Magento\Store\Model;
 
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Store\Model\ResourceModel\Website\CollectionFactory;
+use Magento\Framework\App\Config;
 
+/**
+ * Information Expert in store websites handling
+ *
+ * @package Magento\Store\Model
+ */
 class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface
 {
     /**
@@ -40,6 +47,11 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface
      */
     protected $default;
 
+    /**
+     * @var Config
+     */
+    private $appConfig;
+
     /**
      * @param WebsiteFactory $factory
      * @param CollectionFactory $websiteCollectionFactory
@@ -60,8 +72,12 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface
         if (isset($this->entities[$code])) {
             return $this->entities[$code];
         }
-        $website = $this->factory->create();
-        $website->load($code, 'code');
+
+        $websiteData = $this->getAppConfig()->get('scopes', "websites/$code", []);
+        $website = $this->factory->create([
+            'data' => $websiteData
+        ]);
+
         if ($website->getId() === null) {
             throw new NoSuchEntityException();
         }
@@ -78,14 +94,23 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface
         if (isset($this->entitiesById[$id])) {
             return $this->entitiesById[$id];
         }
-        /** @var Website $website */
-        $website = $this->factory->create();
-        $website->load($id);
+        $websiteData = [];
+        $websites = $this->getAppConfig()->get('scopes', 'websites', []);
+        foreach ($websites as $data) {
+            if (isset($data['website_id']) && $data['website_id'] == $id) {
+                $websiteData = $data;
+                break;
+            }
+        }
+        $website = $this->factory->create([
+            'data' => $websiteData
+        ]);
+
         if ($website->getId() === null) {
             throw new NoSuchEntityException();
         }
-        $this->entitiesById[$id] = $website;
         $this->entities[$website->getCode()] = $website;
+        $this->entitiesById[$id] = $website;
         return $website;
     }
 
@@ -95,10 +120,13 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface
     public function getList()
     {
         if (!$this->allLoaded) {
-            $collection = $this->websiteCollectionFactory->create();
-            $collection->setLoadDefault(true);
-            foreach ($collection as $item) {
-                $this->entities[$item->getCode()] = $item;
+            $websites = $this->getAppConfig()->get('scopes', 'websites', []);
+            foreach ($websites as $data) {
+                $website = $this->factory->create([
+                    'data' => $data
+                ]);
+                $this->entities[$website->getCode()] = $website;
+                $this->entitiesById[$website->getId()] = $website;
             }
             $this->allLoaded = true;
         }
@@ -118,23 +146,13 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface
                 }
             }
             if (!$this->allLoaded) {
-                /** @var \Magento\Store\Model\ResourceModel\Website\Collection $collection */
-                $collection = $this->websiteCollectionFactory->create();
-                $collection->addFieldToFilter('is_default', 1);
-                $items = $collection->getItems();
-                if (count($items) > 1) {
-                    throw new \DomainException(__('More than one default website is defined'));
-                }
-                if (count($items) === 0) {
-                    throw new \DomainException(__('Default website is not defined'));
-                }
-                $this->default = $collection->getFirstItem();
-                $this->entities[$this->default->getCode()] = $this->default;
-                $this->entitiesById[$this->default->getId()] = $this->default;
-            } else {
+                $this->initDefaultWebsite();
+            }
+            if (!$this->default) {
                 throw new \DomainException(__('Default website is not defined'));
             }
         }
+
         return $this->default;
     }
 
@@ -148,4 +166,40 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface
         $this->default = null;
         $this->allLoaded = false;
     }
+
+    /**
+     * Retrieve application config.
+     *
+     * @deprecated
+     * @return Config
+     */
+    private function getAppConfig()
+    {
+        if (!$this->appConfig) {
+            $this->appConfig = ObjectManager::getInstance()->get(Config::class);
+        }
+        return $this->appConfig;
+    }
+
+    /**
+     * Initialize default website.
+     * @return void
+     */
+    private function initDefaultWebsite()
+    {
+        $websites = (array)$this->getAppConfig()->get('scopes', 'websites', []);
+        foreach ($websites as $data) {
+            if (isset($data['is_default']) && $data['is_default'] == 1) {
+                if ($this->default) {
+                    throw new \DomainException(__('More than one default website is defined'));
+                }
+                $website = $this->factory->create([
+                    'data' => $data
+                ]);
+                $this->default = $website;
+                $this->entities[$this->default->getCode()] = $this->default;
+                $this->entitiesById[$this->default->getId()] = $this->default;
+            }
+        }
+    }
 }
diff --git a/app/code/Magento/Store/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php b/app/code/Magento/Store/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8b3ffeafd8b2b71d26e8e2d0b4db627726925680
--- /dev/null
+++ b/app/code/Magento/Store/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php
@@ -0,0 +1,358 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Test\Unit\App\Config\Source;
+
+use Magento\Framework\App\DeploymentConfig;
+use Magento\Store\App\Config\Source\RuntimeConfigSource;
+use Magento\Store\Model\Group;
+use Magento\Store\Model\GroupFactory;
+use Magento\Store\Model\ResourceModel\Website\CollectionFactory;
+use Magento\Store\Model\ResourceModel\Group\CollectionFactory as GroupCollectionFactory;
+use Magento\Store\Model\ResourceModel\Store\CollectionFactory as StoreCollectionFactory;
+use Magento\Store\Model\ResourceModel\Website\Collection as WebsiteCollection;
+use Magento\Store\Model\ResourceModel\Group\Collection as GroupCollection;
+use Magento\Store\Model\ResourceModel\Store\Collection as StoreCollection;
+use Magento\Store\Model\Store;
+use Magento\Store\Model\StoreFactory;
+use Magento\Store\Model\Website;
+use Magento\Store\Model\WebsiteFactory;
+
+/**
+ * @SuppressWarnings(PHPMD.ExcessiveParameterList)
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class RuntimeConfigSourceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var array
+     */
+    private $data;
+
+    /**
+     * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $websiteCollectionFactory;
+
+    /**
+     * @var GroupCollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $groupCollectionFactory;
+
+    /**
+     * @var StoreCollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeCollectionFactory;
+
+    /**
+     * @var WebsiteCollection|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $websiteCollection;
+
+    /**
+     * @var GroupCollection|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $groupCollection;
+
+    /**
+     * @var StoreCollection|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeCollection;
+
+    /**
+     * @var WebsiteFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $websiteFactory;
+
+    /**
+     * @var GroupFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $groupFactory;
+
+    /**
+     * @var StoreFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeFactory;
+
+    /**
+     * @var Website|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $website;
+
+    /**
+     * @var Group|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $group;
+
+    /**
+     * @var Store|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $store;
+
+    /**
+     * @var DeploymentConfig|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $deploymentConfig;
+
+    /**
+     * @var RuntimeConfigSource
+     */
+    private $configSource;
+
+    public function setUp()
+    {
+        $this->data = [
+            'group' => [
+                'code' => 'myGroup',
+                'data' => [
+                    'name' => 'My Group',
+                    'group_id' => $this->data['group']['code']
+                ]
+            ],
+            'website' => [
+                'code' => 'myWebsite',
+                'data' => [
+                    'name' => 'My Website',
+                    'website_code' => $this->data['website']['code']
+                ]
+            ],
+            'store' => [
+                'code' => 'myStore',
+                'data' => [
+                    'name' => 'My Store',
+                    'store_code' => $this->data['store']['code']
+                ]
+            ],
+        ];
+        $this->websiteCollectionFactory = $this->getMockBuilder(CollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->groupCollectionFactory = $this->getMockBuilder(GroupCollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->storeCollectionFactory = $this->getMockBuilder(StoreCollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+
+        $this->websiteCollection = $this->getMockBuilder(WebsiteCollection::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['setLoadDefault', 'getIterator'])
+            ->getMock();
+        $this->groupCollection = $this->getMockBuilder(GroupCollection::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['setLoadDefault', 'getIterator'])
+            ->getMock();
+        $this->storeCollection = $this->getMockBuilder(StoreCollection::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['setLoadDefault', 'getIterator'])
+            ->getMock();
+
+        $this->websiteFactory = $this->getMockBuilder(WebsiteFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->groupFactory = $this->getMockBuilder(GroupFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->storeFactory = $this->getMockBuilder(StoreFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->website = $this->getMockBuilder(Website::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->group = $this->getMockBuilder(Group::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->store = $this->getMockBuilder(Store::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->deploymentConfig = $this->getMockBuilder(DeploymentConfig::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->configSource = new RuntimeConfigSource(
+            $this->websiteCollectionFactory,
+            $this->groupCollectionFactory,
+            $this->storeCollectionFactory,
+            $this->websiteFactory,
+            $this->groupFactory,
+            $this->storeFactory,
+            $this->deploymentConfig
+        );
+    }
+
+    /**
+     * @param string $path
+     * @dataProvider getDataProvider
+     * @return void
+     */
+    public function testGet($path)
+    {
+        $this->deploymentConfig->expects($this->once())
+            ->method('get')
+            ->with('db')
+            ->willReturn(true);
+        $this->prepareWebsites($path);
+        $this->prepareGroups($path);
+        $this->prepareStores($path);
+        $this->assertEquals($this->getExpectedResult($path), $this->configSource->get($path));
+    }
+
+    private function getExpectedResult($path)
+    {
+        switch ($this->getScope($path)) {
+            case 'websites':
+                $result = $this->data['website']['data'];
+                break;
+            case 'groups':
+                $result = $this->data['group']['data'];
+                break;
+            case 'stores':
+                $result = $this->data['store']['data'];
+                break;
+            default:
+                $result = [
+                    'websites' => [
+                        $this->data['website']['code'] => $this->data['website']['data']
+                    ],
+                    'groups' => [
+                        $this->data['group']['code'] => $this->data['group']['data']
+                    ],
+                    'stores' => [
+                        $this->data['store']['code'] => $this->data['store']['data']
+                    ],
+                ];
+                break;
+        }
+        return $result;
+    }
+
+    private function prepareStores($path)
+    {
+        $scope = $this->getScope($path);
+        if ($scope == 'stores' || $scope == 'default') {
+            if ($this->getScopeCode($path)) {
+                $this->storeFactory->expects($this->once())
+                    ->method('create')
+                    ->willReturn($this->store);
+                $this->store->expects($this->once())
+                    ->method('load')
+                    ->with($this->data['store']['code'], 'code')
+                    ->willReturnSelf();
+            } else {
+                $this->storeCollectionFactory->expects($this->once())
+                    ->method('create')
+                    ->willReturn($this->storeCollection);
+                $this->storeCollection->expects($this->once())
+                    ->method('setLoadDefault')
+                    ->with(true)
+                    ->willReturnSelf();
+                $this->storeCollection->expects($this->once())
+                    ->method('getIterator')
+                    ->willReturn(new \ArrayIterator([$this->store]));
+                $this->store->expects($this->once())
+                    ->method('getCode')
+                    ->willReturn($this->data['store']['code']);
+            }
+            $this->store->expects($this->once())
+                ->method('getData')
+                ->willReturn($this->data['store']['data']);
+        }
+    }
+
+    private function prepareGroups($path)
+    {
+        $scope = $this->getScope($path);
+        if ($scope == 'groups' || $scope == 'default') {
+            if ($this->getScopeCode($path)) {
+                $this->groupFactory->expects($this->once())
+                    ->method('create')
+                    ->willReturn($this->group);
+                $this->group->expects($this->once())
+                    ->method('load')
+                    ->with($this->data['group']['code'])
+                    ->willReturnSelf();
+            } else {
+                $this->groupCollectionFactory->expects($this->once())
+                    ->method('create')
+                    ->willReturn($this->groupCollection);
+                $this->groupCollection->expects($this->once())
+                    ->method('setLoadDefault')
+                    ->with(true)
+                    ->willReturnSelf();
+                $this->groupCollection->expects($this->once())
+                    ->method('getIterator')
+                    ->willReturn(new \ArrayIterator([$this->group]));
+                $this->group->expects($this->once())
+                    ->method('getId')
+                    ->willReturn($this->data['group']['code']);
+            }
+            $this->group->expects($this->once())
+                ->method('getData')
+                ->willReturn($this->data['group']['data']);
+        }
+    }
+
+    private function prepareWebsites($path)
+    {
+        $scope = $this->getScope($path);
+        if ($scope == 'websites' || $scope == 'default') {
+            if ($this->getScopeCode($path)) {
+                $this->websiteFactory->expects($this->once())
+                    ->method('create')
+                    ->willReturn($this->website);
+                $this->website->expects($this->once())
+                    ->method('load')
+                    ->with($this->data['website']['code'])
+                    ->willReturnSelf();
+            } else {
+                $this->websiteCollectionFactory->expects($this->once())
+                    ->method('create')
+                    ->willReturn($this->websiteCollection);
+                $this->websiteCollection->expects($this->once())
+                    ->method('setLoadDefault')
+                    ->with(true)
+                    ->willReturnSelf();
+                $this->websiteCollection->expects($this->once())
+                    ->method('getIterator')
+                    ->willReturn(new \ArrayIterator([$this->website]));
+                $this->website->expects($this->once())
+                    ->method('getCode')
+                    ->willReturn($this->data['website']['code']);
+            }
+            $this->website->expects($this->once())
+                ->method('getData')
+                ->willReturn($this->data['website']['data']);
+        }
+    }
+
+    private function getScopeCode($path)
+    {
+        return implode('/', array_slice(explode('/', $path), 1, 1));
+    }
+
+    private function getScope($path)
+    {
+        return implode('/', array_slice(explode('/', $path), 0, 1));
+    }
+
+    /**
+     * @return array
+     */
+    public function getDataProvider()
+    {
+        return [
+            ['websites/myWebsite'],
+            ['groups/myGroup'],
+            ['stores/myStore'],
+            ['default']
+        ];
+    }
+}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/ConverterTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/ConverterTest.php
index 7cd9fd91aedb842e5c79551d8d91c859abc751d8..2a154bcea3431afe026f08b7cd7662f0476e804e 100644
--- a/app/code/Magento/Store/Test/Unit/Model/Config/ConverterTest.php
+++ b/app/code/Magento/Store/Test/Unit/Model/Config/ConverterTest.php
@@ -10,19 +10,9 @@ class ConverterTest extends \PHPUnit_Framework_TestCase
     /** @var  \Magento\Store\Model\Config\Converter */
     protected $_model;
 
-    /** @var \PHPUnit_Framework_MockObject_MockObject */
-    protected $_processorMock;
-
     protected function setUp()
     {
-        $this->_processorMock = $this->getMock(
-            \Magento\Store\Model\Config\Processor\Placeholder::class,
-            [],
-            [],
-            '',
-            false
-        );
-        $this->_model = new \Magento\Store\Model\Config\Converter($this->_processorMock);
+        $this->_model = new \Magento\Store\Model\Config\Converter();
     }
 
     public function testConvert()
@@ -34,17 +24,6 @@ class ConverterTest extends \PHPUnit_Framework_TestCase
                 'to' => ['save' => 'saved value', 'overwrite' => 'overwritten', 'added' => 'added value'],
             ],
         ];
-        $processorResult = '123Value';
-        $this->_processorMock->expects(
-            $this->once()
-        )->method(
-            'process'
-        )->with(
-            $mergeResult
-        )->will(
-            $this->returnValue($processorResult)
-        );
-
-        $this->assertEquals($processorResult, $this->_model->convert($source, $initial));
+        $this->assertEquals($mergeResult, $this->_model->convert($source, $initial));
     }
 }
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/PlaceholderTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/PlaceholderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b952dd84fb38d7f577716a40c9111c37b217ced
--- /dev/null
+++ b/app/code/Magento/Store/Test/Unit/Model/Config/PlaceholderTest.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Test\Unit\Model\Config;
+
+use Magento\Store\Model\Store;
+
+class PlaceholderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Store\Model\Config\Processor\Placeholder
+     */
+    protected $_model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_requestMock;
+
+    protected function setUp()
+    {
+        $this->_requestMock = $this->getMock(\Magento\Framework\App\Request\Http::class, [], [], '', false);
+        $this->_requestMock->expects(
+            $this->any()
+        )->method(
+            'getDistroBaseUrl'
+        )->will(
+            $this->returnValue('http://localhost/')
+        );
+        $this->_model = new \Magento\Store\Model\Config\Placeholder(
+            $this->_requestMock,
+            [
+                'unsecureBaseUrl' => Store::XML_PATH_UNSECURE_BASE_URL,
+                'secureBaseUrl' => Store::XML_PATH_SECURE_BASE_URL
+            ],
+            \Magento\Store\Model\Store::BASE_URL_PLACEHOLDER
+        );
+    }
+
+    public function testProcess()
+    {
+        $data = [
+            'web' => [
+                'unsecure' => [
+                    'base_url' => 'http://localhost/',
+                    'base_link_url' => '{{unsecure_base_url}}website/de',
+                ],
+                'secure' => [
+                    'base_url' => 'https://localhost/',
+                    'base_link_url' => '{{secure_base_url}}website/de',
+                ],
+            ],
+            'path' => 'value',
+            'some_url' => '{{base_url}}some',
+        ];
+        $expectedResult = $data;
+        $expectedResult['web']['unsecure']['base_link_url'] = 'http://localhost/website/de';
+        $expectedResult['web']['secure']['base_link_url'] = 'https://localhost/website/de';
+        $expectedResult['some_url'] = 'http://localhost/some';
+        $this->assertEquals($expectedResult, $this->_model->process($data));
+    }
+}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Processor/PlaceholderTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Processor/PlaceholderTest.php
index 493895ddabe74c12c81d7d3b90a3228b2a633f64..7a258fe41a51d351b653b78d87fe2ab17842a926 100644
--- a/app/code/Magento/Store/Test/Unit/Model/Config/Processor/PlaceholderTest.php
+++ b/app/code/Magento/Store/Test/Unit/Model/Config/Processor/PlaceholderTest.php
@@ -5,60 +5,61 @@
  */
 namespace Magento\Store\Test\Unit\Model\Config\Processor;
 
-use Magento\Store\Model\Store;
-
+/**
+ * Class PlaceholderTest
+ */
 class PlaceholderTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @var \Magento\Store\Model\Config\Processor\Placeholder
      */
-    protected $_model;
+    private $model;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Store\Model\Config\Placeholder|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_requestMock;
+    private $configPlaceholderMock;
 
     protected function setUp()
     {
-        $this->_requestMock = $this->getMock(\Magento\Framework\App\Request\Http::class, [], [], '', false);
-        $this->_requestMock->expects(
+        $this->configPlaceholderMock = $this->getMock(
+            \Magento\Store\Model\Config\Placeholder::class,
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->configPlaceholderMock->expects(
             $this->any()
         )->method(
-            'getDistroBaseUrl'
-        )->will(
-            $this->returnValue('http://localhost/')
-        );
-        $this->_model = new \Magento\Store\Model\Config\Processor\Placeholder(
-            $this->_requestMock,
-            [
-                'unsecureBaseUrl' => Store::XML_PATH_UNSECURE_BASE_URL,
-                'secureBaseUrl' => Store::XML_PATH_SECURE_BASE_URL
-            ],
-            \Magento\Store\Model\Store::BASE_URL_PLACEHOLDER
+            'process'
+        )->withConsecutive(
+            [['key1' => 'value1']],
+            [['key2' => 'value2']]
+        )->willReturnOnConsecutiveCalls(
+            ['key1' => 'value1-processed'],
+            ['key2' => 'value2-processed']
         );
+
+        $this->model = new \Magento\Store\Model\Config\Processor\Placeholder($this->configPlaceholderMock);
     }
 
     public function testProcess()
     {
         $data = [
-            'web' => [
-                'unsecure' => [
-                    'base_url' => 'http://localhost/',
-                    'base_link_url' => '{{unsecure_base_url}}website/de',
-                ],
-                'secure' => [
-                    'base_url' => 'https://localhost/',
-                    'base_link_url' => '{{secure_base_url}}website/de',
-                ],
-            ],
-            'path' => 'value',
-            'some_url' => '{{base_url}}some',
+            'default' => ['key1' => 'value1'],
+            'websites' => [
+                'code' => ['key2' => 'value2']
+            ]
         ];
-        $expectedResult = $data;
-        $expectedResult['web']['unsecure']['base_link_url'] = 'http://localhost/website/de';
-        $expectedResult['web']['secure']['base_link_url'] = 'https://localhost/website/de';
-        $expectedResult['some_url'] = 'http://localhost/some';
-        $this->assertEquals($expectedResult, $this->_model->process($data));
+        $expected = [
+            'default' => ['key1' => 'value1-processed'],
+            'websites' => [
+                'code' => ['key2' => 'value2-processed']
+            ]
+        ];
+
+        $this->assertEquals($expected, $this->model->process($data));
     }
 }
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/DefaultReaderTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/DefaultReaderTest.php
deleted file mode 100644
index dccabb9048dd387fc1b6863877e3d4fc95ce4de6..0000000000000000000000000000000000000000
--- a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/DefaultReaderTest.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Store\Test\Unit\Model\Config\Reader;
-
-use Magento\Framework\App\Config\ScopeConfigInterface;
-
-class DefaultReaderTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Store\Model\Config\Reader\DefaultReader
-     */
-    protected $_model;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_initialConfigMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_collectionFactory;
-
-    protected function setUp()
-    {
-        $this->_initialConfigMock = $this->getMock(\Magento\Framework\App\Config\Initial::class, [], [], '', false);
-        $this->_collectionFactory = $this->getMock(
-            \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory::class,
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->_model = new \Magento\Store\Model\Config\Reader\DefaultReader(
-            $this->_initialConfigMock,
-            new \Magento\Framework\App\Config\Scope\Converter(),
-            $this->_collectionFactory
-        );
-    }
-
-    public function testRead()
-    {
-        $this->_initialConfigMock->expects(
-            $this->any()
-        )->method(
-            'getData'
-        )->with(
-            ScopeConfigInterface::SCOPE_TYPE_DEFAULT
-        )->will(
-            $this->returnValue(['config' => ['key1' => 'default_value1', 'key2' => 'default_value2']])
-        );
-        $this->_collectionFactory->expects(
-            $this->once()
-        )->method(
-            'create'
-        )->with(
-            ['scope' => 'default']
-        )->will(
-            $this->returnValue(
-                [
-                    new \Magento\Framework\DataObject(['path' => 'config/key1', 'value' => 'default_db_value1']),
-                    new \Magento\Framework\DataObject(['path' => 'config/key3', 'value' => 'default_db_value3']),
-                ]
-            )
-        );
-        $expectedData = [
-            'config' => ['key1' => 'default_db_value1', 'key2' => 'default_value2', 'key3' => 'default_db_value3'],
-        ];
-        $this->assertEquals($expectedData, $this->_model->read());
-    }
-}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/ReaderPoolTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/ReaderPoolTest.php
deleted file mode 100644
index fb814415fd2dd34cc2a6028880ac0f0417519e9c..0000000000000000000000000000000000000000
--- a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/ReaderPoolTest.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-// @codingStandardsIgnoreFile
-
-namespace Magento\Store\Test\Unit\Model\Config\Reader;
-
-class ReaderPoolTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Store\Model\Config\Reader\ReaderPool
-     */
-    protected $_model;
-
-    /**
-     * @var \Magento\Store\Model\Config\Reader\DefaultReader
-     */
-    protected $_defaultReaderMock;
-
-    /**
-     * @var \Magento\Store\Model\Config\Reader\Website
-     */
-    protected $_websiteReaderMock;
-
-    /**
-     * @var \Magento\Store\Model\Config\Reader\Store
-     */
-    protected $_storeReaderMock;
-
-    protected function setUp()
-    {
-        $this->_defaultReaderMock = $this->getMock(
-            \Magento\Store\Model\Config\Reader\DefaultReader::class, [], [], '', false
-        );
-        $this->_websiteReaderMock = $this->getMock(
-            \Magento\Store\Model\Config\Reader\Website::class, [], [], '', false
-        );
-        $this->_storeReaderMock = $this->getMock(
-            \Magento\Store\Model\Config\Reader\Store::class, [], [], '', false
-        );
-
-        $this->_model = new \Magento\Store\Model\Config\Reader\ReaderPool([
-            'default' => $this->_defaultReaderMock,
-            'website' => $this->_websiteReaderMock,
-            'store' => $this->_storeReaderMock,
-        ]);
-    }
-
-    /**
-     * @covers \Magento\Store\Model\Config\Reader\ReaderPool::getReader
-     * @dataProvider getReaderDataProvider
-     * @param string $scope
-     * @param string $instanceType
-     */
-    public function testGetReader($scope, $instanceType)
-    {
-        $this->assertInstanceOf($instanceType, $this->_model->getReader($scope));
-    }
-
-    /**
-     * @return array
-     */
-    public function getReaderDataProvider()
-    {
-        return [
-            [
-                'scope' => 'default',
-                'expectedResult' => \Magento\Store\Model\Config\Reader\DefaultReader::class,
-            ],
-            [
-                'scope' => 'website',
-                'expectedResult' => \Magento\Store\Model\Config\Reader\Website::class
-            ],
-            [
-                'scope' => 'store',
-                'expectedResult' => \Magento\Store\Model\Config\Reader\Store::class
-            ],
-        ];
-    }
-}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/DefaultScopeTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/DefaultScopeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2680bde4c00dcfa53a8c1ac63ebb8c4dd9fca340
--- /dev/null
+++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/DefaultScopeTest.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Dynamic;
+
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\DataObject;
+use Magento\Store\Model\Config\Reader\Source\Dynamic\DefaultScope;
+use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory;
+
+class DefaultScopeTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGet()
+    {
+        $expectedResult = [
+            'config/key1' => 'default_db_value1',
+            'config/key3' => 'default_db_value3',
+        ];
+        $collectionFactory = $this->getMockBuilder(ScopedFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $collectionFactory->expects($this->once())
+            ->method('create')
+            ->with(['scope' => ScopeConfigInterface::SCOPE_TYPE_DEFAULT])
+            ->willReturn([
+                new DataObject(['path' => 'config/key1', 'value' => 'default_db_value1']),
+                new DataObject(['path' => 'config/key3', 'value' => 'default_db_value3']),
+            ]);
+        $converter = $this->getMockBuilder(Converter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $converter->expects($this->once())
+            ->method('convert')
+            ->with($expectedResult)
+            ->willReturnArgument(0);
+        $source = new DefaultScope(
+            $collectionFactory,
+            $converter
+        );
+        $this->assertEquals($expectedResult, $source->get());
+    }
+}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/StoreTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/StoreTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3fef89f4c22d4d258750b30847715160478a8fc5
--- /dev/null
+++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/StoreTest.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Dynamic;
+
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Store\Model\Config\Reader\Source\Dynamic\Store as StoreSource;
+use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory;
+use Magento\Store\Model\ScopeInterface;
+use Magento\Store\Model\WebsiteFactory;
+use Magento\Store\Model\Website;
+use Magento\Store\Model\Config\Reader\Source\Dynamic\Website as WebsiteSource;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\Store\Api\Data\StoreInterface;
+use Magento\Framework\DataObject;
+
+/**
+ * Class StoreTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class StoreTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ScopedFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionFactory;
+
+    /**
+     * @var Converter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $converter;
+
+    /**
+     * @var WebsiteFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $websiteFactory;
+
+    /**
+     * @var Website|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $website;
+
+    /**
+     * @var WebsiteSource|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $websiteSource;
+
+    /**
+     * @var StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeManager;
+
+    /**
+     * @var StoreInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $store;
+
+    /**
+     * @var StoreSource
+     */
+    private $storeSource;
+
+    public function setUp()
+    {
+        $this->collectionFactory = $this->getMockBuilder(ScopedFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMockForAbstractClass();
+        $this->converter = $this->getMockBuilder(Converter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->websiteFactory = $this->getMockBuilder(\Magento\Store\Model\WebsiteFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMockForAbstractClass();
+        $this->website = $this->getMockBuilder(\Magento\Store\Model\Website::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->websiteSource = $this->getMockBuilder(WebsiteSource::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeManager = $this->getMockBuilder(StoreManagerInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->store = $this->getMockBuilder(StoreInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeSource = new StoreSource(
+            $this->collectionFactory,
+            $this->converter,
+            $this->websiteFactory,
+            $this->websiteSource,
+            $this->storeManager
+        );
+    }
+
+    public function testGet()
+    {
+        $scopeCode = 'myStore';
+        $expectedResult = [
+            'config/key1' => 'default_db_value1',
+            'config/key3' => 'default_db_value3',
+        ];
+        $this->storeManager->expects($this->once())
+            ->method('getStore')
+            ->with($scopeCode)
+            ->willReturn($this->store);
+        $this->store->expects($this->once())
+            ->method('getId')
+            ->willReturn(1);
+        $this->store->expects($this->once())
+            ->method('getWebsiteId')
+            ->willReturn(1);
+        $this->collectionFactory->expects($this->once())
+            ->method('create')
+            ->with(['scope' => ScopeInterface::SCOPE_STORES, 'scopeId' => 1])
+            ->willReturn([
+                new DataObject(['path' => 'config/key1', 'value' => 'default_db_value1']),
+                new DataObject(['path' => 'config/key3', 'value' => 'default_db_value3']),
+            ]);
+        $this->websiteSource->expects($this->once())
+            ->method('get')
+            ->with(1)
+            ->willReturn([]);
+
+        $this->converter->expects($this->at(0))
+            ->method('convert')
+            ->with([
+                'config/key1' => 'default_db_value1',
+                'config/key3' => 'default_db_value3'
+            ])
+            ->willReturnArgument(0);
+
+        $this->converter->expects($this->at(1))
+            ->method('convert')
+            ->with($expectedResult)
+            ->willReturnArgument(0);
+
+        $this->assertEquals($expectedResult, $this->storeSource->get($scopeCode));
+    }
+}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/WebsiteTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/WebsiteTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b07dafd2fe67b52b9bae650a4ecf1ba198ead47c
--- /dev/null
+++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/WebsiteTest.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Dynamic;
+
+use Magento\Framework\DataObject;
+use Magento\Store\Model\Config\Reader\Source\Dynamic\Website as WebsiteSource;
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory;
+use Magento\Store\Model\ScopeInterface;
+use Magento\Store\Model\WebsiteFactory;
+use Magento\Store\Model\Website;
+use Magento\Store\Model\Config\Reader\Source\Dynamic\DefaultScope;
+
+/**
+ * Class WebsiteTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class WebsiteTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ScopedFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionFactory;
+
+    /**
+     * @var Converter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $converter;
+
+    /**
+     * @var WebsiteFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $websiteFactory;
+
+    /**
+     * @var Website|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $website;
+
+    /**
+     * @var DefaultScope|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $defaultScopeReader;
+
+    /**
+     * @var WebsiteSource
+     */
+    private $websiteSource;
+
+    public function setUp()
+    {
+        $this->collectionFactory = $this->getMockBuilder(ScopedFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMockForAbstractClass();
+        $this->converter = $this->getMockBuilder(Converter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->websiteFactory = $this->getMockBuilder(\Magento\Store\Model\WebsiteFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMockForAbstractClass();
+        $this->website = $this->getMockBuilder(\Magento\Store\Model\Website::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->defaultScopeReader = $this->getMockBuilder(DefaultScope::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->websiteSource = new WebsiteSource(
+            $this->collectionFactory,
+            $this->converter,
+            $this->websiteFactory,
+            $this->defaultScopeReader
+        );
+    }
+
+    public function testGet()
+    {
+        $scopeCode = 'myWebsite';
+        $expectedResult = [
+            'config/key1' => 'default_db_value1',
+            'config/key3' => 'default_db_value3',
+        ];
+        $this->websiteFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($this->website);
+        $this->website->expects($this->once())
+            ->method('load')
+            ->with($scopeCode);
+        $this->website->expects($this->once())
+            ->method('getId')
+            ->willReturn(1);
+        $this->collectionFactory->expects($this->once())
+            ->method('create')
+            ->with(['scope' => ScopeInterface::SCOPE_WEBSITES, 'scopeId' => 1])
+            ->willReturn([
+                new DataObject(['path' => 'config/key1', 'value' => 'default_db_value1']),
+                new DataObject(['path' => 'config/key3', 'value' => 'default_db_value3']),
+            ]);
+        $this->defaultScopeReader->expects($this->once())
+            ->method('get')
+            ->willReturn([]);
+        $this->converter->expects($this->once())
+            ->method('convert')
+            ->with($expectedResult)
+            ->willReturnArgument(0);
+        $this->assertEquals($expectedResult, $this->websiteSource->get($scopeCode));
+    }
+}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/DefaultScopeTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/DefaultScopeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d0b68c59749f89b3bd2bf2e182678d39185750e9
--- /dev/null
+++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/DefaultScopeTest.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Initial;
+
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Store\Model\Config\Reader\Source\Initial\DefaultScope;
+use Magento\Framework\App\Config\Scope\Converter;
+
+class DefaultScopeTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGet()
+    {
+        $initialConfig = $this->getMockBuilder(\Magento\Framework\App\Config\Initial::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $initialConfig->expects($this->once())
+            ->method('getData')
+            ->with(ScopeConfigInterface::SCOPE_TYPE_DEFAULT)
+            ->willReturn([]);
+        $converter = $this->getMockBuilder(Converter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $converter->expects($this->once())
+            ->method('convert')
+            ->with([])
+            ->willReturnArgument(0);
+
+        $defaultSource = new DefaultScope($initialConfig, $converter);
+        $this->assertEquals([], $defaultSource->get());
+    }
+}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/StoreTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/StoreTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..14531490cf4d072eab19e00a138f995f1497f9df
--- /dev/null
+++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/StoreTest.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Initial;
+
+use Magento\Store\Model\Config\Reader\Source\Initial\Store;
+use Magento\Framework\App\Config\Initial;
+use Magento\Store\Model\Config\Reader\Source\Initial\Website;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\Framework\App\Config\Scope\Converter;
+
+class StoreTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGet()
+    {
+        $scopeCode = 'myStore';
+        $websiteCode = 'myWebsite';
+        $initialConfig = $this->getMockBuilder(Initial::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $initialConfig->expects($this->once())
+            ->method('getData')
+            ->with("stores|$scopeCode")
+            ->willReturn([
+                'general' => [
+                    'locale' => [
+                        'code'=> 'en_US'
+                    ]
+                ]
+            ]);
+        $websiteSource = $this->getMockBuilder(Website::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $websiteSource->expects($this->once())
+            ->method('get')
+            ->with($websiteCode)
+            ->willReturn([
+                'general' => [
+                    'locale' => [
+                        'code'=> 'ru_RU'
+                    ]
+                ]
+            ]);
+        $storeManager = $this->getMockBuilder(StoreManagerInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $store = $this->getMockBuilder(\Magento\Store\Model\Store::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $store->expects($this->once())
+            ->method('getData')
+            ->with('website_code')
+            ->willReturn('myWebsite');
+
+        $storeManager->expects($this->once())
+            ->method('getStore')
+            ->with($scopeCode)
+            ->willReturn($store);
+
+        $converter = $this->getMockBuilder(Converter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $converter->expects($this->once())
+            ->method('convert')
+            ->willReturnArgument(0);
+
+        $storeSource = new Store($initialConfig, $websiteSource, $storeManager, $converter);
+        $this->assertEquals(
+            [
+                'general' => [
+                    'locale' => [
+                        'code'=> 'en_US'
+                    ]
+                ]
+            ],
+            $storeSource->get($scopeCode)
+        );
+    }
+}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/WebsiteTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/WebsiteTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a4f3dd189eacf14f98b2d365da48b59b105063b
--- /dev/null
+++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/WebsiteTest.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Initial;
+
+use Magento\Framework\App\Config\Initial;
+use Magento\Store\Model\Config\Reader\Source\Initial\DefaultScope;
+use Magento\Store\Model\Config\Reader\Source\Initial\Website;
+use Magento\Framework\App\Config\Scope\Converter;
+
+class WebsiteTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGet()
+    {
+        $scopeCode = 'myWebsite';
+        $initialConfig = $this->getMockBuilder(Initial::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $initialConfig->expects($this->once())
+            ->method('getData')
+            ->with("websites|$scopeCode")
+            ->willReturn([
+                'general' => [
+                    'locale' => [
+                        'code'=> 'en_US'
+                    ]
+                ]
+            ]);
+        $defaultScopeReader = $this->getMockBuilder(DefaultScope::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $defaultScopeReader->expects($this->once())
+            ->method('get')
+            ->willReturn([
+                'general' => [
+                    'locale' => [
+                        'code'=> 'ru_RU'
+                    ]
+                ]
+            ]);
+        $converter = $this->getMockBuilder(Converter::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $converter->expects($this->once())
+            ->method('convert')
+            ->willReturnArgument(0);
+
+        $websiteSource = new Website($initialConfig, $defaultScopeReader, $converter);
+        $this->assertEquals(
+            [
+                'general' => [
+                    'locale' => [
+                        'code'=> 'en_US'
+                    ]
+                ]
+            ],
+            $websiteSource->get($scopeCode)
+        );
+    }
+}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/StoreTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/StoreTest.php
deleted file mode 100644
index a3db4f89c1b876d660805343302e72f4e333bdab..0000000000000000000000000000000000000000
--- a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/StoreTest.php
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Store\Test\Unit\Model\Config\Reader;
-
-class StoreTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Store\Model\Config\Reader\Store
-     */
-    protected $_model;
-
-    /**
-     * @var \Magento\Framework\App\Config\ScopePool|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_scopePullMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_initialConfigMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_collectionFactory;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_storeMock;
-
-    /**
-     * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_storeManagerMock;
-
-    protected function setUp()
-    {
-        $this->_scopePullMock = $this->getMock(\Magento\Framework\App\Config\ScopePool::class, [], [], '', false);
-        $this->_storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class);
-        $this->_initialConfigMock = $this->getMock(\Magento\Framework\App\Config\Initial::class, [], [], '', false);
-        $this->_collectionFactory = $this->getMock(
-            \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory::class,
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->_storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false);
-        $placeholderProcessor = $this->getMock(
-            \Magento\Store\Model\Config\Processor\Placeholder::class,
-            [],
-            [],
-            '',
-            false
-        );
-        $placeholderProcessor->expects($this->any())->method('process')->will($this->returnArgument(0));
-        $this->_model = new \Magento\Store\Model\Config\Reader\Store(
-            $this->_initialConfigMock,
-            $this->_scopePullMock,
-            new \Magento\Store\Model\Config\Converter($placeholderProcessor),
-            $this->_collectionFactory,
-            $this->_storeManagerMock
-        );
-    }
-
-    /**
-     * @dataProvider readDataProvider
-     * @param string|null $storeCode
-     */
-    public function testRead($storeCode)
-    {
-        $websiteCode = 'default';
-        $storeId = 1;
-        $websiteMock = $this->getMock(\Magento\Store\Model\Website::class, [], [], '', false);
-        $websiteMock->expects($this->any())->method('getCode')->will($this->returnValue($websiteCode));
-        $this->_storeMock->expects($this->any())->method('getWebsite')->will($this->returnValue($websiteMock));
-        $this->_storeMock->expects($this->any())->method('getId')->will($this->returnValue($storeId));
-        $this->_storeMock->expects($this->any())->method('getCode')->will($this->returnValue($websiteCode));
-
-        $dataMock = $this->getMock(\Magento\Framework\App\Config\Data::class, [], [], '', false);
-        $dataMock->expects(
-            $this->any()
-        )->method(
-            'getValue'
-        )->will(
-            $this->returnValue(['config' => ['key0' => 'website_value0', 'key1' => 'website_value1']])
-        );
-
-        $dataMock->expects(
-            $this->once()
-        )->method(
-            'getSource'
-        )->will(
-            $this->returnValue(['config' => ['key0' => 'website_value0', 'key1' => 'website_value1']])
-        );
-        $this->_scopePullMock->expects(
-            $this->once()
-        )->method(
-            'getScope'
-        )->with(
-            'website',
-            $websiteCode
-        )->will(
-            $this->returnValue($dataMock)
-        );
-
-        $this->_initialConfigMock->expects(
-            $this->once()
-        )->method(
-            'getData'
-        )->with(
-            "stores|{$storeCode}"
-        )->will(
-            $this->returnValue(['config' => ['key1' => 'store_value1', 'key2' => 'store_value2']])
-        );
-        $this->_collectionFactory->expects(
-            $this->once()
-        )->method(
-            'create'
-        )->with(
-            ['scope' => 'stores', 'scopeId' => $storeId]
-        )->will(
-            $this->returnValue(
-                [
-                    new \Magento\Framework\DataObject(['path' => 'config/key1', 'value' => 'store_db_value1']),
-                    new \Magento\Framework\DataObject(['path' => 'config/key3', 'value' => 'store_db_value3']),
-                ]
-            )
-        );
-
-        $this->_storeManagerMock
-            ->expects($this->any())
-            ->method('getStore')
-            ->with($storeCode)
-            ->will($this->returnValue($this->_storeMock));
-        $expectedData = [
-            'config' => [
-                'key0' => 'website_value0',
-                'key1' => 'store_db_value1',
-                'key2' => 'store_value2',
-                'key3' => 'store_db_value3',
-            ],
-        ];
-        $this->assertEquals($expectedData, $this->_model->read($storeCode));
-    }
-
-    public function readDataProvider()
-    {
-        return [
-            ['default'],
-            [null],
-            ['code', '']
-        ];
-    }
-}
diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/WebsiteTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/WebsiteTest.php
deleted file mode 100644
index 8aed6de6dd235bbcbc86bd7b996562eb3a42017d..0000000000000000000000000000000000000000
--- a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/WebsiteTest.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Store\Test\Unit\Model\Config\Reader;
-
-class WebsiteTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Store\Model\Config\Reader\Website
-     */
-    protected $_model;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_initialConfigMock;
-
-    /**
-     * @var \Magento\Framework\App\Config\ScopePool|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_scopePullMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_collectionFactory;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_websiteMock;
-
-    protected function setUp()
-    {
-        $this->_initialConfigMock = $this->getMock(\Magento\Framework\App\Config\Initial::class, [], [], '', false);
-        $this->_scopePullMock = $this->getMock(\Magento\Framework\App\Config\ScopePool::class, [], [], '', false);
-        $this->_collectionFactory = $this->getMock(
-            \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory::class,
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $websiteFactoryMock = $this->getMock(
-            \Magento\Store\Model\WebsiteFactory::class,
-            ['create'],
-            [],
-            '',
-            false
-        );
-        $this->_websiteMock = $this->getMock(\Magento\Store\Model\Website::class, [], [], '', false);
-        $websiteFactoryMock->expects($this->any())->method('create')->will($this->returnValue($this->_websiteMock));
-
-        $this->_model = new \Magento\Store\Model\Config\Reader\Website(
-            $this->_initialConfigMock,
-            $this->_scopePullMock,
-            new \Magento\Framework\App\Config\Scope\Converter(),
-            $this->_collectionFactory,
-            $websiteFactoryMock
-        );
-    }
-
-    public function testRead()
-    {
-        $websiteCode = 'default';
-        $websiteId = 1;
-
-        $dataMock = $this->getMock(\Magento\Framework\App\Config\Data::class, [], [], '', false);
-        $dataMock->expects(
-            $this->any()
-        )->method(
-            'getValue'
-        )->will(
-            $this->returnValue(['config' => ['key0' => 'default_value0', 'key1' => 'default_value1']])
-        );
-        $dataMock->expects(
-            $this->once()
-        )->method(
-            'getSource'
-        )->will(
-            $this->returnValue(['config' => ['key0' => 'default_value0', 'key1' => 'default_value1']])
-        );
-        $this->_scopePullMock->expects(
-            $this->once()
-        )->method(
-            'getScope'
-        )->with(
-            'default',
-            null
-        )->will(
-            $this->returnValue($dataMock)
-        );
-
-        $this->_initialConfigMock->expects(
-            $this->any()
-        )->method(
-            'getData'
-        )->with(
-            "websites|{$websiteCode}"
-        )->will(
-            $this->returnValue(['config' => ['key1' => 'website_value1', 'key2' => 'website_value2']])
-        );
-        $this->_websiteMock->expects($this->once())->method('load')->with($websiteCode);
-        $this->_websiteMock->expects($this->any())->method('getId')->will($this->returnValue($websiteId));
-        $this->_collectionFactory->expects(
-            $this->once()
-        )->method(
-            'create'
-        )->with(
-            ['scope' => 'websites', 'scopeId' => $websiteId]
-        )->will(
-            $this->returnValue(
-                [
-                    new \Magento\Framework\DataObject(['path' => 'config/key1', 'value' => 'website_db_value1']),
-                    new \Magento\Framework\DataObject(['path' => 'config/key3', 'value' => 'website_db_value3']),
-                ]
-            )
-        );
-        $expectedData = [
-            'config' => [
-                'key0' => 'default_value0',
-                'key1' => 'website_db_value1',
-                'key2' => 'website_value2',
-                'key3' => 'website_db_value3',
-            ],
-        ];
-        $this->assertEquals($expectedData, $this->_model->read($websiteCode));
-    }
-}
diff --git a/app/code/Magento/Store/Test/Unit/Model/StoreManagerTest.php b/app/code/Magento/Store/Test/Unit/Model/StoreManagerTest.php
index 8e32ba2f989a90e4055d5186f2f11490b09dbfeb..f9d110359895ecd73c8c06f3cd0a438c98c5d090 100644
--- a/app/code/Magento/Store/Test/Unit/Model/StoreManagerTest.php
+++ b/app/code/Magento/Store/Test/Unit/Model/StoreManagerTest.php
@@ -6,6 +6,8 @@
 
 namespace Magento\Store\Test\Unit\Model;
 
+use Magento\Framework\App\DeploymentConfig;
+
 class StoreManagerTest extends \PHPUnit_Framework_TestCase
 {
     /**
diff --git a/app/code/Magento/Store/Test/Unit/Model/StoreRepositoryTest.php b/app/code/Magento/Store/Test/Unit/Model/StoreRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..43bb331c017b218bce651515b6933c3e917aafcd
--- /dev/null
+++ b/app/code/Magento/Store/Test/Unit/Model/StoreRepositoryTest.php
@@ -0,0 +1,185 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Store\Test\Unit\Model;
+
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Store\Api\Data\StoreInterface;
+use Magento\Store\Api\StoreRepositoryInterface;
+use Magento\Store\Model\ResourceModel\Store\Collection;
+use Magento\Store\Model\ResourceModel\Store\CollectionFactory;
+use Magento\Store\Model\Store;
+use Magento\Store\Model\StoreFactory;
+use Magento\Store\Model\StoreRepository;
+use Magento\Framework\App\Config;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class StoreRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var StoreFactory | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeFactory;
+
+    /**
+     * @var CollectionFactory | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeCollectionFactory;
+
+    /**
+     * @var bool
+     */
+    protected $allLoaded = false;
+
+    /**
+     * @var StoreRepositoryInterface
+     */
+    private $storeRepository;
+
+    /**
+     * @var Config | \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $appConfigMock;
+
+    public function setUp()
+    {
+        $this->storeFactory = $this->getMockBuilder(StoreFactory::class)
+            ->setMethods(['create'])
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeCollectionFactory = $this->getMockBuilder(CollectionFactory::class)
+            ->setMethods(['create'])
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeRepository = new StoreRepository(
+            $this->storeFactory,
+            $this->storeCollectionFactory
+        );
+        $this->appConfigMock = $this->getMockBuilder(Config::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->initDistroList();
+    }
+
+    private function initDistroList()
+    {
+        $repositoryReflection = new \ReflectionClass($this->storeRepository);
+        $deploymentProperty = $repositoryReflection->getProperty('appConfig');
+        $deploymentProperty->setAccessible(true);
+        $deploymentProperty->setValue($this->storeRepository, $this->appConfigMock);
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage Requested store is not found
+     */
+    public function testGetWithException()
+    {
+        $storeMock = $this->getMockBuilder(Store::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($storeMock);
+
+        $this->storeRepository->get('some_code');
+    }
+
+    public function testGetWithAvailableStoreFromScope()
+    {
+        $storeMock = $this->getMockBuilder(Store::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $storeMock->expects($this->exactly(2))
+            ->method('getId')
+            ->willReturn(1);
+        $this->storeFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($storeMock);
+
+        $this->assertEquals($storeMock, $this->storeRepository->get('some_code'));
+    }
+
+    public function testGetByIdWithAvailableStoreFromScope()
+    {
+        $storeMock = $this->getMockBuilder(Store::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $storeMock->expects($this->once())
+            ->method('getId')
+            ->willReturn(1);
+        $storeMock->expects($this->once())
+            ->method('getCode')
+            ->willReturn('some_code');
+        $this->storeFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($storeMock);
+        $this->appConfigMock->expects($this->once())
+            ->method('get')
+            ->willReturn([]);
+
+        $this->assertEquals($storeMock, $this->storeRepository->getById(1));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage Requested store is not found
+     */
+    public function testGetByIdWithException()
+    {
+        $storeMock = $this->getMockBuilder(Store::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($storeMock);
+        $this->appConfigMock->expects($this->once())
+            ->method('get')
+            ->willReturn([]);
+        $this->storeRepository->getById(1);
+    }
+
+    public function testGetList()
+    {
+        $storeMock1 = $this->getMock(StoreInterface::class);
+        $storeMock1->expects($this->once())
+            ->method('getCode')
+            ->willReturn('some_code');
+        $storeMock1->expects($this->once())
+            ->method('getId')
+            ->willReturn(1);
+        $storeMock2 = $this->getMock(StoreInterface::class);
+        $storeMock2->expects($this->once())
+            ->method('getCode')
+            ->willReturn('some_code_2');
+        $storeMock2->expects($this->once())
+            ->method('getId')
+            ->willReturn(2);
+        $this->appConfigMock->expects($this->once())
+            ->method('get')
+            ->willReturn([
+                [
+                    'code' => 'some_code'
+                ],
+                [
+                    'code' => 'some_code_2'
+                ]
+            ]);
+        $this->storeFactory->expects($this->at(0))
+            ->method('create')
+            ->willReturn($storeMock1);
+        $this->storeFactory->expects($this->at(1))
+            ->method('create')
+            ->willReturn($storeMock2);
+
+        $this->assertEquals(
+            ['some_code' => $storeMock1, 'some_code_2' => $storeMock2],
+            $this->storeRepository->getList()
+        );
+    }
+}
diff --git a/app/code/Magento/Store/Test/Unit/Model/WebsiteRepositoryTest.php b/app/code/Magento/Store/Test/Unit/Model/WebsiteRepositoryTest.php
index 3cc8b646f75d438cda892bb7c228b64a70514778..fdb2e4530bfdb096563bb8a02b8ef9554df26a2a 100644
--- a/app/code/Magento/Store/Test/Unit/Model/WebsiteRepositoryTest.php
+++ b/app/code/Magento/Store/Test/Unit/Model/WebsiteRepositoryTest.php
@@ -6,6 +6,8 @@
 
 namespace Magento\Store\Test\Unit\Model;
 
+use Magento\Framework\App\Config;
+
 class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -13,14 +15,29 @@ class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $model;
 
+    /**
+     * @var \Magento\Store\Model\WebsiteFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $websiteFactoryMock;
+
     /**
      * @var \Magento\Store\Model\ResourceModel\Website\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $websiteCollectionFactoryMock;
 
+    /**
+     * @var Config | \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $appConfigMock;
+
     protected function setUp()
     {
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->websiteFactoryMock =
+            $this->getMockBuilder('Magento\Store\Model\WebsiteFactory')
+                ->disableOriginalConstructor()
+                ->setMethods(['create'])
+                ->getMock();
         $this->websiteCollectionFactoryMock =
             $this->getMockBuilder(\Magento\Store\Model\ResourceModel\Website\CollectionFactory::class)
                 ->disableOriginalConstructor()
@@ -29,26 +46,46 @@ class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->model = $objectManager->getObject(
             \Magento\Store\Model\WebsiteRepository::class,
             [
+                'factory' => $this->websiteFactoryMock,
                 'websiteCollectionFactory' => $this->websiteCollectionFactoryMock
             ]
         );
+        $this->appConfigMock = $this->getMockBuilder(Config::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->initDistroList();
+    }
 
+    private function initDistroList()
+    {
+        $repositoryReflection = new \ReflectionClass($this->model);
+        $deploymentProperty = $repositoryReflection->getProperty('appConfig');
+        $deploymentProperty->setAccessible(true);
+        $deploymentProperty->setValue($this->model, $this->appConfigMock);
     }
 
     public function testGetDefault()
     {
-        $collectionMock = $this->getMockBuilder(\Magento\Store\Model\ResourceModel\Website\Collection::class)
-            ->disableOriginalConstructor()
-            ->setMethods([])
-            ->getMock();
         $websiteMock = $this->getMockBuilder(\Magento\Store\Api\Data\WebsiteInterface::class)
             ->disableOriginalConstructor()
             ->setMethods([])
             ->getMock();
-        $this->websiteCollectionFactoryMock->expects($this->any())->method('create')->willReturn($collectionMock);
-        $collectionMock->expects($this->any())->method('addFieldToFilter');
-        $collectionMock->expects($this->any())->method('getItems')->willReturn([1]);
-        $collectionMock->expects($this->any())->method('getFirstItem')->willReturn($websiteMock);
+        $this->appConfigMock->expects($this->once())
+            ->method('get')
+            ->with('scopes', 'websites')
+            ->willReturn([
+                'some_code' => [
+                    'code' => 'some_code',
+                    'is_default' => 1
+                ],
+                'some_code_2' => [
+                    'code' => 'some_code_2',
+                    'is_default' => 0
+                ]
+            ]);
+        $this->websiteFactoryMock->expects($this->at(0))
+            ->method('create')
+            ->willReturn($websiteMock);
 
         $website = $this->model->getDefault();
         $this->assertInstanceOf(\Magento\Store\Api\Data\WebsiteInterface::class, $website);
@@ -61,13 +98,24 @@ class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetDefaultIsSeveral()
     {
-        $collectionMock = $this->getMockBuilder(\Magento\Store\Model\ResourceModel\Website\Collection::class)
+        $websiteMock = $this->getMockBuilder(\Magento\Store\Api\Data\WebsiteInterface::class)
             ->disableOriginalConstructor()
             ->setMethods([])
             ->getMock();
-        $this->websiteCollectionFactoryMock->expects($this->any())->method('create')->willReturn($collectionMock);
-        $collectionMock->expects($this->any())->method('addFieldToFilter');
-        $collectionMock->expects($this->any())->method('getItems')->willReturn([1, 2]);
+        $this->appConfigMock->expects($this->once())
+            ->method('get')
+            ->with('scopes', 'websites')
+            ->willReturn([
+                'some_code' => [
+                    'code' => 'some_code',
+                    'is_default' => 1
+                ],
+                'some_code_2' => [
+                    'code' => 'some_code_2',
+                    'is_default' => 1
+                ]
+            ]);
+        $this->websiteFactoryMock->expects($this->any())->method('create')->willReturn($websiteMock);
 
         $this->model->getDefault();
     }
@@ -78,13 +126,24 @@ class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetDefaultIsZero()
     {
-        $collectionMock = $this->getMockBuilder(\Magento\Store\Model\ResourceModel\Website\Collection::class)
+        $websiteMock = $this->getMockBuilder(\Magento\Store\Api\Data\WebsiteInterface::class)
             ->disableOriginalConstructor()
             ->setMethods([])
             ->getMock();
-        $this->websiteCollectionFactoryMock->expects($this->any())->method('create')->willReturn($collectionMock);
-        $collectionMock->expects($this->any())->method('addFieldToFilter');
-        $collectionMock->expects($this->any())->method('getItems')->willReturn([]);
+        $this->appConfigMock->expects($this->once())
+            ->method('get')
+            ->with('scopes', 'websites')
+            ->willReturn([
+                'some_code' => [
+                    'code' => 'some_code',
+                    'is_default' => 0
+                ],
+                'some_code_2' => [
+                    'code' => 'some_code_2',
+                    'is_default' => 0
+                ]
+            ]);
+        $this->websiteFactoryMock->expects($this->any())->method('create')->willReturn($websiteMock);
 
         $this->model->getDefault();
     }
diff --git a/app/code/Magento/Store/composer.json b/app/code/Magento/Store/composer.json
index d5b8a2b4b980b58648c04cfed916b5bd390db048..1c74c46cdf89f3aaa0bf5efc3143556d610e518b 100644
--- a/app/code/Magento/Store/composer.json
+++ b/app/code/Magento/Store/composer.json
@@ -10,6 +10,9 @@
         "magento/module-media-storage": "100.2.*",
         "magento/framework": "100.2.*"
     },
+    "suggest": {
+        "magento/module-deploy": "100.2.*"
+    },
     "type": "magento2-module",
     "version": "100.2.0-dev",
     "license": [
diff --git a/app/code/Magento/Store/etc/di.xml b/app/code/Magento/Store/etc/di.xml
index 57bf057af2724c220d3e7d1bda152351a8b9de88..7307493cefb4cca65eb81eacaec265e9a381f6f1 100644
--- a/app/code/Magento/Store/etc/di.xml
+++ b/app/code/Magento/Store/etc/di.xml
@@ -33,28 +33,11 @@
             <argument name="xFrameOpt" xsi:type="init_parameter">Magento\Framework\App\Response\HeaderProvider\XFrameOptions::DEPLOYMENT_CONFIG_X_FRAME_OPT</argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\App\Config\ScopePool">
-        <arguments>
-            <argument name="readerPool" xsi:type="object">Magento\Store\Model\Config\Reader\ReaderPool\Proxy</argument>
-        <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument>
-        </arguments>
-    </type>
     <type name="Magento\Framework\View\Element\Template\File\Validator">
         <arguments>
             <argument name="scope" xsi:type="string">store</argument>
         </arguments>
     </type>
-    <type name="Magento\Store\Model\Config\Reader\Website">
-        <arguments>
-            <argument name="scopePool" xsi:type="object">Magento\Framework\App\Config\ScopePool\Proxy</argument>
-        </arguments>
-    </type>
-    <type name="Magento\Store\Model\Config\Reader\Store">
-        <arguments>
-            <argument name="scopePool" xsi:type="object">Magento\Framework\App\Config\ScopePool\Proxy</argument>
-            <argument name="storeManager" xsi:type="object">Magento\Store\Model\StoreManagerInterface\Proxy</argument>
-        </arguments>
-    </type>
     <type name="Magento\Store\Model\Resolver\Store">
         <arguments>
             <argument name="storeManager" xsi:type="object">Magento\Store\Model\StoreManagerInterface\Proxy</argument>
@@ -70,18 +53,6 @@
         <argument name="storeManager" xsi:type="object">Magento\Store\Model\StoreManagerInterface\Proxy</argument>
         </arguments>
     </type>
-    <type name="Magento\Store\Model\Config\Reader\ReaderPool">
-        <arguments>
-            <argument name="readers" xsi:type="array">
-                <item name="default" xsi:type="object">Magento\Store\Model\Config\Reader\DefaultReader</item>
-                <item name="website" xsi:type="object">Magento\Store\Model\Config\Reader\Website</item>
-                <item name="websites" xsi:type="object">Magento\Store\Model\Config\Reader\Website</item>
-                <item name="store" xsi:type="object">Magento\Store\Model\Config\Reader\Store</item>
-                <item name="stores" xsi:type="object">Magento\Store\Model\Config\Reader\Store</item>
-            </argument>
-        </arguments>
-    </type>
-    <preference for="Magento\Framework\App\Config\Scope\ReaderPoolInterface" type="Magento\Store\Model\Config\Reader\ReaderPool"/>
     <preference for="Magento\Framework\App\ScopeResolverInterface" type="Magento\Store\Model\Resolver\Store" />
     <preference for="Magento\Framework\App\Router\PathConfigInterface" type="Magento\Store\Model\PathConfig" />
     <type name="\Magento\Framework\App\Action\AbstractAction">
@@ -164,7 +135,7 @@
             <argument name="cacheLifetime" xsi:type="boolean">false</argument>
         </arguments>
     </virtualType>
-    <type name="Magento\Store\Model\Config\Processor\Placeholder">
+    <type name="Magento\Store\Model\Config\Placeholder">
         <arguments>
             <argument name="request" xsi:type="object">Magento\Framework\App\Request\Http\Proxy</argument>
             <argument name="urlPaths" xsi:type="array">
@@ -344,4 +315,59 @@
             </argument>
         </arguments>
     </type>
+    <virtualType name="systemConfigPostProcessorComposite" type="Magento\Framework\App\Config\PostProcessorComposite">
+        <arguments>
+            <argument name="processors" xsi:type="array">
+                <item name="placeholder" xsi:type="object">Magento\Store\Model\Config\Processor\Placeholder</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Framework\App\Config">
+        <arguments>
+            <argument name="types" xsi:type="array">
+                <item name="scopes" xsi:type="object">Magento\Store\App\Config\Type\Scopes</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Store\App\Config\Type\Scopes">
+        <arguments>
+            <argument name="source" xsi:type="object">scopesConfigSourceAggregatedProxy</argument>
+        </arguments>
+    </type>
+    <virtualType name="scopesConfigSourceAggregatedProxy" type="Magento\Framework\App\Config\ConfigSourceAggregated\Proxy">
+        <arguments>
+            <argument name="instanceName" xsi:type="string">scopesConfigSourceAggregated</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="scopesConfigSourceAggregated" type="Magento\Framework\App\Config\ConfigSourceAggregated">
+        <arguments>
+            <argument name="sources" xsi:type="array">
+                <item name="initial" xsi:type="array">
+                    <item name="source" xsi:type="object">scopesConfigInitialDataProvider</item>
+                    <item name="sortOrder" xsi:type="string">10</item>
+                </item>
+                <item name="runtime" xsi:type="array">
+                    <item name="source" xsi:type="object">Magento\Store\App\Config\Source\RuntimeConfigSource</item>
+                    <item name="sortOrder" xsi:type="string">10</item>
+                </item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="scopesConfigInitialDataProvider" type="Magento\Framework\App\Config\InitialConfigSource">
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Framework\App\DeploymentConfig\Reader</argument>
+            <argument name="configType" xsi:type="const">Magento\Store\App\Config\Type\Scopes::CONFIG_TYPE</argument>
+            <argument name="fileKey" xsi:type="const">Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG</argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Deploy\Console\Command\App\ApplicationDumpCommand">
+        <arguments>
+            <argument name="sources" xsi:type="array">
+                <item name="scopes" xsi:type="array">
+                    <item name="source" xsi:type="object">scopesConfigSourceAggregated</item>
+                    <item name="namespace" xsi:type="const">Magento\Store\App\Config\Type\Scopes::CONFIG_TYPE</item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Theme/Model/Design.php b/app/code/Magento/Theme/Model/Design.php
index 39527afc0250d77e0e9ac6d8f9a2941e76e07398..55941cfbcacb6003ef1f03a5a834c1272d40dda8 100644
--- a/app/code/Magento/Theme/Model/Design.php
+++ b/app/code/Magento/Theme/Model/Design.php
@@ -6,9 +6,11 @@
 namespace Magento\Theme\Model;
 
 use Magento\Framework\App\DesignInterface;
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Model\AbstractModel;
 use Magento\Framework\Model\ResourceModel\AbstractResource;
 use Magento\Framework\DataObject\IdentityInterface;
+use Magento\Framework\Serialize\SerializerInterface;
 
 /**
  * Design settings change model
@@ -55,6 +57,11 @@ class Design extends AbstractModel implements IdentityInterface, DesignInterface
      */
     protected $_dateTime;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -63,6 +70,7 @@ class Design extends AbstractModel implements IdentityInterface, DesignInterface
      * @param AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
      * @param array $data
+     * @param SerializerInterface $serializer
      */
     public function __construct(
         \Magento\Framework\Model\Context $context,
@@ -71,10 +79,12 @@ class Design extends AbstractModel implements IdentityInterface, DesignInterface
         \Magento\Framework\Stdlib\DateTime $dateTime,
         AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
-        array $data = []
+        array $data = [],
+        SerializerInterface $serializer = null
     ) {
         $this->_localeDate = $localeDate;
         $this->_dateTime = $dateTime;
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
         parent::__construct($context, $registry, $resource, $resourceCollection, $data);
     }
 
@@ -108,9 +118,9 @@ class Design extends AbstractModel implements IdentityInterface, DesignInterface
             if (!$result) {
                 $result = [];
             }
-            $this->_cacheManager->save(serialize($result), $changeCacheId, [self::CACHE_TAG], 86400);
+            $this->_cacheManager->save($this->serializer->serialize($result), $changeCacheId, [self::CACHE_TAG], 86400);
         } else {
-            $result = unserialize($result);
+            $result = $this->serializer->unserialize($result);
         }
 
         if ($result) {
diff --git a/app/code/Magento/Theme/Model/Theme/ThemeProvider.php b/app/code/Magento/Theme/Model/Theme/ThemeProvider.php
index 9fd3ce94dac45888687cbe6bff26f86a2ac9d2e7..89d7bfc18d30c27026777f7864b562354277dfee 100644
--- a/app/code/Magento/Theme/Model/Theme/ThemeProvider.php
+++ b/app/code/Magento/Theme/Model/Theme/ThemeProvider.php
@@ -5,6 +5,13 @@
  */
 namespace Magento\Theme\Model\Theme;
 
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\View\Design\Theme\ListInterface;
+use Magento\Framework\App\DeploymentConfig;
+
+/**
+ * Provide data for theme grid and for theme edit page
+ */
 class ThemeProvider implements \Magento\Framework\View\Design\Theme\ThemeProviderInterface
 {
     /**
@@ -27,6 +34,16 @@ class ThemeProvider implements \Magento\Framework\View\Design\Theme\ThemeProvide
      */
     private $themes;
 
+    /**
+     * @var ListInterface
+     */
+    private $themeList;
+
+    /**
+     * @var DeploymentConfig
+     */
+    private $deploymentConfig;
+
     /**
      * ThemeProvider constructor.
      *
@@ -52,6 +69,11 @@ class ThemeProvider implements \Magento\Framework\View\Design\Theme\ThemeProvide
         if (isset($this->themes[$fullPath])) {
             return $this->themes[$fullPath];
         }
+
+        if (! $this->getDeploymentConfig()->isDbAvailable()) {
+            return $this->getThemeList()->getThemeByFullPath($fullPath);
+        }
+
         /** @var $themeCollection \Magento\Theme\Model\ResourceModel\Theme\Collection */
         $theme = $this->cache->load('theme'. $fullPath);
         if ($theme) {
@@ -105,4 +127,28 @@ class ThemeProvider implements \Magento\Framework\View\Design\Theme\ThemeProvide
         }
         return $themeModel;
     }
+
+    /**
+     * @deprecated
+     * @return ListInterface
+     */
+    private function getThemeList()
+    {
+        if ($this->themeList === null) {
+            $this->themeList = ObjectManager::getInstance()->get(ListInterface::class);
+        }
+        return $this->themeList;
+    }
+
+    /**
+     * @deprecated
+     * @return DeploymentConfig
+     */
+    private function getDeploymentConfig()
+    {
+        if ($this->deploymentConfig === null) {
+            $this->deploymentConfig = ObjectManager::getInstance()->get(DeploymentConfig::class);
+        }
+        return $this->deploymentConfig;
+    }
 }
diff --git a/app/code/Magento/Theme/Test/Unit/Model/DesignTest.php b/app/code/Magento/Theme/Test/Unit/Model/DesignTest.php
index dc11a4c46eda53a9fad92048f1c65d583ddcb607..67f86575a8afdb4143d5ebc5a213b472553bc463 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/DesignTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/DesignTest.php
@@ -9,6 +9,7 @@
  */
 namespace Magento\Theme\Test\Unit\Model;
 
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Theme\Model\Design;
 
 class DesignTest extends \PHPUnit_Framework_TestCase
@@ -23,11 +24,6 @@ class DesignTest extends \PHPUnit_Framework_TestCase
      */
     protected $cacheManager;
 
-    /**
-     * @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $registry;
-
     /**
      * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject
      */
@@ -44,18 +40,15 @@ class DesignTest extends \PHPUnit_Framework_TestCase
     protected $resource;
 
     /**
-     * @var \Magento\Framework\Data\Collection\AbstractDb|\PHPUnit_Framework_MockObject_MockObject
+     * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $resourceCollection;
+    private $serializerMock;
 
     protected function setUp()
     {
         $context = $this->getMockBuilder(\Magento\Framework\Model\Context::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->registry = $this->getMockBuilder(
-            \Magento\Framework\Registry::class
-        )->disableOriginalConstructor()->getMock();
         $this->localeDate = $this->getMockBuilder(
             \Magento\Framework\Stdlib\DateTime\TimezoneInterface::class
         )->getMock();
@@ -65,25 +58,24 @@ class DesignTest extends \PHPUnit_Framework_TestCase
         $this->resource = $this->getMockBuilder(\Magento\Theme\Model\ResourceModel\Design::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->resourceCollection = $this->getMockBuilder(\Magento\Theme\Model\ResourceModel\Design\Collection::class)
-            ->disableOriginalConstructor()
-            ->getMock();
         $this->cacheManager = $this->getMockBuilder(\Magento\Framework\App\CacheInterface::class)->getMock();
 
         $context->expects($this->any())
             ->method('getCacheManager')
             ->willReturn($this->cacheManager);
 
-        /**
-         * @var $context \Magento\Framework\Model\Context
-         */
-        $this->model = new Design(
-            $context,
-            $this->registry,
-            $this->localeDate,
-            $this->dateTime,
-            $this->resource,
-            $this->resourceCollection
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
+
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->model = $objectManager->getObject(
+            Design::class,
+            [
+                'context' => $context,
+                'localeDate' => $this->localeDate,
+                'dateTime' => $this->dateTime,
+                'resource' => $this->resource,
+                'serializer' => $this->serializerMock,
+            ]
         );
     }
 
@@ -119,9 +111,12 @@ class DesignTest extends \PHPUnit_Framework_TestCase
             ->method('loadChange')
             ->with($storeId, $date)
             ->willReturn(false);
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->willReturn('serializedData');
         $this->cacheManager->expects($this->once())
             ->method('save')
-            ->with(serialize([]), $cacheId, [Design::CACHE_TAG], 86400)
+            ->with('serializedData', $cacheId, [Design::CACHE_TAG], 86400)
             ->willReturnSelf();
 
         $this->assertInstanceOf(get_class($this->model), $this->model->loadChange($storeId));
@@ -151,9 +146,16 @@ class DesignTest extends \PHPUnit_Framework_TestCase
         $this->cacheManager->expects($this->once())
             ->method('load')
             ->with($cacheId)
-            ->willReturn(serialize(['test' => 'data']));
-
-        $this->assertInstanceOf(get_class($this->model), $this->model->loadChange($storeId));
+            ->willReturn('serializedData');
+        $data = ['test' => 'data'];
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with('serializedData')
+            ->willReturn($data);
+
+        $change = $this->model->loadChange($storeId);
+        $this->assertInstanceOf(get_class($this->model), $change);
+        $this->assertEquals($data, $change->getData());
     }
 
     /**
diff --git a/app/code/Magento/Theme/Test/Unit/Model/Theme/ThemeProviderTest.php b/app/code/Magento/Theme/Test/Unit/Model/Theme/ThemeProviderTest.php
index 54120d23699835954283b2768403e07d63dcc66c..fb0e1f9897587ad706301f91f621d31991fca838 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/Theme/ThemeProviderTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/Theme/ThemeProviderTest.php
@@ -10,6 +10,10 @@ use Magento\Framework\View\Design\ThemeInterface;
 use Magento\Theme\Model\Theme\ThemeProvider;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
 
+/**
+ * Class ThemeProviderTest
+ * @covers \Magento\Theme\Model\Theme\ThemeProvider
+ */
 class ThemeProviderTest extends \PHPUnit_Framework_TestCase
 {
     /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */
@@ -52,6 +56,21 @@ class ThemeProviderTest extends \PHPUnit_Framework_TestCase
             ]
         );
 
+        $deploymentConfig = $this->getMockBuilder(\Magento\Framework\App\DeploymentConfig::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $deploymentConfig->expects($this->once())
+            ->method('isDbAvailable')
+            ->willReturn(true);
+
+        $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
+        $objectManagerMock->expects($this->any())
+            ->method('get')
+            ->willReturnMap([
+                [\Magento\Framework\App\DeploymentConfig::class, $deploymentConfig],
+            ]);
+        \Magento\Framework\App\ObjectManager::setInstance($objectManagerMock);
+
         $this->assertSame($theme, $themeProvider->getThemeByFullPath($path));
     }
 
@@ -66,6 +85,9 @@ class ThemeProviderTest extends \PHPUnit_Framework_TestCase
             false
         );
         $theme = $this->getMock(\Magento\Theme\Model\Theme::class, [], [], '', false);
+        $theme->expects($this->once())
+            ->method('getId')
+            ->willReturn(1);
         $theme->expects($this->once())->method('load')->with($themeId)->will($this->returnSelf());
         $theme->expects($this->once())->method('getId')->will($this->returnValue(1));
         $theme->expects($this->once())->method('__sleep')->will($this->returnValue([]));
diff --git a/app/code/Magento/Translation/App/Config/Type/Translation.php b/app/code/Magento/Translation/App/Config/Type/Translation.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a5090f3f5486d3b082ed82279487d27db7748bf
--- /dev/null
+++ b/app/code/Magento/Translation/App/Config/Type/Translation.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\App\Config\Type;
+
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\App\Config\ConfigTypeInterface;
+use Magento\Framework\DataObject;
+
+/**
+ * Class which hold all translation sources and merge them
+ *
+ * @package Magento\Translation\App\Config\Type
+ */
+class Translation implements ConfigTypeInterface
+{
+    const CONFIG_TYPE = "i18n";
+
+    /**
+     * @var DataObject[]
+     */
+    private $data;
+
+    /**
+     * @var ConfigSourceInterface
+     */
+    private $source;
+
+    /**
+     * Translation constructor.
+     * @param ConfigSourceInterface $source
+     */
+    public function __construct(
+        ConfigSourceInterface $source
+    ) {
+        $this->source = $source;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public function get($path = '')
+    {
+        if (!$this->data) {
+            $this->data = new DataObject($this->source->get());
+        }
+
+        return $this->data->getData($path);
+    }
+
+    /**
+     * Clean cache
+     *
+     * @return void
+     */
+    public function clean()
+    {
+        $this->data = null;
+    }
+}
diff --git a/app/code/Magento/Translation/Model/ResourceModel/Translate.php b/app/code/Magento/Translation/Model/ResourceModel/Translate.php
index 0d40a7254eba1e1840e6c1ac7209a09263f9249f..49a8bcdbb43a862700d0e6da11a7f179935d4d67 100644
--- a/app/code/Magento/Translation/Model/ResourceModel/Translate.php
+++ b/app/code/Magento/Translation/Model/ResourceModel/Translate.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\Translation\Model\ResourceModel;
 
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\App\DeploymentConfig;
+use Magento\Framework\App\Config;
+use Magento\Translation\App\Config\Type\Translation;
+
 class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb implements
     \Magento\Framework\Translate\ResourceInterface
 {
@@ -18,6 +23,16 @@ class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb imp
      */
     protected $scope;
 
+    /**
+     * @var Config
+     */
+    private $appConfig;
+
+    /**
+     * @var DeploymentConfig
+     */
+    private $deployedConfig;
+
     /**
      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
      * @param \Magento\Framework\App\ScopeResolverInterface $scopeResolver
@@ -57,21 +72,25 @@ class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb imp
         if ($storeId === null) {
             $storeId = $this->getStoreId();
         }
+        $locale = (string) $locale;
 
+        $data = $this->getAppConfig()->get(
+            Translation::CONFIG_TYPE,
+            $locale . '/' . $this->getStoreCode($storeId),
+            []
+        );
         $connection = $this->getConnection();
-        if (!$connection) {
-            return [];
+        if ($connection) {
+            $select = $connection->select()
+                ->from($this->getMainTable(), ['string', 'translate'])
+                ->where('store_id IN (0 , :store_id)')
+                ->where('locale = :locale')
+                ->order('store_id');
+            $bind = [':locale' => $locale, ':store_id' => $storeId];
+            $dbData = $connection->fetchPairs($select, $bind);
+            $data = array_replace($data, $dbData);
         }
-
-        $select = $connection->select()
-            ->from($this->getMainTable(), ['string', 'translate'])
-            ->where('store_id IN (0 , :store_id)')
-            ->where('locale = :locale')
-            ->order('store_id');
-
-        $bind = [':locale' => (string)$locale, ':store_id' => $storeId];
-
-        return $connection->fetchPairs($select, $bind);
+        return $data;
     }
 
     /**
@@ -115,6 +134,19 @@ class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb imp
         return $this->getChecksum($this->getMainTable());
     }
 
+    /**
+     * Get connection
+     *
+     * @return \Magento\Framework\DB\Adapter\AdapterInterface|false
+     */
+    public function getConnection()
+    {
+        if (!$this->getDeployedConfig()->isDbAvailable()) {
+            return false;
+        }
+        return parent::getConnection();
+    }
+
     /**
      * Retrieve current store identifier
      *
@@ -124,4 +156,39 @@ class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb imp
     {
         return $this->scopeResolver->getScope($this->scope)->getId();
     }
+
+    /**
+     * Retrieve store code by store id
+     *
+     * @param int $storeId
+     * @return string
+     */
+    private function getStoreCode($storeId)
+    {
+        return $this->scopeResolver->getScope($storeId)->getCode();
+    }
+
+    /**
+     * @deprecated
+     * @return DeploymentConfig
+     */
+    private function getDeployedConfig()
+    {
+        if ($this->deployedConfig === null) {
+            $this->deployedConfig = ObjectManager::getInstance()->get(DeploymentConfig::class);
+        }
+        return $this->deployedConfig;
+    }
+
+    /**
+     * @deprecated
+     * @return Config
+     */
+    private function getAppConfig()
+    {
+        if ($this->appConfig === null) {
+            $this->appConfig = ObjectManager::getInstance()->get(Config::class);
+        }
+        return $this->appConfig;
+    }
 }
diff --git a/app/code/Magento/Translation/Model/Source/InitialTranslationSource.php b/app/code/Magento/Translation/Model/Source/InitialTranslationSource.php
new file mode 100644
index 0000000000000000000000000000000000000000..22828cfb1be05eb8609eb9ebdcb1d99667d06391
--- /dev/null
+++ b/app/code/Magento/Translation/Model/Source/InitialTranslationSource.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Model\Source;
+
+use Magento\Framework\App\DeploymentConfig;
+use Magento\Store\Model\StoreManager;
+use Magento\Translation\Model\ResourceModel\TranslateFactory;
+use Magento\Translation\Model\ResourceModel\Translate;
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\DataObject;
+
+/**
+ * Class for reading translations from DB
+ */
+class InitialTranslationSource implements ConfigSourceInterface
+{
+    /**
+     * @var TranslateFactory
+     */
+    private $translateFactory;
+
+    /**
+     * @var StoreManager
+     */
+    private $storeManager;
+
+    /**
+     * @var array
+     */
+    private $data;
+
+    /**
+     * @var DeploymentConfig
+     */
+    private $deploymentConfig;
+
+    /**
+     * @param TranslateFactory $translateFactory
+     * @param StoreManager $storeManager
+     * @param DeploymentConfig $deploymentConfig
+     */
+    public function __construct(
+        TranslateFactory $translateFactory,
+        StoreManager $storeManager,
+        DeploymentConfig $deploymentConfig
+    ) {
+        $this->translateFactory = $translateFactory;
+        $this->storeManager = $storeManager;
+        $this->deploymentConfig = $deploymentConfig;
+    }
+
+    /**
+     * Read translations for the given 'path' from application initial configuration.
+     *
+     * @param string $path
+     * @return mixed
+     */
+    public function get($path = '')
+    {
+        if (!$this->deploymentConfig->isDbAvailable()) {
+            return [];
+        }
+
+        if (!$this->data) {
+            /** @var Translate $translate */
+            $translate = $this->translateFactory->create();
+            $select = $translate->getConnection()->select()
+                ->from($translate->getMainTable(), ['string', 'translate', 'store_id', 'locale'])
+                ->order('store_id');
+            $translations = [];
+            foreach ($translate->getConnection()->fetchAll($select) as $item) {
+                $store = $this->storeManager->getStore($item['store_id']);
+                $translations[$item['locale']][$store->getCode()][$item['string']] = $item['translate'];
+            }
+            $this->data = new DataObject($translations);
+        }
+        return $this->data->getData($path) ?: [];
+    }
+}
diff --git a/app/code/Magento/Translation/Test/Unit/App/Config/Type/TranslationTest.php b/app/code/Magento/Translation/Test/Unit/App/Config/Type/TranslationTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8f2c1efdf515b51bf6985318cfc7f11c0fa0ca65
--- /dev/null
+++ b/app/code/Magento/Translation/Test/Unit/App/Config/Type/TranslationTest.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Test\Unit\App\Config\Type;
+
+use Magento\Authorizenet\Helper\Backend\Data;
+use Magento\Framework\App\Cache\Type\Translate;
+use Magento\Framework\App\Config\ConfigSourceInterface;
+use Magento\Framework\Cache\FrontendInterface;
+use Magento\Translation\App\Config\Type\Translation;
+use Magento\Framework\DataObject;
+
+/**
+ * @covers \Magento\Translation\App\Config\Type\Translation
+ */
+class TranslationTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $source;
+
+    /**
+     * @var Translation
+     */
+    private $configType;
+
+    public function setUp()
+    {
+        $this->source = $this->getMockBuilder(ConfigSourceInterface::class)
+            ->getMockForAbstractClass();
+        $this->configType = new Translation($this->source);
+    }
+
+    public function testGet()
+    {
+        $path = 'en_US/default';
+        $data = [
+            'en_US' => [
+                'default' => [
+                    'hello' => 'bonjour'
+                ]
+            ]
+        ];
+
+        $this->source->expects($this->once())
+            ->method('get')
+            ->with()
+            ->willReturn($data);
+
+        $this->assertEquals(['hello' => 'bonjour'], $this->configType->get($path));
+    }
+}
diff --git a/app/code/Magento/Translation/Test/Unit/Model/Source/InitialTranslationSourceTest.php b/app/code/Magento/Translation/Test/Unit/Model/Source/InitialTranslationSourceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f6b3a39dcbf424131a0bef5012e62f8e3356bad6
--- /dev/null
+++ b/app/code/Magento/Translation/Test/Unit/Model/Source/InitialTranslationSourceTest.php
@@ -0,0 +1,159 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Test\Unit\Model\Source;
+
+use Magento\Framework\App\DeploymentConfig;
+use Magento\Framework\DB\Adapter\AdapterInterface;
+use Magento\Framework\DB\Select;
+use Magento\Store\Model\Store;
+use Magento\Store\Model\StoreManager;
+use Magento\Translation\Model\ResourceModel\Translate;
+use Magento\Translation\Model\ResourceModel\TranslateFactory;
+use Magento\Translation\Model\Source\InitialTranslationSource;
+
+/**
+ * @covers \Magento\Translation\Model\Source\InitialTranslationSource
+ * @package Magento\Translation\Test\Unit\Model\Source
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class InitialTranslationSourceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var TranslateFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $translationFactory;
+
+    /**
+     * @var Translate|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $translation;
+
+    /**
+     * @var StoreManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeManager;
+
+    /**
+     * @var Store|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $store;
+
+    /**
+     * @var AdapterInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $connection;
+
+    /**
+     * @var Select|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $select;
+
+    /**
+     * @var DeploymentConfig | \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $deploymentConfigMock;
+
+    /**
+     * @var InitialTranslationSource
+     */
+    private $source;
+
+    public function setUp()
+    {
+        $this->translationFactory = $this->getMockBuilder(TranslateFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->translation = $this->getMockBuilder(Translate::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeManager = $this->getMockBuilder(StoreManager::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->store = $this->getMockBuilder(Store::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->connection = $this->getMockBuilder(AdapterInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->select = $this->getMockBuilder(Select::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->deploymentConfigMock = $this->getMockBuilder(DeploymentConfig::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->source = new InitialTranslationSource(
+            $this->translationFactory,
+            $this->storeManager,
+            $this->deploymentConfigMock
+        );
+    }
+
+    public function testGet()
+    {
+        $this->deploymentConfigMock->expects($this->once())
+            ->method('isDbAvailable')
+            ->willReturn(true);
+        $this->translationFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($this->translation);
+        $this->translation->expects($this->atLeastOnce())
+            ->method('getConnection')
+            ->willReturn($this->connection);
+        $this->connection->expects($this->once())
+            ->method('select')
+            ->willReturn($this->select);
+        $this->translation->expects($this->once())
+            ->method('getMainTable')
+            ->willReturn('main_table.translate');
+        $this->select->expects($this->once())
+            ->method('from')
+            ->with('main_table.translate', ['string', 'translate', 'store_id', 'locale'])
+            ->willReturnSelf();
+        $this->select->expects($this->once())
+            ->method('order')
+            ->with('store_id')
+            ->willReturnSelf();
+        $this->connection->expects($this->once())
+            ->method('fetchAll')
+            ->with($this->select)
+            ->willReturn([
+                [
+                    'store_id' => 2,
+                    'locale' => 'en_US',
+                    'string' => 'hello',
+                    'translate' => 'bonjour'
+                ]
+            ]);
+        $this->storeManager->expects($this->once())
+            ->method('getStore')
+            ->with(2)
+            ->willReturn($this->store);
+        $this->store->expects($this->once())
+            ->method('getCode')
+            ->willReturn('myStore');
+
+        $this->assertEquals(
+            [
+                'en_US' => [
+                    'myStore' => [
+                        'hello' => 'bonjour'
+                    ]
+                ]
+            ],
+            $this->source->get()
+        );
+    }
+
+    public function testGetWithoutAvailableDb()
+    {
+        $this->deploymentConfigMock->expects($this->once())
+            ->method('isDbAvailable')
+            ->willReturn(false);
+        $this->assertEquals([], $this->source->get());
+    }
+}
diff --git a/app/code/Magento/Translation/composer.json b/app/code/Magento/Translation/composer.json
index b9ed830c9053ea492d76a2402ec8f523fb03a46a..6c6c5fad3e7b9abcab6211e1c2326f9a31054088 100644
--- a/app/code/Magento/Translation/composer.json
+++ b/app/code/Magento/Translation/composer.json
@@ -9,6 +9,9 @@
         "magento/module-theme": "100.2.*",
         "magento/framework": "100.2.*"
     },
+    "suggest": {
+        "magento/module-deploy": "100.2.*"
+    },
     "type": "magento2-module",
     "version": "100.2.0-dev",
     "license": [
diff --git a/app/code/Magento/Translation/etc/di.xml b/app/code/Magento/Translation/etc/di.xml
index 8e29e941499129a546ded22c3532c198f00d9838..3e76f80fff261299484704e3b66a294839cfff42 100644
--- a/app/code/Magento/Translation/etc/di.xml
+++ b/app/code/Magento/Translation/etc/di.xml
@@ -70,7 +70,6 @@
             </argument>
         </arguments>
     </type>
-
     <virtualType name="AssetPreProcessorPool">
         <arguments>
             <argument name="preprocessors" xsi:type="array">
@@ -87,7 +86,6 @@
             </argument>
         </arguments>
     </virtualType>
-
     <type name="Magento\Framework\Console\CommandListInterface">
         <arguments>
             <argument name="commands" xsi:type="array">
@@ -95,4 +93,47 @@
             </argument>
         </arguments>
     </type>
+    <virtualType name="translationConfigInitialDataProvider" type="Magento\Framework\App\Config\InitialConfigSource">
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Framework\App\DeploymentConfig\Reader</argument>
+            <argument name="configType" xsi:type="const">Magento\Translation\App\Config\Type\Translation::CONFIG_TYPE</argument>
+            <argument name="fileKey" xsi:type="const">Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="translationConfigSourceAggregated" type="Magento\Framework\App\Config\ConfigSourceAggregated">
+        <arguments>
+            <argument name="sources" xsi:type="array">
+                <item name="dynamic" xsi:type="array">
+                    <item name="source" xsi:type="object">Magento\Translation\Model\Source\InitialTranslationSource\Proxy</item>
+                    <item name="sortOrder" xsi:type="string">100</item>
+                </item>
+                <item name="initial" xsi:type="array">
+                    <item name="source" xsi:type="object">translationConfigInitialDataProvider</item>
+                    <item name="sortOrder" xsi:type="string">1000</item>
+                </item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\Translation\App\Config\Type\Translation">
+        <arguments>
+            <argument name="source" xsi:type="object">translationConfigSourceAggregated</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\App\Config">
+        <arguments>
+            <argument name="types" xsi:type="array">
+                <item name="i18n" xsi:type="object">Magento\Translation\App\Config\Type\Translation</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Deploy\Console\Command\App\ApplicationDumpCommand">
+        <arguments>
+            <argument name="sources" xsi:type="array">
+                <item name="i18n" xsi:type="array">
+                    <item name="source" xsi:type="object">Magento\Translation\Model\Source\InitialTranslationSource</item>
+                    <item name="namespace" xsi:type="const">Magento\Translation\App\Config\Type\Translation::CONFIG_TYPE</item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Ui/Component/MassAction/Filter.php b/app/code/Magento/Ui/Component/MassAction/Filter.php
index c24b77198030d7ebe1889ed3586b01becf6677ad..c23466ef0844e5237e2ae577cada08dd19086390 100644
--- a/app/code/Magento/Ui/Component/MassAction/Filter.php
+++ b/app/code/Magento/Ui/Component/MassAction/Filter.php
@@ -11,6 +11,7 @@ use Magento\Framework\View\Element\UiComponentFactory;
 use Magento\Framework\App\RequestInterface;
 use Magento\Framework\View\Element\UiComponentInterface;
 use Magento\Framework\Data\Collection\AbstractDb;
+use Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderInterface;
 
 /**
  * Class Filter
@@ -43,6 +44,11 @@ class Filter
      */
     protected $filterBuilder;
 
+    /**
+     * @var DataProviderInterface
+     */
+    private $dataProvider;
+
     /**
      * @param UiComponentFactory $factory
      * @param RequestInterface $request
@@ -74,23 +80,33 @@ class Filter
     }
 
     /**
+     * Adds filters to collection using DataProvider filter results
+     *
      * @param AbstractDb $collection
      * @return AbstractDb
      * @throws LocalizedException
      */
     public function getCollection(AbstractDb $collection)
     {
-        $component = $this->getComponent();
-        $this->prepareComponent($component);
-        $dataProvider = $component->getContext()->getDataProvider();
-        $dataProvider->setLimit(0, false);
-        $ids = [];
-        foreach ($dataProvider->getSearchResult()->getItems() as $document) {
-            $ids[] = $document->getId();
-        }
+        $selected = $this->request->getParam(static::SELECTED_PARAM);
+        $excluded = $this->request->getParam(static::EXCLUDED_PARAM);
 
-        $collection->addFieldToFilter($collection->getIdFieldName(), ['in' => $ids]);
-        return $this->applySelection($collection);
+        $isExcludedIdsValid = (is_array($excluded) && !empty($excluded));
+        $isSelectedIdsValid = (is_array($selected) && !empty($selected));
+
+        if ('false' !== $excluded) {
+            if (!$isExcludedIdsValid && !$isSelectedIdsValid) {
+                throw new LocalizedException(__('Please select item(s).'));
+            }
+        }
+        $idsArray = $this->getFilterIds();
+        if (!empty($idsArray)) {
+            $collection->addFieldToFilter(
+                $collection->getIdFieldName(),
+                ['in' => $idsArray]
+            );
+        }
+        return $collection;
     }
 
     /**
@@ -106,9 +122,7 @@ class Filter
         if ('false' === $excluded) {
             return;
         }
-        $component = $this->getComponent();
-        $this->prepareComponent($component);
-        $dataProvider = $component->getContext()->getDataProvider();
+        $dataProvider = $this->getDataProvider();
         try {
             if (is_array($excluded) && !empty($excluded)) {
                 $this->filterBuilder->setConditionType('nin')
@@ -127,6 +141,8 @@ class Filter
     }
 
     /**
+     * Applies selection to collection from POST parameters
+     *
      * @param AbstractDb $collection
      * @return AbstractDb
      * @throws LocalizedException
@@ -169,7 +185,7 @@ class Filter
     }
 
     /**
-     * Returns RefererUrl
+     * Returns Referrer Url
      *
      * @return string|null
      */
@@ -178,4 +194,33 @@ class Filter
         $data = $this->getComponent()->getContext()->getDataProvider()->getConfigData();
         return (isset($data['referer_url'])) ? $data['referer_url'] : null;
     }
+
+    /**
+     * Get data provider
+     *
+     * @return DataProviderInterface
+     */
+    private function getDataProvider()
+    {
+        if (!$this->dataProvider) {
+            $component = $this->getComponent();
+            $this->prepareComponent($component);
+            $this->dataProvider = $component->getContext()->getDataProvider();
+        }
+        return $this->dataProvider;
+    }
+
+    /**
+     * Get filter ids as array
+     *
+     * @return int[]
+     */
+    private function getFilterIds()
+    {
+        $this->applySelectionOnTargetProvider();
+        if ($this->getDataProvider()->getSearchResult()) {
+            return $this->getDataProvider()->getSearchResult()->getAllIds();
+        }
+        return [];
+    }
 }
diff --git a/app/code/Magento/Ui/Test/Unit/Component/MassAction/FilterTest.php b/app/code/Magento/Ui/Test/Unit/Component/MassAction/FilterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..604febecde041df3e62aeae3cf135bb5e57e5398
--- /dev/null
+++ b/app/code/Magento/Ui/Test/Unit/Component/MassAction/FilterTest.php
@@ -0,0 +1,289 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Ui\Test\Unit\Component\MassAction;
+
+use Magento\Ui\Component\MassAction\Filter;
+use Magento\Framework\Api\Filter as ApiFilter;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Framework\Data\Collection\AbstractDb;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\View\Element\UiComponentFactory;
+use Magento\Framework\App\RequestInterface;
+use Magento\Framework\View\Element\UiComponentInterface;
+use Magento\Framework\Api\Search\SearchResultInterface;
+use Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderInterface;
+use Magento\Framework\View\Element\UiComponent\ContextInterface;
+
+class FilterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     *\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $requestMock;
+
+    /**
+     * \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $uiComponentFactoryMock;
+
+    /**
+     * \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $filterBuilderMock;
+
+    /** @var \Magento\Ui\Component\MassAction\Filter */
+    private $filter;
+
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     *\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $dataProviderMock;
+
+    /**
+     *\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $abstractDbMock;
+
+    /**
+     * \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $searchResultMock;
+
+    /**
+     * \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $uiComponentMock;
+
+    /**
+     * Set up
+     */
+    protected function setUp()
+    {
+        $this->objectManager = new ObjectManager($this);
+        $this->uiComponentFactoryMock = $this->getMock(UiComponentFactory::class, [], [], '', false);
+        $this->filterBuilderMock = $this->getMock(FilterBuilder::class, [], [], '', false);
+        $this->requestMock = $this->getMock(RequestInterface::class);
+        $this->dataProviderMock = $this->getMock(DataProviderInterface::class);
+        $this->uiComponentMock = $this->getMock(UiComponentInterface::class);
+        $this->abstractDbMock = $this->getMock(AbstractDb::class, [], [], '', false);
+        $contextMock = $this->getMock(ContextInterface::class);
+        $this->searchResultMock = $this->getMock(SearchResultInterface::class);
+        $uiComponentMockTwo = $this->getMock(UiComponentInterface::class);
+        $this->filter = $this->objectManager->getObject(
+            Filter::class,
+            [
+                'factory' => $this->uiComponentFactoryMock,
+                'request' => $this->requestMock,
+                'filterBuilder' => $this->filterBuilderMock
+            ]
+        );
+        $this->uiComponentFactoryMock->expects($this->any())
+            ->method('create')
+            ->willReturn($this->uiComponentMock);
+        $this->uiComponentMock->expects($this->any())
+            ->method('getChildComponents')
+            ->willReturn([$uiComponentMockTwo]);
+        $uiComponentMockTwo->expects($this->any())
+            ->method('getChildComponents')
+            ->willReturn([]);
+        $this->uiComponentMock->expects($this->any())
+            ->method('getContext')
+            ->willReturn($contextMock);
+        $contextMock->expects($this->any())
+            ->method('getDataProvider')
+            ->willReturn($this->dataProviderMock);
+        $this->dataProviderMock->expects($this->any())
+            ->method('setLimit');
+        $this->dataProviderMock->expects($this->any())
+            ->method('searchResultMock')
+            ->willReturn($this->searchResultMock);
+        $this->searchResultMock->expects($this->any())
+            ->method('getAllIds')
+            ->willReturn([]);
+    }
+
+    /**
+     * Run test for applySelectionOnTargetProvider method
+     *
+     * @param int[]|bool $selectedIds
+     * @param int[]|bool $excludedIds
+     * @param int $filterExpected
+     * @param string $conditionExpected
+     * @dataProvider applySelectionOnTargetProviderDataProvider
+     */
+    public function testApplySelectionOnTargetProvider($selectedIds, $excludedIds, $filterExpected, $conditionExpected)
+    {
+        $this->setUpApplySelection($selectedIds, $excludedIds, $filterExpected, $conditionExpected);
+        $this->filter->applySelectionOnTargetProvider();
+    }
+
+    /**
+     * Data provider for testApplySelectionOnTargetProvider
+     */
+    public function applySelectionOnTargetProviderDataProvider()
+    {
+        return [
+            [[1, 2, 3], 'false' , 0, 'in'],
+            [[1, 2, 3], [1, 2, 3] , 1, 'nin'],
+            ['false', [1, 2, 3] , 1, 'nin'],
+            ['false', 'false' , 0, '']
+        ];
+    }
+
+    /**
+     * @throws \Exception
+     * @expectedException \Magento\Framework\Exception\LocalizedException
+     */
+    public function testApplySelectionOnTargetProviderException()
+    {
+        $filterMock = $this->getMock(ApiFilter::class, [], [], '', false);
+        $this->filterBuilderMock->expects($this->any())
+            ->method('setConditionType')
+            ->willReturn($this->filterBuilderMock);
+        $this->filterBuilderMock->expects($this->any())
+            ->method('create')
+            ->willReturn($filterMock);
+        $this->filterBuilderMock->expects($this->any())
+            ->method('setField')
+            ->willReturn($this->filterBuilderMock);
+        $this->requestMock->expects($this->at(0))
+            ->method('getParam')
+            ->with(Filter::SELECTED_PARAM)
+            ->willReturn([1]);
+        $this->requestMock->expects($this->at(1))
+            ->method('getParam')
+            ->with(Filter::EXCLUDED_PARAM)
+            ->willReturn([]);
+        $this->dataProviderMock->expects($this->any())
+            ->method('addFilter')
+            ->with($filterMock)
+            ->willThrowException(new \Exception('exception'));
+        $this->filter->applySelectionOnTargetProvider();
+    }
+
+    /**
+     * Run test for getCollection method
+     *
+     * @param int[]|bool $selectedIds
+     * @param int[]|bool $excludedIds
+     * @param int $filterExpected
+     * @param string $conditionExpected
+     * @dataProvider applySelectionOnTargetProviderDataProvider
+     */
+    public function testGetCollection($selectedIds, $excludedIds, $filterExpected, $conditionExpected)
+    {
+        $this->setUpApplySelection($selectedIds, $excludedIds, $filterExpected, $conditionExpected);
+        $this->requestMock->expects($this->at(4))
+            ->method('getParam')
+            ->with('namespace')
+            ->willReturn('');
+        $this->requestMock->expects($this->at(2))
+            ->method('getParam')
+            ->with(Filter::SELECTED_PARAM)
+            ->willReturn($selectedIds);
+        $this->requestMock->expects($this->at(3))
+            ->method('getParam')
+            ->with(Filter::EXCLUDED_PARAM)
+            ->willReturn($excludedIds);
+        $this->assertEquals($this->abstractDbMock, $this->filter->getCollection($this->abstractDbMock));
+    }
+
+    /**
+     * This tests the method prepareComponent()
+     */
+    public function testPrepareComponent()
+    {
+        $this->filter->prepareComponent($this->uiComponentMock);
+    }
+
+    /**
+     * This tests the method getComponent()
+     */
+    public function testGetComponent()
+    {
+        $this->requestMock->expects($this->at(0))
+            ->method('getParam')
+            ->with('namespace')
+            ->willReturn('');
+        $this->assertEquals($this->uiComponentMock, $this->filter->getComponent());
+    }
+
+    /**
+     * This tests the method getComponentRefererUrl()
+     */
+    public function testGetComponentRefererUrlIsNotNull()
+    {
+        $returnArray = [
+            'referer_url' => 'referer_url'
+        ];
+        $this->dataProviderMock->expects($this->once())
+            ->method('getConfigData')
+            ->willReturn($returnArray);
+        $this->assertEquals('referer_url', $this->filter->getComponentRefererUrl());
+    }
+
+    /**
+     * This tests the method getComponentRefererUrl()
+     */
+    public function testGetComponentRefererUrlIsNull()
+    {
+        $this->assertNull($this->filter->getComponentRefererUrl());
+    }
+
+    /**
+     * Apply mocks for current parameters from datasource
+     *
+     * @param int[]|bool $selectedIds
+     * @param int[]|bool $excludedIds
+     * @param int $filterExpected
+     * @param string $conditionExpected
+     */
+    private function setUpApplySelection($selectedIds, $excludedIds, $filterExpected, $conditionExpected)
+    {
+        $filterMock = $this->getMock(ApiFilter::class, [], [], '', false);
+        $this->requestMock->expects($this->at(0))
+            ->method('getParam')
+            ->with(Filter::SELECTED_PARAM)
+            ->willReturn($selectedIds);
+        $this->requestMock->expects($this->at(1))
+            ->method('getParam')
+            ->with(Filter::EXCLUDED_PARAM)
+            ->willReturn($excludedIds);
+        $this->dataProviderMock->expects($this->exactly($filterExpected))
+            ->method('addFilter')
+            ->with($filterMock);
+        $this->filterBuilderMock->expects($this->exactly($filterExpected))
+            ->method('setConditionType')
+            ->with($conditionExpected)
+            ->willReturnSelf();
+        $this->filterBuilderMock->expects($this->any())
+            ->method('setField')
+            ->willReturnSelf();
+        $this->filterBuilderMock->expects($this->any())
+            ->method('value')
+            ->willReturnSelf();
+        $this->filterBuilderMock->expects($this->any())
+            ->method('create')
+            ->willReturn($filterMock);
+        $this->filterBuilderMock->expects($this->any())
+            ->method('setConditionType')
+            ->willReturnSelf();
+        $this->filterBuilderMock->expects($this->any())
+            ->method('setField')
+            ->willReturnSelf();
+        $this->filterBuilderMock->expects($this->any())
+            ->method('value')
+            ->willReturnSelf();
+        $this->filterBuilderMock->expects($this->any())
+            ->method('create')
+            ->willReturn($filterMock);
+    }
+}
diff --git a/app/code/Magento/User/Model/ResourceModel/User.php b/app/code/Magento/User/Model/ResourceModel/User.php
index b35deb6c5c6f147dfba617705c3877a771494f10..d3e228d44358136c748258c47da3f7f2b2bba76b 100644
--- a/app/code/Magento/User/Model/ResourceModel/User.php
+++ b/app/code/Magento/User/Model/ResourceModel/User.php
@@ -34,13 +34,6 @@ class User extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
      */
     protected $dateTime;
 
-    /**
-     * Users table
-     *
-     * @var string
-     */
-    protected $_usersTable;
-
     /**
      * Construct
      *
@@ -61,7 +54,6 @@ class User extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
         $this->_aclCache = $aclCache;
         $this->_roleFactory = $roleFactory;
         $this->dateTime = $dateTime;
-        $this->_usersTable = $this->getTable('admin_user');
     }
 
     /**
@@ -473,7 +465,7 @@ class User extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
         if (sizeof($users) > 0) {
             $bind = ['reload_acl_flag' => 1];
             $where = ['user_id IN(?)' => $users];
-            $rowsCount = $connection->update($this->_usersTable, $bind, $where);
+            $rowsCount = $connection->update($this->getTable('admin_user'), $bind, $where);
         }
 
         return $rowsCount > 0;
diff --git a/app/code/Magento/Vault/Setup/UpgradeData.php b/app/code/Magento/Vault/Setup/UpgradeData.php
index 757b5f4d3167cb00254e8f2ef20fad3addc1cb27..1c3f113ba9831de6123cbf0c0af361a0f520a1fb 100644
--- a/app/code/Magento/Vault/Setup/UpgradeData.php
+++ b/app/code/Magento/Vault/Setup/UpgradeData.php
@@ -20,9 +20,11 @@ use Magento\Vault\Model\CreditCardTokenFactory;
 class UpgradeData implements UpgradeDataInterface
 {
     /**
-     * @var AdapterInterface
+     * Predefined name for sales connection
+     *
+     * @var string
      */
-    private $connection;
+    private static $salesConnectionName = 'sales';
 
     /**
      * @inheritdoc
@@ -30,12 +32,11 @@ class UpgradeData implements UpgradeDataInterface
     public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
     {
         $setup->startSetup();
-        $connection = $this->getConnection();
 
         // data update for Vault module < 2.0.1
         if (version_compare($context->getVersion(), '2.0.1', '<')) {
             // update sets credit card as default token type
-            $connection->update($setup->getTable(InstallSchema::PAYMENT_TOKEN_TABLE), [
+            $setup->getConnection()->update($setup->getTable(InstallSchema::PAYMENT_TOKEN_TABLE), [
                 PaymentTokenInterface::TYPE => CreditCardTokenFactory::TOKEN_TYPE_CREDIT_CARD
             ], PaymentTokenInterface::TYPE . ' = ""');
         }
@@ -43,12 +44,13 @@ class UpgradeData implements UpgradeDataInterface
         // data update for Vault module < 2.0.2
         if (version_compare($context->getVersion(), '2.0.2', '<')) {
             // update converts additional info with token metadata to single dimensional array
-            $select = $connection->select()
+            $salesConnection = $setup->getConnection(self::$salesConnectionName);
+            $select = $salesConnection->select()
                 ->from($setup->getTable('sales_order_payment'), 'entity_id')
                 ->columns(['additional_information'])
                 ->where('additional_information LIKE ?', '%token_metadata%');
 
-            $items = $connection->fetchAll($select);
+            $items = $salesConnection->fetchAll($select);
             foreach ($items as $item) {
                 $additionalInfo = unserialize($item['additional_information']);
                 $additionalInfo[PaymentTokenInterface::CUSTOMER_ID] =
@@ -57,7 +59,7 @@ class UpgradeData implements UpgradeDataInterface
                     $additionalInfo['token_metadata'][PaymentTokenInterface::PUBLIC_HASH];
                 unset($additionalInfo['token_metadata']);
 
-                $connection->update(
+                $salesConnection->update(
                     $setup->getTable('sales_order_payment'),
                     ['additional_information' => serialize($additionalInfo)],
                     ['entity_id = ?' => $item['entity_id']]
@@ -67,23 +69,4 @@ class UpgradeData implements UpgradeDataInterface
 
         $setup->endSetup();
     }
-
-    /**
-     * Tries to get connection for scalable sales DB, otherwise returns default connection
-     * @return AdapterInterface
-     */
-    private function getConnection()
-    {
-        if ($this->connection === null) {
-            /** @var ResourceConnection $conn */
-            $conn = ObjectManager::getInstance()->get(ResourceConnection::class);
-            try {
-                $this->connection = $conn->getConnectionByName('sales');
-            } catch (\DomainException $e) {
-                $this->connection = $conn->getConnection();
-            }
-        }
-
-        return $this->connection;
-    }
 }
diff --git a/app/code/Magento/Vault/view/adminhtml/web/js/vault.js b/app/code/Magento/Vault/view/adminhtml/web/js/vault.js
index 560e65c007f8ab22c2b5b1e76bac0c9062e2af78..66c17801ec02edb262434bc807988bed1bece940 100644
--- a/app/code/Magento/Vault/view/adminhtml/web/js/vault.js
+++ b/app/code/Magento/Vault/view/adminhtml/web/js/vault.js
@@ -33,8 +33,8 @@ define([
                 .observe(['active']);
 
             // re-init payment method events
-            self.$selector.off('changePaymentMethod.' + this.code)
-                .on('changePaymentMethod.' + this.code, this.changePaymentMethod.bind(this));
+            self.$selector.off('changePaymentMethod.' + this.getCode())
+                .on('changePaymentMethod.' + this.getCode(), this.changePaymentMethod.bind(this));
 
             if (this.active()) {
                 $('#' + this.fieldset + ' input:radio:first').trigger('click');
@@ -50,7 +50,7 @@ define([
          * @returns {exports.changePaymentMethod}
          */
         changePaymentMethod: function (event, method) {
-            this.active(method === this.code);
+            this.active(method === this.getCode());
 
             return this;
         },
@@ -61,13 +61,21 @@ define([
          */
         onActiveChange: function (isActive) {
             if (!isActive) {
-                this.$selector.trigger('setVaultNotActive');
+                this.$selector.trigger('setVaultNotActive.' + this.getCode());
 
                 return;
             }
 
             $('#' + this.fieldset + ' input:radio:first').trigger('click');
-            window.order.addExcludedPaymentMethod(this.code);
+            window.order.addExcludedPaymentMethod(this.getCode());
+        },
+
+        /**
+         * Get payment method code
+         * @returns {String}
+         */
+        getCode: function () {
+            return this.code;
         }
     });
 });
diff --git a/app/code/Magento/Webapi/Test/Unit/Model/DataObjectProcessorTest.php b/app/code/Magento/Webapi/Test/Unit/Model/DataObjectProcessorTest.php
index 4ab16098163328f1b49abe6b478b3fb06ae51adb..0565832932a3fcd9bcfacf491759a27370bbc1dd 100644
--- a/app/code/Magento/Webapi/Test/Unit/Model/DataObjectProcessorTest.php
+++ b/app/code/Magento/Webapi/Test/Unit/Model/DataObjectProcessorTest.php
@@ -6,6 +6,8 @@
 
 namespace Magento\Webapi\Test\Unit\Model;
 
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Reflection\DataObjectProcessor;
 use Magento\Webapi\Model\Config as ModelConfig;
 
 class DataObjectProcessorTest extends \PHPUnit_Framework_TestCase
@@ -30,6 +32,17 @@ class DataObjectProcessorTest extends \PHPUnit_Framework_TestCase
                 'typeProcessor' => $objectManager->getObject(\Magento\Framework\Reflection\TypeProcessor::class),
             ]
         );
+        $serializerMock = $this->getMock(SerializerInterface::class);
+        $serializerMock->method('serialize')
+            ->willReturn('serializedData');
+        $serializerMock->method('unserialize')
+            ->willReturn(['unserializedData']);
+
+        $objectManager->setBackwardCompatibleProperty(
+            $methodsMapProcessor,
+            'serializer',
+            $serializerMock
+        );
         $this->dataObjectProcessor = $objectManager->getObject(
             \Magento\Framework\Reflection\DataObjectProcessor::class,
             [
diff --git a/app/etc/di.xml b/app/etc/di.xml
index e430c15729d3d0cced20bf2b326d40f152b174e6..e9767eccb28114ffa66bc8bc84829d92b1620e99 100755
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -956,11 +956,6 @@
             <argument name="uploader" xsi:type="object">Magento\Framework\View\Design\Theme\Image\Uploader\Proxy</argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\App\Config\ScopePool">
-        <arguments>
-            <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument>
-        </arguments>
-    </type>
     <type name="Magento\Framework\App\Config\Initial">
         <arguments>
             <argument name="reader" xsi:type="object">Magento\Framework\App\Config\Initial\Reader\Proxy</argument>
diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartManagementTest.php
index 43134e838c9c7845ddc1648210b1d5e956b64c56..2cb9aa3bbc9a13ef08244eef48686c88de3fe417 100644
--- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartManagementTest.php
@@ -6,8 +6,14 @@
 
 namespace Magento\Quote\Api;
 
+use Magento\Framework\App\Config;
 use Magento\TestFramework\TestCase\WebapiAbstract;
 
+/**
+ * Class CartManagementTest
+ * @package Magento\Quote\Api
+ * @magentoAppIsolation enabled
+ */
 class CartManagementTest extends WebapiAbstract
 {
     const SERVICE_VERSION = 'V1';
@@ -25,6 +31,8 @@ class CartManagementTest extends WebapiAbstract
     protected function setUp()
     {
         $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $appConfig = $this->objectManager->get(Config::class);
+        $appConfig->clean();
     }
 
     public function tearDown()
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml
index 66d912d77bba7836ab2f747757f32f2a82cf02ec..5f5e2f50594bf8d0473b65ee584e50f47bc852a4 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml
@@ -7,7 +7,7 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Vault\Test\TestCase\ReorderUsingVaultTest" summary="Reorder from Admin with saved within Braintree credit card">
-        <variation name="ReorderUsingVaultBraintreeTestVariation1" summary="Reorder from Admin with saved within Braintree credit card for Guest Customer" ticketId="MAGETWO-54870">
+        <variation name="ReorderUsingVaultBraintreeTestVariation1" summary="Reorder from Admin with saved within Braintree credit card for Guest Customer" ticketId="MAGETWO-54869, MAGETWO-54870">
             <data name="description" xsi:type="string">Reorder from Admin with saved within Braintree credit card for Guest Customer</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
             <data name="customer/dataset" xsi:type="string">default</data>
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View.php
index a688ffac5ac019627c137fcb678c56f374599c8b..071604e9cde32e5c8c83484a582ab95099256203 100644
--- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View.php
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View.php
@@ -95,6 +95,7 @@ class View extends \Magento\Catalog\Test\Block\Product\View
         );
         $this->_rootElement->find($this->customizeButton)->click();
         $this->waitForElementVisible($this->addToCart);
+        $this->waitForElementVisible($this->visibleOptions, Locator::SELECTOR_XPATH);
     }
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View/Type/Option/Hidden.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View/Type/Option/Hidden.xml
index 356f6a52d6b0c296abc0eb857fe2d8b3dccc4b84..ecced21254cdc113b5f0d5d3d46be1dbd3a4386e 100644
--- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View/Type/Option/Hidden.xml
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View/Type/Option/Hidden.xml
@@ -8,8 +8,7 @@
 <mapping strict="1">
     <fields>
         <qty>
-            <selector>//input[contains(@class,"qty")]</selector>
-            <strategy>xpath</strategy>
+            <selector>input.qty</selector>
             <class>Magento\Bundle\Test\Block\Catalog\Product\View\Type\Option\Element\Qty</class>
         </qty>
     </fields>
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertBundleProductForm.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertBundleProductForm.php
index d9b843cc37a0f2ac109ac662183b93119d3e1edc..9a2304c876f89ca8598e47b720154642f9b96ca0 100644
--- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertBundleProductForm.php
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertBundleProductForm.php
@@ -52,6 +52,7 @@ class AssertBundleProductForm extends AssertProductForm
     protected function prepareBundleOptions(array $bundleSelections)
     {
         foreach ($bundleSelections as &$item) {
+            unset($item['frontend_type']);
             foreach ($item['assigned_products'] as &$selection) {
                 $selection['data']['getProductName'] = $selection['search_data']['name'];
                 $selection = $selection['data'];
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/CheckoutData.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/CheckoutData.xml
index 3bf2e7b7f2ad1387c89752282148fc582d65a0e1..e694b65110e89cd1840ad1249e6c14a61302a877 100644
--- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/CheckoutData.xml
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/CheckoutData.xml
@@ -353,6 +353,7 @@
                     <item name="3" xsi:type="array">
                         <item name="title" xsi:type="string">Multiple Select Option</item>
                         <item name="type" xsi:type="string">Multiple</item>
+                        <item name="frontend_type" xsi:type="string">Multiple</item>
                         <item name="value" xsi:type="array">
                             <item name="name" xsi:type="string">product_100_dollar</item>
                         </item>
@@ -367,6 +368,7 @@
                     <item name="0" xsi:type="array">
                         <item name="title" xsi:type="string">Drop-down Option</item>
                         <item name="type" xsi:type="string">Drop-down</item>
+                        <item name="frontend_type" xsi:type="string">Drop-down</item>
                         <item name="value" xsi:type="array">
                             <item name="name" xsi:type="string">Test simple product</item>
                         </item>
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a34bf44d38cae01f46f711fd6181c1ae8895ae68
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Sales\Test\TestCase\MoveRecentlyComparedProductsOnOrderPageTest">
+        <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariationWithBundleProduct1">
+            <data name="products/0" xsi:type="string">bundleProduct::bundle_dynamic_product</data>
+            <data name="products/1" xsi:type="string">bundleProduct::bundle_dynamic_product</data>
+            <data name="productsIsConfigured" xsi:type="boolean">true</data>
+            <constraint name="Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/etc/di.xml
index 402dcca44c9485a46d9c40b5103f1cac50b86122..61eac871df9722550fff8735930febc339e4ea4d 100644
--- a/dev/tests/functional/tests/app/Magento/Bundle/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/etc/di.xml
@@ -11,4 +11,17 @@
             <argument name="severity" xsi:type="string">S2</argument>
         </arguments>
     </type>
+    <type name="Magento\Sales\Test\Block\Adminhtml\Order\Create\CustomerActivities\Sidebar\RecentlyComparedProducts">
+        <arguments>
+            <argument name="config" xsi:type="array">
+                <item name="renders" xsi:type="array">
+                    <item name="bundle" xsi:type="array">
+                        <item name="class" xsi:type="string">\Magento\Bundle\Test\Block\Adminhtml\Product\Composite\Configure</item>
+                        <item name="locator" xsi:type="string">//ancestor::body//*[contains(@class, "modal-slide") and contains(@class, "_show")]</item>
+                        <item name="strategy" xsi:type="string">xpath</item>
+                    </item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Page/Adminhtml/OrderCreateIndex.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Page/Adminhtml/OrderCreateIndex.xml
index a67119cbf19aa5ac5aa1541672a30242edd29a93..97809af4bff7875f1bb4c90fe0f3a9c05d037b24 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Page/Adminhtml/OrderCreateIndex.xml
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Page/Adminhtml/OrderCreateIndex.xml
@@ -6,9 +6,9 @@
  */
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd">
-  <page name="OrderCreateIndex" area="Adminhtml" mca="sales/order_create/index">
-    <block name="configureProductBlock">
-      <render name="configurable" class="Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Composite\Configure"/>
-    </block>
-  </page>
+    <page name="OrderCreateIndex" area="Adminhtml" mca="sales/order_create/index">
+        <block name="configureProductBlock">
+            <render name="configurable" class="Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Composite\Configure" />
+        </block>
+    </page>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateCreditMemoEntityTest.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateCreditMemoEntityTest.xml
index dd92edc82b3310ad9610c70138578a220e4358cd..8a8195db638d565564ae0e2bdf20ad46fbb05bbd 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateCreditMemoEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateCreditMemoEntityTest.xml
@@ -14,6 +14,7 @@
             <data name="order/dataset" xsi:type="string">default</data>
             <data name="order/data/entity_id/products" xsi:type="string">configurableProduct::configurable_with_qty_1</data>
             <data name="order/data/price/dataset" xsi:type="string">full_refund</data>
+            <data name="configData" xsi:type="string"/>
             <constraint name="Magento\Sales\Test\Constraint\AssertRefundSuccessCreateMessage" />
             <constraint name="Magento\ConfigurableProduct\Test\Constraint\AssertProductQtyDecreasedAfterCreditmemo" />
         </variation>
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aaa9b3e1f88f918aa63f852b28a5ac653f94cdef
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Sales\Test\TestCase\MoveRecentlyComparedProductsOnOrderPageTest">
+        <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariationWithConfigurableProduct1">
+            <data name="products/0" xsi:type="string">configurableProduct::configurable_with_qty_1</data>
+            <data name="products/1" xsi:type="string">configurableProduct::configurable_with_qty_1</data>
+            <constraint name="Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/etc/di.xml
index 002ccfc4ed80ca48fb1b851558efa909b2e1c503..8bdf098cea58341cf83b081fca7bc946281e4884 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/etc/di.xml
@@ -26,4 +26,17 @@
             <argument name="severity" xsi:type="string">high</argument>
         </arguments>
     </type>
+    <type name="Magento\Sales\Test\Block\Adminhtml\Order\Create\CustomerActivities\Sidebar\RecentlyComparedProducts">
+        <arguments>
+            <argument name="config" xsi:type="array">
+                <item name="renders" xsi:type="array">
+                    <item name="configurable" xsi:type="array">
+                        <item name="class" xsi:type="string">Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Composite\Configure</item>
+                        <item name="locator" xsi:type="string">//ancestor::body//*[contains(@class, "modal-slide") and contains(@class, "_show")]</item>
+                        <item name="strategy" xsi:type="string">xpath</item>
+                    </item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Composite/Configure.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Composite/Configure.xml
index 04a918c3bf8d9598b74b0f53ebd41b9f477e778f..676ae6a64f3d820b4d65d821053d6d0ab7971542 100644
--- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Composite/Configure.xml
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Composite/Configure.xml
@@ -8,7 +8,7 @@
 <mapping strict="0">
     <fields>
         <qty>
-            <selector>//tr[contains(.,"%product_name%")]//input[contains(@class,"qty")]</selector>
+            <selector>.//tr[contains(.,"%product_name%")]//input[contains(@class,"qty")]</selector>
             <strategy>xpath</strategy>
         </qty>
     </fields>
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AssertProductInItemsOrderedGrid.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AssertProductInItemsOrderedGrid.php
new file mode 100644
index 0000000000000000000000000000000000000000..918c86f93340730e19ac576c1cda37255d86f0b3
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AssertProductInItemsOrderedGrid.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\GroupedProduct\Test\Constraint;
+
+/**
+ * Assert product was added to Items Ordered grid in customer account on Order creation page backend.
+ */
+class AssertProductInItemsOrderedGrid extends \Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid
+{
+    /**
+     * Prepare data.
+     *
+     * @param array $data
+     * @param \Magento\Sales\Test\Block\Adminhtml\Order\Create\Items $itemsBlock
+     * @return array
+     */
+    protected function prepareData(array $data, \Magento\Sales\Test\Block\Adminhtml\Order\Create\Items $itemsBlock)
+    {
+        $fixtureData = [];
+        foreach ($data as $product) {
+            $fixtureData = array_merge($fixtureData, $this->getOptionsDetails($product));
+        }
+        $pageData = $itemsBlock->getProductsDataByFields($this->fields);
+        $preparePageData = $this->arraySort($fixtureData, $pageData);
+        return ['fixtureData' => $fixtureData, 'pageData' => $preparePageData];
+    }
+
+    /**
+     * Get product options details.
+     *
+     * @param \Magento\Mtf\Fixture\FixtureInterface $product
+     * @return array
+     */
+    private function getOptionsDetails(\Magento\Mtf\Fixture\FixtureInterface $product)
+    {
+        /** @var \Magento\GroupedProduct\Test\Fixture\GroupedProduct  $product */
+        $fixtureProducts = [];
+        $optionsPrices = $this->getProductPrice($product);
+        $optionsQtys = $product->getCheckoutData()['cartItem']['qty'];
+        $assignedProducts = $product->getAssociated()['assigned_products'];
+
+        foreach ($assignedProducts as $key => $assignedProduct) {
+            $fixtureProducts[] = [
+                'name' => $assignedProduct['name'],
+                'price' => number_format($optionsPrices['product_key_' . $key], 2),
+                'checkout_data' => [
+                    'qty' => $this->productsIsConfigured ? $optionsQtys['product_key_' . $key] : 1
+                ]
+            ];
+        }
+        return $fixtureProducts;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1de8aeda4e9a4415b476d73c8b454b17ad4f5824
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Sales\Test\TestCase\MoveRecentlyComparedProductsOnOrderPageTest">
+        <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariationWithGroupedProduct1">
+            <data name="products/0" xsi:type="string">groupedProduct::three_simple_products</data>
+            <data name="products/1" xsi:type="string">groupedProduct::three_simple_products</data>
+            <data name="productsIsConfigured" xsi:type="boolean">true</data>
+            <constraint name="Magento\GroupedProduct\Test\Constraint\AssertProductInItemsOrderedGrid" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/etc/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5b12a012749fb6feb0e90b1910d964a19394ca8d
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/etc/di.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+    <type name="Magento\Sales\Test\Block\Adminhtml\Order\Create\CustomerActivities\Sidebar\RecentlyComparedProducts">
+        <arguments>
+            <argument name="config" xsi:type="array">
+                <item name="renders" xsi:type="array">
+                    <item name="grouped" xsi:type="array">
+                        <item name="class" xsi:type="string">\Magento\GroupedProduct\Test\Block\Adminhtml\Product\Composite\Configure</item>
+                        <item name="locator" xsi:type="string">//ancestor::body//*[contains(@class, "modal-slide") and contains(@class, "_show")]</item>
+                        <item name="strategy" xsi:type="string">xpath</item>
+                    </item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml
index b1da43e473bc5d78d4bfaf0fbcbb718dac6acd3e..ad937cf472de7145429b16983288df69bb851134 100644
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml
@@ -7,7 +7,7 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Vault\Test\TestCase\ReorderUsingVaultTest" summary="Reorder from Admin with saved within PayPal Payflow Pro credit card">
-        <variation name="ReorderUsingVaultPayflowProTestVariation1" summary="Reorder from Admin with saved within PayPal Payflow Pro credit card for Guest Customer" ticketId="MAGETWO-54872">
+        <variation name="ReorderUsingVaultPayflowProTestVariation1" summary="Reorder from Admin with saved within PayPal Payflow Pro credit card for Guest Customer" ticketId="MAGETWO-34217, MAGETWO-54872">
             <data name="description" xsi:type="string">Reorder from Admin with saved within PayPal Payflow Pro credit card for Guest Customer</data>
             <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
             <data name="customer/dataset" xsi:type="string">default</data>
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/CustomerActivities/Sidebar.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/CustomerActivities/Sidebar.php
index 050f797d83825e99eaf08728c2dc69149f8faaae..3fc41e0db1785d06eb29bd58b7343b02a274ee00 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/CustomerActivities/Sidebar.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/CustomerActivities/Sidebar.php
@@ -21,6 +21,13 @@ abstract class Sidebar extends Block
      */
     protected $addToOrder = './/tr[td[.="%s"]]//input[contains(@name,"add")]';
 
+    /**
+     * 'Add to order' configure.
+     *
+     * @var string
+     */
+    protected $addToOrderConfigure = './/tr[td[contains(.,"%s")]]//a[contains(@class, "icon-configure")]';
+
     /**
      * 'Add to order' checkbox.
      *
@@ -39,9 +46,18 @@ abstract class Sidebar extends Block
         foreach ($products as $product) {
             $name = $product->getName();
             $this->_rootElement->find(sprintf($this->addToOrderProductName, $name), Locator::SELECTOR_XPATH)->click();
-            $this->_rootElement->click();
-            $this->_rootElement->find(sprintf($this->addToOrder, $name), Locator::SELECTOR_XPATH, 'checkbox')
-                ->setValue('Yes');
+
+            $dataConfig = $product->getDataConfig();
+            $typeId = isset($dataConfig['type_id']) ? $dataConfig['type_id'] : null;
+
+            if ($this->hasRender($typeId)) {
+                $this->_rootElement->find(sprintf($this->addToOrderConfigure, $name), Locator::SELECTOR_XPATH)->click();
+                $this->callRender($typeId, 'configProduct', ['product' => $product]);
+            } else {
+                $this->_rootElement->click();
+                $this->_rootElement->find(sprintf($this->addToOrder, $name), Locator::SELECTOR_XPATH, 'checkbox')
+                    ->setValue('Yes');
+            }
         }
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.php b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.php
index 49487ff1b2e8ea9b9e23543a44a2878b797c4f2c..a501ec3cd228d8c60a5225027719e463dbf6c688 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.php
@@ -142,9 +142,10 @@ class MoveRecentlyComparedProductsOnOrderPageTest extends Injectable
      *
      * @param Customer $customer
      * @param string $products
+     * @param bool $productsIsConfigured
      * @return array
      */
-    public function test(Customer $customer, $products)
+    public function test(Customer $customer, $products, $productsIsConfigured = false)
     {
         // Preconditions
         // Create product
@@ -168,6 +169,6 @@ class MoveRecentlyComparedProductsOnOrderPageTest extends Injectable
         $activitiesBlock->getRecentlyComparedProductsBlock()->addProductsToOrder($products);
         $activitiesBlock->updateChanges();
 
-        return ['products' => $products, 'productsIsConfigured' => false];
+        return ['products' => $products, 'productsIsConfigured' => $productsIsConfigured];
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml
index 601f550e4588bfd3c613ef8a50e8615174b298ae..76282ff3eec53867d257029f5184b941899ac2db 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml
@@ -7,17 +7,10 @@
  -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
     <testCase name="Magento\Sales\Test\TestCase\MoveRecentlyComparedProductsOnOrderPageTest" summary="Add Products to Order from Recently Compared Products Section" ticketId="MAGETWO-28109">
-        <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariation1">
-            <data name="tag" xsi:type="string">stable:no</data>
+        <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariationWithSimpleProduct1">
             <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
             <data name="products/1" xsi:type="string">catalogProductSimple::default</data>
             <constraint name="Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid" />
         </variation>
-        <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariation2">
-            <data name="tag" xsi:type="string">to_maintain:yes</data>
-            <data name="products/0" xsi:type="string">configurableProduct::configurable_with_qty_1</data>
-            <data name="products/1" xsi:type="string">configurableProduct::configurable_with_qty_1</data>
-            <constraint name="Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid" />
-        </variation>
     </testCase>
 </config>
diff --git a/dev/tests/integration/etc/di/preferences/ce.php b/dev/tests/integration/etc/di/preferences/ce.php
index cec08b1d91da7ec77ce81d00dcdf8fd09addfd9c..f1654cba97d74faedd12797d19a967afb410d500 100644
--- a/dev/tests/integration/etc/di/preferences/ce.php
+++ b/dev/tests/integration/etc/di/preferences/ce.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Preferences for classes like in di.xml (for integration tests)
+ *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
@@ -19,5 +21,6 @@ return [
     \Magento\Framework\View\LayoutInterface::class => \Magento\TestFramework\View\Layout::class,
     \Magento\Framework\App\ResourceConnection\ConnectionAdapterInterface::class =>
         \Magento\TestFramework\Db\ConnectionAdapter::class,
-    \Magento\Framework\Filesystem\DriverInterface::class => \Magento\Framework\Filesystem\Driver\File::class
+    \Magento\Framework\Filesystem\DriverInterface::class => \Magento\Framework\Filesystem\Driver\File::class,
+    \Magento\Framework\App\Config\ScopeConfigInterface::class => \Magento\TestFramework\App\Config::class,
 ];
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Annotation/AdminConfigFixture.php b/dev/tests/integration/framework/Magento/TestFramework/Annotation/AdminConfigFixture.php
index 780beaef7cc44715cebb722d02382cd602ab1f75..5b687d4d5a4660cecfe276f59fe4ed92a30441e6 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Annotation/AdminConfigFixture.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Annotation/AdminConfigFixture.php
@@ -9,6 +9,11 @@
  */
 namespace Magento\TestFramework\Annotation;
 
+/**
+ * Handler for applying magentoAdminConfig annotation
+ *
+ * @package Magento\TestFramework\Annotation
+ */
 class AdminConfigFixture
 {
     /**
@@ -34,7 +39,7 @@ class AdminConfigFixture
     protected function _getConfigValue($configPath)
     {
         return \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
-            \Magento\Backend\App\ConfigInterface::class
+            \Magento\Framework\App\Config\MutableScopeConfigInterface::class
         )->getValue(
             $configPath
         );
@@ -49,7 +54,7 @@ class AdminConfigFixture
     protected function _setConfigValue($configPath, $value)
     {
         \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
-            \Magento\Backend\App\ConfigInterface::class
+            \Magento\Framework\App\Config\MutableScopeConfigInterface::class
         )->setValue(
             $configPath,
             $value
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Annotation/ConfigFixture.php b/dev/tests/integration/framework/Magento/TestFramework/Annotation/ConfigFixture.php
index 25863089bd6308d2c990c249ba427723d1ccdf1b..d9df69b7b76e5aed096d74e727f6c4ae9de0022d 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Annotation/ConfigFixture.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Annotation/ConfigFixture.php
@@ -11,6 +11,11 @@ namespace Magento\TestFramework\Annotation;
 
 use Magento\Framework\App\Config\ScopeConfigInterface;
 
+/**
+ * Handler which works with magentoConfigFixture annotations
+ *
+ * @package Magento\TestFramework\Annotation
+ */
 class ConfigFixture
 {
     /**
diff --git a/dev/tests/integration/framework/Magento/TestFramework/App/Config.php b/dev/tests/integration/framework/Magento/TestFramework/App/Config.php
new file mode 100644
index 0000000000000000000000000000000000000000..43a47debf9064abacd7ca1ddf7c081561c4e6ec9
--- /dev/null
+++ b/dev/tests/integration/framework/Magento/TestFramework/App/Config.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * Application configuration object. Used to access configuration when application is initialized and installed.
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestFramework\App;
+
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\DataObject;
+use Magento\TestFramework\ObjectManager;
+
+/**
+ * @inheritdoc
+ */
+class Config extends \Magento\Framework\App\Config
+{
+    /**
+     * @var DataObject[]
+     */
+    private $data;
+
+    /**
+     * @var ScopeCodeResolver
+     */
+    private $scopeCodeResolver;
+
+    /**
+     * Initialize data object with all settings data
+     *
+     * @param array $data
+     * @param string $configType
+     * @return void
+     */
+    private function setData(array $data, $configType)
+    {
+        $this->data[$configType] = new DataObject($data);
+    }
+
+    /**
+     * Retrieve Scope Code Resolver
+     *
+     * @return ScopeCodeResolver
+     */
+    private function getScopeCodeResolver()
+    {
+        if (!$this->scopeCodeResolver) {
+            $this->scopeCodeResolver = ObjectManager::getInstance()->get(ScopeCodeResolver::class);
+        }
+
+        return $this->scopeCodeResolver;
+    }
+
+    /**
+     * Set config value in the corresponding config scope
+     *
+     * @param string $path
+     * @param mixed $value
+     * @param string $scope
+     * @param null|string $scopeCode
+     * @return void
+     */
+    public function setValue(
+        $path,
+        $value,
+        $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
+        $scopeCode = null
+    ) {
+        $result = $this->get('system');
+
+        if ($scope === 'store') {
+            $scope = 'stores';
+        } elseif ($scope === 'website') {
+            $scope = 'websites';
+        }
+
+        if (empty($scopeCode)) {
+            $scopeCode = $this->getScopeCodeResolver()->resolve($scope, $scopeCode);
+        }
+
+        $keys = explode('/', $path);
+        if ($scope !== ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
+            $searchKeys = array_merge([$scope, $scopeCode], $keys);
+        } else {
+            $searchKeys = array_merge([$scope], $keys);
+        }
+
+        $this->updateResult($searchKeys, $result, $value);
+        $this->setData($result, 'system');
+    }
+
+    /**
+     * Recursively update results in global variable, which hold configs
+     *
+     * @param array $keys
+     * @param array $result
+     * @param mixed $value
+     * @return void
+     */
+    private function updateResult(array $keys, & $result, $value)
+    {
+        $key = array_shift($keys);
+
+        if (empty($keys)) {
+            $result[$key] = $value;
+        } else {
+            $this->updateResult($keys, $result[$key], $value);
+        }
+    }
+
+    /**
+     * Flush all muted settings
+     *
+     * @return void
+     */
+    public function clean()
+    {
+        $this->data = null;
+        $this->scopeCodeResolver = null;
+        parent::clean();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function get($configType, $path = null, $default = null)
+    {
+        $path = $path === null ? '' : $path;
+        if (!isset($this->data[$configType]) || $this->data[$configType]->getData($path) === null) {
+            return parent::get($configType, $path, $default);
+        }
+
+        return $this->data[$configType]->getData($path);
+    }
+}
diff --git a/dev/tests/integration/framework/Magento/TestFramework/App/MutableScopeConfig.php b/dev/tests/integration/framework/Magento/TestFramework/App/MutableScopeConfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..3af325bab0ec18e674ada29ab6d236d4970fe274
--- /dev/null
+++ b/dev/tests/integration/framework/Magento/TestFramework/App/MutableScopeConfig.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Application configuration object. Used to access configuration when application is installed.
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\TestFramework\App;
+
+use Magento\Framework\App\Config\MutableScopeConfigInterface;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\TestFramework\ObjectManager;
+
+/**
+ * @inheritdoc
+ */
+class MutableScopeConfig implements MutableScopeConfigInterface
+{
+    /**
+     * @var Config
+     */
+    private $testAppConfig;
+
+    /**
+     * @param string $path
+     * @param string $scopeType
+     * @param null $scopeCode
+     * @return bool
+     */
+    public function isSetFlag($path, $scopeType = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null)
+    {
+        return $this->getTestAppConfig()->isSetFlag($path, $scopeType, $scopeCode);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getValue($path, $scopeType = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null)
+    {
+        return $this->getTestAppConfig()->getValue($path, $scopeType, $scopeCode);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function setValue(
+        $path,
+        $value,
+        $scopeType = \Magento\Framework\App\Config\ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
+        $scopeCode = null
+    ) {
+        return $this->getTestAppConfig()->setValue($path, $value, $scopeType, $scopeCode);
+    }
+
+    /**
+     * Clean app config cache
+     *
+     * @param string|null $type
+     * @return void
+     */
+    public function clean()
+    {
+        $this->getTestAppConfig()->clean();
+    }
+
+    /**
+     * Retrieve test app config instance
+     *
+     * @return \Magento\TestFramework\App\Config
+     */
+    private function getTestAppConfig()
+    {
+        if (!$this->testAppConfig) {
+            $this->testAppConfig = ObjectManager::getInstance()->get(ScopeConfigInterface::class);
+        }
+
+        return $this->testAppConfig;
+    }
+}
diff --git a/dev/tests/integration/framework/Magento/TestFramework/App/ReinitableConfig.php b/dev/tests/integration/framework/Magento/TestFramework/App/ReinitableConfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d0b52555a395e398823e9d5ec1dd1d7aba59042
--- /dev/null
+++ b/dev/tests/integration/framework/Magento/TestFramework/App/ReinitableConfig.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestFramework\App;
+
+use Magento\Framework\App\Config\ReinitableConfigInterface;
+use Magento\TestFramework\ObjectManager;
+
+/**
+ * @inheritdoc
+ */
+class ReinitableConfig extends MutableScopeConfig implements ReinitableConfigInterface
+{
+    /**
+     * @var Config
+     */
+    private $testAppConfig;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reinit()
+    {
+        $this->getTestScopeConfig()->clean();
+        return $this;
+    }
+
+    /**
+     * Retrieve Test Scope Config
+     *
+     * @return Config
+     */
+    public function getTestScopeConfig()
+    {
+        if (!$this->testAppConfig) {
+            $this->testAppConfig = ObjectManager::getInstance()->get(Config::class);
+        }
+
+        return $this->testAppConfig;
+    }
+}
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Application.php b/dev/tests/integration/framework/Magento/TestFramework/Application.php
index 3ae2c994511c7ed64038826399dc00cd9af62817..15407f2cd572f32b143d82bad9b59e6e382dc9fe 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Application.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Application.php
@@ -6,8 +6,6 @@
 namespace Magento\TestFramework;
 
 use Magento\Framework\Autoload\AutoloaderInterface;
-use Magento\Framework\Filesystem;
-use Magento\Framework\Filesystem\DriverInterface;
 use Magento\Framework\App\Filesystem\DirectoryList;
 use Magento\Framework\App\DeploymentConfig;
 use Magento\Framework\Config\ConfigOptionsListConstants;
@@ -561,7 +559,6 @@ class Application
         /** @var $objectManager \Magento\TestFramework\ObjectManager */
         $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
         $objectManager->clearCache();
-
         \Magento\Framework\Data\Form::setElementRenderer(null);
         \Magento\Framework\Data\Form::setFieldsetRenderer(null);
         \Magento\Framework\Data\Form::setFieldsetElementRenderer(null);
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Backend/App/Config.php b/dev/tests/integration/framework/Magento/TestFramework/Backend/App/Config.php
new file mode 100644
index 0000000000000000000000000000000000000000..7907cf5a82d2e01d1814497879a49fcbccd3d229
--- /dev/null
+++ b/dev/tests/integration/framework/Magento/TestFramework/Backend/App/Config.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Default application path for backend area
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+// @codingStandardsIgnoreFile
+
+namespace Magento\TestFramework\Backend\App;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+
+/**
+ * Backend config accessor.
+ */
+class Config extends \Magento\Backend\App\Config
+{
+    /**
+     * @var \Magento\TestFramework\App\MutableScopeConfig
+     */
+    private $mutableScopeConfig;
+
+    /**
+     * Config constructor.
+     * @param \Magento\TestFramework\App\Config $appConfig
+     * @param \Magento\TestFramework\App\MutableScopeConfig $mutableScopeConfig
+     */
+    public function __construct(\Magento\TestFramework\App\Config $appConfig, \Magento\TestFramework\App\MutableScopeConfig $mutableScopeConfig)
+    {
+        parent::__construct($appConfig);
+        $this->mutableScopeConfig = $mutableScopeConfig;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function setValue(
+        $path,
+        $value,
+        $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
+        $scopeCode = null
+    ) {
+        $this->mutableScopeConfig->setValue($path, $value, $scope, $scopeCode);
+    }
+}
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Bootstrap/DocBlock.php b/dev/tests/integration/framework/Magento/TestFramework/Bootstrap/DocBlock.php
index 2349ae949876eff6cdbe29c47ac44c846fb8ba4b..bf890b2448e23f7a134574b9fb2fb2d7eca1151e 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Bootstrap/DocBlock.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Bootstrap/DocBlock.php
@@ -53,6 +53,7 @@ class DocBlock
             new \Magento\TestFramework\Isolation\WorkingDirectory(),
             new \Magento\TestFramework\Isolation\DeploymentConfig(),
             new \Magento\TestFramework\Annotation\AppIsolation($application),
+            new \Magento\TestFramework\Isolation\AppConfig(),
             new \Magento\TestFramework\Annotation\ConfigFixture(),
             new \Magento\TestFramework\Annotation\DataFixtureBeforeTransaction($this->_fixturesBaseDir),
             new \Magento\TestFramework\Event\Transaction(
@@ -66,7 +67,7 @@ class DocBlock
             new \Magento\TestFramework\Annotation\ComponentRegistrarFixture($this->_fixturesBaseDir),
             new \Magento\TestFramework\Annotation\AppArea($application),
             new \Magento\TestFramework\Annotation\Cache($application),
-            new \Magento\TestFramework\Annotation\AdminConfigFixture()
+            new \Magento\TestFramework\Annotation\AdminConfigFixture(),
         ];
     }
 }
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Helper/CacheCleaner.php b/dev/tests/integration/framework/Magento/TestFramework/Helper/CacheCleaner.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d7748f0b1fd91db302a33b5ff84086f8fb11b23
--- /dev/null
+++ b/dev/tests/integration/framework/Magento/TestFramework/Helper/CacheCleaner.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\TestFramework\Helper;
+
+use Magento\Framework\App\Cache\Frontend\Pool;
+
+/**
+ * Helper for cleaning cache
+ */
+class CacheCleaner
+{
+    /**
+     * Clean cache by specified types
+     *
+     * @param array $cacheTypes
+     */
+    public static function clean(array $cacheTypes = [])
+    {
+        $cachePool = self::getCachePool();
+        foreach ($cacheTypes as $cacheType) {
+            $cachePool->get($cacheType)->getBackend()->clean();
+        }
+    }
+
+    /**
+     * Clean all cache
+     */
+    public static function cleanAll()
+    {
+        $cachePool = self::getCachePool();
+        foreach ($cachePool as $cacheType) {
+            $cacheType->getBackend()->clean();
+        }
+    }
+
+    /**
+     * Get cache pool
+     *
+     * @return Pool
+     */
+    private static function getCachePool()
+    {
+        return Bootstrap::getObjectManager()
+            ->get(Pool::class);
+    }
+}
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Interception/PluginList.php b/dev/tests/integration/framework/Magento/TestFramework/Interception/PluginList.php
index 9e8901c91fd7587378713afd7abea020cb82fa83..18cdc66cb3f2ea28436692cf55c5bfae1df42ac4 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Interception/PluginList.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Interception/PluginList.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\TestFramework\Interception;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides plugin list configuration
+ */
 class PluginList extends \Magento\Framework\Interception\PluginList\PluginList
 {
     /**
@@ -13,6 +18,8 @@ class PluginList extends \Magento\Framework\Interception\PluginList\PluginList
     protected $_originScopeScheme = [];
 
     /**
+     * Constructor
+     *
      * @param \Magento\Framework\Config\ReaderInterface $reader
      * @param \Magento\Framework\Config\ScopeInterface $configScope
      * @param \Magento\Framework\Config\CacheInterface $cache
@@ -22,8 +29,8 @@ class PluginList extends \Magento\Framework\Interception\PluginList\PluginList
      * @param \Magento\Framework\ObjectManagerInterface $objectManager
      * @param \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions
      * @param array $scopePriorityScheme
-     * @param string $cacheId
-     *
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -36,7 +43,8 @@ class PluginList extends \Magento\Framework\Interception\PluginList\PluginList
         \Magento\Framework\ObjectManagerInterface $objectManager,
         \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions,
         array $scopePriorityScheme,
-        $cacheId = 'plugins'
+        $cacheId = 'plugins',
+        SerializerInterface $serializer = null
     ) {
         parent::__construct(
             $reader,
@@ -48,7 +56,8 @@ class PluginList extends \Magento\Framework\Interception\PluginList\PluginList
             $objectManager,
             $classDefinitions,
             $scopePriorityScheme,
-            $cacheId
+            $cacheId,
+            $serializer
         );
         $this->_originScopeScheme = $this->_scopePriorityScheme;
     }
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Isolation/AppConfig.php b/dev/tests/integration/framework/Magento/TestFramework/Isolation/AppConfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..514b074d23366b25f6427f2d1e50da35e7641e0b
--- /dev/null
+++ b/dev/tests/integration/framework/Magento/TestFramework/Isolation/AppConfig.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\TestFramework\Isolation;
+
+use Magento\TestFramework\App\Config;
+use Magento\TestFramework\ObjectManager;
+
+/**
+ * A listener that watches for integrity of app configuration
+ */
+class AppConfig
+{
+    /**
+     * @var Config
+     */
+    private $testAppConfig;
+
+    /**
+     * Clean memorized and cached setting values
+     *
+     * Assumption: this is done once right before executing very first test suite.
+     * It is assumed that deployment configuration is valid at this point
+     *
+     * @param \PHPUnit_Framework_TestCase $test
+     * @return void
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function startTest(\PHPUnit_Framework_TestCase $test)
+    {
+        $this->getTestAppConfig()->clean();
+    }
+
+    /**
+     * Retrieve Test App Config
+     *
+     * @return Config
+     */
+    private function getTestAppConfig()
+    {
+        if (!$this->testAppConfig) {
+            $this->testAppConfig = ObjectManager::getInstance()->get(Config::class);
+        }
+
+        return $this->testAppConfig;
+    }
+}
diff --git a/dev/tests/integration/framework/Magento/TestFramework/ObjectManager.php b/dev/tests/integration/framework/Magento/TestFramework/ObjectManager.php
index c65ce0907912834027f929432be7f62dc01330a4..ad685845cde004bd54c8499671e9e22faa72d0e5 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/ObjectManager.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/ObjectManager.php
@@ -5,6 +5,7 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\TestFramework;
 
 class ObjectManager extends \Magento\Framework\App\ObjectManager
@@ -23,6 +24,8 @@ class ObjectManager extends \Magento\Framework\App\ObjectManager
      * @var array
      */
     protected $persistedInstances = [
+        \Magento\TestFramework\App\Config::class,
+        \Magento\Framework\App\Config\ScopeConfigInterface::class,
         \Magento\Framework\App\ResourceConnection::class,
         \Magento\Framework\Config\Scope::class,
         \Magento\Framework\ObjectManager\RelationsInterface::class,
diff --git a/dev/tests/integration/framework/Magento/TestFramework/ObjectManager/Configurator.php b/dev/tests/integration/framework/Magento/TestFramework/ObjectManager/Configurator.php
index b4a9819228e5fc653530a8ab3d28351e2538f2f6..afab0eca6edf051ff710b229ac114845f160e998 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/ObjectManager/Configurator.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/ObjectManager/Configurator.php
@@ -5,10 +5,23 @@
  */
 namespace Magento\TestFramework\ObjectManager;
 
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\Stdlib\CookieManagerInterface;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\Framework\App\MutableScopeConfig;
+use Magento\Framework\App\ReinitableConfig;
+use Magento\Framework\App\Config as AppConfig;
+use Magento\Backend\App\Config as BackendConfig;
+
+/**
+ * Class which hold configurations (preferences, etc...) of integration test framework
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class Configurator implements \Magento\Framework\ObjectManager\DynamicConfigInterface
 {
     /**
-     * Map application initialization params to Object Manager configuration format
+     * Map application initialization params to Object Manager configuration format.
      *
      * @return array
      */
@@ -16,8 +29,13 @@ class Configurator implements \Magento\Framework\ObjectManager\DynamicConfigInte
     {
         return [
             'preferences' => [
-                \Magento\Framework\Stdlib\CookieManagerInterface::class => \Magento\TestFramework\CookieManager::class,
-                \Magento\Store\Model\StoreManagerInterface::class => \Magento\TestFramework\Store\StoreManager::class,
+                CookieManagerInterface::class => \Magento\TestFramework\CookieManager::class,
+                StoreManagerInterface::class => \Magento\TestFramework\Store\StoreManager::class,
+                ScopeConfigInterface::class => \Magento\TestFramework\App\Config::class,
+                \Magento\Framework\App\Config::class => \Magento\TestFramework\App\Config::class,
+                BackendConfig::class => \Magento\TestFramework\Backend\App\Config::class,
+                ReinitableConfig::class => \Magento\TestFramework\App\ReinitableConfig::class,
+                MutableScopeConfig::class => \Magento\TestFramework\App\MutableScopeConfig::class,
             ]
         ];
     }
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Store/StoreManager.php b/dev/tests/integration/framework/Magento/TestFramework/Store/StoreManager.php
index 9f0124593ac1eff7892dabbb3e4b94a69150f831..5b2546765a132d35cd451fff449c80d06f31c06f 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Store/StoreManager.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Store/StoreManager.php
@@ -5,6 +5,14 @@
  */
 namespace Magento\TestFramework\Store;
 
+use Magento\TestFramework\App\Config;
+use Magento\TestFramework\ObjectManager;
+
+/**
+ * Integration tests decoration of store manager
+ *
+ * @package Magento\TestFramework\Store
+ */
 class StoreManager implements \Magento\Store\Model\StoreManagerInterface
 {
     /**
@@ -117,7 +125,16 @@ class StoreManager implements \Magento\Store\Model\StoreManagerInterface
      */
     public function reinitStores()
     {
+        //In order to restore configFixture values
+        $testAppConfig = ObjectManager::getInstance()->get(Config::class);
+        $reflection = new \ReflectionClass($testAppConfig);
+        $dataProperty = $reflection->getProperty('data');
+        $dataProperty->setAccessible(true);
+        $savedConfig = $dataProperty->getValue($testAppConfig);
+
         $this->decoratedStoreManager->reinitStores();
+
+        $dataProperty->setValue($testAppConfig, $savedConfig);
         $this->dispatchInitCurrentStoreAfterEvent();
     }
 
diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/ConfigTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/ConfigTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..508550fc1385ac47e75c7e63be982f6e9f1b57ca
--- /dev/null
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/ConfigTest.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/**
+ * Test class for \Magento\TestFramework\App\Config.
+ */
+namespace Magento\Test\App;
+
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\TestFramework\App\Config;
+
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    private $model;
+
+    public function setUp()
+    {
+        $scopeCodeResolver = $this->getMockBuilder(ScopeCodeResolver::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->model = new Config($scopeCodeResolver);
+    }
+
+    public function testGet()
+    {
+        $configType = "system";
+        $path = "stores/one";
+        $value = 1;
+        $this->model->setValue($path, $value, 'default', 'one');
+
+        $this->assertEquals($value, $this->model->get($configType, 'default/stores/one'));
+    }
+
+    public function testClean()
+    {
+        $configType = "system";
+        $path = "stores/one";
+        $value = 1;
+        $this->model->setValue($path, $value, 'default', 'one');
+        $this->assertEquals($value, $this->model->get($configType, 'default/stores/one'));
+        $this->model->clean();
+        $this->assertNull($this->model->get($configType, 'default/stores/one'));
+    }
+}
diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Isolation/AppConfigTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Isolation/AppConfigTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..34cf654dcf5c0669cd16532d8960215565a92dde
--- /dev/null
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Isolation/AppConfigTest.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/**
+ * Test class for \Magento\TestFramework\Isolation\WorkingDirectory.
+ */
+namespace Magento\Test\Isolation;
+
+use Magento\Framework\ObjectManagerInterface;
+use Magento\TestFramework\ObjectManager;
+
+class AppConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\TestFramework\Isolation\WorkingDirectory
+     */
+    private $model;
+
+    protected function setUp()
+    {
+        $this->model = new \Magento\TestFramework\Isolation\AppConfig();
+    }
+
+    protected function tearDown()
+    {
+        $this->model = null;
+    }
+
+    public function testStartTestEndTest()
+    {
+        $test = $this->getMockBuilder(\PHPUnit_Framework_TestCase::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $modelReflection = new \ReflectionClass($this->model);
+        $testAppConfigProperty = $modelReflection->getProperty('testAppConfig');
+        $testAppConfigProperty->setAccessible(true);
+        $testAppConfigMock = $this->getMockBuilder(\Magento\TestFramework\App\Config::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $testAppConfigProperty->setValue($this->model, $testAppConfigMock);
+        $testAppConfigMock->expects($this->once())
+            ->method('clean');
+        $this->model->startTest($test);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Authorizenet/Model/Directpost/RequestTest.php b/dev/tests/integration/testsuite/Magento/Authorizenet/Model/Directpost/RequestTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab35c27985da8f13fb2fd4362c719fe0d3267315
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Authorizenet/Model/Directpost/RequestTest.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Authorizenet\Model\Directpost;
+
+use Magento\Authorizenet\Model\Directpost;
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\App\ObjectManager;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Api\OrderRepositoryInterface;
+use Magento\Sales\Model\Order;
+use Magento\TestFramework\Helper\Bootstrap;
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
+
+/**
+ * Class contains tests for Authorize.net Direct Post request handler
+ */
+class RequestTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Order
+     */
+    private $order;
+
+    /**
+     * @var Request
+     */
+    private $request;
+
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+
+        $this->order = $this->getOrder();
+        $this->request = $this->objectManager->get(Request::class);
+    }
+
+    /**
+     * @covers \Magento\Authorizenet\Model\Directpost\Request::setDataFromOrder
+     * @magentoDataFixture Magento/Authorizenet/_files/order.php
+     */
+    public function testSetDataFromOrder()
+    {
+        $customerEmail = 'john.doe@example.com';
+        $merchantEmail = 'merchant@example.com';
+
+        /** @var Directpost|MockObject $payment */
+        $payment = $this->getMockBuilder(Directpost::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getConfigData'])
+            ->getMock();
+
+        $payment->expects(static::exactly(2))
+            ->method('getConfigData')
+            ->willReturnMap([
+                ['email_customer', null, $customerEmail],
+                ['merchant_email', null, $merchantEmail]
+            ]);
+
+        $result = $this->request->setDataFromOrder($this->order, $payment);
+
+        static::assertEquals('US', $result->getXCountry());
+        static::assertEquals('UK', $result->getXShipToCountry());
+        static::assertEquals($customerEmail, $result->getXEmailCustomer());
+        static::assertEquals($merchantEmail, $result->getXMerchantEmail());
+    }
+
+    /**
+     * Get stored order
+     * @return Order
+     */
+    private function getOrder()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = $this->objectManager->get(FilterBuilder::class);
+        $filters = [
+            $filterBuilder->setField(OrderInterface::INCREMENT_ID)
+                ->setValue('100000002')
+                ->create()
+        ];
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
+        $searchCriteria = $searchCriteriaBuilder->addFilters($filters)
+            ->create();
+
+        $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
+        $orders = $orderRepository->getList($searchCriteria)
+            ->getItems();
+
+        /** @var OrderInterface $order */
+        return array_pop($orders);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Authorizenet/Model/DirectpostTest.php b/dev/tests/integration/testsuite/Magento/Authorizenet/Model/DirectpostTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c20db43c127b4a9c058cb206cde14822f9aafd84
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Authorizenet/Model/DirectpostTest.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Authorizenet\Model;
+
+use Magento\Framework\Api\FilterBuilder;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\HTTP\ZendClient;
+use Magento\Framework\HTTP\ZendClientFactory;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Api\OrderRepositoryInterface;
+use Magento\Sales\Model\Order\Payment;
+use Magento\TestFramework\Helper\Bootstrap;
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
+use Zend_Http_Response;
+
+/**
+ * Class contains tests for Direct Post integration
+ */
+class DirectpostTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var ZendClientFactory|MockObject
+     */
+    private $httpClientFactory;
+
+    /**
+     * @var Directpost
+     */
+    private $directPost;
+
+    protected function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+
+        $this->httpClientFactory = $this->getMockBuilder(ZendClientFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+
+        $this->directPost = $this->objectManager->create(Directpost::class, [
+            'httpClientFactory' => $this->httpClientFactory
+        ]);
+    }
+
+    /**
+     * @covers \Magento\Authorizenet\Model\Directpost::capture
+     * @magentoDataFixture Magento/Authorizenet/_files/order.php
+     */
+    public function testCapture()
+    {
+        $amount = 120.15;
+        /** @var Payment $payment */
+        $payment = $this->getPayment();
+        $transactionId = '106235225';
+
+        /** @var ZendClient|MockObject $httpClient */
+        $httpClient = $this->getMockBuilder(ZendClient::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['setUri', 'setConfig', 'setParameterPost', 'setMethod', 'request'])
+            ->getMock();
+
+        $this->httpClientFactory->expects(static::once())
+            ->method('create')
+            ->willReturn($httpClient);
+
+        $response = $this->getMockBuilder(Zend_Http_Response::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getBody'])
+            ->getMock();
+        $response->expects(static::once())
+            ->method('getBody')
+            ->willReturn(
+                "1(~)1(~)1(~)This transaction has been approved.(~)AWZFTG(~)P(~){$transactionId}(~)100000002(~)
+                (~)120.15(~)CC(~)prior_auth_capture(~)(~)Anthony(~)Nealy(~)(~)Pearl St(~)Los Angeles(~)California
+                (~)10020(~)US(~)22-333-44(~)(~)customer@example.com(~)John(~)Doe(~)
+                (~)Bourne St(~)London(~)(~)DW23W(~)UK(~)0.00(~)(~){$amount}(~)(~)
+                (~)74B5D54ADFE98093A0FF6446(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)XXXX1111(~)Visa(~)(~)(~)(~)(~)
+                (~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)"
+            );
+
+        $httpClient->expects(static::once())
+            ->method('request')
+            ->willReturn($response);
+
+        $this->directPost->capture($payment, $amount);
+
+        static::assertEquals($transactionId, $payment->getTransactionId());
+        static::assertFalse($payment->getIsTransactionClosed());
+        static::assertEquals('US', $payment->getOrder()->getBillingAddress()->getCountryId());
+        static::assertEquals('UK', $payment->getOrder()->getShippingAddress()->getCountryId());
+    }
+
+    /**
+     * Get order payment
+     * @return Payment
+     */
+    private function getPayment()
+    {
+        /** @var FilterBuilder $filterBuilder */
+        $filterBuilder = $this->objectManager->get(FilterBuilder::class);
+        $filters = [
+            $filterBuilder->setField(OrderInterface::INCREMENT_ID)
+                ->setValue('100000002')
+                ->create()
+        ];
+
+        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+        $searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
+        $searchCriteria = $searchCriteriaBuilder->addFilters($filters)
+            ->create();
+
+        $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
+        $orders = $orderRepository->getList($searchCriteria)
+            ->getItems();
+
+        /** @var OrderInterface $order */
+        $order = array_pop($orders);
+        return $order->getPayment();
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Authorizenet/_files/order.php b/dev/tests/integration/testsuite/Magento/Authorizenet/_files/order.php
new file mode 100644
index 0000000000000000000000000000000000000000..564ab84a8f8527c61bf8e79f7a57ad53b971089f
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Authorizenet/_files/order.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+use Magento\Sales\Api\OrderRepositoryInterface;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Address;
+use Magento\Sales\Model\Order\Payment;
+use Magento\TestFramework\Helper\Bootstrap;
+
+$objectManager = Bootstrap::getObjectManager();
+
+$amount = 120.15;
+
+/** @var Payment $payment */
+$payment = $objectManager->get(Payment::class);
+$payment
+    ->setMethod('authorizenet_directpost')
+    ->setAnetTransType('AUTH_ONLY')
+    ->setBaseAmountAuthorized($amount)
+    ->setPoNumber('10101200');
+
+/** @var Address\ $billingAddress */
+$billingAddress = $objectManager->create(Address::class, [
+    'data' => [
+        'firstname' => 'John',
+        'lastname' => 'Doe',
+        'email' => 'customer@example.com',
+        'street' => 'Pearl St',
+        'city' => 'Los Angeles',
+        'region' => 'CA',
+        'postcode' => '10020',
+        'country_id' => 'US',
+        'telephone' => '22-333-44',
+        'address_type' => 'billing'
+    ]
+]);
+
+$shippingAddress = $objectManager->create(Address::class, [
+    'data' => [
+        'firstname' => 'John',
+        'lastname' => 'Doe',
+        'email' => 'customer@example.com',
+        'street' => 'Bourne St',
+        'city' => 'London',
+        'postcode' => 'DW23W',
+        'country_id' => 'UK',
+        'telephone' => '22-333-44',
+        'address_type' => 'billing'
+    ]
+]);
+
+/** @var Order $order */
+$order = $objectManager->create(Order::class);
+$order->setIncrementId('100000002')
+    ->setQuoteId(2)
+    ->setIncrementId('100000002')
+    ->setBaseGrandTotal($amount)
+    ->setBaseCurrencyCode('USD')
+    ->setBaseTaxAmount($amount)
+    ->setBaseShippingAmount($amount)
+    ->setCustomerEmail('customer@example.com')
+    ->setBillingAddress($billingAddress)
+    ->setShippingAddress($shippingAddress)
+    ->setPayment($payment);
+
+/** @var OrderRepositoryInterface $orderRepository */
+$orderRepository = $objectManager->get(OrderRepositoryInterface::class);
+$orderRepository->save($order);
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/TextTest.php b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/TextTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d2875716156e83b48502be84a4ef1a86ef46772
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/TextTest.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Backend\Block\Widget\Grid\Column\Renderer;
+
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\TestFramework\ObjectManager;
+use Magento\Backend\Block\Widget\Grid\Column;
+use Magento\Framework\DataObject;
+use Magento\Framework\Phrase;
+use Magento\Framework\Phrase\RendererInterface;
+
+class TextTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var RendererInterface
+     */
+    private $origRenderer;
+
+    protected function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+        $this->origRenderer = Phrase::getRenderer();
+        /** @var RendererInterface|PHPUnit_Framework_MockObject_MockObject $rendererMock */
+        $rendererMock = $this->getMock(RendererInterface::class);
+        $rendererMock->expects($this->any())
+            ->method('render')
+            ->willReturnCallback(
+                function ($input) {
+                    return end($input) . ' translated';
+                }
+            );
+        Phrase::setRenderer($rendererMock);
+    }
+
+    protected function tearDown()
+    {
+        Phrase::setRenderer($this->origRenderer);
+    }
+
+    /**
+     * @param array $columnData
+     * @param array $rowData
+     * @param string $expected
+     * @dataProvider renderDataProvider
+     */
+    public function testRender($columnData, $rowData, $expected)
+    {
+        /** @var Text $renderer */
+        $renderer = $this->objectManager->create(Text::class);
+        /** @var Column $column */
+        $column = $this->objectManager->create(
+            Column::class,
+            [
+                'data' => $columnData
+            ]
+        );
+        /** @var DataObject $row */
+        $row = $this->objectManager->create(
+            DataObject::class,
+            [
+                'data' => $rowData
+            ]
+        );
+        $this->assertEquals(
+            $expected,
+            $renderer->setColumn($column)->render($row)
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function renderDataProvider()
+    {
+        return [
+            [
+                [
+                    'index' => 'title',
+                    'translate' => true
+                ],
+                [
+                    'title' => 'String'
+                ],
+                'String translated'
+            ],
+            [
+                [
+                    'index' => 'title'
+                ],
+                [
+                    'title' => 'Doesn\'t need to be translated'
+                ],
+                'Doesn&#039;t need to be translated'
+            ],
+            [
+                [
+                    'format' => '#$subscriber_id $customer_name ($subscriber_email)'
+                ],
+                [
+                    'subscriber_id' => '10',
+                    'customer_name' => 'John Doe',
+                    'subscriber_email' => 'john@doe.com'
+                ],
+                '#10 John Doe (john@doe.com)'
+            ],
+            [
+                [
+                    'format' => '$customer_name, email: $subscriber_email',
+                    'translate' => true
+                ],
+                [
+                    'customer_name' => 'John Doe',
+                    'subscriber_email' => 'john@doe.com'
+                ],
+                'John Doe, email: john@doe.com translated'
+            ],
+            [
+                [
+                    'format' => 'String',
+                    'translate' => true
+                ],
+                [],
+                'String translated'
+            ],
+            [
+                [
+                    'format' => 'Doesn\'t need to be translated'
+                ],
+                [],
+                'Doesn&#039;t need to be translated'
+            ]
+        ];
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Helper/DataTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Helper/DataTest.php
index 650c84f17a36624b39df6ccd6bef5094ec021123..071c2499bb33262f1f1df9a6bcbd1f37340516ed 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Helper/DataTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Helper/DataTest.php
@@ -397,7 +397,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
             ],
             'price include tax, display excluding tax, high rate product tax class, round' => [
                 (new \Magento\Framework\DataObject())->setPrice(3.256)->setRoundPrice(true),
-                '2.67',
+                '2.97',
                 [
                     [
                         'path' => Config::CONFIG_XML_PATH_PRICE_INCLUDES_TAX,
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php
index 0d6f18dbacbc837485b20751d9f840ee252db284..9252f87079fa501960e274789d394bd577137ceb 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php
@@ -27,11 +27,6 @@ class FlatTest extends \PHPUnit_Framework_TestCase
         );
     }
 
-    public function testIsEnabledDefault()
-    {
-        $this->assertFalse($this->_state->isFlatEnabled());
-    }
-
     /**
      * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1
      */
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ConfigTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ConfigTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..178107e487e9292b90226e838e5767deef47d1d8
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ConfigTest.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Model;
+
+use Magento\Catalog\Model\Config;
+use Magento\TestFramework\ObjectManager;
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\TestFramework\Helper\CacheCleaner;
+
+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';
+        CacheCleaner::cleanAll();
+        $this->assertEquals(
+            $this->config->getEntityAttributeCodes($entityType),
+            $this->config->getEntityAttributeCodes($entityType)
+        );
+    }
+
+    public function testGetAttribute()
+    {
+        $entityType = 'catalog_product';
+        $attributeCode = 'color';
+        CacheCleaner::cleanAll();
+        $this->assertEquals(
+            $this->config->getAttribute($entityType, $attributeCode),
+            $this->config->getAttribute($entityType, $attributeCode)
+        );
+    }
+
+    public function testGetEntityType()
+    {
+        $entityType = 'catalog_product';
+        CacheCleaner::cleanAll();
+        $this->assertEquals(
+            $this->config->getEntityType($entityType),
+            $this->config->getEntityType($entityType)
+        );
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Source/CountryofmanufactureTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Source/CountryofmanufactureTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..34fd3b678a0866af7ce5bcec53cf6d6fe496bbfc
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Source/CountryofmanufactureTest.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Model\Product\Attribute\Source;
+
+use Magento\TestFramework\Helper\CacheCleaner;
+
+class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture
+     */
+    private $model;
+
+    protected function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->model = $objectManager->create(
+            \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture::class
+        );
+    }
+
+    public function testGetAllOptions()
+    {
+        CacheCleaner::cleanAll();
+        $allOptions = $this->model->getAllOptions();
+        $cachedAllOptions = $this->model->getAllOptions();
+        $this->assertEquals($allOptions, $cachedAllOptions);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/SourceTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/SourceTest.php
index ed8f12020a977192d94c866e81110a167d7a3587..2d811ea59bfa95eedb56f48635ed4dd0d95a0c87 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/SourceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/SourceTest.php
@@ -11,6 +11,7 @@ use Magento\TestFramework\Helper\Bootstrap;
 
 /**
  * Class SourceTest
+ * @magentoAppIsolation enabled
  */
 class SourceTest extends \PHPUnit_Framework_TestCase
 {
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b01d1e6d38655fac502d16e4be7f6d117202078d
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Ui\DataProvider\Product\Form\Modifier;
+
+use Magento\TestFramework\Helper\CacheCleaner;
+
+/**
+ * @magentoAppArea adminhtml
+ * @magentoDataFixture Magento/Catalog/_files/categories.php
+ * @magentoDbIsolation enabled
+ * @magentoAppIsolation enabled
+ */
+class CategoriesTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Categories
+     */
+    private $object;
+
+    protected function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $registry = $objectManager->get(\Magento\Framework\Registry::class);
+        /** @var $store \Magento\Store\Model\Store */
+        $store = $objectManager->create(\Magento\Store\Model\Store::class);
+        $store->load('admin');
+        $registry->register('current_store', $store);
+        $this->object = $objectManager->create(Categories::class);
+    }
+
+    public function testModifyMeta()
+    {
+        $inputMeta = include __DIR__ . '/_files/input_meta_for_categories.php';
+        $expectedCategories = include __DIR__ . '/_files/expected_categories.php';
+        CacheCleaner::cleanAll();
+        $this->assertCategoriesInMeta($expectedCategories, $this->object->modifyMeta($inputMeta));
+        // Verify cached data
+        $this->assertCategoriesInMeta($expectedCategories, $this->object->modifyMeta($inputMeta));
+    }
+
+    private function assertCategoriesInMeta(array $expectedCategories, array $meta)
+    {
+        $categoriesElement = $meta['product-details']['children']['container_category_ids']['children']['category_ids'];
+        $this->assertEquals($expectedCategories, $categoriesElement['arguments']['data']['config']['options']);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/expected_categories.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/expected_categories.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed30676e16b07dd54cae708b2f7942511fe8fb6c
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/expected_categories.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+return [
+    0 =>
+        [
+            'value' => '2',
+            'is_active' => '1',
+            'label' => 'Default Category',
+            'optgroup' =>
+                [
+                    0 =>
+                        [
+                            'value' => '3',
+                            'is_active' => '1',
+                            'label' => 'Category 1',
+                            'optgroup' =>
+                                [
+                                    0 =>
+                                        [
+                                            'value' => '4',
+                                            'is_active' => '1',
+                                            'label' => 'Category 1.1',
+                                            'optgroup' =>
+                                                [
+                                                    0 =>
+                                                        [
+                                                            'value' => '5',
+                                                            'is_active' => '1',
+                                                            'label' => 'Category 1.1.1',
+                                                        ],
+                                                ],
+                                        ],
+                                    1 =>
+                                        [
+                                            'value' => '13',
+                                            'is_active' => '1',
+                                            'label' => 'Category 1.2',
+                                        ],
+                                ],
+                        ],
+                    1 =>
+                        [
+                            'value' => '6',
+                            'is_active' => '1',
+                            'label' => 'Category 2',
+                        ],
+                    2 =>
+                        [
+                            'value' => '7',
+                            'is_active' => '1',
+                            'label' => 'Movable',
+                        ],
+                    3 =>
+                        [
+                            'value' => '8',
+                            'is_active' => '0',
+                            'label' => 'Inactive',
+                        ],
+                    4 =>
+                        [
+                            'value' => '9',
+                            'is_active' => '1',
+                            'label' => 'Movable Position 1',
+                        ],
+                    5 =>
+                        [
+                            'value' => '10',
+                            'is_active' => '1',
+                            'label' => 'Movable Position 2',
+                        ],
+                    6 =>
+                        [
+                            'value' => '11',
+                            'is_active' => '1',
+                            'label' => 'Movable Position 3',
+                        ],
+                    7 =>
+                        [
+                            'value' => '12',
+                            'is_active' => '1',
+                            'label' => 'Category 12',
+                        ],
+                ],
+        ],
+];
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/input_meta_for_categories.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/input_meta_for_categories.php
new file mode 100644
index 0000000000000000000000000000000000000000..f43e9c916fcd25723a65f9dd6fde0018f026cd66
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/input_meta_for_categories.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+return [
+    'product-details' =>
+        [
+            'children' =>
+                ['container_category_ids' =>
+                    [
+                        'arguments' =>
+                            [
+                                'data' =>
+                                    [
+                                        'config' =>
+                                            [
+                                                'formElement' => 'container',
+                                                'componentType' => 'container',
+                                                'breakLine' => false,
+                                                'label' => 'Categories',
+                                                'required' => '0',
+                                                'sortOrder' => 70,
+                                            ],
+                                    ],
+                            ],
+                        'children' =>
+                            [
+                                'category_ids' =>
+                                    [
+                                        'arguments' =>
+                                            [
+                                                'data' =>
+                                                    [
+                                                        'config' =>
+                                                            [
+                                                                'dataType' => 'text',
+                                                                'formElement' => 'input',
+                                                                'visible' => '1',
+                                                                'required' => '0',
+                                                                'notice' => null,
+                                                                'default' => null,
+                                                                'label' => 'Categories',
+                                                                'code' => 'category_ids',
+                                                                'source' => 'product-details',
+                                                                'scopeLabel' => '[GLOBAL]',
+                                                                'globalScope' => true,
+                                                                'sortOrder' => 70,
+                                                                'componentType' => 'field',
+                                                            ],
+                                                    ],
+                                            ],
+                                    ],
+                            ],
+                    ]]]];
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute.php
index 963de3e46fea69c821902b8d4266681adc0d5ea8..6b1e53242cb3dcf412525eb1334e398c55a58d8b 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute.php
@@ -3,7 +3,6 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 /* Create attribute */
 /** @var $installer \Magento\Catalog\Setup\CategorySetup */
 $installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..6fe9f0d2b4898fd3cf3a09208272ae87133036f5
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute_rollback.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+/* Delete attribute  with multiselect_attribute code */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry');
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+/** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
+$attribute = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+    'Magento\Catalog\Model\ResourceModel\Eav\Attribute'
+);
+$attribute->load('multiselect_attribute', 'attribute_code');
+$attribute->delete();
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute.php
index f252447a1586d363be145a74e4e7c9fab00d63a6..259b7a9166c32b6a19071ab9a6358fe2494d84c3 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute.php
@@ -3,8 +3,14 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+/**
+ * Create multiselect attribute
+ */
 require __DIR__ . '/multiselect_attribute.php';
 
+/** Create product with options and multiselect attribute */
+
 /** @var $installer \Magento\Catalog\Setup\CategorySetup */
 $installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
     \Magento\Catalog\Setup\CategorySetup::class
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..97937bc3509ea10220c013118449be0e869d47c7
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute_rollback.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+/**
+ * Remove all products as strategy of isolation process
+ */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry');
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+
+/** @var $productCollection \Magento\Catalog\Model\ResourceModel\Product */
+$productCollection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Product')
+    ->getCollection();
+
+foreach ($productCollection as $product) {
+    $product->delete();
+}
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/text_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/text_attribute_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..c81afcaf95d2ea6dbd712229bce891a2cd17d50f
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/text_attribute_rollback.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+/* Delete attribute with text_attribute code */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry');
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+/** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
+$attribute = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+    'Magento\Catalog\Model\ResourceModel\Eav\Attribute'
+);
+$attribute->load('text_attribute', 'attribute_code');
+$attribute->delete();
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/AbstractProductExportImportTestCase.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/AbstractProductExportImportTestCase.php
index 3f566bda2d3525d4375ec58477e9a7cb20d50e7f..c5ebf80c6a060681947e920a686997c48c07b3d2 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/AbstractProductExportImportTestCase.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/AbstractProductExportImportTestCase.php
@@ -6,9 +6,12 @@
 namespace Magento\CatalogImportExport\Model;
 
 use Magento\Framework\App\Bootstrap;
+use Magento\Framework\App\Config;
 use Magento\Framework\App\Filesystem\DirectoryList;
 
 /**
+ * Abstract class for testing product export and import scenarios
+ *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 abstract class AbstractProductExportImportTestCase extends \PHPUnit_Framework_TestCase
@@ -64,6 +67,7 @@ abstract class AbstractProductExportImportTestCase extends \PHPUnit_Framework_Te
         $this->productResource = $this->objectManager->create(
             \Magento\Catalog\Model\ResourceModel\Product::class
         );
+        \Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType::$commonAttributesCache = [];
     }
 
     protected function tearDown()
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php
index dc9e440b045f86ad2e85de45124ac01881d3892c..9087aefa11e8320b7b1113770109904ffc3dcb6a 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php
@@ -7,6 +7,8 @@ namespace Magento\CatalogImportExport\Model\Export;
 
 /**
  * @magentoDataFixtureBeforeTransaction Magento/Catalog/_files/enable_reindex_schedule.php
+ * @magentoAppIsolation enabled
+ * @magentoDbIsolation enabled
  */
 class ProductTest extends \PHPUnit_Framework_TestCase
 {
@@ -66,6 +68,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @magentoDataFixture Magento/CatalogImportExport/_files/product_export_data.php
+     * @magentoDbIsolationEnabled
      */
     public function testExport()
     {
@@ -88,6 +91,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @magentoDataFixture Magento/CatalogImportExport/_files/product_export_with_product_links_data.php
+     * @magentoDbIsolationEnabled
      */
     public function testExportWithProductLinks()
     {
@@ -101,7 +105,9 @@ class ProductTest extends \PHPUnit_Framework_TestCase
 
     /**
      * Verify that all stock item attribute values are exported (aren't equal to empty string)
-     *
+     * 
+     * @magentoAppIsolation enabled
+     * @magentoDbIsolation enabled
      * @covers \Magento\CatalogImportExport\Model\Export\Product::export
      * @magentoDataFixture Magento/CatalogImportExport/_files/product_export_data.php
      */
@@ -163,7 +169,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
 
     /**
      * Verifies if exception processing works properly
-     *
+     * @magentoDbIsolation enabled
      * @magentoDataFixture Magento/CatalogImportExport/_files/product_export_data.php
      */
     public function testExceptionInGetExportData()
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
index c0e45410952717c783686e05b75d54eabdc6a295..ff21749ccf372d3dae8d07d64406b21e87465b49 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
@@ -24,7 +24,8 @@ use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface;
 
 /**
  * Class ProductTest
- *
+ * @magentoAppIsolation enabled
+ * @magentoDbIsolation enabled
  * @magentoDataFixtureBeforeTransaction Magento/Catalog/_files/enable_reindex_schedule.php
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data.php
index ffee568b0622fa8ef3f5af185e24805367ee9203..f7fd7cec31996908d0a6ed5b76ad5d6ada302381 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data.php
@@ -3,12 +3,13 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
-\Magento\TestFramework\Helper\Bootstrap::getInstance()->reinitialize();
-
+/** Create category */
 require dirname(dirname(__DIR__)) . '/Catalog/_files/category.php';
+/** Create fixture store */
 require dirname(dirname(__DIR__)) . '/Store/_files/second_store.php';
+/** Create product with multiselect attribute and values */
 require dirname(dirname(__DIR__)) . '/Catalog/_files/products_with_multiselect_attribute.php';
+/** Create dummy text attribute */
 require dirname(dirname(__DIR__)) . '/Catalog/_files/product_text_attribute.php';
 
 $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdb65e731f8255aba9c26c750f1d74760ea6fc59
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data_rollback.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/** Delete all products */
+require dirname(dirname(__DIR__)) . '/Catalog/_files/products_with_multiselect_attribute_rollback.php';
+/** Delete text attribute */
+require dirname(dirname(__DIR__)) . '/Catalog/_files/text_attribute_rollback.php';
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data.php
index fcbf58a44e569aa80f2cfe94251ca7e1859a8483..bf5f4f96eed0221a6f1579508bfce5636caf7cf4 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data.php
@@ -3,9 +3,11 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
+/** Create category  */
 require dirname(dirname(__DIR__)) . '/Catalog/_files/category.php';
+/** Create fixture store */
 require dirname(dirname(__DIR__)) . '/Store/_files/second_store.php';
+/** Create product with mulselect attribute */
 require dirname(dirname(__DIR__)) . '/Catalog/_files/products_with_multiselect_attribute.php';
 
 $productModel = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..519568103b9dabb3bd6abf42b386ce6ebd5cc32d
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data_rollback.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/** Remove fixture category */
+require dirname(dirname(__DIR__)) . '/Catalog/_files/category_rollback.php';
+/** Remove fixture store */
+require dirname(dirname(__DIR__)) . '/Store/_files/second_store_rollback.php';
+/** Delete all products */
+require dirname(dirname(__DIR__)) . '/Catalog/_files/products_with_multiselect_attribute_rollback.php';
diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php
index 6322a60cef8a5fda1b50e220b10de7c5385956d4..783baba407da5a3365a5c08e65ae78c35afef2e4 100644
--- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php
@@ -80,6 +80,7 @@ class PriceTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
+     * @magentoConfigFixture current_store tax/display/type 1
      * @magentoDataFixture Magento/ConfigurableProduct/_files/tax_rule.php
      * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
      */
diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/configurable_attribute.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/configurable_attribute.php
index 2ef7beb59838f0d052056d2a01932d9d60e1d473..b6fe9d7097e1648196b3b4260c443d019563c7f9 100644
--- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/configurable_attribute.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/configurable_attribute.php
@@ -54,8 +54,9 @@ if (!$attribute->getId()) {
     );
 
     $attributeRepository->save($attribute);
+
+    /* Assign attribute to attribute set */
+    $installer->addAttributeToGroup('catalog_product', 'Default', 'General', $attribute->getId());
 }
 
-/* Assign attribute to attribute set */
-$installer->addAttributeToGroup('catalog_product', 'Default', 'General', $attribute->getId());
 $eavConfig->clear();
diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id.php
index 305a6e699125fae655dcf67b36b6ba8772f2a71e..79a2ff32eed54a8a9b3693732536074505b8458f 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Create customer and attach it to custom website with code newwebsite
+ *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
@@ -13,8 +15,10 @@ $website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\
 $website->setName('new Website')->setCode('newwebsite')->save();
 
 $websiteId = $website->getId();
-
-$customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+$storeManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->get(\Magento\Store\Model\StoreManager::class);
+$storeManager->reinitStores();
+$customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
     \Magento\Customer\Model\Customer::class);
 /** @var Magento\Customer\Model\Customer $customer */
 $customer->setWebsiteId(
@@ -47,7 +51,7 @@ $customer->setWebsiteId(
 $customer->isObjectNew(true);
 
 /** @var \Magento\Customer\Model\Address $addressOne  */
-$addressOne = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+$addressOne = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
     \Magento\Customer\Model\Address::class);
 $addressOneData = [
     'firstname' => 'Firstname',
@@ -63,7 +67,7 @@ $addressOne->setData($addressOneData);
 $customer->addAddress($addressOne);
 
 /** @var \Magento\Customer\Model\Address $addressTwo  */
-$addressTwo = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+$addressTwo = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
     \Magento\Customer\Model\Address::class);
 $addressTwoData = [
     'firstname' => 'test firstname',
@@ -79,7 +83,7 @@ $addressTwo->setData($addressTwoData);
 $customer->addAddress($addressTwo);
 
 /** @var \Magento\Customer\Model\Address $addressThree  */
-$addressThree = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+$addressThree = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
     \Magento\Customer\Model\Address::class);
 $addressThreeData = [
     'firstname' => 'removed firstname',
diff --git a/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php b/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a229b64bb7dd10ef29acd5e824dfb5a9b28bfcc8
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Deploy\Console\Command\App;
+
+use Magento\Framework\App\DeploymentConfig;
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Config\File\ConfigFilePool;
+use Magento\Framework\Filesystem\DriverPool;
+use Magento\Framework\ObjectManagerInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class ApplicationDumpCommandTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ApplicationDumpCommand
+     */
+    private $command;
+
+    /**
+     * @var ObjectManagerInterface
+     */
+    private $objectManager;
+
+    public function setUp()
+    {
+        $this->command = Bootstrap::getObjectManager()->get(ApplicationDumpCommand::class);
+        $this->objectManager = Bootstrap::getObjectManager();
+    }
+
+    public function testExecute()
+    {
+        $inputMock = $this->getMock(InputInterface::class);
+        $outputMock = $this->getMock(OutputInterface::class);
+        $outputMock->expects($this->once())
+            ->method('writeln')
+            ->with('<info>Done.</info>');
+        $this->assertEquals(0, $this->command->run($inputMock, $outputMock));
+    }
+
+    public function tearDown()
+    {
+        /** @var ConfigFilePool $configFilePool */
+        $configFilePool = $this->objectManager->get(ConfigFilePool::class);
+        $filePool = $configFilePool->getInitialFilePools();
+        $file = $filePool[ConfigFilePool::LOCAL][ConfigFilePool::APP_CONFIG];
+        /** @var DirectoryList $dirList */
+        $dirList = $this->objectManager->get(DirectoryList::class);
+        $path = $dirList->getPath(DirectoryList::CONFIG);
+        $driverPool = $this->objectManager->get(DriverPool::class);
+        $fileDriver = $driverPool->getDriver(DriverPool::FILE);
+        if ($fileDriver->isExists($path . '/' . $file)) {
+            unlink($path . '/' . $file);
+        }
+        /** @var DeploymentConfig $deploymentConfig */
+        $deploymentConfig = $this->objectManager->get(DeploymentConfig::class);
+        $deploymentConfig->resetData();
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Directory/Block/DataTest.php b/dev/tests/integration/testsuite/Magento/Directory/Block/DataTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b0c08ed1792fc8f17b42d263436b4701bf865d7c
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Directory/Block/DataTest.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Directory\Block;
+
+use Magento\TestFramework\Helper\CacheCleaner;
+
+class DataTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Directory\Block\Data
+     */
+    private $block;
+
+    protected function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->block = $objectManager->get(\Magento\Directory\Block\Data::class);
+    }
+
+    public function testGetCountryHtmlSelect()
+    {
+        CacheCleaner::cleanAll();
+        $result = $this->block->getCountryHtmlSelect();
+        $resultTwo = $this->block->getCountryHtmlSelect();
+        $this->assertEquals($result, $resultTwo);
+    }
+
+    public function testGetRegionHtmlSelect()
+    {
+        CacheCleaner::cleanAll();
+        $result = $this->block->getRegionHtmlSelect();
+        $resultTwo = $this->block->getRegionHtmlSelect();
+        $this->assertEquals($result, $resultTwo);
+    }
+}
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 8db369facf97f4d61dd8468dd34db67b5250bf13..d25e0406882377e1ef5e6ab89c21bf5a1368496c 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
@@ -5,9 +5,7 @@
  */
 namespace Magento\DownloadableImportExport\Model\Import\Product\Type;
 
-use Magento\Framework\App\Bootstrap;
 use Magento\Framework\App\Filesystem\DirectoryList;
-use Magento\ImportExport\Model\Import;
 
 /**
  * @magentoAppArea adminhtml
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..4cb90c2c98c56185f99f3b1e1759fc40aa73d179
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Eav/Model/ConfigTest.php
@@ -0,0 +1,40 @@
+<?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;
+use Magento\TestFramework\Helper\CacheCleaner;
+
+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';
+        CacheCleaner::cleanAll();
+        $this->assertEquals(
+            $this->config->getEntityAttributeCodes($entityType),
+            $this->config->getEntityAttributeCodes($entityType)
+        );
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php b/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php
index be9c2afe32f42cc0da7ebc591fc144cae8ad39e2..5144c31bfd1486ffb0f0be013cdc98d992e57900 100644
--- a/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php
+++ b/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php
@@ -12,6 +12,7 @@ use Magento\Framework\Phrase;
 use Magento\Setup\Module\I18n\Locale;
 
 /**
+ * @magentoAppIsolation enabled
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class FilterTest extends \PHPUnit_Framework_TestCase
diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/Config/DataTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/Config/DataTest.php
index 25187acef3950ead32082e338c9bdf06f402ece7..5a5a6fa0cf99c345c92dc28bed32d84d79d342af 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/App/Config/DataTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/App/Config/DataTest.php
@@ -5,6 +5,9 @@
  */
 namespace Magento\Framework\App\Config;
 
+use Magento\Framework\App\Config;
+use Magento\Framework\App\ObjectManager;
+
 class DataTest extends \PHPUnit_Framework_TestCase
 {
     const SAMPLE_CONFIG_PATH = 'web/unsecure/base_url';
@@ -45,6 +48,8 @@ class DataTest extends \PHPUnit_Framework_TestCase
         \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\App\CacheInterface::class)
             ->clean([\Magento\Framework\App\Config::CACHE_TAG]);
         \Magento\TestFramework\Helper\Bootstrap::getInstance()->reinitialize();
+        $appConfig = ObjectManager::getInstance()->get(Config::class);
+        $appConfig->clean();
     }
 
     protected function setUp()
diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/Config/InitialTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/Config/InitialTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a98704a130b3bb74c2fc14df9d7b2d4efa0205f8
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/App/Config/InitialTest.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+use Magento\TestFramework\Helper\CacheCleaner;
+use Magento\TestFramework\ObjectManager;
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\Framework\App\Config\Initial as Config;
+
+class InitialTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+    }
+
+    public function testGetMetadata()
+    {
+        CacheCleaner::cleanAll();
+        $this->assertEquals(
+            $this->objectManager->create(Config::class)->getMetadata(),
+            $this->objectManager->create(Config::class)->getMetadata()
+        );
+    }
+
+    /**
+     * @param string $scope
+     * @dataProvider getDataDataProvider
+     */
+    public function testGetData($scope)
+    {
+        CacheCleaner::cleanAll();
+        $this->assertEquals(
+            $this->objectManager->create(Config::class)->getData($scope),
+            $this->objectManager->create(Config::class)->getData($scope)
+        );
+    }
+
+    public function getDataDataProvider()
+    {
+        return [
+            ['default'],
+            ['stores|default'],
+            ['websites|default']
+        ];
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/ObjectManager/ConfigLoaderTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/ObjectManager/ConfigLoaderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..30e9c09e9b4c5b834a4e071ed3d74be1c6d27029
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/App/ObjectManager/ConfigLoaderTest.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\ObjectManager;
+
+use Magento\TestFramework\Helper\CacheCleaner;
+
+class ConfigLoaderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Framework\App\ObjectManager\ConfigLoader
+     */
+    private $object;
+
+    protected function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->object = $objectManager->create(
+            \Magento\Framework\App\ObjectManager\ConfigLoader::class
+        );
+    }
+
+    public function testLoad()
+    {
+        CacheCleaner::cleanAll();
+        $data = $this->object->load('global');
+        $this->assertNotEmpty($data);
+        $cachedData = $this->object->load('global');
+        $this->assertEquals($data, $cachedData);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/Route/ConfigTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/Route/ConfigTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d0c4b562952ba0f0b36ba88088430eb87fdb40d7
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/App/Route/ConfigTest.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Route;
+
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\TestFramework\Helper\CacheCleaner;
+use Magento\TestFramework\ObjectManager;
+
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+    }
+
+    /**
+     * @param string $route
+     * @param string $scope
+     * @dataProvider getRouteFrontNameDataProvider
+     */
+    public function testGetRouteFrontName($route, $scope)
+    {
+        CacheCleaner::cleanAll();
+        $this->assertEquals(
+            $this->objectManager->create(Config::class)->getRouteFrontName($route, $scope),
+            $this->objectManager->create(Config::class)->getRouteFrontName($route, $scope)
+        );
+    }
+
+    public function getRouteFrontNameDataProvider()
+    {
+        return [
+            ['adminhtml', 'adminhtml'],
+            ['catalog', 'frontend'],
+        ];
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Interception/AbstractPlugin.php b/dev/tests/integration/testsuite/Magento/Framework/Interception/AbstractPlugin.php
index 5c0406ec372a5b0055bca2ef1171ea0d7841282f..43b962851c3bfb68fe9aa0e0a20711266f50aebc 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Interception/AbstractPlugin.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Interception/AbstractPlugin.php
@@ -71,6 +71,7 @@ abstract class AbstractPlugin extends \PHPUnit_Framework_TestCase
             $definitions
         );
         $interceptionDefinitions = new Definition\Runtime();
+        $json = new \Magento\Framework\Serialize\Serializer\Json();
         $sharedInstances = [
             \Magento\Framework\Config\CacheInterface::class                      => $cache,
             \Magento\Framework\Config\ScopeInterface::class                      => $configScope,
@@ -79,7 +80,8 @@ abstract class AbstractPlugin extends \PHPUnit_Framework_TestCase
             \Magento\Framework\ObjectManager\ConfigInterface::class              => $config,
             \Magento\Framework\Interception\ObjectManager\ConfigInterface::class => $config,
             \Magento\Framework\ObjectManager\DefinitionInterface::class          => $definitions,
-            \Magento\Framework\Interception\DefinitionInterface::class           => $interceptionDefinitions
+            \Magento\Framework\Interception\DefinitionInterface::class           => $interceptionDefinitions,
+            \Magento\Framework\Serialize\SerializerInterface::class              => $json,
         ];
         $this->_objectManager = new \Magento\Framework\ObjectManager\ObjectManager(
             $factory,
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Reflection/MethodsMapTest.php b/dev/tests/integration/testsuite/Magento/Framework/Reflection/MethodsMapTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..992b6a59382e7c3b5e67e6f8e3b6df6dfbaad2ab
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Reflection/MethodsMapTest.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Test case for \Magento\Framework\Profiler
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Reflection;
+
+use Magento\TestFramework\Helper\CacheCleaner;
+
+class MethodsMapTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Framework\Reflection\MethodsMap */
+    private $object;
+
+    protected function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->object = $objectManager->create(
+            \Magento\Framework\Reflection\MethodsMap::class
+        );
+    }
+
+    public function testGetMethodsMap()
+    {
+        CacheCleaner::cleanAll();
+        $data = $this->object->getMethodsMap(\Magento\Framework\Reflection\MethodsMap::class);
+        $this->assertArrayHasKey('getMethodsMap', $data);
+        $cachedData = $this->object->getMethodsMap(\Magento\Framework\Reflection\MethodsMap::class);
+        $this->assertEquals($data, $cachedData);
+    }
+
+    public function testGetMethodParams()
+    {
+        CacheCleaner::cleanAll();
+        $data = $this->object->getMethodParams(
+            \Magento\Framework\Reflection\MethodsMap::class,
+            'getMethodParams'
+        );
+        $this->assertCount(2, $data);
+        $cachedData = $this->object->getMethodParams(
+            \Magento\Framework\Reflection\MethodsMap::class,
+            'getMethodParams'
+        );
+        $this->assertEquals($data, $cachedData);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/filterable_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/filterable_attribute_rollback.php
index 9498a4251be1274d6e92313a32c90825398ac053..214f2b1dda5de0ee5c0be976664ef76730f6e189 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/filterable_attribute_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/filterable_attribute_rollback.php
@@ -3,7 +3,6 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 /* Create attribute */
 /** @var $installer \Magento\Catalog\Setup\CategorySetup */
 $installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
diff --git a/dev/tests/integration/testsuite/Magento/Framework/TranslateCachingTest.php b/dev/tests/integration/testsuite/Magento/Framework/TranslateCachingTest.php
index fbbc2ffc7bd1bdeee03e9f612e6bc2a3ee6fc3a2..e2b1982ba534c9c6ac84e18fc25f50ec4c6cd661 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/TranslateCachingTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/TranslateCachingTest.php
@@ -6,8 +6,12 @@
 namespace Magento\Framework;
 
 use Magento\TestFramework\Helper\Bootstrap;
-use Magento\Framework\Phrase;
 
+/**
+ * Class TranslateCachingTest
+ * @package Magento\Framework
+ * @magentoAppIsolation enabled
+ */
 class TranslateCachingTest extends \PHPUnit_Framework_TestCase
 {
     /**
diff --git a/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php b/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php
index 2af602ff91850720845b73f04cd74b6c610714a0..93043a5deb12ae36c324ee56208124b1d5bccfd9 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php
@@ -6,13 +6,18 @@
 namespace Magento\Framework;
 
 use Magento\TestFramework\Helper\Bootstrap;
+use Magento\TestFramework\Helper\CacheCleaner;
 
 /**
+ * @magentoAppIsolation enabled
  * @magentoCache all disabled
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class TranslateTest extends \PHPUnit_Framework_TestCase
 {
+    /** @var \Magento\Framework\Translate */
+    private $translate;
+
     protected function setUp()
     {
         /** @var \Magento\Framework\View\FileSystem $viewFileSystem */
@@ -36,6 +41,7 @@ class TranslateTest extends \PHPUnit_Framework_TestCase
 
         $viewFileSystem->expects($this->any())->method('getDesignTheme')->will($this->returnValue($theme));
 
+        /** @var \Magento\TestFramework\ObjectManager $objectManager */
         $objectManager = Bootstrap::getObjectManager();
         $objectManager->addSharedInstance($viewFileSystem, \Magento\Framework\View\FileSystem::class);
 
@@ -71,19 +77,31 @@ class TranslateTest extends \PHPUnit_Framework_TestCase
 
         $objectManager->addSharedInstance($designModel, \Magento\Theme\Model\View\Design\Proxy::class);
 
-        $model = $objectManager->create(\Magento\Framework\Translate::class);
-        $objectManager->addSharedInstance($model, \Magento\Framework\Translate::class);
+        $this->translate = $objectManager->create(\Magento\Framework\Translate::class);
+        $objectManager->addSharedInstance($this->translate, \Magento\Framework\Translate::class);
         $objectManager->removeSharedInstance(\Magento\Framework\Phrase\Renderer\Composite::class);
         $objectManager->removeSharedInstance(\Magento\Framework\Phrase\Renderer\Translate::class);
-        \Magento\Framework\Phrase::setRenderer($objectManager->get(\Magento\Framework\Phrase\RendererInterface::class));
-        $model->loadData(\Magento\Framework\App\Area::AREA_FRONTEND);
+        \Magento\Framework\Phrase::setRenderer(
+            $objectManager->get(\Magento\Framework\Phrase\RendererInterface::class)
+        );
+    }
+
+    public function testLoadData()
+    {
+        $data = $this->translate->loadData(null, true)->getData();
+        CacheCleaner::cleanAll();
+        $this->translate->loadData()->getData();
+        $dataCached = $this->translate->loadData()->getData();
+        $this->assertEquals($data, $dataCached);
     }
 
     /**
+     * @magentoCache all disabled
      * @dataProvider translateDataProvider
      */
     public function testTranslate($inputText, $expectedTranslation)
     {
+        $this->translate->loadData(\Magento\Framework\App\Area::AREA_FRONTEND);
         $actualTranslation = new \Magento\Framework\Phrase($inputText);
         $this->assertEquals($expectedTranslation, $actualTranslation);
     }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/Element/UiComponent/Config/Provider/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Framework/View/Element/UiComponent/Config/Provider/TemplateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2e5ab7215ff00fa76428d027d8289f7bb2dc3bb
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/Element/UiComponent/Config/Provider/TemplateTest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\View\Element\UiComponent\Config\Provider;
+
+use \Magento\TestFramework\Helper\Bootstrap;
+use Magento\TestFramework\Helper\CacheCleaner;
+
+/**
+ * @magentoComponentsDir Magento/Framework/View/_files/UiComponent/theme
+ * @magentoAppIsolation enabled
+ * @magentoDbIsolation enabled
+ */
+class TemplateTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Framework\ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var \Magento\Framework\View\Element\UiComponent\Config\Provider\Template
+     */
+    private $model;
+
+    protected function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+        $this->registerThemes();
+        $this->objectManager->addSharedInstance(
+            $this->objectManager->create(
+                \Magento\Framework\App\Arguments\ValidationState::class,
+                ['appMode' => 'default']
+            ),
+            \Magento\Framework\App\Arguments\ValidationState::class
+        );
+        $this->model = $this->objectManager->create(
+            \Magento\Framework\View\Element\UiComponent\Config\Provider\Template::class
+        );
+    }
+
+    public function testGetTemplate()
+    {
+        $expected = file_get_contents(__DIR__ . '/../../../../_files/UiComponent/expected/config.xml');
+
+        \Magento\TestFramework\Helper\Bootstrap::getInstance()->loadArea('adminhtml');
+        $this->objectManager->get(\Magento\Framework\View\DesignInterface::class)
+            ->setDesignTheme('FrameworkViewUiComponent/default');
+        CacheCleaner::cleanAll();
+
+        $resultOne = $this->model->getTemplate('test.xml');
+        $resultTwo = $this->model->getTemplate('test.xml');
+
+        $this->assertXmlStringEqualsXmlString($expected, $resultOne);
+        $this->assertXmlStringEqualsXmlString($expected, $resultTwo);
+    }
+
+    /**
+     * Register themes in the fixture folder
+     */
+    protected function registerThemes()
+    {
+        /** @var \Magento\Theme\Model\Theme\Registration $registration */
+        $registration = $this->objectManager->get(
+            \Magento\Theme\Model\Theme\Registration::class
+        );
+        $registration->register();
+    }
+
+    protected function tearDown()
+    {
+        $this->objectManager->removeSharedInstance(
+            \Magento\Framework\App\Arguments\ValidationState::class
+        );
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/expected/config.xml b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/expected/config.xml
new file mode 100644
index 0000000000000000000000000000000000000000..467afb2004cbe9d85b92ef8aba0778abec26a420
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/expected/config.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
+    <argument name="data" xsi:type="array" type="array">
+        <item name="buttons" xsi:type="array">
+            <item name="save" xsi:type="string">Magento\Catalog\Block\Adminhtml\Product\Edit\Button\CreateCategory</item>
+        </item>
+        <item name="js_config" xsi:type="array">
+            <item name="provider" xsi:type="string">new_category_form.new_category_form_data_source</item>
+        </item>
+    </argument>
+</form>
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Catalog/ui_component/test.xml b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Catalog/ui_component/test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e0bd296bfda2b1d9096b115e2176b2df17059648
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Catalog/ui_component/test.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
+    <argument name="data" xsi:type="array">
+        <item name="js_config" xsi:type="array">
+            <item name="provider" xsi:type="string">new_category_form.new_category_form_data_source</item>
+        </item>
+    </argument>
+</form>
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Customer/ui_component/test.xml b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Customer/ui_component/test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c1e0d46aee53e82eba40994f545231974c2b3523
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Customer/ui_component/test.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
+    <argument name="data" xsi:type="array">
+        <item name="buttons" xsi:type="array">
+            <item name="save" xsi:type="string">Magento\Catalog\Block\Adminhtml\Product\Edit\Button\CreateCategory</item>
+        </item>
+    </argument>
+</form>
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/registration.php b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/registration.php
new file mode 100644
index 0000000000000000000000000000000000000000..42145b38953bdf25371d3a8eaf83b9889c7e27d1
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/registration.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+\Magento\Framework\Component\ComponentRegistrar::register(
+    \Magento\Framework\Component\ComponentRegistrar::THEME,
+    'adminhtml/FrameworkViewUiComponent/default',
+    __DIR__
+);
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/theme.xml b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/theme.xml
new file mode 100644
index 0000000000000000000000000000000000000000..96de1f7bebee0d46e22e984e97ae61983e6cd5ca
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/theme.xml
@@ -0,0 +1,9 @@
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<theme xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Config/etc/theme.xsd">
+    <title>Test theme</title>
+</theme>
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php
index 13d7636b0cbac8721a8c3e0757137f86f1533bd0..fe12480e25879014edd75f47b90876c4e53fddeb 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\Sales\Model\Order;
 
+/**
+ * Class ShipmentTest
+ * @magentoAppIsolation enabled
+ * @package Magento\Sales\Model\Order
+ */
 class ShipmentTest extends \PHPUnit_Framework_TestCase
 {
     /**
diff --git a/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php b/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php
index cdf0a38d249150a9454d580353c938b26637103e..155431ba67f1e2cba89b1cb973e17776aed666ef 100644
--- a/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php
@@ -21,7 +21,7 @@ class SwitchActionTest extends \Magento\TestFramework\TestCase\AbstractControlle
      */
     public function testExecuteWithCustomDefaultStore()
     {
-
+        \Magento\TestFramework\Helper\Bootstrap::getInstance()->reinitialize();
         $defaultStoreCode = 'default';
         $modifiedDefaultCode = 'modified_default_code';
         $this->changeStoreCode($defaultStoreCode, $modifiedDefaultCode);
diff --git a/dev/tests/integration/testsuite/Magento/Store/Model/StoreResolverTest.php b/dev/tests/integration/testsuite/Magento/Store/Model/StoreResolverTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2aa803bc010599cc6a02554b9c23b36ad47b8f2
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Store/Model/StoreResolverTest.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Store\Model;
+
+use Magento\TestFramework\Helper\CacheCleaner;
+
+class StoreResolverTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\TestFramework\ObjectManager */
+    private $objectManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->block = $this->objectManager->get(\Magento\Directory\Block\Data::class);
+    }
+
+    public function testGetStoreData()
+    {
+        $methodGetStoresData = new \ReflectionMethod(\Magento\Store\Model\StoreResolver::class, 'getStoresData');
+        $methodGetStoresData->setAccessible(true);
+        $methodReadStoresData = new \ReflectionMethod(\Magento\Store\Model\StoreResolver::class, 'readStoresData');
+        $methodReadStoresData->setAccessible(true);
+
+        $storeResolver = $this->objectManager->get(\Magento\Store\Model\StoreResolver::class);
+
+        $storesDataRead = $methodReadStoresData->invoke($storeResolver);
+        CacheCleaner::cleanAll();
+        $storesData = $methodGetStoresData->invoke($storeResolver);
+        $storesDataCached = $methodGetStoresData->invoke($storeResolver);
+        $this->assertEquals($storesDataRead, $storesData);
+        $this->assertEquals($storesDataRead, $storesDataCached);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/scope.config.fixture.php b/dev/tests/integration/testsuite/Magento/Store/_files/scope.config.fixture.php
new file mode 100644
index 0000000000000000000000000000000000000000..1bf8fa811183391f3450c185bee4f25579dfbf21
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/scope.config.fixture.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Fixture which retrieve dummy scopes
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+return [
+
+];
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php
index b75c491b36a0e9c013707aec4155f7454eb5a8ba..91b30888194f44a007528ddc557784e58cab5fd6 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Create fixture store
+ *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
@@ -26,9 +28,9 @@ if (!$store->load('fixture_second_store', 'code')->getId()) {
         1
     );
     $store->save();
-
-    /* Refresh stores memory cache */
-    \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
-        \Magento\Store\Model\StoreManagerInterface::class
-    )->reinitStores();
 }
+
+/* Refresh stores memory cache */
+\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+    \Magento\Store\Model\StoreManagerInterface::class
+)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/store.php b/dev/tests/integration/testsuite/Magento/Store/_files/store.php
index 9bb761f0b6a136c5b01c50ba2c5a1942716db18e..35ade6fe3a4358c865196157e041d5cd465f6388 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/store.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/store.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Create fixture store with code test
+ *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
@@ -19,3 +21,6 @@ if (!$store->load('test', 'code')->getId()) {
     );
     $store->save();
 }
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+/* Refresh stores memory cache */
+$objectManager->get('Magento\Store\Model\StoreManagerInterface')->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/website.php b/dev/tests/integration/testsuite/Magento/Store/_files/website.php
index 4e1f03fcadb58acea0d69fb9cb195437f9355030..dfe04879548ccbb88a7db58e762f8aab1e05b969 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/website.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/website.php
@@ -8,3 +8,7 @@
 $website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Store\Model\Website::class);
 $website->setData(['code' => 'test', 'name' => 'Test Website', 'default_group_id' => '1', 'is_default' => '0']);
 $website->save();
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+/* Refresh stores memory cache */
+$objectManager->get('Magento\Store\Model\StoreManagerInterface')->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Theme/Model/DesignTest.php b/dev/tests/integration/testsuite/Magento/Theme/Model/DesignTest.php
index 6cd9746daca3325eafcf730a462b9c0226db9ba0..f450f1b3d0cbe2309611ee673493bfdddfad9f5d 100644
--- a/dev/tests/integration/testsuite/Magento/Theme/Model/DesignTest.php
+++ b/dev/tests/integration/testsuite/Magento/Theme/Model/DesignTest.php
@@ -5,6 +5,9 @@
  */
 namespace Magento\Theme\Model;
 
+use Magento\Backend\Block\Widget\Grid\Serializer;
+use Magento\Framework\Serialize\SerializerInterface;
+
 class DesignTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -121,7 +124,8 @@ class DesignTest extends \PHPUnit_Framework_TestCase
         )->load(
             $cacheId
         );
-        $cachedDesign = unserialize($cachedDesign);
+        $serializer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(SerializerInterface::class);
+        $cachedDesign = $serializer->unserialize($cachedDesign);
 
         $this->assertInternalType('array', $cachedDesign);
         $this->assertArrayHasKey('design', $cachedDesign);
@@ -139,7 +143,8 @@ class DesignTest extends \PHPUnit_Framework_TestCase
         )->load(
             $cacheId
         );
-        $cachedDesign = unserialize($cachedDesign);
+
+        $cachedDesign = $serializer->unserialize($cachedDesign);
 
         $this->assertTrue(is_array($cachedDesign));
         $this->assertEquals($cachedDesign['design'], $design->getDesign());
diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php
index 54f4a030992803ff60cdd9cdffacc5879056069b..8e820c1d22c10a6c055cbe45f950465ba40cfe1f 100644
--- a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php
+++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php
@@ -146,6 +146,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
      * Test fields disabled status
      * @dataProvider fieldsStateDataProvider
      * @magentoAppIsolation enabled
+     * @magentoConfigFixture current_store general/single_store_mode/enabled 0
      */
     public function testReadonlyFields($urlRewrite, $fields)
     {
diff --git a/dev/tests/integration/testsuite/Magento/User/Helper/DataTest.php b/dev/tests/integration/testsuite/Magento/User/Helper/DataTest.php
index 4c0a81b41efd42f05c1fe5b83cbbb36ede2cedee..c197f3f86d22f1dbe4aa5d57051f945b5668045c 100644
--- a/dev/tests/integration/testsuite/Magento/User/Helper/DataTest.php
+++ b/dev/tests/integration/testsuite/Magento/User/Helper/DataTest.php
@@ -42,7 +42,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
     {
         /** @var $configModel \Magento\Backend\App\ConfigInterface */
         $configModel = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
-            \Magento\Backend\App\ConfigInterface::class
+            \Magento\Framework\App\Config\MutableScopeConfigInterface::class
         );
         $this->assertEquals(
             2,
diff --git a/dev/tests/static/framework/Magento/Sniffs/Translation/ConstantUsageSniff.php b/dev/tests/static/framework/Magento/Sniffs/Translation/ConstantUsageSniff.php
index 260f731aecf1ce30d60cbd5dee1c2fb0f20074d2..4f9082aa4eb2124072b3c9fe39ddd50a901b7bd1 100644
--- a/dev/tests/static/framework/Magento/Sniffs/Translation/ConstantUsageSniff.php
+++ b/dev/tests/static/framework/Magento/Sniffs/Translation/ConstantUsageSniff.php
@@ -5,12 +5,10 @@
  */
 namespace Magento\Sniffs\Translation;
 
-use PHP_CodeSniffer_File;
-
 /**
  * Make sure that constants are not used as the first argument of translation function.
  */
-class ConstantUsageSniff extends \Generic_Sniffs_Files_LineLengthSniff
+class ConstantUsageSniff implements \PHP_CodeSniffer_Sniff
 {
     /**
      * Having previous line content allows to process multi-line declaration.
@@ -20,24 +18,73 @@ class ConstantUsageSniff extends \Generic_Sniffs_Files_LineLengthSniff
     protected $previousLineContent = '';
 
     /**
-     * {@inheritdoc}
+     * {@inheritDoc}
+     */
+    public function register()
+    {
+        return [T_OPEN_TAG];
+
+    }
+
+    /**
+     * Copied from \Generic_Sniffs_Files_LineLengthSniff, minor changes made
+     *
+     * {@inheritDoc}
      */
-    protected function checkLineLength(\PHP_CodeSniffer_File $phpcsFile, $stackPtr, $lineContent)
+    public function process(\PHP_CodeSniffer_File $phpcsFile, $stackPtr)
     {
-        $previousLineRegexp = '~__\($|Phrase\($~';
-        $currentLineRegexp = '~__\(.+\)|Phrase\(.+\)~';
+        $tokens = $phpcsFile->getTokens();
+
+        // Make sure this is the first open tag
+        $previousOpenTag = $phpcsFile->findPrevious(T_OPEN_TAG, ($stackPtr - 1));
+        if ($previousOpenTag !== false) {
+            return;
+        }
+
+        $tokenCount = 0;
+        $currentLineContent = '';
+        $currentLine = 1;
+
+        for (; $tokenCount < $phpcsFile->numTokens; $tokenCount++) {
+            if ($tokens[$tokenCount]['line'] === $currentLine) {
+                $currentLineContent .= $tokens[$tokenCount]['content'];
+            } else {
+                $this->checkIfFirstArgumentConstant($phpcsFile, ($tokenCount - 1), $currentLineContent);
+                $currentLineContent = $tokens[$tokenCount]['content'];
+                $currentLine++;
+            }
+        }
+
+        $this->checkIfFirstArgumentConstant($phpcsFile, ($tokenCount - 1), $currentLineContent);
+    }
+
+    /**
+     * Checks if first argument of \Magento\Framework\Phrase or translation function is a constant
+     *
+     * @param \PHP_CodeSniffer_File $phpcsFile
+     * @param int $stackPtr
+     * @param string $lineContent
+     * @return void
+     */
+    private function checkIfFirstArgumentConstant(
+        \PHP_CodeSniffer_File $phpcsFile,
+        $stackPtr,
+        $lineContent
+    ) {
+        $previousLineRegexp = '/(__|Phrase)\($/im';
+        $currentLineRegexp = '/(__|Phrase)\(.+\)/';
         $currentLineMatch = preg_match($currentLineRegexp, $lineContent) !== 0;
         $previousLineMatch = preg_match($previousLineRegexp, $this->previousLineContent) !== 0;
         $this->previousLineContent = $lineContent;
         $error = 'Constants are not allowed as the first argument of translation function, use string literal instead';
-        $constantRegexp = '[^\'"]+::[A-Z_0-9]+.*';
+        $constantRegexp = '[^\$\'"]+::[A-Z_0-9]+.*';
         if ($currentLineMatch) {
-            $variableRegexp = "~__\({$constantRegexp}\)|Phrase\({$constantRegexp}\)~";
+            $variableRegexp = "/(__|Phrase)\({$constantRegexp}\)/";
             if (preg_match($variableRegexp, $lineContent) !== 0) {
                 $phpcsFile->addError($error, $stackPtr, 'VariableTranslation');
             }
         } else if ($previousLineMatch) {
-            $variableRegexp = "~^\s+{$constantRegexp}~";
+            $variableRegexp = "/^{$constantRegexp}/";
             if (preg_match($variableRegexp, $lineContent) !== 0) {
                 $phpcsFile->addError($error, $stackPtr, 'VariableTranslation');
             }
diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php b/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php
index d71c03eb0f85d01634f6f3a28c185c37e84bc1b2..a25b16c2277f3e7052840e9cf1fbbe2660cc4462 100644
--- a/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php
+++ b/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php
@@ -7,6 +7,7 @@
 namespace Magento\TestFramework\Utility;
 
 use Magento\Framework\App\Utility\Files;
+use Magento\TestFramework\Utility\File\RegexIteratorFactory;
 
 /**
  * A helper to gather various changed files
@@ -15,6 +16,11 @@ use Magento\Framework\App\Utility\Files;
  */
 class ChangedFiles
 {
+    /**
+     * File path with changed files content.
+     */
+    const CHANGED_FILES_CONTENT_FILE = '/dev/tests/static/testsuite/Magento/Test/_files/changed_%s_files_content.json';
+
     /**
      * Returns array of PHP-files, that use or declare Magento application classes and Magento libs
      *
@@ -23,7 +29,7 @@ class ChangedFiles
      */
     public static function getPhpFiles($changedFilesList)
     {
-        $fileHelper = \Magento\Framework\App\Utility\Files::init();
+        $fileUtilities = new File(Files::init(), new RegexIteratorFactory());
         if (isset($_ENV['INCREMENTAL_BUILD'])) {
             $phpFiles = [];
             foreach (glob($changedFilesList) as $listFile) {
@@ -36,29 +42,45 @@ class ChangedFiles
                 }
             );
             if (!empty($phpFiles)) {
-                $phpFiles = \Magento\Framework\App\Utility\Files::composeDataSets($phpFiles);
-                $phpFiles = array_intersect_key($phpFiles, $fileHelper->getPhpFiles(
-                    Files::INCLUDE_APP_CODE
-                    | Files::INCLUDE_PUB_CODE
-                    | Files::INCLUDE_LIBS
-                    | Files::INCLUDE_TEMPLATES
-                    | Files::INCLUDE_TESTS
-                    | Files::AS_DATA_SET
-                    | Files::INCLUDE_NON_CLASSES
-                ));
+                $phpFiles = Files::composeDataSets($phpFiles);
+                $phpFiles = array_intersect_key($phpFiles, $fileUtilities->getPhpFiles());
             }
         } else {
-            $phpFiles = $fileHelper->getPhpFiles(
-                Files::INCLUDE_APP_CODE
-                | Files::INCLUDE_PUB_CODE
-                | Files::INCLUDE_LIBS
-                | Files::INCLUDE_TEMPLATES
-                | Files::INCLUDE_TESTS
-                | Files::AS_DATA_SET
-                | Files::INCLUDE_NON_CLASSES
-            );
+            $phpFiles = $fileUtilities->getPhpFiles();
         }
 
         return $phpFiles;
     }
+
+    /**
+     * Get changed content.
+     *
+     * @param string $fileName
+     * @return string
+     */
+    public static function getChangedContent($fileName)
+    {
+        $data = [];
+        $extension = self::getFileExtension($fileName);
+        $fileName = ltrim(str_replace(BP, '', $fileName), DIRECTORY_SEPARATOR);
+        $changedFilesContentFile = BP . sprintf(self::CHANGED_FILES_CONTENT_FILE, $extension);
+        if (file_exists($changedFilesContentFile)) {
+            $changedContent = file_get_contents($changedFilesContentFile);
+            $data = json_decode($changedContent, true);
+        }
+
+        return isset($data[$fileName]) ? $data[$fileName] : '';
+    }
+
+    /**
+     * Get file extension.
+     *
+     * @param string $fileName
+     * @return string
+     */
+    public static function getFileExtension($fileName)
+    {
+        $fileInfo = pathinfo($fileName);
+        return isset($fileInfo['extension']) ? $fileInfo['extension'] : 'unknown';
+    }
 }
diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/File.php b/dev/tests/static/framework/Magento/TestFramework/Utility/File.php
new file mode 100644
index 0000000000000000000000000000000000000000..7a8e02e5143a0808867a4b9c1d1d01b2da7b34f9
--- /dev/null
+++ b/dev/tests/static/framework/Magento/TestFramework/Utility/File.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestFramework\Utility;
+
+use Magento\Framework\App\Utility\Files;
+use Magento\TestFramework\Utility\File\RegexIteratorFactory;
+
+/**
+ * Get list of PHP files including files in setup application
+ */
+class File
+{
+    /**
+     * @var RegexIteratorFactory
+     */
+    private $regexIteratorFactory;
+
+    /**
+     * @var Files
+     */
+    private $fileUtilities;
+
+    /**
+     * Constructor
+     *
+     * @param Files $fileUtilities
+     * @param RegexIteratorFactory $regexIteratorFactory
+     */
+    public function __construct(
+        Files $fileUtilities,
+        RegexIteratorFactory $regexIteratorFactory
+    ) {
+        $this->fileUtilities = $fileUtilities;
+        $this->regexIteratorFactory = $regexIteratorFactory;
+    }
+
+    /**
+     * Get list of PHP files
+     *
+     * @return array
+     * @throws \Exception
+     */
+    public function getPhpFiles()
+    {
+        $files = array_merge(
+            $this->fileUtilities->getPhpFiles(
+                Files::INCLUDE_APP_CODE
+                | Files::INCLUDE_PUB_CODE
+                | Files::INCLUDE_LIBS
+                | Files::INCLUDE_TEMPLATES
+                | Files::INCLUDE_TESTS
+                | Files::INCLUDE_NON_CLASSES
+            ),
+            $this->getSetupPhpFiles()
+        );
+        return Files::composeDataSets($files);
+    }
+
+    /**
+     * Get list of PHP files in setup application
+     *
+     * @param int $flags
+     * @return array
+     */
+    private function getSetupPhpFiles()
+    {
+        $files = [];
+        $regexIterator = $this->regexIteratorFactory->create(
+            BP . '/setup',
+            '/.*php^/'
+        );
+        foreach ($regexIterator as $file) {
+            $files = array_merge($files, [$file]);
+        }
+        return $files;
+    }
+}
diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/File/RegexIteratorFactory.php b/dev/tests/static/framework/Magento/TestFramework/Utility/File/RegexIteratorFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2e5768414f06f13138ba83ebcf34ce7535783e6
--- /dev/null
+++ b/dev/tests/static/framework/Magento/TestFramework/Utility/File/RegexIteratorFactory.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestFramework\Utility\File;
+
+/**
+ * Factory for \RegexIterator
+ */
+class RegexIteratorFactory
+{
+    /**
+     * Create instance of \RegexIterator
+     *
+     * @param string $directoryPath
+     * @param string $regexp
+     * @return \RegexIterator
+     */
+    public function create($directoryPath, $regexp)
+    {
+        $directory = new \RecursiveDirectoryIterator($directoryPath);
+        $recursiveIterator = new \RecursiveIteratorIterator($directory);
+        return new \RegexIterator($recursiveIterator, $regexp, \RegexIterator::GET_MATCH);
+    }
+}
diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/FunctionDetector.php b/dev/tests/static/framework/Magento/TestFramework/Utility/FunctionDetector.php
new file mode 100644
index 0000000000000000000000000000000000000000..69162d3dfba2e6d67acb9c9bad48dbb03fc3c41a
--- /dev/null
+++ b/dev/tests/static/framework/Magento/TestFramework/Utility/FunctionDetector.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestFramework\Utility;
+
+/**
+ * Check if one or more functions are used in the file
+ */
+class FunctionDetector
+{
+    /**
+     * Detect functions in given file
+     *
+     * return result in this format:
+     *  [
+     *      line_number => [
+     *          function_name_1,
+     *          function_name_2,
+     *          function_name_3,
+     *      ],
+     *      line_number => [
+     *          function_name_1,
+     *          function_name_2,
+     *          function_name_3,
+     *      ],
+     *  ]
+     *
+     * @param string $filePath
+     * @param string[] $functions
+     * @return array
+     */
+    public function detect($filePath, $functions)
+    {
+        $result = [];
+        $regexp = $this->composeRegexp($functions);
+
+        if (!$regexp) {
+            return $result;
+        }
+
+        $fileContent = \Magento\TestFramework\Utility\ChangedFiles::getChangedContent($filePath);
+        $file = file($filePath);
+
+        return $fileContent
+            ? $this->grepChangedContent($file, $regexp, $functions, $fileContent)
+            : $this->grepFile($file, $regexp);
+    }
+
+    /**
+     * Grep only changed content.
+     *
+     * @param array $file
+     * @param string $regexp
+     * @param string[] $functions
+     * @param string $fileContent
+     * @return array
+     */
+    public function grepChangedContent(array $file, $regexp, $functions, $fileContent)
+    {
+        $result = [];
+        $matches = preg_grep($regexp, explode("\n", $fileContent));
+        if (!empty($matches)) {
+            foreach ($matches as $line) {
+                $actualFunctions = [];
+                foreach ($functions as $function) {
+                    if (false !== strpos($line, $function)) {
+                        $actualFunctions[] = $function;
+                    }
+                }
+                $result[array_search($line . "\n", $file) + 1] = $actualFunctions;
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Grep File.
+     *
+     * @param array $file
+     * @param string $regexp
+     * @return array
+     */
+    public function grepFile(array $file, $regexp)
+    {
+        $result = [];
+        array_unshift($file, '');
+        $lines = preg_grep($regexp, $file);
+        foreach ($lines as $lineNumber => $line) {
+            if (preg_match_all($regexp, $line, $matches)) {
+                $result[$lineNumber] = $matches[1];
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Compose regular expression
+     *
+     * @param array $functions
+     * @return string
+     */
+    private function composeRegexp(array $functions)
+    {
+        if (empty($functions)) {
+            return '';
+        }
+        return '/(?<!function |->|::)\b(' . join('|', $functions) . ')\s*\(/i';
+    }
+}
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/ConstantUsageSniffTest.php b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/ConstantUsageSniffTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a64d47054ede9bc1f695514aa8f3ef95fc1e8eeb
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/ConstantUsageSniffTest.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Sniffs\Translation;
+
+class ConstantUsageSniffTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHP_CodeSniffer_File|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $fileMock;
+
+    /**
+     * @var ConstantUsageSniff
+     */
+    private $constantUsageSniff;
+
+    protected function setUp()
+    {
+        $this->fileMock = $this->getMock(\PHP_CodeSniffer_File::class, [], [], '', false);
+        $this->constantUsageSniff = new ConstantUsageSniff();
+    }
+
+    /**
+     * @param string $file
+     * @param int $numIncorrectUsages
+     * @dataProvider processDataProvider
+     */
+    public function testProcessIncorrectArguments($file, $numIncorrectUsages)
+    {
+        $stackPtr = 10;
+        $fileContent = file_get_contents(__DIR__ . '/_files/' . $file);
+        $tokens = $this->tokenizeString($fileContent);
+        $this->fileMock->expects($this->once())
+            ->method('findPrevious')
+            ->with(
+                T_OPEN_TAG,
+                $stackPtr - 1
+            )
+            ->willReturn(false);
+        $this->fileMock->expects($this->once())
+            ->method('getTokens')
+            ->willReturn($tokens);
+        $this->fileMock->numTokens = count($tokens);
+        $this->fileMock->expects($this->exactly($numIncorrectUsages))
+            ->method('addError')
+            ->with(
+                'Constants are not allowed as the first argument of translation function, use string literal instead',
+                $this->anything(),
+                'VariableTranslation'
+            );
+        $this->constantUsageSniff->process($this->fileMock, $stackPtr);
+    }
+
+    /**
+     * Get tokens for a string
+     *
+     * @param string $fileContent
+     * @return array
+     */
+    private function tokenizeString($fileContent)
+    {
+        $lineNumber = 1;
+        $tokens = token_get_all($fileContent);
+        $snifferTokens = [];
+        for ($i = 0; $i < count($tokens); $i++) {
+            $content = is_array($tokens[$i]) ? $tokens[$i][1] : $tokens[$i];
+            $snifferTokens[$i]['line'] = $lineNumber;
+            $snifferTokens[$i]['content'] = $content;
+            $trimmedContent = trim($content, ' ');
+            if ($trimmedContent == PHP_EOL || $trimmedContent == PHP_EOL . PHP_EOL) {
+                $lineNumber++;
+            }
+        }
+        return $snifferTokens;
+    }
+
+    /**
+     * @return array
+     */
+    public function processDataProvider()
+    {
+        return [
+            [
+                'incorrect_arguments.txt',
+                9
+            ],
+            [
+                'correct_arguments.txt',
+                0
+            ]
+        ];
+    }
+}
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/correct_arguments.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/correct_arguments.txt
new file mode 100644
index 0000000000000000000000000000000000000000..536029811fd87972da11ca531cd6787fa59921a4
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/correct_arguments.txt
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+__($variable)
+
+__($variable[Class::CONSTANT])
+
+__($variable[\Namespace\Class::CONSTANT])
+
+__($variable['value'])
+
+__(
+    $variable
+)
+
+Phrase($variable)
+
+Phrase($variable[Class::CONSTANT])
+
+Phrase($variable[\Namespace\Class::CONSTANT])
+
+\Magento\Framework\Phrase($variable['value'])
+
+\Magento\Framework\Phrase(
+    $variable[Class::CONSTANT]
+)
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/incorrect_arguments.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/incorrect_arguments.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6112ce567ce14cc200e4bb648e828fc51d0dbc77
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/incorrect_arguments.txt
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+__(Class::CONSTANT)
+
+__(self::CONSTANT)
+
+__(\Namespace\Class::CONSTANT)
+
+__(
+    Class::CONSTANT
+)
+
+Phrase(Class::CONSTANT)
+
+Phrase(self::CONSTANT)
+
+Phrase(\Namespace\Class::CONSTANT)
+
+\Magento\Framework\Phrase(Class::CONSTANT)
+
+\Magento\Framework\Phrase(
+    Class::CONSTANT
+)
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FileTest.php b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FileTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..be8b246a9330495fd5b859a4feb2552772492e21
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FileTest.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestFramework\Utility;
+
+use Magento\Framework\App\Utility\Files;
+use Magento\TestFramework\Utility\File\RegexIteratorFactory;
+use Magento\TestFramework\Utility\File;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+
+class FileTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Files|PHPUnit_Framework_MockObject_MockObject
+     */
+    private $fileUtilitiesMock;
+
+    /**
+     * @var RegexIteratorFactory|PHPUnit_Framework_MockObject_MockObject
+     */
+    private $regexIteratorFactoryMock;
+
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var File
+     */
+    private $file;
+
+    protected function setUp()
+    {
+        $this->objectManager = new ObjectManager($this);
+        $this->fileUtilitiesMock = $this->getMock(Files::class, [], [], '', false);
+        $this->regexIteratorFactoryMock = $this->getMock(RegexIteratorFactory::class, [], [], '', false);
+        $this->file = $this->objectManager->getObject(
+            File::class,
+            [
+                'fileUtilities' => $this->fileUtilitiesMock,
+                'regexIteratorFactory' => $this->regexIteratorFactoryMock
+            ]
+        );
+    }
+
+    public function testGetPhpFiles()
+    {
+        $appFiles = [
+            'file1',
+            'file2'
+        ];
+        $setupFiles = [
+            'file3'
+        ];
+        $expected = [
+            'file1' => ['file1'],
+            'file2' => ['file2'],
+            'file3' => ['file3']
+        ];
+        $iteratorMock = $this->getMock(\IteratorAggregate::class, [], [], '', false);
+        $iteratorMock->expects($this->any())
+            ->method('getIterator')
+            ->willReturn(new \ArrayIterator($setupFiles));
+        $this->regexIteratorFactoryMock->expects($this->once())
+            ->method('create')
+            ->willReturn($iteratorMock);
+        $this->fileUtilitiesMock->expects($this->once())
+            ->method('getPhpFiles')
+            ->with(
+                Files::INCLUDE_APP_CODE
+                | Files::INCLUDE_PUB_CODE
+                | Files::INCLUDE_LIBS
+                | Files::INCLUDE_TEMPLATES
+                | Files::INCLUDE_TESTS
+                | Files::INCLUDE_NON_CLASSES
+            )
+            ->willReturn($appFiles);
+        $this->assertEquals($expected, $this->file->getPhpFiles());
+    }
+}
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FunctionDetectorTest.php b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FunctionDetectorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a356aaa3cc83b48e4bf310b31d2556ec4c63bc12
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FunctionDetectorTest.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestFramework\Utility;
+
+class FunctionDetectorTest extends \PHPUnit_Framework_TestCase
+{
+    public function testDetectFunctions()
+    {
+        $fixturePath = __DIR__ . '/_files/test.txt';
+        $expectedResults = [
+            1 => ['strtoupper', 'strtolower'],
+            3 => ['foo'],
+            4 => ['foo'],
+        ];
+        $functionDetector = new FunctionDetector();
+        $lines = $functionDetector->detect($fixturePath, ['foo', 'strtoupper', 'test', 'strtolower']);
+        $this->assertEquals($expectedResults, $lines);
+    }
+}
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/test.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c2feb8284b2373bc94f9c16f7b5383fbc60f711a
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/test.txt
@@ -0,0 +1,9 @@
+strtoupper(strtolower($foo . $bar))
+function foo($merchantMd5, $merchantApiLogin)
+$this->generateHash(foo($bar), $foo)
+foo(
+    'bar'
+)
+Foo::bar($foo, $this->getData('bar'))
+$this->foo('bar')
+Foo::foo()
diff --git a/dev/tests/static/get_github_changes.php b/dev/tests/static/get_github_changes.php
index f332208cd17d0861dd1b28bd7096a0b3fe0066a5..16a4f7d8e090de40c4881f1e3a60015bb377396b 100644
--- a/dev/tests/static/get_github_changes.php
+++ b/dev/tests/static/get_github_changes.php
@@ -34,6 +34,8 @@ if (!validateInput($options, $requiredOptions)) {
 
 $fileExtensions = explode(',', isset($options['file-extensions']) ? $options['file-extensions'] : 'php');
 
+include_once __DIR__ . '/framework/autoload.php';
+
 $mainline = 'mainline_' . (string)rand(0, 9999);
 $repo = getRepo($options, $mainline);
 $branches = $repo->getBranches('--remotes');
@@ -41,8 +43,27 @@ generateBranchesList($options['output-file'], $branches, $options['branch']);
 $changes = retrieveChangesAcrossForks($mainline, $repo, $options['branch']);
 $changedFiles = getChangedFiles($changes, $fileExtensions);
 generateChangedFilesList($options['output-file'], $changedFiles);
+saveChangedFileContent($repo);
 cleanup($repo, $mainline);
 
+/**
+ * Save changed file content.
+ *
+ * @param GitRepo $repo
+ * @return void
+ */
+function saveChangedFileContent(GitRepo $repo)
+{
+    $changedFilesContentFileName = BP . Magento\TestFramework\Utility\ChangedFiles::CHANGED_FILES_CONTENT_FILE;
+    foreach ($repo->getChangedContentFiles() as $key => $changedContentFile) {
+        $filePath = sprintf($changedFilesContentFileName, $key);
+        $oldContent = file_exists($filePath) ? file_get_contents($filePath) : '{}';
+        $oldData = json_decode($oldContent, true);
+        $data = array_merge($oldData, $changedContentFile);
+        file_put_contents($filePath, json_encode($data));
+    }
+}
+
 /**
  * Generates a file containing changed files
  *
@@ -170,6 +191,18 @@ class GitRepo
      */
     private $remoteList = [];
 
+    /**
+     * Array of changed content files.
+     *
+     * Example:
+     *         'extension' =>
+     *                      'path_to_file/filename'  => 'Content that was edited',
+     *                      'path_to_file/filename2' => 'Content that was edited',
+     *
+     * @var array
+     */
+    private $changedContentFiles = [];
+
     /**
      * @param string $workTree absolute path to git project
      */
@@ -285,6 +318,9 @@ class GitRepo
                                 'diff HEAD %s/%s -- %s', $remoteAlias, $remoteBranch, $this->workTree . '/' . $fileName)
                         );
                         if ($result) {
+                            if (!(isset($this->changedContentFiles[$fileName]))) {
+                                $this->setChangedContentFile($result, $fileName);
+                            }
                             $filteredChanges[] = $fileName;
                         }
                     }
@@ -295,6 +331,38 @@ class GitRepo
         return $filteredChanges;
     }
 
+    /**
+     * Set changed content for file.
+     *
+     * @param array $content
+     * @param string $fileName
+     * @return void
+     */
+    private function setChangedContentFile(array $content, $fileName)
+    {
+        $changedContent = '';
+        $extension = Magento\TestFramework\Utility\ChangedFiles::getFileExtension($fileName);
+
+        foreach ($content as $item) {
+            if (strpos($item, '---') !== 0 && strpos($item, '-') === 0 && $line = ltrim($item, '-')) {
+                $changedContent .= $line . "\n";
+            }
+        }
+        if ($changedContent !== '') {
+            $this->changedContentFiles[$extension][$fileName] = $changedContent;
+        }
+    }
+
+    /**
+     * Get changed content files collection.
+     *
+     * @return array
+     */
+    public function getChangedContentFiles()
+    {
+        return $this->changedContentFiles;
+    }
+
     /**
      * Makes call ro git cli
      *
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/ApiAnnotationTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/ApiAnnotationTest.php
deleted file mode 100644
index a1e7c25e3d6008cff744a090c0c01a810efad8a4..0000000000000000000000000000000000000000
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/ApiAnnotationTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Scan source code for unmarked API interfaces
- *
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Test\Integrity;
-
-use Magento\Framework\App\Utility\Files;
-use Magento\Framework\Component\ComponentRegistrar;
-
-class ApiAnnotationTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * API annotation pattern
-     */
-    private $apiAnnotation  = '~/\*{2}(.*@api.*)\*/\s+(?=interface)~s';
-
-    public function testApiAnnotations()
-    {
-        $modulePaths = array_map(function ($path) {
-            return $path . DIRECTORY_SEPARATOR .  'Api';
-        }, (new ComponentRegistrar())->getPaths(ComponentRegistrar::MODULE));
-
-        foreach (Files::init()->getFiles($modulePaths, '*.php', true) as $file) {
-            $fileContent = file_get_contents($file);
-            if (!preg_match($this->apiAnnotation, $fileContent)) {
-                $result[] = $file;
-            }
-        }
-        if (!empty($result)) {
-            $this->fail(sprintf(
-                'Found %s file(s) without @api annotations under Api namespace: %s',
-                count($result),
-                PHP_EOL . implode(PHP_EOL, $result)
-            ));
-        }
-    }
-}
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/ModuleDBChangeTest.php b/dev/tests/static/testsuite/Magento/Test/Legacy/ModuleDBChangeTest.php
index 2f3d312fb41ffba1287bafd324a64ac751316d5c..5c8c2fdf0501699768457b3b888c217a1301f6c3 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/ModuleDBChangeTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/ModuleDBChangeTest.php
@@ -15,12 +15,7 @@ class ModuleDBChangeTest extends \PHPUnit_Framework_TestCase
     /**
      * @var string
      */
-    private static $branchesFilesPattern = __DIR__ . '/../_files/branches*';
-
-    /**
-     * @var string
-     */
-    private static $changedFilesPattern = __DIR__ . '/../_files/changed_files*';
+    protected static $changedFilesPattern = __DIR__ . '/../_files/changed_files*';
 
     /**
      * @var string
@@ -37,24 +32,6 @@ class ModuleDBChangeTest extends \PHPUnit_Framework_TestCase
      */
     public static function setUpBeforeClass()
     {
-        foreach (glob(self::$branchesFilesPattern) as $branchesFile) {
-            //get the current branchname from the first line
-            $branchName = trim(file($branchesFile)[0]);
-            if ($branchName === 'develop') {
-                self::$actualBranch = true;
-            } else {
-                //get current minor branch name
-                preg_match('|^(\d+\.\d+)|', $branchName, $minorBranch);
-                $branchName = $minorBranch[0];
-
-                //get all version branches
-                preg_match_all('|^(\d+\.\d+)|m', file_get_contents($branchesFile), $matches);
-
-                //check is this a latest release branch
-                self::$actualBranch = ($branchName == max($matches[0]));
-            }
-        }
-
         foreach (glob(self::$changedFilesPattern) as $changedFile) {
             self::$changedFileList .= file_get_contents($changedFile) . PHP_EOL;
         }
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/RestrictedCodeTest.php b/dev/tests/static/testsuite/Magento/Test/Legacy/RestrictedCodeTest.php
index 0c4c6eba49efa33c997b2dc62c70bd49434540e8..68c2d166448ab6fb4c39354b92ddb9f803d500f1 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/RestrictedCodeTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/RestrictedCodeTest.php
@@ -3,14 +3,13 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
-/**
- * Tests to find usage of restricted code
- */
 namespace Magento\Test\Legacy;
 
 use Magento\Framework\Component\ComponentRegistrar;
 
+/**
+ * Tests to find usage of restricted code
+ */
 class RestrictedCodeTest extends \PHPUnit_Framework_TestCase
 {
     /**@#+
@@ -18,17 +17,29 @@ class RestrictedCodeTest extends \PHPUnit_Framework_TestCase
      *
      * @var array
      */
-    protected static $_classes = [];
+    private static $_classes = [];
     /**#@-*/
 
     /**
      * List of fixtures that contain restricted classes and should not be tested
+     *
      * @var array
      */
-    protected static $_fixtureFiles = [];
+    private static $_fixtureFiles = [];
+
+    /**
+     * @var ComponentRegistrar
+     */
+    private $componentRegistrar;
+
+    protected function setUp()
+    {
+        $this->componentRegistrar = new ComponentRegistrar();
+    }
 
     /**
      * Read fixtures into memory as arrays
+     *
      * @return void
      */
     public static function setUpBeforeClass()
@@ -69,6 +80,7 @@ class RestrictedCodeTest extends \PHPUnit_Framework_TestCase
 
     /**
      * Test that restricted entities are not used in PHP files
+     *
      * @return void
      */
     public function testPhpFiles()
@@ -97,15 +109,13 @@ class RestrictedCodeTest extends \PHPUnit_Framework_TestCase
     protected function _testRestrictedClasses($file)
     {
         $content = file_get_contents($file);
-        $componentRegistrar = new ComponentRegistrar();
         foreach (self::$_classes as $restrictedClass => $classRules) {
             foreach ($classRules['exclude'] as $skippedPathInfo) {
-                $skippedPath = $componentRegistrar->getPath($skippedPathInfo['type'], $skippedPathInfo['name'])
-                    . '/' . $skippedPathInfo['path'];
-                if (strpos($file, $skippedPath) === 0) {
+                if (strpos($file, $this->getExcludedFilePath($skippedPathInfo)) === 0) {
                     continue 2;
                 }
             }
+
             $this->assertFalse(
                 \Magento\TestFramework\Utility\CodeCheck::isClassUsed($restrictedClass, $content),
                 sprintf(
@@ -117,4 +127,18 @@ class RestrictedCodeTest extends \PHPUnit_Framework_TestCase
             );
         }
     }
+
+    /**
+     * Get full path for excluded file
+     *
+     * @param array $pathInfo
+     * @return string
+     */
+    private function getExcludedFilePath($pathInfo)
+    {
+        if ($pathInfo['type'] != 'setup') {
+            return $this->componentRegistrar->getPath($pathInfo['type'], $pathInfo['name']) . '/' . $pathInfo['path'];
+        }
+        return BP . '/setup/' . $pathInfo['path'];
+    }
 }
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/UnsecureFunctionsUsageTest.php b/dev/tests/static/testsuite/Magento/Test/Legacy/UnsecureFunctionsUsageTest.php
index e5263713d71d7af374ea1f32c2d765d3639e56ce..44eb7fa78d8ac7099bfbfb6c14eae050c5e578e1 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/UnsecureFunctionsUsageTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/UnsecureFunctionsUsageTest.php
@@ -6,12 +6,28 @@
 namespace Magento\Test\Legacy;
 
 use Magento\Framework\App\Utility\Files;
+use Magento\Framework\Component\ComponentRegistrar;
+use Magento\TestFramework\Utility\FunctionDetector;
 
 /**
  * Tests to detect unsecure functions usage
  */
 class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * Php unsecure functions
+     *
+     * @var array
+     */
+    private static $phpUnsecureFunctions = [];
+
+    /**
+     * JS unsecure functions
+     *
+     * @var array
+     */
+    private static $jsUnsecureFunctions = [];
+
     /**
      * File extensions pattern to search for
      *
@@ -20,25 +36,54 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase
     private $fileExtensions = '/\.(php|phtml|js)$/';
 
     /**
-     * Php unsecure functions to detect
+     * Read fixtures into memory as arrays
      *
-     * @var array
+     * @return void
      */
-    private $phpUnsecureFunctions = [
-        'unserialize',
-        'serialize',
-        'eval',
-        'md5',
-        'srand',
-        'mt_srand'
-    ];
+    public static function setUpBeforeClass()
+    {
+        self::loadData(self::$phpUnsecureFunctions, 'unsecure_php_functions*.php');
+        self::loadData(self::$jsUnsecureFunctions, 'unsecure_js_functions*.php');
+    }
 
     /**
-     * JS unsecure functions to detect
+     * Loads and merges data from fixtures
      *
-     * @var array
+     * @param array $data
+     * @param string $filePattern
+     * @return void
      */
-    private $jsUnsecureFunctions = [];
+    private static function loadData(array &$data, $filePattern)
+    {
+        foreach (glob(__DIR__ . '/_files/security/' . $filePattern) as $file) {
+            $data = array_merge_recursive($data, self::readList($file));
+        }
+        $componentRegistrar = new ComponentRegistrar();
+        foreach ($data as $key => $value) {
+            $excludes = $value['exclude'];
+            $excludePaths = [];
+            foreach ($excludes as $exclude) {
+                if ('setup' == $exclude['type']) {
+                    $excludePaths[] = BP . '/setup/' . $exclude['path'];
+                } else {
+                    $excludePaths[] = $componentRegistrar->getPath($exclude['type'], $exclude['name'])
+                        . '/' . $exclude['path'];
+                }
+            }
+            $data[$key]['exclude'] = $excludePaths;
+        }
+    }
+
+    /**
+     * Isolate including a file into a method to reduce scope
+     *
+     * @param string $file
+     * @return array
+     */
+    private static function readList($file)
+    {
+        return include $file;
+    }
 
     /**
      * Detect unsecure functions usage for changed files in whitelist with the exception of blacklist
@@ -48,46 +93,69 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase
     public function testUnsecureFunctionsUsage()
     {
         $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
+        $functionDetector = new FunctionDetector();
         $invoker(
-            function ($fileName) {
-                $result = '';
-                $errorMessage = 'The following functions are non secure and should be avoided: '
-                    . implode(', ', $this->phpUnsecureFunctions)
-                    . ' for PHP';
-                if (!empty($this->jsUnsecureFunctions)) {
-                    $errorMessage .= ', and '
-                        . implode(', ', $this->jsUnsecureFunctions)
-                        . ' for JavaScript';
-                }
-                $errorMessage .= ".\n";
-                $regexp = $this->getRegexpByFileExtension(pathinfo($fileName, PATHINFO_EXTENSION));
-                if ($regexp) {
-                    $matches = preg_grep(
-                        $regexp,
-                        file($fileName)
-                    );
-                    if (!empty($matches)) {
-                        foreach (array_keys($matches) as $line) {
-                            $result .= $fileName . ':' . ($line + 1) . "\n";
-                        }
-                    }
-                    $this->assertEmpty($result, $errorMessage . $result);
+            function ($fileFullPath) use ($functionDetector) {
+                $functions = $this->getFunctions($fileFullPath);
+                $lines = $functionDetector->detect($fileFullPath, array_keys($functions));
+
+                $message = '';
+                if (!empty($lines)) {
+                    $message = $this->composeMessage($fileFullPath, $lines, $functions);
                 }
+                $this->assertEmpty(
+                    $lines,
+                    $message
+                );
             },
-            $this->unsecureFunctionsUsageDataProvider()
+            $this->getFilesToVerify()
         );
     }
 
     /**
-     * Data provider for test
+     * Compose message
+     *
+     * @param string $fileFullPath
+     * @param array $lines
+     * @param array $functionRules
+     * @return string
+     */
+    private function composeMessage($fileFullPath, $lines, $functionRules)
+    {
+        $result = '';
+        foreach ($lines as $lineNumber => $detectedFunctions) {
+            $detectedFunctionRules = array_intersect_key($functionRules, array_flip($detectedFunctions));
+            $replacementString = '';
+            foreach ($detectedFunctionRules as $function => $functionRule) {
+                $replacement = $functionRule['replacement'];
+                if (is_array($replacement)) {
+                    $replacement = array_unique($replacement);
+                    $replacement = count($replacement) > 1 ?
+                        "[\n\t\t\t" . implode("\n\t\t\t", $replacement) . "\n\t\t]" :
+                        $replacement[0];
+                }
+                $replacement = empty($replacement) ? 'No suggested replacement at this time' : $replacement;
+                $replacementString .= "\t\t'$function' => '$replacement'\n";
+            }
+            $result .= sprintf(
+                "Functions '%s' are not secure in %s. \n\tSuggested replacement:\n%s",
+                implode(', ', $detectedFunctions),
+                $fileFullPath . ':' . $lineNumber,
+                $replacementString
+            );
+        }
+        return $result;
+    }
+
+    /**
+     * Get files to be verified
      *
      * @return array
      */
-    public function unsecureFunctionsUsageDataProvider()
+    private function getFilesToVerify()
     {
         $fileExtensions = $this->fileExtensions;
         $directoriesToScan = Files::init()->readLists(__DIR__ . '/_files/security/whitelist.txt');
-        $blackListFiles = include __DIR__ . '/_files/security/blacklist.php';
 
         $filesToVerify = [];
         foreach (glob(__DIR__ . '/../_files/changed_files*') as $listFile) {
@@ -104,7 +172,7 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase
         );
         $filesToVerify = array_filter(
             $filesToVerify,
-            function ($path) use ($directoriesToScan, $fileExtensions, $blackListFiles) {
+            function ($path) use ($directoriesToScan, $fileExtensions) {
                 if (!file_exists($path[0])) {
                     return false;
                 }
@@ -113,11 +181,9 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase
                     $directory = realpath($directory);
                     if (strpos($path, $directory) === 0) {
                         if (preg_match($fileExtensions, $path)) {
-                            foreach ($blackListFiles as $blackListFile) {
-                                $blackListFile = preg_quote($blackListFile, '#');
-                                if (preg_match('#' . $blackListFile . '#', $path)) {
-                                    return false;
-                                }
+                            // skip unit tests
+                            if (preg_match('#' . preg_quote('Test/Unit', '#') . '#', $path)) {
+                                return false;
                             }
                             return true;
                         }
@@ -130,35 +196,27 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * Get regular expression by file extension
+     * Get functions for the given file
      *
-     * @param string $fileExtension
-     * @return string|bool
+     * @param string $fileFullPath
+     * @return array
      */
-    private function getRegexpByFileExtension($fileExtension)
+    private function getFunctions($fileFullPath)
     {
-        $regexp = false;
+        $fileExtension = pathinfo($fileFullPath, PATHINFO_EXTENSION);
+        $functions = [];
         if ($fileExtension == 'php') {
-            $regexp = $this->prepareRegexp($this->phpUnsecureFunctions);
+            $functions = self::$phpUnsecureFunctions;
         } elseif ($fileExtension == 'js') {
-            $regexp = $this->prepareRegexp($this->jsUnsecureFunctions);
+            $functions = self::$jsUnsecureFunctions;
         } elseif ($fileExtension == 'phtml') {
-            $regexp = $this->prepareRegexp($this->phpUnsecureFunctions + $this->jsUnsecureFunctions);
+            $functions = array_merge_recursive(self::$phpUnsecureFunctions, self::$jsUnsecureFunctions);
         }
-        return $regexp;
-    }
-
-    /**
-     * Prepare regular expression for unsecure function names
-     *
-     * @param array $functions
-     * @return string
-     */
-    private function prepareRegexp(array $functions)
-    {
-        if (empty($functions)) {
-            return '';
+        foreach ($functions as $function => $functionRules) {
+            if (in_array($fileFullPath, $functionRules['exclude'])) {
+                unset($functions[$function]);
+            }
         }
-        return '/(?<!function |[^\s])\b(' . join('|', $functions) . ')\s*\(/i';
+        return $functions;
     }
 }
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php
index f5ae2f2dfd67b5628326149d6d28f055c9d2485f..2a0c4f23bf3793978b06c3cb26e8706554d0ad51 100755
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php
@@ -3826,8 +3826,8 @@ return [
     ],
     ['Magento\Setup\Model\Deployer', 'Magento\Deploy\Model\Deployer'],
     [
-        'Magento\Setup\Console\Command\DeployStaticContentCommand',
-        'Magento\Deploy\Console\Command\DeployStaticContentCommand'
+        'Magento\Deploy\Console\Command\DeployStaticContentCommand',
+        'Magento\Setup\Console\Command\DeployStaticContentCommand'
     ],
     [
         'Magento\Setup\Test\Unit\Console\Command\DeployStaticContentCommandTest',
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/restricted_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/restricted_classes.php
index a950b2d7e9ed243356da176f8eef1095ef4fb210..683449d4e5e34b919ef476d93c26fe01d122b0a8 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/restricted_classes.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/restricted_classes.php
@@ -1,27 +1,103 @@
 <?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
 /**
  * Classes that are restricted to use directly.
  * A <replacement> will be suggested to be used instead.
  * Use <whitelist> to specify files and directories that are allowed to use restricted classes.
  *
  * Format: array(<class_name>, <replacement>[, array(<whitelist>)]])
- *
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
  */
 return [
     'Zend_Db_Select' => [
         'replacement' => '\Magento\Framework\DB\Select',
         'exclude' => [
-            ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Select.php'],
-            ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Adapter/Pdo/Mysql.php'],
-            ['type' => 'library', 'name' => 'magento/framework', 'path' => 'Model/ResourceModel/Iterator.php'],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'DB/Select.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'DB/Adapter/Pdo/Mysql.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'Model/ResourceModel/Iterator.php'
+            ],
         ]
     ],
     'Zend_Db_Adapter_Pdo_Mysql' => [
         'replacement' => '\Magento\Framework\DB\Adapter\Pdo\Mysql',
         'exclude' => [
-            ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Adapter/Pdo/Mysql.php'],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'DB/Adapter/Pdo/Mysql.php'
+            ],
         ]
     ],
+    'Magento\Framework\Serialize\Serializer\Serialize' => [
+        'replacement' => 'Magento\Framework\Serialize\SerializerInterface',
+        'exclude' => [
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'DB/Adapter/Pdo/Mysql.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'App/ObjectManager/ConfigLoader/Compiled.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'App/Config/ScopePool.php'],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'App/ObjectManager/ConfigCache.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'App/ObjectManager/ConfigLoader.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'ObjectManager/Config/Compiled.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'Interception/Config/Config.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'Interception/PluginList/PluginList.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'App/Router/ActionList.php'
+            ],
+            [
+                'type' => 'library',
+                'name' => 'magento/framework',
+                'path' => 'Serialize/Test/Unit/Serializer/SerializeTest.php'
+            ],
+            [
+                'type' => 'setup',
+                'path' => 'src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php'
+            ],
+        ]
+    ]
 ];
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/blacklist.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/blacklist.php
deleted file mode 100644
index 42b8e68e784111b96d43049ae27dc5ebc963ad40..0000000000000000000000000000000000000000
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/blacklist.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-return [
-    'Test/Unit',
-    'lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php',
-    'lib/internal/Magento/Framework/Serialize/Serializer/Serialize.php',
-];
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/unsecure_php_functions.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/unsecure_php_functions.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb51d1bbba3bd98ec7ef2d5fd26754aea8fc221a
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/unsecure_php_functions.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/**
+ * Functions that are not secure to use.
+ * A <replacement> will be suggested to be used instead.
+ * Use <exclude> to specify files and directories that are allowed to use function.
+ *
+ * Format: [
+ *      <class_name> => [
+ *          'replacement' => <replacement>,
+ *          'exclude' => [
+ *              <exclude>,
+ *              <exclude>,
+ *          ]
+ *      ]
+ */
+return [
+    'unserialize' => [
+        'replacement' => '\Magento\Framework\Serialize\SerializerInterface::unserialize',
+        'exclude' => [
+            ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Adapter/Pdo/Mysql.php'],
+            ['type' => 'library', 'name' => 'magento/framework', 'path' => 'Serialize/Serializer/Serialize.php'],
+        ]
+    ],
+    'serialize' => [
+        'replacement' => '\Magento\Framework\Serialize\SerializerInterface::serialize',
+        'exclude' => [
+            ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Adapter/Pdo/Mysql.php'],
+            ['type' => 'library', 'name' => 'magento/framework', 'path' => 'Serialize/Serializer/Serialize.php'],
+        ]
+    ],
+    'eval' => [
+        'replacement' => '',
+        'exclude' => []
+    ],
+    'md5' => [
+        'replacement' => '',
+        'exclude' => []
+    ],
+    'srand' => [
+        'replacement' => '',
+        'exclude' => []
+    ],
+    'mt_srand' => [
+        'replacement' => '',
+        'exclude' => []
+    ],
+];
diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config.php b/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config.php
index 303e4a57926662733398a7703afea0c548da2f03..1dcfe02e56b3ed22f780216bb0728a8a0ee6466e 100644
--- a/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config.php
+++ b/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config.php
@@ -7,24 +7,32 @@ namespace Magento\Framework\Api\ExtensionAttribute;
 
 use Magento\Framework\Config\CacheInterface;
 use Magento\Framework\Api\ExtensionAttribute\Config\Reader;
+use Magento\Framework\Serialize\SerializerInterface;
 
 /**
  * Extension attributes config
  */
 class Config extends \Magento\Framework\Config\Data
 {
+    /**
+     * Cache identifier
+     */
     const CACHE_ID = 'extension_attributes_config';
 
     /**
-     * Initialize reader and cache.
+     * Constructor
      *
      * @param Reader $reader
      * @param CacheInterface $cache
+     * @param string $cacheId|null
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         Reader $reader,
-        CacheInterface $cache
+        CacheInterface $cache,
+        $cacheId = self::CACHE_ID,
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, self::CACHE_ID);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 }
diff --git a/lib/internal/Magento/Framework/Api/Search/SearchResult.php b/lib/internal/Magento/Framework/Api/Search/SearchResult.php
index f637ef27d7b2cb4889e509aac154997ff1454aa9..f4ece5c84dde049468b76b357ecb09e2e86c2230 100644
--- a/lib/internal/Magento/Framework/Api/Search/SearchResult.php
+++ b/lib/internal/Magento/Framework/Api/Search/SearchResult.php
@@ -85,4 +85,18 @@ class SearchResult extends AbstractSimpleObject implements SearchResultInterface
     {
         return $this->setData(self::TOTAL_COUNT, $totalCount);
     }
+
+    /**
+     * Retrieve ids of all items
+     *
+     * @return array
+     */
+    public function getAllIds()
+    {
+        $ids = [];
+        foreach ($this->getItems() as $item) {
+            $ids[] = $item->getId();
+        }
+        return $ids;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Api/Search/SearchResultInterface.php b/lib/internal/Magento/Framework/Api/Search/SearchResultInterface.php
index ffa4c0fe43cf2422efbefc5a2c1605ec78281711..d44a8be3fb0ecff9a5031d07d66a50785c31c9d0 100644
--- a/lib/internal/Magento/Framework/Api/Search/SearchResultInterface.php
+++ b/lib/internal/Magento/Framework/Api/Search/SearchResultInterface.php
@@ -7,6 +7,11 @@ namespace Magento\Framework\Api\Search;
 
 use Magento\Framework\Api\SearchResultsInterface;
 
+/**
+ * Interface SearchResultInterface
+ *
+ * @api
+ */
 interface SearchResultInterface extends SearchResultsInterface
 {
     /**#@+
@@ -48,4 +53,11 @@ interface SearchResultInterface extends SearchResultsInterface
      * @return \Magento\Framework\Api\Search\SearchCriteriaInterface
      */
     public function getSearchCriteria();
+
+    /**
+     * Retrieve all ids from list
+     *
+     * @return int[]
+     */
+    public function getAllIds();
 }
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Search/SearchResultTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/Search/SearchResultTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d289291996906e4b60b0940da8fafd893a720fc
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/Search/SearchResultTest.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api\Test\Unit\Search;
+
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Framework\Api\Search\SearchResult;
+use Magento\Framework\Api\Search\DocumentInterface;
+
+class SearchResultTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var SearchResult
+     */
+    private $search;
+
+    /**
+     * @var DocumentInterface[]
+     */
+    private $items;
+
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * Set up
+     */
+    protected function setUp()
+    {
+        $document1 = $this->getMock(DocumentInterface::class);
+        $document2 = $this->getMock(DocumentInterface::class);
+
+        $this->items = [ $document1,  $document2];
+        $document1->expects($this->any())
+            ->method('getId')
+            ->willReturn(1);
+        $document2->expects($this->any())
+            ->method('getId')
+            ->willReturn(2);
+
+        $data = [
+            'items' => $this->items
+        ];
+        $this->objectManager = new ObjectManager($this);
+        $this->search = $this->objectManager->getObject(
+            SearchResult::class,
+            [
+                'data' => $data
+            ]
+        );
+    }
+
+    /**
+     * Test getAllIds
+     */
+    public function testGetAllIds()
+    {
+        $this->assertEquals([1, 2], $this->search->getAllIds());
+    }
+
+    /**
+     * Test getItems
+     */
+    public function testGetItems()
+    {
+        $this->assertEquals($this->items, $this->search->getItems());
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Cache/TypeList.php b/lib/internal/Magento/Framework/App/Cache/TypeList.php
index 1fae9652810c8528870c5157948a4aa4809dcb0f..38516b7174d6f143b066752394b8f469a87e3bd5 100644
--- a/lib/internal/Magento/Framework/App/Cache/TypeList.php
+++ b/lib/internal/Magento/Framework/App/Cache/TypeList.php
@@ -5,6 +5,9 @@
  */
 namespace Magento\Framework\App\Cache;
 
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Serialize\SerializerInterface;
+
 class TypeList implements TypeListInterface
 {
     const INVALIDATED_TYPES = 'core_cache_invalidate';
@@ -29,22 +32,30 @@ class TypeList implements TypeListInterface
      */
     protected $_cache;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\Cache\ConfigInterface $config
      * @param StateInterface $cacheState
      * @param InstanceFactory $factory
      * @param \Magento\Framework\App\CacheInterface $cache
+     * @param SerializerInterface $serializer
      */
     public function __construct(
         \Magento\Framework\Cache\ConfigInterface $config,
         StateInterface $cacheState,
         InstanceFactory $factory,
-        \Magento\Framework\App\CacheInterface $cache
+        \Magento\Framework\App\CacheInterface $cache,
+        SerializerInterface $serializer = null
     ) {
         $this->_config = $config;
         $this->_factory = $factory;
         $this->_cacheState = $cacheState;
         $this->_cache = $cache;
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
     }
 
     /**
@@ -72,7 +83,7 @@ class TypeList implements TypeListInterface
     {
         $types = $this->_cache->load(self::INVALIDATED_TYPES);
         if ($types) {
-            $types = unserialize($types);
+            $types = $this->serializer->unserialize($types);
         } else {
             $types = [];
         }
@@ -87,7 +98,7 @@ class TypeList implements TypeListInterface
      */
     protected function _saveInvalidatedTypes($types)
     {
-        $this->_cache->save(serialize($types), self::INVALIDATED_TYPES);
+        $this->_cache->save($this->serializer->serialize($types), self::INVALIDATED_TYPES);
     }
 
     /**
diff --git a/lib/internal/Magento/Framework/App/Config.php b/lib/internal/Magento/Framework/App/Config.php
index e8aaaa0bbe57094d088e0df9cf81711d251b8cd6..d25739c5d1bf3238745d5016d28f5cae95459bfd 100644
--- a/lib/internal/Magento/Framework/App/Config.php
+++ b/lib/internal/Magento/Framework/App/Config.php
@@ -7,9 +7,14 @@
  */
 namespace Magento\Framework\App;
 
+use Magento\Framework\App\Config\ScopeCodeResolver;
 use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\Config\ConfigTypeInterface;
 
-class Config implements \Magento\Framework\App\Config\ScopeConfigInterface
+/**
+ * Class Config
+ */
+class Config implements ScopeConfigInterface
 {
     /**
      * Config cache tag
@@ -17,16 +22,27 @@ class Config implements \Magento\Framework\App\Config\ScopeConfigInterface
     const CACHE_TAG = 'CONFIG';
 
     /**
-     * @var \Magento\Framework\App\Config\ScopePool
+     * @var ScopeCodeResolver
      */
-    protected $_scopePool;
+    private $scopeCodeResolver;
 
     /**
-     * @param \Magento\Framework\App\Config\ScopePool $scopePool
+     * @var ConfigTypeInterface[]
      */
-    public function __construct(\Magento\Framework\App\Config\ScopePool $scopePool)
-    {
-        $this->_scopePool = $scopePool;
+    private $types;
+
+    /**
+     * Config constructor.
+     *
+     * @param ScopeCodeResolver $scopeCodeResolver
+     * @param array $types
+     */
+    public function __construct(
+        ScopeCodeResolver $scopeCodeResolver,
+        array $types = []
+    ) {
+        $this->scopeCodeResolver = $scopeCodeResolver;
+        $this->types = $types;
     }
 
     /**
@@ -42,7 +58,26 @@ class Config implements \Magento\Framework\App\Config\ScopeConfigInterface
         $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
         $scopeCode = null
     ) {
-        return $this->_scopePool->getScope($scope, $scopeCode)->getValue($path);
+        if ($scope === 'store') {
+            $scope = 'stores';
+        } elseif ($scope === 'website') {
+            $scope = 'websites';
+        }
+        $configPath = $scope;
+        if ($scope !== 'default') {
+            if (is_numeric($scopeCode) || $scopeCode === null) {
+                $scopeCode = $this->scopeCodeResolver->resolve($scope, $scopeCode);
+            } else if ($scopeCode instanceof \Magento\Framework\App\ScopeInterface) {
+                $scopeCode = $scopeCode->getCode();
+            }
+            if ($scopeCode) {
+                $configPath .= '/' . $scopeCode;
+            }
+        }
+        if ($path) {
+            $configPath .= '/' . $path;
+        }
+        return $this->get('system', $configPath);
     }
 
     /**
@@ -55,6 +90,45 @@ class Config implements \Magento\Framework\App\Config\ScopeConfigInterface
      */
     public function isSetFlag($path, $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null)
     {
-        return (bool) $this->getValue($path, $scope, $scopeCode);
+        return !!$this->getValue($path, $scope, $scopeCode);
+    }
+
+    /**
+     * Invalidate cache by type
+     *
+     * @return void
+     */
+    public function clean()
+    {
+        foreach ($this->types as $type) {
+            $type->clean();
+        }
+    }
+
+    /**
+     * Retrieve configuration.
+     *
+     * ('modules') - modules status configuration data
+     * ('scopes', 'websites/base') - base website data
+     * ('scopes', 'stores/default') - default store data
+     *
+     * ('system', 'default/web/seo/use_rewrites') - default system configuration data
+     * ('system', 'websites/base/web/seo/use_rewrites') - 'base' website system configuration data
+     *
+     * ('i18n', 'default/en_US') - translations for default store and 'en_US' locale
+     *
+     * @param string $configType
+     * @param string|null $path
+     * @param mixed|null $default
+     * @return array
+     */
+    public function get($configType, $path = '', $default = null)
+    {
+        $result = null;
+        if (isset($this->types[$configType])) {
+            $result = $this->types[$configType]->get($path);
+        }
+        
+        return $result !== null ? $result : $default;
     }
 }
diff --git a/lib/internal/Magento/Framework/App/Config/ConfigSourceAggregated.php b/lib/internal/Magento/Framework/App/Config/ConfigSourceAggregated.php
new file mode 100644
index 0000000000000000000000000000000000000000..c1a9259a4329b4ce2998b53f293ed7bf0301deb5
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/ConfigSourceAggregated.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Application configuration object. Used to access configuration when application is initialized and installed.
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+class ConfigSourceAggregated implements ConfigSourceInterface
+{
+    /**
+     * @var ConfigSourceInterface[]
+     */
+    private $sources;
+
+    /**
+     * ConfigSourceAggregated constructor.
+     *
+     * @param array $sources
+     */
+    public function __construct(array $sources = [])
+    {
+        $this->sources = $sources;
+    }
+
+    /**
+     * Retrieve aggregated configuration from all available sources.
+     *
+     * @param string $path
+     * @return array
+     */
+    public function get($path = '')
+    {
+        $this->sortSources();
+        $data = [];
+        foreach ($this->sources as $sourceConfig) {
+            /** @var ConfigSourceInterface $source */
+            $source = $sourceConfig['source'];
+            $data = array_replace_recursive($data, $source->get($path));
+        }
+        return $data;
+    }
+
+    /**
+     * Sort sources
+     *
+     * @return void
+     */
+    private function sortSources()
+    {
+        uasort($this->sources, function ($firstItem, $secondItem) {
+            return $firstItem['sortOrder'] > $secondItem['sortOrder'];
+        });
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Config/ConfigSourceInterface.php b/lib/internal/Magento/Framework/App/Config/ConfigSourceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..c070125de9f35d5119b9d4df5ddf250ed09a4ca4
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/ConfigSourceInterface.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Provide access to data. Each Source can be responsible for each storage, where config data can be placed
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+/**
+ * Interface ConfigSourceInterface
+ */
+interface ConfigSourceInterface
+{
+    /**
+     * Retrieve configuration raw data array.
+     *
+     * @param string $path
+     * @return array
+     */
+    public function get($path = '');
+}
diff --git a/lib/internal/Magento/Framework/App/Config/ConfigTypeInterface.php b/lib/internal/Magento/Framework/App/Config/ConfigTypeInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..81dce57e314786144fa53a8b9bc31bb79ebbc9bb
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/ConfigTypeInterface.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Application configuration object. Used to access configuration when application is initialized and installed.
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+/**
+ * Interface ConfigTypeInterface
+ */
+interface ConfigTypeInterface
+{
+    /**
+     * Retrieve configuration raw data array.
+     *
+     * @param string $path
+     * @return array
+     */
+    public function get($path = '');
+
+    /**
+     * @return void
+     */
+    public function clean();
+}
diff --git a/lib/internal/Magento/Framework/App/Config/Initial.php b/lib/internal/Magento/Framework/App/Config/Initial.php
index 0704fb855939625d2fd7c756e7abf1a213391efb..5669041ee98d232682ca8c2102290e71c0059433 100644
--- a/lib/internal/Magento/Framework/App/Config/Initial.php
+++ b/lib/internal/Magento/Framework/App/Config/Initial.php
@@ -8,6 +8,7 @@
 namespace Magento\Framework\App\Config;
 
 use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\Serialize\SerializerInterface;
 
 class Initial
 {
@@ -31,19 +32,30 @@ class Initial
     protected $_metadata = [];
 
     /**
-     * @param \Magento\Framework\App\Config\Initial\Reader $reader
+     * @var SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * Initial constructor
+     *
+     * @param Initial\Reader $reader
      * @param \Magento\Framework\App\Cache\Type\Config $cache
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\App\Config\Initial\Reader $reader,
-        \Magento\Framework\App\Cache\Type\Config $cache
+        \Magento\Framework\App\Cache\Type\Config $cache,
+        SerializerInterface $serializer = null
     ) {
+        $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()
+            ->get(SerializerInterface::class);
         $data = $cache->load(self::CACHE_ID);
         if (!$data) {
             $data = $reader->read();
-            $cache->save(serialize($data), self::CACHE_ID);
+            $cache->save($this->serializer->serialize($data), self::CACHE_ID);
         } else {
-            $data = unserialize($data);
+            $data = $this->serializer->unserialize($data);
         }
         $this->_data = $data['data'];
         $this->_metadata = $data['metadata'];
diff --git a/lib/internal/Magento/Framework/App/Config/InitialConfigSource.php b/lib/internal/Magento/Framework/App/Config/InitialConfigSource.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f75bef92914a348e28317bf6b81739eae5c145d
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/InitialConfigSource.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+use Magento\Framework\App\DeploymentConfig\Reader;
+use Magento\Framework\DataObject;
+
+/**
+ * Responsible for reading sources from files: config.dist.php, config.local.php, config.php
+ */
+class InitialConfigSource implements ConfigSourceInterface
+{
+    /**
+     * @var Reader
+     */
+    private $reader;
+
+    /**
+     * @var string
+     */
+    private $configType;
+
+    /**
+     * @var string
+     */
+    private $fileKey;
+
+    /**
+     * DataProvider constructor.
+     *
+     * @param Reader $reader
+     * @param string $configType
+     * @param string $fileKey
+     */
+    public function __construct(Reader $reader, $configType, $fileKey)
+    {
+        $this->reader = $reader;
+        $this->configType = $configType;
+        $this->fileKey = $fileKey;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function get($path = '')
+    {
+        $data = new DataObject($this->reader->load($this->fileKey));
+        if ($path !== '' && $path !== null) {
+            $path = '/' . $path;
+        }
+        return $data->getData($this->configType . $path) ?: [];
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Config/MetadataConfigTypeProcessor.php b/lib/internal/Magento/Framework/App/Config/MetadataConfigTypeProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..04acde7950c136f070b413c198b192a5417744b7
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/MetadataConfigTypeProcessor.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Configuration metadata processor
+ *
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+use Magento\Framework\App\Config\Spi\PostProcessorInterface;
+
+class MetadataConfigTypeProcessor implements PostProcessorInterface
+{
+    /**
+     * @var \Magento\Framework\App\Config\Data\ProcessorFactory
+     */
+    protected $_processorFactory;
+
+    /**
+     * @var array
+     */
+    protected $_metadata = [];
+
+    /**
+     * @param \Magento\Framework\App\Config\Data\ProcessorFactory $processorFactory
+     * @param Initial $initialConfig
+     */
+    public function __construct(
+        \Magento\Framework\App\Config\Data\ProcessorFactory $processorFactory,
+        Initial $initialConfig
+    ) {
+        $this->_processorFactory = $processorFactory;
+        $this->_metadata = $initialConfig->getMetadata();
+    }
+
+    /**
+     * Retrieve array value by path
+     *
+     * @param array $data
+     * @param string $path
+     * @return string|null
+     */
+    protected function _getValue(array $data, $path)
+    {
+        $keys = explode('/', $path);
+        foreach ($keys as $key) {
+            if (is_array($data) && array_key_exists($key, $data)) {
+                $data = $data[$key];
+            } else {
+                return null;
+            }
+        }
+        return $data;
+    }
+
+    /**
+     * Set array value by path
+     *
+     * @param array &$container
+     * @param string $path
+     * @param string $value
+     * @return void
+     */
+    protected function _setValue(array &$container, $path, $value)
+    {
+        $segments = explode('/', $path);
+        $currentPointer = & $container;
+        foreach ($segments as $segment) {
+            if (!isset($currentPointer[$segment])) {
+                $currentPointer[$segment] = [];
+            }
+            $currentPointer = & $currentPointer[$segment];
+        }
+        $currentPointer = $value;
+    }
+
+    /**
+     * Process data by sections: stores, default, websites and by scope codes
+     *
+     * @param array $data
+     * @return array
+     */
+    private function processScopeData(array $data)
+    {
+        foreach ($this->_metadata as $path => $metadata) {
+            /** @var \Magento\Framework\App\Config\Data\ProcessorInterface $processor */
+            $processor = $this->_processorFactory->get($metadata['backendModel']);
+            $value = $processor->processValue($this->_getValue($data, $path));
+            $this->_setValue($data, $path, $value);
+        }
+
+        return $data;
+    }
+
+    /**
+     * Process config data
+     *
+     * @param array $data
+     * @return array
+     */
+    public function process(array $rawData)
+    {
+        $processedData = [];
+        foreach ($rawData as $scope => $scopeData) {
+            if ($scope == ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
+                $processedData[ScopeConfigInterface::SCOPE_TYPE_DEFAULT] = $this->processScopeData($scopeData);
+            } else {
+                foreach ($scopeData as $scopeCode => $data) {
+                    $processedData[$scope][$scopeCode] = $this->processScopeData($data);
+                }
+            }
+        }
+
+        return $processedData;
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Config/PostProcessorComposite.php b/lib/internal/Magento/Framework/App/Config/PostProcessorComposite.php
new file mode 100644
index 0000000000000000000000000000000000000000..a008b1abd0595bf163c20563c822484d9076d3b5
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/PostProcessorComposite.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+use Magento\Framework\App\Config\Spi\PostProcessorInterface;
+
+/**
+ * @inheritdoc
+ * @package Magento\Framework\App\Config
+ */
+class PostProcessorComposite implements PostProcessorInterface
+{
+    /** @var  PostProcessorInterface[] */
+    private $processors;
+
+    /**
+     * @param array $processors
+     */
+    public function __construct(array $processors = [])
+    {
+        $this->processors = $processors;
+    }
+
+    /**
+     * @param array $config
+     * @return array
+     */
+    public function process(array $config)
+    {
+        foreach ($this->processors as $processor) {
+            $config = $processor->process($config);
+        }
+
+        return $config;
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Config/Reader/Source/SourceInterface.php b/lib/internal/Magento/Framework/App/Config/Reader/Source/SourceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..2f1061fb7b6bdb5533929a9ac477ab695491de29
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/Reader/Source/SourceInterface.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config\Reader\Source;
+
+/**
+ * Provide access to data. Each Source can be responsible for each storage, where config data can be placed
+ *
+ * @package Magento\Framework\App\Config\Reader\Source
+ */
+interface SourceInterface
+{
+    /**
+     * Retrieve config by scope
+     *
+     * @param string|null $scopeCode
+     * @return array
+     */
+    public function get($scopeCode = null);
+}
diff --git a/lib/internal/Magento/Framework/App/Config/Scope/ReaderPoolInterface.php b/lib/internal/Magento/Framework/App/Config/Scope/ReaderPoolInterface.php
deleted file mode 100644
index 9c2b66dad2860156393bfe5f02f5512850f067c8..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/App/Config/Scope/ReaderPoolInterface.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\App\Config\Scope;
-
-interface ReaderPoolInterface
-{
-    /**
-     * Retrieve reader by scope
-     *
-     * @param string $scopeType
-     * @return ReaderInterface|null
-     */
-    public function getReader($scopeType);
-}
diff --git a/lib/internal/Magento/Framework/App/Config/ScopeCodeResolver.php b/lib/internal/Magento/Framework/App/Config/ScopeCodeResolver.php
new file mode 100644
index 0000000000000000000000000000000000000000..ef7da5c94c1e25e061909fffa692ecfb0c728fd6
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/ScopeCodeResolver.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config;
+
+use Magento\Framework\App\ScopeResolverPool;
+
+/**
+ * Class for resolving scope code
+ */
+class ScopeCodeResolver
+{
+    /**
+     * @var ScopeResolverPool
+     */
+    private $scopeResolverPool;
+
+    /**
+     * @var array
+     */
+    private $resolvedScopeCodes = [];
+
+    /**
+     * @param ScopeResolverPool $scopeResolverPool
+     */
+    public function __construct(ScopeResolverPool $scopeResolverPool)
+    {
+        $this->scopeResolverPool = $scopeResolverPool;
+    }
+
+    /**
+     * Resolve scope code
+     *
+     * @param string $scopeType
+     * @param string $scopeCode
+     * @return string
+     */
+    public function resolve($scopeType, $scopeCode)
+    {
+        if (isset($this->resolvedScopeCodes[$scopeType][$scopeCode])) {
+            return $this->resolvedScopeCodes[$scopeType][$scopeCode];
+        }
+        if (($scopeCode === null || is_numeric($scopeCode))
+            && $scopeType !== ScopeConfigInterface::SCOPE_TYPE_DEFAULT
+        ) {
+            $scopeResolver = $this->scopeResolverPool->get($scopeType);
+            $resolverScopeCode = $scopeResolver->getScope($scopeCode);
+        } else {
+            $resolverScopeCode = $scopeCode;
+        }
+
+        if ($resolverScopeCode instanceof \Magento\Framework\App\ScopeInterface) {
+            $resolverScopeCode = $resolverScopeCode->getCode();
+        }
+
+        $this->resolvedScopeCodes[$scopeType][$scopeCode] = $resolverScopeCode;
+        return $resolverScopeCode;
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Config/ScopePool.php b/lib/internal/Magento/Framework/App/Config/ScopePool.php
deleted file mode 100644
index 9e6a47d918f7602cd2e2b1d50286eb82f3f5cca6..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/App/Config/ScopePool.php
+++ /dev/null
@@ -1,156 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\App\Config;
-
-use Magento\Framework\App\RequestInterface;
-
-/**
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
-class ScopePool
-{
-    const CACHE_TAG = 'config_scopes';
-
-    /**
-     * @var \Magento\Framework\App\Config\Scope\ReaderPoolInterface
-     */
-    protected $_readerPool;
-
-    /**
-     * @var DataFactory
-     */
-    protected $_dataFactory;
-
-    /**
-     * @var \Magento\Framework\Cache\FrontendInterface
-     */
-    protected $_cache;
-
-    /**
-     * @var string
-     */
-    protected $_cacheId;
-
-    /**
-     * @var DataInterface[]
-     */
-    protected $_scopes = [];
-
-    /**
-     * @var \Magento\Framework\App\ScopeResolverPool
-     */
-    protected $_scopeResolverPool;
-
-    /**
-     * @var RequestInterface
-     */
-    private $request;
-
-    /**
-     * @param \Magento\Framework\App\Config\Scope\ReaderPoolInterface $readerPool
-     * @param DataFactory $dataFactory
-     * @param \Magento\Framework\Cache\FrontendInterface $cache
-     * @param \Magento\Framework\App\ScopeResolverPool $scopeResolverPool
-     * @param string $cacheId
-     */
-    public function __construct(
-        \Magento\Framework\App\Config\Scope\ReaderPoolInterface $readerPool,
-        DataFactory $dataFactory,
-        \Magento\Framework\Cache\FrontendInterface $cache,
-        \Magento\Framework\App\ScopeResolverPool $scopeResolverPool,
-        $cacheId = 'default_config_cache'
-    ) {
-        $this->_readerPool = $readerPool;
-        $this->_dataFactory = $dataFactory;
-        $this->_cache = $cache;
-        $this->_cacheId = $cacheId;
-        $this->_scopeResolverPool = $scopeResolverPool;
-    }
-
-    /**
-     * @return RequestInterface
-     */
-    private function getRequest()
-    {
-        if ($this->request === null) {
-            $this->request = \Magento\Framework\App\ObjectManager::getInstance()->get(RequestInterface::class);
-        }
-        return $this->request;
-    }
-    
-    /**
-     * Retrieve config section
-     *
-     * @param string $scopeType
-     * @param string|\Magento\Framework\DataObject|null $scopeCode
-     * @return \Magento\Framework\App\Config\DataInterface
-     */
-    public function getScope($scopeType, $scopeCode = null)
-    {
-        $scopeCode = $this->_getScopeCode($scopeType, $scopeCode);
-
-        $code = $scopeType . '|' . $scopeCode;
-
-        if (!isset($this->_scopes[$code])) {
-            // Key by url to support dynamic {{base_url}} and port assignments
-            $host = $this->getRequest()->getHttpHost();
-            $port = $this->getRequest()->getServer('SERVER_PORT');
-            $path = $this->getRequest()->getBasePath();
-
-            $urlInfo = $host . $port . trim($path, '/');
-            $cacheKey = $this->_cacheId . '|' . $code . '|' . $urlInfo;
-            $data = $this->_cache->load($cacheKey);
-
-            if ($data) {
-                $data = unserialize($data);
-            } else {
-                $reader = $this->_readerPool->getReader($scopeType);
-                if ($scopeType === ScopeConfigInterface::SCOPE_TYPE_DEFAULT) {
-                    $data = $reader->read();
-                } else {
-                    $data = $reader->read($scopeCode);
-                }
-                $this->_cache->save(serialize($data), $cacheKey, [self::CACHE_TAG]);
-            }
-            $this->_scopes[$code] = $this->_dataFactory->create(['data' => $data]);
-        }
-        return $this->_scopes[$code];
-    }
-
-    /**
-     * Clear cache of all scopes
-     *
-     * @return void
-     */
-    public function clean()
-    {
-        $this->_scopes = [];
-        $this->_cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_TAG, [self::CACHE_TAG]);
-    }
-
-    /**
-     * Retrieve scope code value
-     *
-     * @param string $scopeType
-     * @param string|\Magento\Framework\DataObject|null $scopeCode
-     * @return string
-     */
-    protected function _getScopeCode($scopeType, $scopeCode)
-    {
-        if (($scopeCode === null || is_numeric($scopeCode))
-            && $scopeType !== ScopeConfigInterface::SCOPE_TYPE_DEFAULT
-        ) {
-            $scopeResolver = $this->_scopeResolverPool->get($scopeType);
-            $scopeCode = $scopeResolver->getScope($scopeCode);
-        }
-
-        if ($scopeCode instanceof \Magento\Framework\App\ScopeInterface) {
-            $scopeCode = $scopeCode->getCode();
-        }
-
-        return $scopeCode;
-    }
-}
diff --git a/lib/internal/Magento/Framework/App/Config/Spi/PostProcessorInterface.php b/lib/internal/Magento/Framework/App/Config/Spi/PostProcessorInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..53c348170761f448914a01447a028c766ec89f4b
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Config/Spi/PostProcessorInterface.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Config\Spi;
+
+use Magento\Framework\App\Config\ConfigTypeInterface;
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+
+/**
+ * Allows to use custom callbacks and functions after collecting config from all sources
+ *
+ * @see SourceInterface
+ * @see ConfigTypeInterface
+ * @package Magento\Framework\App\Config\Spi
+ */
+interface PostProcessorInterface
+{
+    /**
+     * Process config after reading and converting to appropriate format
+     *
+     * @param array $config
+     * @return array
+     */
+    public function process(array $config);
+}
diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig.php b/lib/internal/Magento/Framework/App/DeploymentConfig.php
index d1a8b9018d55deb6b2d4d32031c168efec1d5f23..fa81b0fd8bc71f502bc1c0798a4698e33f667569 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig.php
@@ -114,6 +114,17 @@ class DeploymentConfig
         $this->data = null;
     }
 
+    /**
+     * Check if data from deploy files is avaiable
+     *
+     * @return bool
+     */
+    public function isDbAvailable()
+    {
+        $this->load();
+        return isset($this->data['db']);
+    }
+
     /**
      * Loads the configuration data
      *
diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php
index 6a4af75512d4d993f99ac374b33c1b5dca7bc812..a1635fc4b2670d3749adbc8ac7bb88bab31904cf 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php
@@ -11,7 +11,7 @@ use Magento\Framework\Config\File\ConfigFilePool;
 use Magento\Framework\Filesystem\DriverPool;
 
 /**
- * Deployment configuration reader
+ * Deployment configuration reader from files: env.php, config.php (config.local.php, config.dist.php)
  */
 class Reader
 {
@@ -72,7 +72,26 @@ class Reader
      */
     public function getFiles()
     {
-        return $this->files;
+        $path = $this->dirList->getPath(DirectoryList::CONFIG);
+        $fileDriver = $this->driverPool->getDriver(DriverPool::FILE);
+        $initialFilePools = $this->configFilePool->getInitialFilePools();
+
+        $files = [];
+        foreach ($this->files as $fileKey => $filePath) {
+            $files[$fileKey] = $filePath;
+            if (!$fileDriver->isExists($path . "/" . $filePath)) {
+                foreach ($initialFilePools as $initialFiles) {
+                    if (
+                        isset($initialFiles[$fileKey])
+                        && $fileDriver->isExists($path . '/' . $initialFiles[$fileKey])
+                    ) {
+                        $files[$fileKey] = $initialFiles[$fileKey];
+                    }
+                }
+            }
+        }
+
+        return $files;
     }
 
     /**
@@ -84,26 +103,19 @@ class Reader
      */
     public function load($fileKey = null)
     {
-        $path = $this->dirList->getPath(DirectoryList::CONFIG);
-        $fileDriver = $this->driverPool->getDriver(DriverPool::FILE);
-        $result = [];
         if ($fileKey) {
-            $filePath = $path . '/' . $this->configFilePool->getPath($fileKey);
-            if ($fileDriver->isExists($filePath)) {
-                $result = include $filePath;
-            }
+            $pathConfig = $this->configFilePool->getPath($fileKey);
+            return $this->loadConfigFile($fileKey, $pathConfig);
         } else {
             $configFiles = $this->configFilePool->getPaths();
             $allFilesData = [];
             $result = [];
-            foreach (array_keys($configFiles) as $fileKey) {
-                $configFile = $path . '/' . $this->configFilePool->getPath($fileKey);
-                if ($fileDriver->isExists($configFile)) {
-                    $fileData = include $configFile;
-                } else {
+            foreach ($configFiles as $fileKey => $pathConfig) {
+                $fileData = $this->loadConfigFile($fileKey, $pathConfig);
+                if (!$fileData) {
                     continue;
                 }
-                $allFilesData[$configFile] = $fileData;
+                $allFilesData[$fileKey] = $fileData;
                 if (!empty($fileData)) {
                     $intersection = array_intersect_key($result, $fileData);
                     if (!empty($intersection)) {
@@ -116,8 +128,38 @@ class Reader
                     $result = array_merge($result, $fileData);
                 }
             }
+            return $result;
         }
-        return $result ?: [];
+    }
+
+    /**
+     * @param string $fileKey
+     * @param string $pathConfig
+     * @param bool $ignoreInitialConfigFiles
+     * @return array
+     */
+    public function loadConfigFile($fileKey, $pathConfig, $ignoreInitialConfigFiles = false)
+    {
+        $result = [];
+        $initialFilePools = $this->configFilePool->getInitialFilePools();
+        $path = $this->dirList->getPath(DirectoryList::CONFIG);
+        $fileDriver = $this->driverPool->getDriver(DriverPool::FILE);
+
+        if (!$ignoreInitialConfigFiles) {
+            foreach ($initialFilePools as $initialFiles) {
+                if (isset($initialFiles[$fileKey]) && $fileDriver->isExists($path . '/' . $initialFiles[$fileKey])) {
+                    $fileBuffer = include $path . '/' . $initialFiles[$fileKey];
+                    $result = array_replace_recursive($result, $fileBuffer);
+                }
+            }
+        }
+
+        if ($fileDriver->isExists($path . '/' . $pathConfig)) {
+            $fileBuffer = include $path . '/' . $pathConfig;
+            $result = array_replace_recursive($result, $fileBuffer);
+        }
+
+        return $result;
     }
 
     /**
diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php
index ac1e5f6ecf897c4769af5b3dbe97cfde4a9e9ee8..6cead0305a6c6ada899060a2a7debdbfe71f6f1a 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php
@@ -14,7 +14,7 @@ use Magento\Framework\Config\File\ConfigFilePool;
 use Magento\Framework\Phrase;
 
 /**
- * Deployment configuration writer
+ * Deployment configuration writer to files: env.php, config.php (config.local.php, config.dist.php)
  */
 class Writer
 {
@@ -93,17 +93,18 @@ class Writer
      *
      * @param array $data
      * @param bool $override
+     * @param string $pool
      * @return void
+     * @throws FileSystemException
      */
-    public function saveConfig(array $data, $override = false)
+    public function saveConfig(array $data, $override = false, $pool = null)
     {
-        $paths = $this->configFilePool->getPaths();
-
         foreach ($data as $fileKey => $config) {
-            if (isset($paths[$fileKey])) {
+            $paths = $pool ? $this->configFilePool->getPathsByPool($pool) : $this->configFilePool->getPaths();
 
-                if ($this->filesystem->getDirectoryWrite(DirectoryList::CONFIG)->isExist($paths[$fileKey])) {
-                    $currentData = $this->reader->load($fileKey);
+            if (isset($paths[$fileKey])) {
+                $currentData = $this->reader->loadConfigFile($fileKey, $paths[$fileKey], true);
+                if ($currentData) {
                     if ($override) {
                         $config = array_merge($currentData, $config);
                     } else {
@@ -113,7 +114,8 @@ class Writer
 
                 $contents = $this->formatter->format($config);
                 try {
-                    $this->filesystem->getDirectoryWrite(DirectoryList::CONFIG)->writeFile($paths[$fileKey], $contents);
+                    $writeFilePath = $paths[$fileKey];
+                    $this->filesystem->getDirectoryWrite(DirectoryList::CONFIG)->writeFile($writeFilePath, $contents);
                 } catch (FileSystemException $e) {
                     throw new FileSystemException(
                         new Phrase('Deployment config file %1 is not writable.', [$paths[$fileKey]])
diff --git a/lib/internal/Magento/Framework/App/MutableScopeConfig.php b/lib/internal/Magento/Framework/App/MutableScopeConfig.php
index 5cbf108bc20317e27be0e13be4d4f3b2e2fc547a..010504d993bfcf7f54268994b03294289348956f 100644
--- a/lib/internal/Magento/Framework/App/MutableScopeConfig.php
+++ b/lib/internal/Magento/Framework/App/MutableScopeConfig.php
@@ -11,8 +11,31 @@ namespace Magento\Framework\App;
 use Magento\Framework\App\Config\MutableScopeConfigInterface;
 use Magento\Framework\App\Config\ScopeConfigInterface;
 
+/**
+ * @inheritdoc
+ */
 class MutableScopeConfig extends Config implements MutableScopeConfigInterface
 {
+    /**
+     * @var array
+     */
+    private $data;
+
+    /**
+     * @inheritdoc
+     */
+    public function getValue(
+        $path = null,
+        $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
+        $scopeCode = null
+    ) {
+        if (isset($this->data[$scope][$scopeCode][$path])) {
+            return $this->data[$scope][$scopeCode][$path];
+        }
+
+        return parent::getValue($path, $scope, $scopeCode);
+    }
+
     /**
      * Set config value in the corresponding config scope
      *
@@ -28,9 +51,15 @@ class MutableScopeConfig extends Config implements MutableScopeConfigInterface
         $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
         $scopeCode = null
     ) {
-        if (empty($scopeCode)) {
-            $scopeCode = null;
-        }
-        $this->_scopePool->getScope($scope, $scopeCode)->setValue($path, $value);
+        $this->data[$scope][$scopeCode][$path] = $value;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function clean()
+    {
+        $this->data = null;
+        parent::clean();
     }
 }
diff --git a/lib/internal/Magento/Framework/App/ObjectManager/ConfigCache.php b/lib/internal/Magento/Framework/App/ObjectManager/ConfigCache.php
index 7e8711d027bb730327f080170f6b5d4557ed9630..4e685e3472ef8305095c150088b77efc94964244 100644
--- a/lib/internal/Magento/Framework/App/ObjectManager/ConfigCache.php
+++ b/lib/internal/Magento/Framework/App/ObjectManager/ConfigCache.php
@@ -7,6 +7,9 @@
  */
 namespace Magento\Framework\App\ObjectManager;
 
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Serialize\Serializer\Serialize;
+
 class ConfigCache implements \Magento\Framework\ObjectManager\ConfigCacheInterface
 {
     /**
@@ -21,6 +24,11 @@ class ConfigCache implements \Magento\Framework\ObjectManager\ConfigCacheInterfa
      */
     protected $_prefix = 'diConfig';
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\Cache\FrontendInterface $cacheFrontend
      */
@@ -37,7 +45,7 @@ class ConfigCache implements \Magento\Framework\ObjectManager\ConfigCacheInterfa
      */
     public function get($key)
     {
-        return unserialize($this->_cacheFrontend->load($this->_prefix . $key));
+        return $this->getSerializer()->unserialize($this->_cacheFrontend->load($this->_prefix . $key));
     }
 
     /**
@@ -49,6 +57,20 @@ class ConfigCache implements \Magento\Framework\ObjectManager\ConfigCacheInterfa
      */
     public function save(array $config, $key)
     {
-        $this->_cacheFrontend->save(serialize($config), $this->_prefix . $key);
+        $this->_cacheFrontend->save($this->getSerializer()->serialize($config), $this->_prefix . $key);
+    }
+
+    /**
+     * Get serializer
+     *
+     * @return SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if (null === $this->serializer) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()->get(Serialize::class);
+        }
+        return $this->serializer;
     }
 }
diff --git a/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader.php b/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader.php
index 2190ff6cdb37fa5a17bc618dc4b8b2f396a787ad..2770443b6d7e28bc1565c6a79372402f5e196fee 100644
--- a/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader.php
+++ b/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader.php
@@ -7,6 +7,8 @@
  */
 namespace Magento\Framework\App\ObjectManager;
 
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Serialize\Serializer\Serialize;
 use Magento\Framework\ObjectManager\ConfigLoaderInterface;
 
 class ConfigLoader implements ConfigLoaderInterface
@@ -32,6 +34,11 @@ class ConfigLoader implements ConfigLoaderInterface
      */
     protected $_cache;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\Config\CacheInterface $cache
      * @param \Magento\Framework\ObjectManager\Config\Reader\DomFactory $readerFactory
@@ -67,11 +74,25 @@ class ConfigLoader implements ConfigLoaderInterface
 
         if (!$data) {
             $data = $this->_getReader()->read($area);
-            $this->_cache->save(serialize($data), $cacheId);
+            $this->_cache->save($this->getSerializer()->serialize($data), $cacheId);
         } else {
-            $data = unserialize($data);
+            $data = $this->getSerializer()->unserialize($data);
         }
 
         return $data;
     }
+
+    /**
+     * Get serializer
+     *
+     * @return SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if (null === $this->serializer) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()->get(Serialize::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader/Compiled.php b/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader/Compiled.php
index 844d3f038aefec4e5e13e80741d5f49477eea627..669c9f4121ac0612faf6ac34317e180b6011eddb 100644
--- a/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader/Compiled.php
+++ b/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader/Compiled.php
@@ -6,7 +6,10 @@
  */
 namespace Magento\Framework\App\ObjectManager\ConfigLoader;
 
+use Magento\Framework\App\Filesystem\DirectoryList;
 use Magento\Framework\ObjectManager\ConfigLoaderInterface;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Serialize\Serializer\Serialize;
 
 class Compiled implements ConfigLoaderInterface
 {
@@ -17,6 +20,11 @@ class Compiled implements ConfigLoaderInterface
      */
     private $configCache = [];
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * {inheritdoc}
      */
@@ -25,18 +33,33 @@ class Compiled implements ConfigLoaderInterface
         if (isset($this->configCache[$area])) {
             return $this->configCache[$area];
         }
-        $this->configCache[$area] = \unserialize(\file_get_contents(self::getFilePath($area)));
+        $this->configCache[$area] = $this->getSerializer()->unserialize(\file_get_contents(self::getFilePath($area)));
         return $this->configCache[$area];
     }
 
     /**
-     * Returns path to cached configuration
+     * Returns path to compiled configuration
      *
      * @param string $area
      * @return string
      */
     public static function getFilePath($area)
     {
-        return BP . '/var/di/' . $area . '.ser';
+        $diPath = DirectoryList::getDefaultConfig()[DirectoryList::DI][DirectoryList::PATH];
+        return BP . '/' . $diPath . '/' . $area . '.ser';
+    }
+
+    /**
+     * Get serializer
+     *
+     * @return SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if (null === $this->serializer) {
+            $this->serializer = new Serialize();
+        }
+        return $this->serializer;
     }
 }
diff --git a/lib/internal/Magento/Framework/App/ObjectManagerFactory.php b/lib/internal/Magento/Framework/App/ObjectManagerFactory.php
index 3a007841532cc84258b7a1a4d5d03aff927b4161..530c7c43599dfcdc8749491716f0239079d16243 100644
--- a/lib/internal/Magento/Framework/App/ObjectManagerFactory.php
+++ b/lib/internal/Magento/Framework/App/ObjectManagerFactory.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * Initialize application object manager.
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
@@ -10,22 +8,15 @@ namespace Magento\Framework\App;
 use Magento\Framework\App\Filesystem\DirectoryList;
 use Magento\Framework\Filesystem\DriverPool;
 use Magento\Framework\Interception\ObjectManager\ConfigInterface;
-use Magento\Framework\ObjectManager\Definition\Compiled\Serialized;
 use Magento\Framework\App\ObjectManager\Environment;
 use Magento\Framework\Config\File\ConfigFilePool;
 use Magento\Framework\Code\GeneratedFiles;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- * Class ObjectManagerFactory
  */
 class ObjectManagerFactory
 {
-    /**
-     * Path to definitions format in deployment configuration
-     */
-    const CONFIG_PATH_DEFINITION_FORMAT = 'definition/format';
-
     /**
      * Initialization parameter for a custom deployment configuration file
      */
@@ -117,18 +108,16 @@ class ObjectManagerFactory
         $arguments = array_merge($deploymentConfig->get(), $arguments);
         $definitionFactory = new \Magento\Framework\ObjectManager\DefinitionFactory(
             $this->driverPool->getDriver(DriverPool::FILE),
-            $this->directoryList->getPath(DirectoryList::DI),
-            $this->directoryList->getPath(DirectoryList::GENERATION),
-            $deploymentConfig->get(self::CONFIG_PATH_DEFINITION_FORMAT, Serialized::MODE_NAME)
+            $this->directoryList->getPath(DirectoryList::GENERATION)
         );
 
-        $definitions = $definitionFactory->createClassDefinition($deploymentConfig->get('definitions'));
+        $definitions = $definitionFactory->createClassDefinition();
         $relations = $definitionFactory->createRelations();
 
         /** @var EnvironmentFactory $envFactory */
         $envFactory = new $this->envFactoryClassName($relations, $definitions);
         /** @var EnvironmentInterface $env */
-        $env =  $envFactory->createEnvironment();
+        $env = $envFactory->createEnvironment();
 
         /** @var ConfigInterface $diConfig */
         $diConfig = $env->getDiConfig();
@@ -298,6 +287,8 @@ class ObjectManagerFactory
      * @param \Magento\Framework\ObjectManager\Config\Config $diConfig
      * @param \Magento\Framework\ObjectManager\DefinitionInterface $definitions
      * @return \Magento\Framework\Interception\PluginList\PluginList
+     * @deprecated
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     protected function _createPluginList(
         \Magento\Framework\ObjectManagerInterface $objectManager,
@@ -312,8 +303,7 @@ class ObjectManagerFactory
                 'relations' => $relations,
                 'definitions' => $definitionFactory->createPluginDefinition(),
                 'omConfig' => $diConfig,
-                'classDefinitions' => $definitions instanceof
-                \Magento\Framework\ObjectManager\Definition\Compiled ? $definitions : null
+                'classDefinitions' => null
             ]
         );
     }
diff --git a/lib/internal/Magento/Framework/App/ReinitableConfig.php b/lib/internal/Magento/Framework/App/ReinitableConfig.php
index 9944978785f54445eb0da3cd8007ec7b27712ed4..2d50bbadabbfefd81ef59a9be7a8ee7e193169fb 100644
--- a/lib/internal/Magento/Framework/App/ReinitableConfig.php
+++ b/lib/internal/Magento/Framework/App/ReinitableConfig.php
@@ -7,6 +7,10 @@ namespace Magento\Framework\App;
 
 use Magento\Framework\App\Config\ReinitableConfigInterface;
 
+/**
+ * @inheritdoc
+ * @deprecated
+ */
 class ReinitableConfig extends MutableScopeConfig implements ReinitableConfigInterface
 {
     /**
@@ -14,7 +18,7 @@ class ReinitableConfig extends MutableScopeConfig implements ReinitableConfigInt
      */
     public function reinit()
     {
-        $this->_scopePool->clean();
+        $this->clean();
         return $this;
     }
 }
diff --git a/lib/internal/Magento/Framework/App/ResourceConnection/Config.php b/lib/internal/Magento/Framework/App/ResourceConnection/Config.php
index 9cd03c8372e1753c1268e4a523a1407151cefa52..e967bb1b007b9d495e3eaed6bfb399ce247ecdba 100644
--- a/lib/internal/Magento/Framework/App/ResourceConnection/Config.php
+++ b/lib/internal/Magento/Framework/App/ResourceConnection/Config.php
@@ -1,14 +1,16 @@
 <?php
 /**
- * Resource configuration. Uses application configuration to retrieve resource connection information.
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Framework\App\ResourceConnection;
 
 use Magento\Framework\Config\ConfigOptionsListConstants;
+use Magento\Framework\Serialize\SerializerInterface;
 
+/**
+ * Resource configuration, uses application configuration to retrieve resource connection information
+ */
 class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInterface
 {
     /**
@@ -19,11 +21,24 @@ class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInte
     protected $_connectionNames = [];
 
     /**
+     * @var \Magento\Framework\App\DeploymentConfig
+     */
+    private $deploymentConfig;
+
+    /**
+     * @var bool
+     */
+    private $initialized = false;
+
+    /**
+     * Constructor
+     *
      * @param Config\Reader $reader
      * @param \Magento\Framework\Config\ScopeInterface $configScope
      * @param \Magento\Framework\Config\CacheInterface $cache
      * @param \Magento\Framework\App\DeploymentConfig $deploymentConfig
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      * @throws \InvalidArgumentException
      */
     public function __construct(
@@ -31,17 +46,11 @@ class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInte
         \Magento\Framework\Config\ScopeInterface $configScope,
         \Magento\Framework\Config\CacheInterface $cache,
         \Magento\Framework\App\DeploymentConfig $deploymentConfig,
-        $cacheId = 'resourcesCache'
+        $cacheId = 'resourcesCache',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $configScope, $cache, $cacheId);
-
-        $resource = $deploymentConfig->getConfigData(ConfigOptionsListConstants::KEY_RESOURCE);
-        foreach ($resource as $resourceName => $resourceData) {
-            if (!isset($resourceData['connection'])) {
-                throw new \InvalidArgumentException('Invalid initial resource configuration');
-            }
-            $this->_connectionNames[$resourceName] = $resourceData['connection'];
-        }
+        parent::__construct($reader, $configScope, $cache, $cacheId, $serializer);
+        $this->deploymentConfig = $deploymentConfig;
     }
 
     /**
@@ -52,6 +61,7 @@ class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInte
      */
     public function getConnectionName($resourceName)
     {
+        $this->initConnections();
         $connectionName = \Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION;
 
         $resourceName = preg_replace("/_setup$/", '', $resourceName);
@@ -80,4 +90,23 @@ class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInte
 
         return $connectionName;
     }
+
+    /**
+     * Initialise connections
+     *
+     * @return void
+     */
+    private function initConnections()
+    {
+        if (!$this->initialized) {
+            $this->initialized = true;
+            $resource = $this->deploymentConfig->getConfigData(ConfigOptionsListConstants::KEY_RESOURCE) ?: [];
+            foreach ($resource as $resourceName => $resourceData) {
+                if (!isset($resourceData['connection'])) {
+                    throw new \InvalidArgumentException('Invalid initial resource configuration');
+                }
+                $this->_connectionNames[$resourceName] = $resourceData['connection'];
+            }
+        }
+    }
 }
diff --git a/lib/internal/Magento/Framework/App/Route/Config.php b/lib/internal/Magento/Framework/App/Route/Config.php
index 70968c84d77fcf7de3951b182fd7cde2a12e365d..60412e7fa888b2969067ab7e73725b5f39d301a9 100644
--- a/lib/internal/Magento/Framework/App/Route/Config.php
+++ b/lib/internal/Magento/Framework/App/Route/Config.php
@@ -7,6 +7,8 @@
  */
 namespace Magento\Framework\App\Route;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
 class Config implements ConfigInterface
 {
     /**
@@ -39,6 +41,11 @@ class Config implements ConfigInterface
      */
     protected $_routes;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param Config\Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
@@ -73,7 +80,7 @@ class Config implements ConfigInterface
             return $this->_routes[$scope];
         }
         $cacheId = $scope . '::' . $this->_cacheId;
-        $cachedRoutes = unserialize($this->_cache->load($cacheId));
+        $cachedRoutes = $this->getSerializer()->unserialize($this->_cache->load($cacheId));
         if (is_array($cachedRoutes)) {
             $this->_routes[$scope] = $cachedRoutes;
             return $cachedRoutes;
@@ -81,7 +88,8 @@ class Config implements ConfigInterface
 
         $routers = $this->_reader->read($scope);
         $routes = $routers[$this->_areaList->getDefaultRouter($scope)]['routes'];
-        $this->_cache->save(serialize($routes), $cacheId);
+        $routesData = $this->getSerializer()->serialize($routes);
+        $this->_cache->save($routesData, $cacheId);
         $this->_routes[$scope] = $routes;
         return $routes;
     }
@@ -133,4 +141,19 @@ class Config implements ConfigInterface
 
         return array_unique($modules);
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/lib/internal/Magento/Framework/App/Router/ActionList.php b/lib/internal/Magento/Framework/App/Router/ActionList.php
index 11ee22a5f375ebd5f08e6cb7d606c5a4787074db..ec46154b2553ac2bc7f1d6e288a04f63602d25f7 100644
--- a/lib/internal/Magento/Framework/App/Router/ActionList.php
+++ b/lib/internal/Magento/Framework/App/Router/ActionList.php
@@ -6,6 +6,8 @@
  */
 namespace Magento\Framework\App\Router;
 
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Serialize\Serializer\Serialize;
 use Magento\Framework\Module\Dir\Reader as ModuleReader;
 
 class ActionList
@@ -36,27 +38,42 @@ class ActionList
     ];
 
     /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * @var string
+     */
+    private $actionInterface;
+
+    /**
+     * ActionList constructor
+     *
      * @param \Magento\Framework\Config\CacheInterface $cache
      * @param ModuleReader $moduleReader
      * @param string $actionInterface
      * @param string $cacheKey
      * @param array $reservedWords
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Config\CacheInterface $cache,
         ModuleReader $moduleReader,
         $actionInterface = \Magento\Framework\App\ActionInterface::class,
         $cacheKey = 'app_action_list',
-        $reservedWords = []
+        $reservedWords = [],
+        SerializerInterface $serializer = null
     ) {
         $this->reservedWords = array_merge($reservedWords, $this->reservedWords);
         $this->actionInterface = $actionInterface;
+        $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()->get(Serialize::class);
         $data = $cache->load($cacheKey);
         if (!$data) {
             $this->actions = $moduleReader->getActionFiles();
-            $cache->save(serialize($this->actions), $cacheKey);
+            $cache->save($this->serializer->serialize($this->actions), $cacheKey);
         } else {
-            $this->actions = unserialize($data);
+            $this->actions = $this->serializer->unserialize($data);
         }
     }
 
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/TypeListTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/TypeListTest.php
index a6074f6c457402054cae24c5ac05a499ef21e8fe..d185219becefed1935960b78467c98316c8bbcc3 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/TypeListTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/TypeListTest.php
@@ -7,6 +7,7 @@
 namespace Magento\Framework\App\Test\Unit\Cache;
 
 use \Magento\Framework\App\Cache\TypeList;
+use Magento\Framework\Serialize\SerializerInterface;
 
 /**
  * Test class for \Magento\Framework\App\Cache\TypeList
@@ -48,6 +49,11 @@ class TypeListTest extends \PHPUnit_Framework_TestCase
      */
     const CACHE_TYPE = \Magento\Framework\Cache\FrontendInterface::class;
 
+    /**
+     * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
+
     protected function setUp()
     {
         $this->_typesArray = [
@@ -85,6 +91,7 @@ class TypeListTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
 
         $objectHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->_typeList = $objectHelper->getObject(
@@ -93,7 +100,8 @@ class TypeListTest extends \PHPUnit_Framework_TestCase
                 'config' => $this->_config,
                 'cacheState' => $cacheState,
                 'factory' => $factory,
-                'cache' => $this->_cache
+                'cache' => $this->_cache,
+                'serializer' => $this->serializerMock,
             ]
         );
     }
@@ -118,8 +126,12 @@ class TypeListTest extends \PHPUnit_Framework_TestCase
     {
         $expectation = [self::TYPE_KEY => $this->_getPreparedType()];
         $this->_cache->expects($this->once())->method('load')->with(TypeList::INVALIDATED_TYPES)->will(
-            $this->returnValue(serialize($this->_typesArray))
+            $this->returnValue('serializedData')
         );
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with('serializedData')
+            ->willReturn($this->_typesArray);
         $this->assertEquals($expectation, $this->_typeList->getInvalidated());
     }
 
@@ -132,8 +144,12 @@ class TypeListTest extends \PHPUnit_Framework_TestCase
         $expectedInvalidated = [
             self::TYPE_KEY => 1,
         ];
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($expectedInvalidated)
+            ->willReturn('serializedData');
         $this->_cache->expects($this->once())->method('save')->with(
-            serialize($expectedInvalidated),
+            'serializedData',
             TypeList::INVALIDATED_TYPES
         );
         $this->_typeList->invalidate(self::TYPE_KEY);
@@ -147,8 +163,12 @@ class TypeListTest extends \PHPUnit_Framework_TestCase
         $expectedInvalidated = [
             self::TYPE_KEY => 1,
         ];
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($expectedInvalidated)
+            ->willReturn('serializedData');
         $this->_cache->expects($this->once())->method('save')->with(
-            serialize($expectedInvalidated),
+            'serializedData',
             TypeList::INVALIDATED_TYPES
         );
         $this->_typeList->invalidate([self::TYPE_KEY]);
@@ -156,15 +176,23 @@ class TypeListTest extends \PHPUnit_Framework_TestCase
 
     public function testCleanType()
     {
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with('serializedData')
+            ->willReturn($this->_typesArray);
         $this->_cache->expects($this->once())->method('load')->with(TypeList::INVALIDATED_TYPES)->will(
-            $this->returnValue(serialize($this->_typesArray))
+            $this->returnValue('serializedData')
         );
         $this->_config->expects($this->once())->method('getType')->with(self::TYPE_KEY)->will(
             $this->returnValue(['instance' => self::CACHE_TYPE])
         );
         unset($this->_typesArray[self::TYPE_KEY]);
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($this->_typesArray)
+            ->willReturn('serializedData');
         $this->_cache->expects($this->once())->method('save')->with(
-            serialize($this->_typesArray),
+            'serializedData',
             TypeList::INVALIDATED_TYPES
         );
         $this->_typeList->cleanType(self::TYPE_KEY);
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/ConfigSourceAggregatedTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/ConfigSourceAggregatedTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ddd8e325671afa3199270522811027308c222e6
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/ConfigSourceAggregatedTest.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Test\Unit\Config;
+
+use Magento\Framework\App\Config\ConfigSourceAggregated;
+use Magento\Framework\App\Config\ConfigSourceInterface;
+
+class ConfigSourceAggregatedTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $sourceMock;
+
+    /**
+     * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $sourceMockTwo;
+
+    /**
+     * @var ConfigSourceAggregated
+     */
+    private $source;
+
+    public function setUp()
+    {
+        $this->sourceMock = $this->getMockBuilder(ConfigSourceInterface::class)
+            ->getMockForAbstractClass();
+        $this->sourceMockTwo = $this->getMockBuilder(ConfigSourceInterface::class)
+            ->getMockForAbstractClass();
+
+        $sources = [
+            [
+                'source' => $this->sourceMockTwo,
+                'sortOrder' => 100
+            ],
+            [
+                'source' => $this->sourceMock,
+                'sortOrder' => 10
+            ],
+
+        ];
+
+        $this->source = new ConfigSourceAggregated($sources);
+    }
+
+    public function testGet()
+    {
+        $path = 'path';
+        $this->sourceMock->expects($this->once())
+            ->method('get')
+            ->with($path)
+            ->willReturn(['key' => 'value1', 'test' => false]);
+        $this->sourceMockTwo->expects($this->once())
+            ->method('get')
+            ->with($path)
+            ->willReturn(['key' => 'value2']);
+        $this->assertEquals(
+            [
+                'test' => false,
+                'key' => 'value2'
+            ],
+            $this->source->get($path)
+        );
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialConfigSourceTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialConfigSourceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e1b8d1e465141c4a724c891f5fae1d09eaa87299
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialConfigSourceTest.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\App\Test\Unit\Config;
+
+
+use Magento\Framework\App\Config\InitialConfigSource;
+use Magento\Framework\App\DeploymentConfig\Reader;
+
+class InitialConfigSourceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Reader|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $reader;
+
+    /**
+     * @var string
+     */
+    private $configType;
+
+    /**
+     * @var string
+     */
+    private $fileKey;
+
+    /**
+     * @var InitialConfigSource
+     */
+    private $source;
+
+    public function setUp()
+    {
+        $this->reader = $this->getMockBuilder(Reader::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->configType = 'configType';
+        $this->fileKey = 'file.php';
+        $this->source = new InitialConfigSource($this->reader, $this->configType, $this->fileKey);
+    }
+
+    public function testGet()
+    {
+        $path = 'path';
+        $this->reader->expects($this->once())
+            ->method('load')
+            ->with($this->fileKey)
+            ->willReturn([$this->configType => [$path => 'value']]);
+        $this->assertEquals('value', $this->source->get($path));
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialTest.php
index ce85753bedab5463799390149386a36ed6143803..941a670b1b44c8848371788826dcc3953a4fa8a1 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialTest.php
@@ -7,59 +7,68 @@ namespace Magento\Framework\App\Test\Unit\Config;
 
 class InitialTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\Framework\App\Config\Initial
      */
-    protected $_model;
+    private $config;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\Cache\Type\Config|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_initialReaderMock;
+    private $cacheMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var array
      */
-    protected $_configCacheMock;
+    private $data = [
+        'data' => [
+            'default' => ['key' => 'default_value'],
+            'stores' => ['default' => ['key' => 'store_value']],
+            'websites' => ['default' => ['key' => 'website_value']],
+        ],
+        'metadata' => ['metadata'],
+    ];
 
     protected function setUp()
     {
-        $this->_initialReaderMock =
-            $this->getMock(\Magento\Framework\App\Config\Initial\Reader::class, [], [], '', false);
-        $this->_configCacheMock =
-            $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false);
-        $serializedData = serialize(
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->cacheMock = $this->getMock(
+            \Magento\Framework\App\Cache\Type\Config::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->cacheMock->expects($this->any())
+            ->method('load')
+            ->with('initial_config')
+            ->willReturn(json_encode($this->data));
+        $serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
+        $serializerMock->method('unserialize')
+            ->willReturn($this->data);
+
+        $this->config = $this->objectManager->getObject(
+            \Magento\Framework\App\Config\Initial::class,
             [
-                'data' => [
-                    'default' => ['key' => 'default_value'],
-                    'stores' => ['default' => ['key' => 'store_value']],
-                    'websites' => ['default' => ['key' => 'website_value']],
-                ],
-                'metadata' => ['metadata'],
+                'cache' => $this->cacheMock,
+                'serializer' => $serializerMock,
             ]
         );
-        $this->_configCacheMock->expects(
-            $this->any()
-        )->method(
-            'load'
-        )->with(
-            'initial_config'
-        )->will(
-            $this->returnValue($serializedData)
-        );
-
-        $this->_model = new \Magento\Framework\App\Config\Initial($this->_initialReaderMock, $this->_configCacheMock);
     }
 
     /**
-     * @dataProvider getDataDataProvider
-     *
      * @param string $scope
-     * @param array $expectedResult
+     * @param array $expected
+     * @dataProvider getDataDataProvider
      */
-    public function testGetData($scope, $expectedResult)
+    public function testGetData($scope, $expected)
     {
-        $this->assertEquals($expectedResult, $this->_model->getData($scope));
+        $this->assertEquals($expected, $this->config->getData($scope));
     }
 
     public function getDataDataProvider()
@@ -73,7 +82,6 @@ class InitialTest extends \PHPUnit_Framework_TestCase
 
     public function testGetMetadata()
     {
-        $expectedResult = ['metadata'];
-        $this->assertEquals($expectedResult, $this->_model->getMetadata());
+        $this->assertEquals(['metadata'], $this->config->getMetadata());
     }
 }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/MetadataConfigTypeProcessorTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/MetadataConfigTypeProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1bedf1c3276b338075f83694fe0b1e8917192a0
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/MetadataConfigTypeProcessorTest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Test\Unit\Config;
+
+class MetadataConfigTypeProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Framework\App\Config\MetadataProcessor
+     */
+    protected $_model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_initialConfigMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_modelPoolMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_backendModelMock;
+
+    protected function setUp()
+    {
+        $this->_modelPoolMock = $this->getMock(
+            \Magento\Framework\App\Config\Data\ProcessorFactory::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->_initialConfigMock = $this->getMock(\Magento\Framework\App\Config\Initial::class, [], [], '', false);
+        $this->_backendModelMock = $this->getMock(\Magento\Framework\App\Config\Data\ProcessorInterface::class);
+        $this->_initialConfigMock->expects(
+            $this->any()
+        )->method(
+            'getMetadata'
+        )->will(
+            $this->returnValue(['some/config/path' => ['backendModel' => 'Custom_Backend_Model']])
+        );
+        $this->_model = new \Magento\Framework\App\Config\MetadataConfigTypeProcessor(
+            $this->_modelPoolMock,
+            $this->_initialConfigMock
+        );
+    }
+
+    public function testProcess()
+    {
+        $this->_modelPoolMock->expects(
+            $this->once()
+        )->method(
+            'get'
+        )->with(
+            'Custom_Backend_Model'
+        )->will(
+            $this->returnValue($this->_backendModelMock)
+        );
+        $this->_backendModelMock->expects(
+            $this->once()
+        )->method(
+            'processValue'
+        )->with(
+            'value'
+        )->will(
+            $this->returnValue('processed_value')
+        );
+        $data = ['default' => [ 'some' => ['config' => ['path' => 'value']], 'active' => 1]];
+        $expectedResult = $data;
+        $expectedResult['default']['some']['config']['path'] = 'processed_value';
+        $this->assertEquals($expectedResult, $this->_model->process($data));
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopeCodeResolverTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopeCodeResolverTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cbf671479877bedc1f6bb55f682f60b329e105bf
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopeCodeResolverTest.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Test\Unit\Config;
+
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\Framework\App\ScopeInterface;
+use Magento\Framework\App\ScopeResolverInterface;
+use Magento\Framework\App\ScopeResolverPool;
+
+class ScopeCodeResolverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ScopeResolverPool|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scopeResolverPool;
+
+    /**
+     * @var ScopeResolverInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scopeResolver;
+
+    /**
+     * @var ScopeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scope;
+
+    /**
+     * @var ScopeCodeResolver
+     */
+    private $scopeCodeResolver;
+
+    public function setUp()
+    {
+        $this->scopeResolverPool = $this->getMockBuilder(ScopeResolverPool::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->scopeResolver = $this->getMockBuilder(ScopeResolverInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $this->scope = $this->getMockBuilder(ScopeInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $this->scopeCodeResolver = new ScopeCodeResolver($this->scopeResolverPool);
+    }
+
+    public function testResolve()
+    {
+        $scopeType = 'website';
+        $scopeCode = 'myWebsite';
+        $scopeId = 4;
+        $this->scopeResolverPool->expects($this->once())
+            ->method('get')
+            ->with($scopeType)
+            ->willReturn($this->scopeResolver);
+        $this->scopeResolver->expects($this->once())
+            ->method('getScope')
+            ->with($scopeId)
+            ->willReturn($this->scope);
+        $this->scope->expects($this->once())
+            ->method('getCode')
+            ->willReturn($scopeCode);
+        $this->assertEquals($scopeCode, $this->scopeCodeResolver->resolve($scopeType, $scopeId));
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopePoolTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopePoolTest.php
deleted file mode 100644
index 6c9ae8a09a77de9481e80de94c1b2faa1a19bf42..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopePoolTest.php
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\App\Test\Unit\Config;
-
-use Magento\Framework\App\Config\Scope\ReaderInterface;
-use Magento\Framework\App\Config\Scope\ReaderPoolInterface;
-
-class ScopePoolTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var ReaderInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_reader;
-
-    /**
-     * @var ReaderPoolInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_readerPool;
-
-    /**
-     * @var \Magento\Framework\App\Config\DataFactory|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_dataFactory;
-
-    /**
-     * @var \Magento\Framework\Cache\FrontendInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_cache;
-
-    /**
-     * @var \Magento\Framework\App\Config\ScopePool
-     */
-    protected $_object;
-
-    protected function setUp()
-    {
-        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-        $this->_readerPool = $this->getMockForAbstractClass(ReaderPoolInterface::class);
-        $this->_reader = $this->getMockForAbstractClass(ReaderInterface::class);
-        $this->_dataFactory = $this->getMockBuilder(
-            \Magento\Framework\App\Config\DataFactory::class
-        )->disableOriginalConstructor()->getMock();
-        $this->_cache = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class);
-        $this->_object = $helper->getObject(
-            \Magento\Framework\App\Config\ScopePool::class,
-            [
-                'readerPool' => $this->_readerPool,
-                'dataFactory' => $this->_dataFactory,
-                'cache' => $this->_cache,
-                'cacheId' => 'test_cache_id'
-            ]
-        );
-
-        $requestMock = $this->getMockBuilder(\Magento\Framework\App\RequestInterface::class)
-            ->disableOriginalConstructor()
-            ->setMethods(
-                [
-                    'getBasePath',
-                    'getModuleName',
-                    'setModuleName',
-                    'getActionName',
-                    'setActionName',
-                    'getParam',
-                    'getParams',
-                    'setParams',
-                    'getCookie',
-                    'isSecure',
-                    'getServer',
-                    'getHttpHost'
-                ]
-            )->getMock();
-        $reflection = new \ReflectionClass(get_class($this->_object));
-        $reflectionProperty = $reflection->getProperty('request');
-        $reflectionProperty->setAccessible(true);
-        $reflectionProperty->setValue($this->_object, $requestMock);
-        $requestMock->expects($this->any())
-            ->method('getBasePath')
-            ->willReturn('baseUrl');
-    }
-
-    /**
-     * @dataProvider getScopeDataProvider
-     *
-     * @param string $scopeType
-     * @param string $scope
-     * @param array $data
-     * @param string|null $cachedData
-     */
-    public function testGetScope($scopeType, $scope, array $data, $cachedData)
-    {
-        $scopeCode = $scope instanceof \Magento\Framework\App\ScopeInterface ? $scope->getCode() : $scope;
-        $cacheKey = "test_cache_id|{$scopeType}|{$scopeCode}|baseUrl";
-
-        $this->_readerPool->expects(
-            $this->any()
-        )->method(
-            'getReader'
-        )->with(
-            $scopeType
-        )->will(
-            $this->returnValue($this->_reader)
-        );
-        $this->_cache->expects($this->once())->method('load')->with($cacheKey)->will($this->returnValue($cachedData));
-
-        if (!$cachedData) {
-            $this->_reader->expects($this->once())->method('read')->with('testScope')->will($this->returnValue($data));
-            $this->_cache->expects(
-                $this->once()
-            )->method(
-                'save'
-            )->with(
-                serialize($data),
-                $cacheKey,
-                [\Magento\Framework\App\Config\ScopePool::CACHE_TAG]
-            );
-        }
-
-        $configData = $this->getMockBuilder(\Magento\Framework\App\Config\Data::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->_dataFactory->expects(
-            $this->once()
-        )->method(
-            'create'
-        )->with(
-            ['data' => $data]
-        )->will(
-            $this->returnValue($configData)
-        );
-        $this->assertInstanceOf(
-            \Magento\Framework\App\Config\DataInterface::class,
-            $this->_object->getScope($scopeType, $scope)
-        );
-
-        // second call to check caching
-        $this->assertInstanceOf(
-            \Magento\Framework\App\Config\DataInterface::class,
-            $this->_object->getScope($scopeType, $scope)
-        );
-    }
-
-    public function getScopeDataProvider()
-    {
-        $baseScope = $this->getMockForAbstractClass(\Magento\Framework\App\ScopeInterface::class);
-        $baseScope->expects($this->any())->method('getCode')->will($this->returnValue('testScope'));
-        return [
-            ['scopeType1', 'testScope', ['key' => 'value'], null],
-            ['scopeType2', 'testScope', ['key' => 'value'], serialize(['key' => 'value'])],
-            ['scopeType1', $baseScope, ['key' => 'value'], null]
-        ];
-    }
-
-    public function testClean()
-    {
-        $this->_cache->expects(
-            $this->once()
-        )->method(
-            'clean'
-        )->with(
-            \Zend_Cache::CLEANING_MODE_MATCHING_TAG,
-            [\Magento\Framework\App\Config\ScopePool::CACHE_TAG]
-        );
-        $this->_object->clean('testScope');
-    }
-}
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ConfigTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2474829693e40a16890041c25791f05525defe3
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Test/Unit/ConfigTest.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Test\Unit;
+
+use Magento\Framework\App\Config;
+use Magento\Framework\App\Config\ConfigTypeInterface;
+use Magento\Framework\App\Config\ScopeCodeResolver;
+use Magento\Framework\App\ScopeInterface;
+
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ScopeCodeResolver|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scopeCodeResolver;
+
+    /**
+     * @var ConfigTypeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $configType;
+
+    /**
+     * @var ScopeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scope;
+
+    /**
+     * @var Config
+     */
+    private $appConfig;
+
+    public function setUp()
+    {
+        $this->scopeCodeResolver = $this->getMockBuilder(ScopeCodeResolver::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->configType = $this->getMockBuilder(ConfigTypeInterface::class)
+            ->getMockForAbstractClass();
+        $this->scope = $this->getMockBuilder(ScopeInterface::class)
+            ->getMockForAbstractClass();
+
+        $this->appConfig = new Config($this->scopeCodeResolver, ['system' => $this->configType]);
+    }
+
+    /**
+     * @param string $scope
+     * @param string|null $scopeCode
+     *
+     * @dataProvider getValueDataProvider
+     * @return void
+     */
+    public function testGetValue($scope, $scopeCode = null)
+    {
+        $path = 'path';
+        if (!is_string($scope)) {
+            $this->scopeCodeResolver->expects($this->once())
+                ->method('resolve')
+                ->with('stores', $scopeCode)
+                ->willReturn('myStore');
+        } elseif (!$scopeCode) {
+            $this->scope->expects($this->once())
+                ->method('getCode')
+                ->willReturn('myWebsite');
+        }
+        $this->configType->expects($this->once())
+            ->method('get')
+            ->with($scope =='store' ? 'stores/path' : 'websites/myWebsite/path')
+            ->willReturn(true);
+
+        $this->assertTrue($this->appConfig->getValue($path, $scope, $scopeCode ?: $this->scope));
+    }
+
+    public function getValueDataProvider()
+    {
+        return [
+            ['store', 1],
+            ['website'],
+        ];
+    }
+}
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/ReaderTest.php b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/ReaderTest.php
index b78e5a536ac9d3757f537822851a3e450788aa9b..a321775883e09abb951aa3179a24d2ec82ce6370 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/ReaderTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/ReaderTest.php
@@ -61,6 +61,10 @@ class ReaderTest extends \PHPUnit_Framework_TestCase
             ->expects($this->any())
             ->method('getPaths')
             ->willReturn(['configKeyOne' => 'config.php', 'configKeyTwo' => 'env.php']);
+        $this->configFilePool
+            ->expects($this->any())
+            ->method('getInitialFilePools')
+            ->willReturn([]);
     }
 
     public function testGetFile()
@@ -103,6 +107,7 @@ class ReaderTest extends \PHPUnit_Framework_TestCase
         $configFilePool = $this->getMock(\Magento\Framework\Config\File\ConfigFilePool::class, [], [], '', false);
         $configFilePool->expects($this->any())->method('getPaths')->willReturn([$file]);
         $configFilePool->expects($this->any())->method('getPath')->willReturn($file);
+        $configFilePool->expects($this->any())->method('getInitialFilePools')->willReturn([]);
         $object = new Reader($this->dirList, $this->driverPool, $configFilePool, $file);
         $this->assertSame($expected, $object->load($file));
     }
@@ -130,6 +135,9 @@ class ReaderTest extends \PHPUnit_Framework_TestCase
             ->expects($this->any())
             ->method('getPath')
             ->will($this->returnValueMap($files));
+        $configFilePool->expects($this->any())
+            ->method('getInitialFilePools')
+            ->willReturn([]);
         $configFilePool
             ->expects($this->any())
             ->method('getPaths')
@@ -150,6 +158,9 @@ class ReaderTest extends \PHPUnit_Framework_TestCase
             ->expects($this->any())
             ->method('getPath')
             ->will($this->returnValueMap($files));
+        $configFilePool->expects($this->any())
+            ->method('getInitialFilePools')
+            ->willReturn([]);
         $configFilePool
             ->expects($this->any())
             ->method('getPaths')
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/WriterTest.php b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/WriterTest.php
index de06f6f18a5909093a0b5d45e8c2b34c2f1940b9..02d3ade243b8319f458b28a24977bd7893240ad8 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/WriterTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/WriterTest.php
@@ -18,6 +18,11 @@ use Magento\Framework\Filesystem\Directory\ReadInterface;
 use Magento\Framework\Filesystem\Directory\WriteInterface;
 use Magento\Framework\Phrase;
 
+/**
+ * @covers \Magento\Framework\App\DeploymentConfig\Writer
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * @package Magento\Framework\App\Test\Unit\DeploymentConfig
+ */
 class WriterTest extends \PHPUnit_Framework_TestCase
 {
     /** @var Writer */
@@ -76,8 +81,7 @@ class WriterTest extends \PHPUnit_Framework_TestCase
     public function testSaveConfig()
     {
         $configFiles = [
-            ConfigFilePool::APP_CONFIG => 'test_conf.php',
-            'test_key' => 'test2_conf.php'
+            ConfigFilePool::APP_CONFIG => 'config.php'
         ];
 
         $testSetExisting = [
@@ -113,13 +117,14 @@ class WriterTest extends \PHPUnit_Framework_TestCase
         $this->deploymentConfig->expects($this->once())->method('resetData');
         $this->configFilePool->expects($this->once())->method('getPaths')->willReturn($configFiles);
         $this->dirWrite->expects($this->any())->method('isExist')->willReturn(true);
-        $this->reader->expects($this->once())->method('load')->willReturn($testSetExisting[ConfigFilePool::APP_CONFIG]);
+        $this->reader->expects($this->once())->method('loadConfigFile')
+            ->willReturn($testSetExisting[ConfigFilePool::APP_CONFIG]);
         $this->formatter
             ->expects($this->once())
             ->method('format')
             ->with($testSetExpected[ConfigFilePool::APP_CONFIG])
             ->willReturn([]);
-        $this->dirWrite->expects($this->once())->method('writeFile')->with('test_conf.php', []);
+        $this->dirWrite->expects($this->once())->method('writeFile')->with('config.php', []);
 
         $this->object->saveConfig($testSetUpdate);
     }
@@ -127,19 +132,7 @@ class WriterTest extends \PHPUnit_Framework_TestCase
     public function testSaveConfigOverride()
     {
         $configFiles = [
-            ConfigFilePool::APP_CONFIG => 'test_conf.php',
-            'test_key' => 'test2_conf.php'
-        ];
-
-        $testSetExisting = [
-            ConfigFilePool::APP_CONFIG => [
-                'foo' => 'bar',
-                'key' => 'value',
-                'baz' => [
-                    'test' => 'value',
-                    'test1' => 'value1'
-                ]
-            ],
+            ConfigFilePool::APP_CONFIG => 'config.php'
         ];
 
         $testSetUpdate = [
@@ -152,8 +145,6 @@ class WriterTest extends \PHPUnit_Framework_TestCase
 
         $testSetExpected = [
             ConfigFilePool::APP_CONFIG => [
-                'foo' => 'bar',
-                'key' => 'value',
                 'baz' => [
                     'test' => 'value2',
                 ]
@@ -163,13 +154,12 @@ class WriterTest extends \PHPUnit_Framework_TestCase
         $this->deploymentConfig->expects($this->once())->method('resetData');
         $this->configFilePool->expects($this->once())->method('getPaths')->willReturn($configFiles);
         $this->dirWrite->expects($this->any())->method('isExist')->willReturn(true);
-        $this->reader->expects($this->once())->method('load')->willReturn($testSetExisting[ConfigFilePool::APP_CONFIG]);
         $this->formatter
             ->expects($this->once())
             ->method('format')
             ->with($testSetExpected[ConfigFilePool::APP_CONFIG])
             ->willReturn([]);
-        $this->dirWrite->expects($this->once())->method('writeFile')->with('test_conf.php', []);
+        $this->dirWrite->expects($this->once())->method('writeFile')->with('config.php', []);
 
         $this->object->saveConfig($testSetUpdate, true);
     }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigCacheTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigCacheTest.php
index 336e958403f9198e916af3ef3fc6a3dd10af84c3..7f05857f7cc816c9e5b0be56ae3ff520ac38efa4 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigCacheTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigCacheTest.php
@@ -5,49 +5,86 @@
  */
 namespace Magento\Framework\App\Test\Unit\ObjectManager;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
 class ConfigCacheTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @var \Magento\Framework\App\ObjectManager\ConfigCache
      */
-    protected $_configCache;
+    private $configCache;
+
+    /**
+     * @var \Magento\Framework\App\ObjectManager\ConfigCache|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $cacheFrontendMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_cacheFrontendMock;
+    private $serializerMock;
 
     protected function setUp()
     {
-        $this->_cacheFrontendMock = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class);
-        $this->_configCache = new \Magento\Framework\App\ObjectManager\ConfigCache($this->_cacheFrontendMock);
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->cacheFrontendMock = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class);
+        $this->configCache = $objectManagerHelper->getObject(
+            \Magento\Framework\App\ObjectManager\ConfigCache::class,
+            ['cacheFrontend' => $this->cacheFrontendMock]
+        );
+
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
+        $objectManagerHelper->setBackwardCompatibleProperty(
+            $this->configCache,
+            'serializer',
+            $this->serializerMock
+        );
     }
 
     protected function tearDown()
     {
-        unset($this->_configCache);
+        unset($this->configCache);
     }
 
-    public function testGet()
+    /**
+     * @dataProvider getDataProvider
+     */
+    public function testGet($loadData, $expectedResult)
     {
         $key = 'key';
-        $this->_cacheFrontendMock->expects(
+        $this->cacheFrontendMock->expects(
             $this->once()
         )->method(
             'load'
         )->with(
             'diConfig' . $key
         )->will(
-            $this->returnValue(false)
+            $this->returnValue($loadData)
         );
-        $this->assertEquals(false, $this->_configCache->get($key));
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($loadData)
+            ->willReturn($expectedResult);
+        $this->assertEquals($expectedResult, $this->configCache->get($key));
+    }
+
+    public function getDataProvider()
+    {
+        return [
+            [false, false],
+            ['serialized data', ['some data']],
+        ];
     }
 
     public function testSave()
     {
         $key = 'key';
         $config = ['config'];
-        $this->_cacheFrontendMock->expects($this->once())->method('save')->with(serialize($config), 'diConfig' . $key);
-        $this->_configCache->save($config, $key);
+        $serializedData = 'serialized data';
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->willReturn($serializedData);
+        $this->cacheFrontendMock->expects($this->once())->method('save')->with($serializedData, 'diConfig' . $key);
+        $this->configCache->save($config, $key);
     }
 }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigLoaderTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigLoaderTest.php
index 5a0b4ae96f26cf7eeebe59e0df60d6a981fb4b08..90dba092f054e04370604d061e1eb6b5088300d2 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigLoaderTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigLoaderTest.php
@@ -8,31 +8,38 @@
 
 namespace Magento\Framework\App\Test\Unit\ObjectManager;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
 class ConfigLoaderTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @var \Magento\Framework\App\ObjectManager\ConfigLoader
      */
-    protected $_model;
+    private $object;
+
+    /**
+     * @var \Magento\Framework\ObjectManager\Config\Reader\DomFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $readerFactoryMock;
 
     /**
-     * @var \Magento\Framework\ObjectManager\Config\Reader\DomFactory
+     * @var \Magento\Framework\ObjectManager\Config\Reader\Dom|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_readerFactoryMock;
+    private $readerMock;
 
     /**
-     * @var \Magento\Framework\ObjectManager\Config\Reader\Dom
+     * @var \Magento\Framework\App\Cache\Type\Config|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_readerMock;
+    private $cacheMock;
 
     /**
-     * @var \Magento\Framework\App\Cache\Type\Config
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_cacheMock;
+    private $serializerMock;
 
     protected function setUp()
     {
-        $this->_readerMock = $this->getMock(
+        $this->readerMock = $this->getMock(
             \Magento\Framework\ObjectManager\Config\Reader\Dom::class,
             [],
             [],
@@ -40,7 +47,7 @@ class ConfigLoaderTest extends \PHPUnit_Framework_TestCase
             false
         );
 
-        $this->_readerFactoryMock = $this->getMock(
+        $this->readerFactoryMock = $this->getMock(
             \Magento\Framework\ObjectManager\Config\Reader\DomFactory::class,
             ['create'],
             [],
@@ -48,17 +55,29 @@ class ConfigLoaderTest extends \PHPUnit_Framework_TestCase
             false
         );
 
-        $this->_readerFactoryMock->expects(
+        $this->readerFactoryMock->expects(
             $this->any()
         )->method(
             'create'
         )->will(
-            $this->returnValue($this->_readerMock)
+            $this->returnValue($this->readerMock)
         );
 
-        $this->_cacheMock = $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false);
-        $this->_model = new \Magento\Framework\App\ObjectManager\ConfigLoader(
-            $this->_cacheMock, $this->_readerFactoryMock
+        $this->cacheMock = $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false);
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $this->object = $objectManagerHelper->getObject(
+            \Magento\Framework\App\ObjectManager\ConfigLoader::class,
+            [
+                'cache' => $this->cacheMock,
+                'readerFactory' => $this->readerFactoryMock,
+            ]
+        );
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
+        $objectManagerHelper->setBackwardCompatibleProperty(
+            $this->object,
+            'serializer',
+            $this->serializerMock
         );
     }
 
@@ -66,23 +85,28 @@ class ConfigLoaderTest extends \PHPUnit_Framework_TestCase
      * @param $area
      * @dataProvider loadDataProvider
      */
-    public function testLoad($area)
+    public function testLoadNotCached($area)
     {
         $configData = ['some' => 'config', 'data' => 'value'];
+        $serializedData = 'serialized data';
 
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            $area . '::DiConfig'
-        )->will(
-            $this->returnValue(false)
-        );
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->with($area . '::DiConfig')
+            ->will($this->returnValue(false));
+
+        $this->cacheMock->expects($this->once())
+            ->method('save')
+            ->with($serializedData);
+        $this->readerMock->expects($this->once())->method('read')->with($area)->will($this->returnValue($configData));
 
-        $this->_readerMock->expects($this->once())->method('read')->with($area)->will($this->returnValue($configData));
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->willReturn($serializedData);
 
-        $this->assertEquals($configData, $this->_model->load($area));
+        $this->serializerMock->expects($this->never())->method('unserialize');
+
+        $this->assertEquals($configData, $this->object->load($area));
     }
 
     /**
@@ -98,4 +122,23 @@ class ConfigLoaderTest extends \PHPUnit_Framework_TestCase
             'any area files' => ['any']
         ];
     }
+
+    public function testLoadCached()
+    {
+        $configData = ['some' => 'config', 'data' => 'value'];
+        $serializedData = 'serialized data';
+
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn($serializedData);
+        $this->cacheMock->expects($this->never())
+            ->method('save');
+        $this->readerMock->expects($this->never())->method('read');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedData)
+            ->willReturn($configData);
+        $this->serializerMock->expects($this->never())->method('serialize');
+        $this->assertEquals($configData, $this->object->load('testArea'));
+    }
 }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php
deleted file mode 100644
index 9a35aa9104e80e3eae34c928130fd32add5f0d2e..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-// @codingStandardsIgnoreFile
-
-namespace Magento\Framework\App\Test\Unit;
-
-class ReinitableConfigTest extends \PHPUnit_Framework_TestCase
-{
-    public function testReinit()
-    {
-        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-        $scopePool = $this->getMock(\Magento\Framework\App\Config\ScopePool::class, ['clean'], [], '', false);
-        $scopePool->expects($this->once())->method('clean');
-        /** @var \Magento\Framework\App\ReinitableConfig $config */
-        $config = $helper->getObject(\Magento\Framework\App\ReinitableConfig::class, ['scopePool' => $scopePool]);
-        $this->assertInstanceOf(\Magento\Framework\App\Config\ReinitableConfigInterface::class, $config->reinit());
-    }
-}
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ResourceConnection/ConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ResourceConnection/ConfigTest.php
index 936a806432419a43a33207d51cfd751e71bee814..4b6944146e5ed4bb9d59ce458ea9b901403cbf69 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/ResourceConnection/ConfigTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/ResourceConnection/ConfigTest.php
@@ -5,47 +5,60 @@
  */
 namespace Magento\Framework\App\Test\Unit\ResourceConnection;
 
+use Magento\Framework\Config\ConfigOptionsListConstants;
+
 class ConfigTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Framework\App\\Config
+     * @var \Magento\Framework\App\ResourceConnection\Config
      */
-    protected $_model;
+    private $config;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Config\ScopeInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_scopeMock;
+    private $scopeMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_cacheMock;
+    private $cacheMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\ResourceConnection\Config\Reader|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_readerMock;
+    private $readerMock;
 
     /**
-     * @var array
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_resourcesConfig;
+    private $serializerMock;
 
     /**
      * @var array
      */
-    protected $_initialResources;
+    private $resourcesConfig;
+
+    /**
+     * @var \Magento\Framework\App\DeploymentConfig|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $deploymentConfig;
 
     protected function setUp()
     {
-        $this->_scopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class);
-        $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
-
-        $this->_readerMock =
-            $this->getMock(\Magento\Framework\App\ResourceConnection\Config\Reader::class, [], [], '', false);
+        $this->scopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class);
+        $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+
+        $this->readerMock = $this->getMock(
+            \Magento\Framework\App\ResourceConnection\Config\Reader::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
 
-        $this->_resourcesConfig = [
+        $this->resourcesConfig = [
             'mainResourceName' => ['name' => 'mainResourceName', 'extends' => 'anotherResourceName'],
             'otherResourceName' => ['name' => 'otherResourceName', 'connection' => 'otherConnectionName'],
             'anotherResourceName' => ['name' => 'anotherResourceName', 'connection' => 'anotherConnection'],
@@ -53,61 +66,61 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             'extendedResourceName' => ['name' => 'extendedResourceName', 'extends' => 'validResource'],
         ];
 
-        $this->_initialResources = [
-            'validResource' => ['connection' => 'validConnectionName'],
-        ];
-
-        $this->_cacheMock->expects(
-            $this->any()
-        )->method(
-            'load'
-        )->will(
-            $this->returnValue(serialize($this->_resourcesConfig))
-        );
-
-        $deploymentConfig = $this->getMock(\Magento\Framework\App\DeploymentConfig::class, [], [], '', false);
-        $deploymentConfig->expects($this->once())
-            ->method('getConfigData')
-            ->with('resource')
-            ->willReturn($this->_initialResources);
-
-        $this->_model = new \Magento\Framework\App\ResourceConnection\Config(
-            $this->_readerMock,
-            $this->_scopeMock,
-            $this->_cacheMock,
-            $deploymentConfig,
-            'cacheId'
+        $serializedData = 'serialized data';
+        $this->cacheMock->expects($this->any())
+            ->method('load')
+            ->willReturn($serializedData);
+        $this->serializerMock->method('unserialize')
+            ->with($serializedData)
+            ->willReturn($this->resourcesConfig);
+
+        $this->deploymentConfig = $this->getMock(\Magento\Framework\App\DeploymentConfig::class, [], [], '', false);
+        $this->config = new \Magento\Framework\App\ResourceConnection\Config(
+            $this->readerMock,
+            $this->scopeMock,
+            $this->cacheMock,
+            $this->deploymentConfig,
+            'cacheId',
+            $this->serializerMock
         );
     }
 
     /**
-     * @dataProvider getConnectionNameDataProvider
      * @param string $resourceName
      * @param string $connectionName
+     * @dataProvider getConnectionNameDataProvider
      */
     public function testGetConnectionName($resourceName, $connectionName)
     {
-        $this->assertEquals($connectionName, $this->_model->getConnectionName($resourceName));
+        $this->deploymentConfig->expects($this->once())
+            ->method('getConfigData')
+            ->with(ConfigOptionsListConstants::KEY_RESOURCE)
+            ->willReturn([
+                'validResource' => ['connection' => 'validConnectionName'],
+            ]);
+        $this->assertEquals($connectionName, $this->config->getConnectionName($resourceName));
     }
 
     /**
      * @expectedException \InvalidArgumentException
      */
-    public function testExceptionConstructor()
+    public function testGetConnectionNameWithException()
     {
-        $deploymentConfig = $this->getMock(\Magento\Framework\App\DeploymentConfig::class, [], [], '', false);
-        $deploymentConfig->expects($this->once())
+        $deploymentConfigMock = $this->getMock(\Magento\Framework\App\DeploymentConfig::class, [], [], '', false);
+        $deploymentConfigMock->expects($this->once())
             ->method('getConfigData')
-            ->with('resource')
+            ->with(ConfigOptionsListConstants::KEY_RESOURCE)
             ->willReturn(['validResource' => ['somekey' => 'validConnectionName']]);
 
-        new \Magento\Framework\App\ResourceConnection\Config(
-            $this->_readerMock,
-            $this->_scopeMock,
-            $this->_cacheMock,
-            $deploymentConfig,
-            'cacheId'
+        $config = new \Magento\Framework\App\ResourceConnection\Config(
+            $this->readerMock,
+            $this->scopeMock,
+            $this->cacheMock,
+            $deploymentConfigMock,
+            'cacheId',
+            $this->serializerMock
         );
+        $config->getConnectionName('default');
     }
 
     /**
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Route/ConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Route/ConfigTest.php
index 949ed3f9953c91782361e30e5240748c2646f0ea..fe6f8d05114c58cc0585bc44908faf3fa2a2b666 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Route/ConfigTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Route/ConfigTest.php
@@ -13,7 +13,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
     protected $_config;
 
     /**
-     * @var Cache_Mock_Wrapper
+     * @var \Magento\Framework\App\Route\Config\Reader|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_readerMock;
 
@@ -32,88 +32,76 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      */
     protected $_areaList;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
+
     protected function setUp()
     {
         $this->_readerMock = $this->getMock(\Magento\Framework\App\Route\Config\Reader::class, [], [], '', false);
         $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
         $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class);
         $this->_areaList = $this->getMock(\Magento\Framework\App\AreaList::class, [], [], '', false);
-        $this->_configScopeMock->expects(
-            $this->any()
-        )->method(
-            'getCurrentScope'
-        )->will(
-            $this->returnValue('areaCode')
-        );
-        $this->_config = new \Magento\Framework\App\Route\Config(
-            $this->_readerMock,
-            $this->_cacheMock,
-            $this->_configScopeMock,
-            $this->_areaList
+        $this->_configScopeMock->expects($this->any())
+            ->method('getCurrentScope')
+            ->willReturn('areaCode');
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->_config = $objectManager->getObject(
+            \Magento\Framework\App\Route\Config::class,
+            [
+                'reader' => $this->_readerMock,
+                'cache' => $this->_cacheMock,
+                'configScope' => $this->_configScopeMock,
+                'areaList' => $this->_areaList
+            ]
         );
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
+        $objectManager->setBackwardCompatibleProperty($this->_config, 'serializer', $this->serializerMock);
     }
 
     public function testGetRouteFrontNameIfCacheIfRouterIdNotExist()
     {
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            'areaCode::RoutesConfig'
-        )->will(
-            $this->returnValue(serialize(['expected']))
-        );
+        $this->_cacheMock->expects($this->once())
+            ->method('load')
+            ->with('areaCode::RoutesConfig')
+            ->willReturn('["expected"]');
         $this->assertEquals('routerCode', $this->_config->getRouteFrontName('routerCode'));
     }
 
     public function testGetRouteByFrontName()
     {
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            'areaCode::RoutesConfig'
-        )->will(
-            $this->returnValue(serialize(['routerCode' => ['frontName' => 'routerName']]))
-        );
-
-        $this->assertEquals('routerCode', $this->_config->getRouteByFrontName('routerName'));
-
-        // check internal caching in $this->_routes array
+        $data = ['routerCode' => ['frontName' => 'routerName']];
+        $this->_cacheMock->expects($this->once())
+            ->method('load')
+            ->with('areaCode::RoutesConfig')
+            ->willReturn('serializedData');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with('serializedData')
+            ->willReturn($data);
         $this->assertEquals('routerCode', $this->_config->getRouteByFrontName('routerName'));
     }
 
     public function testGetRouteByFrontNameNoRoutes()
     {
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            'areaCode::RoutesConfig'
-        )->will(
-            $this->returnValue(serialize([]))
-        );
-
-        $this->assertFalse($this->_config->getRouteByFrontName('routerName'));
-
-        // check caching in $this->_routes array
+        $this->_cacheMock->expects($this->once())
+            ->method('load')
+            ->with('areaCode::RoutesConfig')
+            ->willReturn('serializedData');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with('serializedData')
+            ->willReturn([]);
         $this->assertFalse($this->_config->getRouteByFrontName('routerName'));
     }
 
     public function testGetRouteByFrontNameNoCache()
     {
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            'scope::RoutesConfig'
-        )->will(
-            $this->returnValue(serialize(false))
-        );
+        $this->_cacheMock->expects($this->once())
+            ->method('load')
+            ->with('scope::RoutesConfig')
+            ->willReturn('false');
 
         $routes = [
             'routerCode' => [
@@ -127,6 +115,8 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             ],
         ];
 
+        $serializedData = json_encode($routes);
+
         $this->_readerMock->expects(
             $this->once()
         )->method(
@@ -147,34 +137,29 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             $this->returnValue('default_router')
         );
 
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'save'
-        )->with(
-            serialize($routes),
-            'scope::RoutesConfig'
-        );
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->willReturn($serializedData);
 
-        $this->assertEquals('routerCode', $this->_config->getRouteByFrontName('routerName', 'scope'));
+        $this->_cacheMock->expects($this->once())
+            ->method('save')
+            ->with($serializedData, 'scope::RoutesConfig');
 
-        // check caching in $this->_routes array
         $this->assertEquals('routerCode', $this->_config->getRouteByFrontName('routerName', 'scope'));
     }
 
     public function testGetModulesByFrontName()
     {
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            'areaCode::RoutesConfig'
-        )->will(
-            $this->returnValue(
-                serialize(['routerCode' => ['frontName' => 'routerName', 'modules' => ['Module1']]])
-            )
-        );
+        $data = ['routerCode' => ['frontName' => 'routerName', 'modules' => ['Module1']]];
+
+        $this->_cacheMock->expects($this->once())
+            ->method('load')
+            ->with('areaCode::RoutesConfig')
+            ->willReturn('serializedData');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with('serializedData')
+            ->willReturn($data);
         $this->assertEquals(['Module1'], $this->_config->getModulesByFrontName('routerName'));
     }
 }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php
index c24c31e282c62255b3970e01c0994cdb52866dd8..bef703e99a33e1888faf418fdf29e806bfa15003 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * RouterList model test class
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
@@ -12,69 +10,76 @@ class ActionListTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
      */
-    protected $objectManager;
+    private $objectManager;
 
     /**
-     * @var \Magento\Framework\Config\CacheInterface | \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cacheMock;
+    private $cacheMock;
 
     /**
-     * @var \Magento\Framework\Module\Dir\Reader | \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Module\Dir\Reader|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $moduleReaderMock;
+    private $readerMock;
 
     /**
      * @var \Magento\Framework\App\Router\ActionList
      */
-    protected $actionList;
+    private $actionList;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
 
     protected function setUp()
     {
         $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-        $this->cacheMock = $this->getMockBuilder(\Magento\Framework\Config\CacheInterface::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->moduleReaderMock = $this->getMockBuilder(\Magento\Framework\Module\Dir\Reader::class)
-            ->disableOriginalConstructor()
-            ->getMock();
+        $this->cacheMock = $this->getMock(
+            \Magento\Framework\Config\CacheInterface::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->readerMock = $this->getMock(
+            \Magento\Framework\Module\Dir\Reader::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
     }
 
-    public function testConstructorCachedData()
+    public function testConstructActionsCached()
     {
         $this->cacheMock->expects($this->once())
             ->method('load')
-            ->will($this->returnValue(serialize('data')));
+            ->willReturn('"data"');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize');
         $this->cacheMock->expects($this->never())
             ->method('save');
-        $this->moduleReaderMock->expects($this->never())
+        $this->readerMock->expects($this->never())
             ->method('getActionFiles');
-        $this->actionList = $this->objectManager->getObject(
-            \Magento\Framework\App\Router\ActionList::class,
-            [
-                'cache' => $this->cacheMock,
-                'moduleReader' => $this->moduleReaderMock,
-            ]
-        );
+        $this->createActionListInstance();
     }
 
-    public function testConstructorNoCachedData()
+    public function testConstructActionsNoCached()
     {
         $this->cacheMock->expects($this->once())
             ->method('load')
-            ->will($this->returnValue(false));
+            ->willReturn(false);
+        $this->serializerMock->expects($this->once())
+            ->method('serialize');
         $this->cacheMock->expects($this->once())
             ->method('save');
-        $this->moduleReaderMock->expects($this->once())
+        $this->readerMock->expects($this->once())
             ->method('getActionFiles')
-            ->will($this->returnValue('data'));
-        $this->actionList = $this->objectManager->getObject(
-            \Magento\Framework\App\Router\ActionList::class,
-            [
-                'cache' => $this->cacheMock,
-                'moduleReader' => $this->moduleReaderMock,
-            ]
-        );
+            ->willReturn('data')
+        ;
+        $this->createActionListInstance();
     }
 
     /**
@@ -88,22 +93,15 @@ class ActionListTest extends \PHPUnit_Framework_TestCase
      */
     public function testGet($module, $area, $namespace, $action, $data, $expected)
     {
-
         $this->cacheMock->expects($this->once())
             ->method('load')
             ->will($this->returnValue(false));
         $this->cacheMock->expects($this->once())
             ->method('save');
-        $this->moduleReaderMock->expects($this->once())
+        $this->readerMock->expects($this->once())
             ->method('getActionFiles')
-            ->will($this->returnValue($data));
-        $this->actionList = $this->objectManager->getObject(
-            \Magento\Framework\App\Router\ActionList::class,
-            [
-                'cache' => $this->cacheMock,
-                'moduleReader' => $this->moduleReaderMock,
-            ]
-        );
+            ->willReturn($data);
+        $this->createActionListInstance();
         $this->assertEquals($expected, $this->actionList->get($module, $area, $namespace, $action));
     }
 
@@ -168,4 +166,16 @@ class ActionListTest extends \PHPUnit_Framework_TestCase
             ],
         ];
     }
+
+    private function createActionListInstance()
+    {
+        $this->actionList = $this->objectManager->getObject(
+            \Magento\Framework\App\Router\ActionList::class,
+            [
+                'cache' => $this->cacheMock,
+                'moduleReader' => $this->readerMock,
+                'serializer' => $this->serializerMock,
+            ]
+        );
+    }
 }
diff --git a/lib/internal/Magento/Framework/Cache/Config/Data.php b/lib/internal/Magento/Framework/Cache/Config/Data.php
index a1f203d9aa7bb6c8ef19567f76bfe11ab893f1ce..5909fff105e2bbfda587f1715e81955bb5aa0ca7 100644
--- a/lib/internal/Magento/Framework/Cache/Config/Data.php
+++ b/lib/internal/Magento/Framework/Cache/Config/Data.php
@@ -1,12 +1,15 @@
 <?php
 /**
- * Cache configuration data container. Provides cache configuration data based on current config scope
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Framework\Cache\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides cached configuration data based on current config scope
+ */
 class Data extends \Magento\Framework\Config\Data\Scoped
 {
     /**
@@ -17,17 +20,21 @@ class Data extends \Magento\Framework\Config\Data\Scoped
     protected $_scopePriorityScheme = ['global'];
 
     /**
+     * Constructor
+     *
      * @param \Magento\Framework\Cache\Config\Reader $reader
      * @param \Magento\Framework\Config\ScopeInterface $configScope
      * @param \Magento\Framework\Config\CacheInterface $cache
      * @param string $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Cache\Config\Reader $reader,
         \Magento\Framework\Config\ScopeInterface $configScope,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId
+        $cacheId,
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $configScope, $cache, $cacheId);
+        parent::__construct($reader, $configScope, $cache, $cacheId, $serializer);
     }
 }
diff --git a/lib/internal/Magento/Framework/Code/GeneratedFiles.php b/lib/internal/Magento/Framework/Code/GeneratedFiles.php
index 75d5ff4b4b73bce4e7d82ba65b107611b0208344..f3d3c2bd611d5c0bb1795aaacc24c4701009d573 100644
--- a/lib/internal/Magento/Framework/Code/GeneratedFiles.php
+++ b/lib/internal/Magento/Framework/Code/GeneratedFiles.php
@@ -133,7 +133,6 @@ class GeneratedFiles
         return $enabledCacheTypes;
     }
 
-
     /**
      * Returns path to env.php file
      *
@@ -183,8 +182,7 @@ class GeneratedFiles
      * Enables apppropriate cache types in app/etc/env.php based on the passed in $cacheTypes array
      * TODO: to be removed in scope of MAGETWO-53476
      *
-     * @param string[]
-     *
+     * @param string[] $cacheTypes
      * @return void
      */
     private function enableCacheTypes($cacheTypes)
diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/GeneratedFilesTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/GeneratedFilesTest.php
index facf71854c575da7d093d865e8bd919c443ec7a8..ab5e0a594e14ae849ac3e6a442a93a8c62b98e64 100644
--- a/lib/internal/Magento/Framework/Code/Test/Unit/GeneratedFilesTest.php
+++ b/lib/internal/Magento/Framework/Code/Test/Unit/GeneratedFilesTest.php
@@ -12,12 +12,12 @@ use Magento\Framework\Code\GeneratedFiles;
 class GeneratedFilesTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var Magento\Framework\App\Filesystem\DirectoryList | \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\Filesystem\DirectoryList | \PHPUnit_Framework_MockObject_MockObject
      */
     private $directoryList;
 
     /**
-     * @var Magento\Framework\Filesystem\Directory\WriteInterface | \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Filesystem\Directory\WriteInterface | \PHPUnit_Framework_MockObject_MockObject
      */
     private $writeInterface;
 
diff --git a/lib/internal/Magento/Framework/Communication/Config/Data.php b/lib/internal/Magento/Framework/Communication/Config/Data.php
index e073c7c5471c2adb122c006c21371143c22eff8b..29667100b68603e9a8ff02e7f4486dfa4c55566c 100644
--- a/lib/internal/Magento/Framework/Communication/Config/Data.php
+++ b/lib/internal/Magento/Framework/Communication/Config/Data.php
@@ -5,23 +5,27 @@
  */
 namespace Magento\Framework\Communication\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
 /**
- * Communication config data.
+ * Provides communication configuration
  */
 class Data extends \Magento\Framework\Config\Data
 {
     /**
-     * Initialize dependencies.
+     * Constructor
      *
      * @param \Magento\Framework\Communication\Config\CompositeReader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Communication\Config\CompositeReader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = 'communication_config_cache'
+        $cacheId = 'communication_config_cache',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 }
diff --git a/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php b/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php
index b6363520dc085c75ec44a1700094e328af1fb973..304174ac52d3792054221c27d53624f34ed2ca7e 100644
--- a/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php
+++ b/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php
@@ -37,7 +37,6 @@ class ConfigOptionsListConstants
      */
     const INPUT_KEY_ENCRYPTION_KEY = 'key';
     const INPUT_KEY_SESSION_SAVE = 'session-save';
-    const INPUT_KEY_DEFINITION_FORMAT = 'definition-format';
     const INPUT_KEY_DB_HOST = 'db-host';
     const INPUT_KEY_DB_NAME = 'db-name';
     const INPUT_KEY_DB_USER = 'db-user';
@@ -51,6 +50,9 @@ class ConfigOptionsListConstants
     const INPUT_KEY_CACHE_HOSTS = 'http-cache-hosts';
     /**#@-*/
 
+    /** @deprecated */
+    const INPUT_KEY_DEFINITION_FORMAT = 'definition-format';
+
     /**#@+
      * Values for session-save
      */
diff --git a/lib/internal/Magento/Framework/Config/Converter.php b/lib/internal/Magento/Framework/Config/Converter.php
index 5ea535bac5f29ccff3d8ac8c1f4675d317eb6083..b22d4d61a68673e158ed973de3d271422d0706fa 100644
--- a/lib/internal/Magento/Framework/Config/Converter.php
+++ b/lib/internal/Magento/Framework/Config/Converter.php
@@ -7,6 +7,11 @@ namespace Magento\Framework\Config;
 
 use Magento\Framework\View\Xsd\Media\TypeDataExtractorPool;
 
+/**
+ * Class Converter convert xml to appropriate array
+ *
+ * @package Magento\Framework\Config
+ */
 class Converter implements \Magento\Framework\Config\ConverterInterface
 {
     /**
diff --git a/lib/internal/Magento/Framework/Config/Data.php b/lib/internal/Magento/Framework/Config/Data.php
index ed5ed3ad9f2e20ff4046bbd09a3ab3714311eaa9..1169abafccd8f2d868d2d56c821a67a761368f38 100644
--- a/lib/internal/Magento/Framework/Config/Data.php
+++ b/lib/internal/Magento/Framework/Config/Data.php
@@ -1,26 +1,29 @@
 <?php
 /**
- * Config data. Represents loaded and cached configuration data. Should be used to gain access to different types
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Framework\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\App\ObjectManager;
+
 /**
+ * Represents loaded and cached configuration data, should be used to gain access to different types
+ *
  * @SuppressWarnings(PHPMD.NumberOfChildren)
  */
 class Data implements \Magento\Framework\Config\DataInterface
 {
     /**
-     * Configuration reader model
+     * Configuration reader
      *
      * @var ReaderInterface
      */
     protected $_reader;
 
     /**
-     * Configuration cache model
+     * Configuration cache
      *
      * @var CacheInterface
      */
@@ -62,26 +65,35 @@ class Data implements \Magento\Framework\Config\DataInterface
      */
     private $cacheId;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * Constructor
      *
      * @param ReaderInterface $reader
      * @param CacheInterface $cache
      * @param string $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         ReaderInterface $reader,
         CacheInterface $cache,
-        $cacheId
+        $cacheId,
+        SerializerInterface $serializer = null
     ) {
         $this->reader = $reader;
         $this->cache = $cache;
         $this->cacheId = $cacheId;
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
         $this->initData();
     }
 
     /**
      * Initialise data for configuration
+     *
      * @return void
      */
     protected function initData()
@@ -89,10 +101,11 @@ class Data implements \Magento\Framework\Config\DataInterface
         $data = $this->cache->load($this->cacheId);
         if (false === $data) {
             $data = $this->reader->read();
-            $this->cache->save(serialize($data), $this->cacheId, $this->cacheTags);
+            $this->cache->save($this->serializer->serialize($data), $this->cacheId, $this->cacheTags);
         } else {
-            $data = unserialize($data);
+            $data = $this->serializer->unserialize($data);
         }
+
         $this->merge($data);
     }
 
@@ -133,6 +146,7 @@ class Data implements \Magento\Framework\Config\DataInterface
 
     /**
      * Clear cache data
+     *
      * @return void
      */
     public function reset()
diff --git a/lib/internal/Magento/Framework/Config/Data/Scoped.php b/lib/internal/Magento/Framework/Config/Data/Scoped.php
index 36b265ac9e6f47584917433e50c54e83999948db..f9c151e867b89726ccea1f46ed269931efee51da 100644
--- a/lib/internal/Magento/Framework/Config/Data/Scoped.php
+++ b/lib/internal/Magento/Framework/Config/Data/Scoped.php
@@ -5,6 +5,12 @@
  */
 namespace Magento\Framework\Config\Data;
 
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\App\ObjectManager;
+
+/**
+ * Provides scoped configuration
+ */
 class Scoped extends \Magento\Framework\Config\Data
 {
     /**
@@ -49,6 +55,11 @@ class Scoped extends \Magento\Framework\Config\Data
      */
     protected $_loadedScopes = [];
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * Constructor
      *
@@ -56,17 +67,20 @@ class Scoped extends \Magento\Framework\Config\Data
      * @param \Magento\Framework\Config\ScopeInterface $configScope
      * @param \Magento\Framework\Config\CacheInterface $cache
      * @param string $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Config\ReaderInterface $reader,
         \Magento\Framework\Config\ScopeInterface $configScope,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId
+        $cacheId,
+        SerializerInterface $serializer = null
     ) {
         $this->_reader = $reader;
         $this->_configScope = $configScope;
         $this->_cache = $cache;
         $this->_cacheId = $cacheId;
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
     }
 
     /**
@@ -98,11 +112,14 @@ class Scoped extends \Magento\Framework\Config\Data
                 if (false == isset($this->_loadedScopes[$scopeCode])) {
                     if ($scopeCode !== 'primary' && ($data = $this->_cache->load($scopeCode . '::' . $this->_cacheId))
                     ) {
-                        $data = unserialize($data);
+                        $data = $this->serializer->unserialize($data);
                     } else {
                         $data = $this->_reader->read($scopeCode);
                         if ($scopeCode !== 'primary') {
-                            $this->_cache->save(serialize($data), $scopeCode . '::' . $this->_cacheId);
+                            $this->_cache->save(
+                                $this->serializer->serialize($data),
+                                $scopeCode . '::' . $this->_cacheId
+                            );
                         }
                     }
                     $this->merge($data);
diff --git a/lib/internal/Magento/Framework/Config/File/ConfigFilePool.php b/lib/internal/Magento/Framework/Config/File/ConfigFilePool.php
index c9439d0a45e8fd064dc6db4a2dc69c075c0ba38c..e84f61383c7cc86d2c5c5fda7abacc42611366d7 100644
--- a/lib/internal/Magento/Framework/Config/File/ConfigFilePool.php
+++ b/lib/internal/Magento/Framework/Config/File/ConfigFilePool.php
@@ -14,6 +14,9 @@ class ConfigFilePool
     const APP_CONFIG = 'app_config';
     const APP_ENV = 'app_env';
 
+    const LOCAL = 'local';
+    const DIST = 'dist';
+
     /**
      * Default files for configuration
      *
@@ -24,6 +27,22 @@ class ConfigFilePool
         self::APP_ENV => 'env.php',
     ];
 
+    /**
+     * Initial files for configuration
+     *
+     * @var array
+     */
+    private $initialConfigFiles = [
+        self::DIST => [
+            self::APP_CONFIG => 'config.dist.php',
+            self::APP_ENV => 'env.dist.php',
+        ],
+        self::LOCAL => [
+            self::APP_CONFIG => 'config.local.php',
+            self::APP_ENV => 'env.local.php',
+        ]
+    ];
+
     /**
      * Constructor
      *
@@ -35,7 +54,7 @@ class ConfigFilePool
     }
 
     /**
-     * Returns application config files
+     * Returns application config files.
      *
      * @return array
      */
@@ -58,4 +77,25 @@ class ConfigFilePool
         }
         return $this->applicationConfigFiles[$fileKey];
     }
+
+    /**
+     * Returns application initial config files.
+     *
+     * @return array
+     */
+    public function getInitialFilePools()
+    {
+        return $this->initialConfigFiles;
+    }
+
+    /**
+     * Retrieve all config file pools.
+     *
+     * @param string $pool
+     * @return array
+     */
+    public function getPathsByPool($pool)
+    {
+        return $this->initialConfigFiles[$pool];
+    }
 }
diff --git a/lib/internal/Magento/Framework/Config/FileResolver.php b/lib/internal/Magento/Framework/Config/FileResolver.php
index 1455eb355df7ac5e0307405fbe6560c03108f5bc..a6726b95526b34c73d232094c3bb06cd431ee533 100644
--- a/lib/internal/Magento/Framework/Config/FileResolver.php
+++ b/lib/internal/Magento/Framework/Config/FileResolver.php
@@ -7,7 +7,7 @@
  */
 namespace Magento\Framework\Config;
 
-use Magento\Framework\Module\Dir\Reader;
+use Magento\Framework\Module\Dir\Reader as DirReader;
 use Magento\Framework\Filesystem;
 use Magento\Framework\View\Design\ThemeInterface;
 use Magento\Framework\View\DesignInterface;
@@ -24,7 +24,7 @@ class FileResolver implements \Magento\Framework\Config\FileResolverInterface, D
     /**
      * Module configuration file reader
      *
-     * @var \Magento\Framework\Module\Dir\Reader
+     * @var DirReader
      */
     protected $moduleReader;
 
@@ -54,7 +54,7 @@ class FileResolver implements \Magento\Framework\Config\FileResolverInterface, D
     protected $resolver;
 
     /**
-     * @param Reader $moduleReader
+     * @param DirReader $moduleReader
      * @param FileIteratorFactory $iteratorFactory
      * @param DesignInterface $designInterface
      * @param DirectoryList $directoryList
@@ -62,7 +62,7 @@ class FileResolver implements \Magento\Framework\Config\FileResolverInterface, D
      * @param ResolverInterface $resolver
      */
     public function __construct(
-        Reader $moduleReader,
+        DirReader $moduleReader,
         FileIteratorFactory $iteratorFactory,
         DesignInterface $designInterface,
         DirectoryList $directoryList,
diff --git a/lib/internal/Magento/Framework/Config/Reader.php b/lib/internal/Magento/Framework/Config/Reader.php
new file mode 100644
index 0000000000000000000000000000000000000000..f99e4e3341860d4acf33402c2623889fe523a484
--- /dev/null
+++ b/lib/internal/Magento/Framework/Config/Reader.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Config;
+
+use Magento\Framework\Exception\LocalizedException;
+
+/**
+ * Read config from different sources and aggregate them
+ *
+ * @package Magento\Framework\Config
+ */
+class Reader implements \Magento\Framework\App\Config\Scope\ReaderInterface
+{
+    /**
+     * @var array
+     */
+    private $sources;
+
+    /**
+     * @param array $sources
+     */
+    public function __construct(array $sources)
+    {
+        $this->sources = $this->prepareSources($sources);
+    }
+
+    /**
+     * Read configuration data
+     *
+     * @param null|string $scope
+     * @throws LocalizedException Exception is thrown when scope other than default is given
+     * @return array
+     */
+    public function read($scope = null)
+    {
+        $config = [];
+        foreach ($this->sources as $sourceData) {
+            /** @var \Magento\Framework\App\Config\Reader\Source\SourceInterface $source */
+            $source = $sourceData['class'];
+            $config = array_replace_recursive($config, $source->get($scope));
+        }
+
+        return $config;
+    }
+
+    /**
+     * Prepare source for usage
+     *
+     * @param array $array
+     * @return array
+     */
+    private function prepareSources(array $array)
+    {
+        $array = array_filter(
+            $array,
+            function ($item) {
+                return (!isset($item['disable']) || !$item['disable']) && $item['class'];
+            }
+        );
+        uasort(
+            $array,
+            function ($firstItem, $nexItem) {
+                if ((int)$firstItem['sortOrder'] == (int)$nexItem['sortOrder']) {
+                    return 0;
+                }
+                return (int)$firstItem['sortOrder'] < (int)$nexItem['sortOrder'] ? -1 : 1;
+            }
+        );
+
+        return $array;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/Data/ScopedTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/Data/ScopedTest.php
index 496da72ceef9b45d06a498aae8bc732a08de43ae..607977b99bb42a9fcdd0162a5443186343ef06f3 100644
--- a/lib/internal/Magento/Framework/Config/Test/Unit/Data/ScopedTest.php
+++ b/lib/internal/Magento/Framework/Config/Test/Unit/Data/ScopedTest.php
@@ -7,6 +7,11 @@ namespace Magento\Framework\Config\Test\Unit\Data;
 
 class ScopedTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
     /**
      * @var \Magento\Framework\Config\Data\Scoped
      */
@@ -27,17 +32,28 @@ class ScopedTest extends \PHPUnit_Framework_TestCase
      */
     protected $_cacheMock;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
+
     protected function setUp()
     {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->_readerMock = $this->getMock(\Magento\Framework\Config\ReaderInterface::class);
         $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class);
         $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
 
-        $this->_model = new \Magento\Framework\Config\Data\Scoped(
-            $this->_readerMock,
-            $this->_configScopeMock,
-            $this->_cacheMock,
-            'tag'
+        $this->_model = $this->objectManager->getObject(
+            \Magento\Framework\Config\Data\Scoped::class,
+            [
+                'reader' => $this->_readerMock,
+                'configScope' => $this->_configScopeMock,
+                'cache' => $this->_cacheMock,
+                'cacheId' => 'tag',
+                'serializer' => $this->serializerMock
+            ]
         );
     }
 
@@ -47,7 +63,7 @@ class ScopedTest extends \PHPUnit_Framework_TestCase
      * @param string $default
      * @dataProvider getConfigByPathDataProvider
      */
-    public function testgetConfigByPath($path, $expectedValue, $default)
+    public function testGetConfigByPath($path, $expectedValue, $default)
     {
         $testData = [
             'key_1' => [
@@ -55,7 +71,12 @@ class ScopedTest extends \PHPUnit_Framework_TestCase
                 'key_1.2' => ['some' => 'arrayValue'],
             ],
         ];
-        $this->_cacheMock->expects($this->any())->method('load')->will($this->returnValue(serialize([])));
+        $this->_cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn(false);
+        $this->_readerMock->expects($this->once())
+            ->method('read')
+            ->willReturn([]);
         $this->_model->merge($testData);
         $this->assertEquals($expectedValue, $this->_model->get($path, $default));
     }
@@ -77,6 +98,7 @@ class ScopedTest extends \PHPUnit_Framework_TestCase
     public function testGetScopeSwitchingWithNonCachedData()
     {
         $testValue = ['some' => 'testValue'];
+        $serializedData = 'serialized data';
 
         /** change current area */
         $this->_configScopeMock->expects(
@@ -109,8 +131,15 @@ class ScopedTest extends \PHPUnit_Framework_TestCase
             $this->returnValue($testValue)
         );
 
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($testValue)
+            ->willReturn($serializedData);
+
         /** test cache saving  */
-        $this->_cacheMock->expects($this->once())->method('save')->with(serialize($testValue), 'adminhtml::tag');
+        $this->_cacheMock->expects($this->once())
+            ->method('save')
+            ->with($serializedData, 'adminhtml::tag');
 
         /** test config value existence */
         $this->assertEquals('testValue', $this->_model->get('some'));
@@ -122,6 +151,7 @@ class ScopedTest extends \PHPUnit_Framework_TestCase
     public function testGetScopeSwitchingWithCachedData()
     {
         $testValue = ['some' => 'testValue'];
+        $serializedData = 'serialized data';
 
         /** change current area */
         $this->_configScopeMock->expects(
@@ -132,16 +162,16 @@ class ScopedTest extends \PHPUnit_Framework_TestCase
             $this->returnValue('adminhtml')
         );
 
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedData)
+            ->willReturn($testValue);
+
         /** set cache data */
-        $this->_cacheMock->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            'adminhtml::tag'
-        )->will(
-            $this->returnValue(serialize($testValue))
-        );
+        $this->_cacheMock->expects($this->once())
+            ->method('load')
+            ->with('adminhtml::tag')
+            ->willReturn($serializedData);
 
         /** test preventing of getting data from reader  */
         $this->_readerMock->expects($this->never())->method('read');
diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/DataTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/DataTest.php
index 5c58310e096bbd27b1ba5448e7a5da92c86da250..c37d2108191b429b4d4fa7289b5464570aad5ad9 100644
--- a/lib/internal/Magento/Framework/Config/Test/Unit/DataTest.php
+++ b/lib/internal/Magento/Framework/Config/Test/Unit/DataTest.php
@@ -10,33 +10,46 @@ namespace Magento\Framework\Config\Test\Unit;
 
 class DataTest extends \PHPUnit_Framework_TestCase
 {
-    /** @var \Magento\Framework\Config\ReaderInterface|\PHPUnit_Framework_MockObject_MockObject */
-    protected $reader;
-    /** @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */
-    protected $cache;
-    /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager  */
-    protected $objectManagerHelper;
+   /**
+     * @var \Magento\Framework\Config\ReaderInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $readerMock;
+
+    /**
+     * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $cacheMock;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
 
     protected function setUp()
     {
-        $this->reader = $this->getMockBuilder(\Magento\Framework\Config\ReaderInterface::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->cache = $this->getMockBuilder(\Magento\Framework\Config\CacheInterface::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->readerMock = $this->getMock(\Magento\Framework\Config\ReaderInterface::class);
+        $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
     }
 
-    public function testGet()
+    public function testGetConfigNotCached()
     {
         $data = ['a' => 'b'];
-        $cacheid = 'test';
-        $this->cache->expects($this->once())->method('load')->will($this->returnValue(false));
-        $this->reader->expects($this->once())->method('read')->will($this->returnValue($data));
-
+        $cacheId = 'test';
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn(false);
+        $this->readerMock->expects($this->once())
+            ->method('read')
+            ->willReturn($data);
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($data);
         $config = new \Magento\Framework\Config\Data(
-            $this->reader, $this->cache, $cacheid
+            $this->readerMock,
+            $this->cacheMock,
+            $cacheId,
+            $this->serializerMock
         );
         $this->assertEquals($data, $config->get());
         $this->assertEquals('b', $config->get('a'));
@@ -44,18 +57,50 @@ class DataTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals(33, $config->get('a/b', 33));
     }
 
-    public function testReset()
+    public function testGetConfigCached()
     {
-        $cacheid = 'test';
-        $this->cache->expects($this->once())->method('load')->will($this->returnValue(serialize([])));
-        $this->cache->expects($this->once())->method('remove')->with($cacheid);
-
+        $data = ['a' => 'b'];
+        $serializedData = '{"a":"b"}';
+        $cacheId = 'test';
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn($serializedData);
+        $this->readerMock->expects($this->never())
+            ->method('read');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedData)
+            ->willReturn($data);
         $config = new \Magento\Framework\Config\Data(
-            $this->reader,
-            $this->cache,
-            $cacheid
+            $this->readerMock,
+            $this->cacheMock,
+            $cacheId,
+            $this->serializerMock
         );
+        $this->assertEquals($data, $config->get());
+        $this->assertEquals('b', $config->get('a'));
+    }
 
+    public function testReset()
+    {
+        $serializedData = '';
+        $cacheId = 'test';
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn($serializedData);
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedData)
+            ->willReturn([]);
+        $this->cacheMock->expects($this->once())
+            ->method('remove')
+            ->with($cacheId);
+        $config = new \Magento\Framework\Config\Data(
+            $this->readerMock,
+            $this->cacheMock,
+            $cacheId,
+            $this->serializerMock
+        );
         $config->reset();
     }
 }
diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/ReaderTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/ReaderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b51fbd3598e11b8c021d25405ffbe19dd41a0355
--- /dev/null
+++ b/lib/internal/Magento/Framework/Config/Test/Unit/ReaderTest.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Config\Test\Unit;
+
+use Magento\Framework\App\Config\Reader\Source\SourceInterface;
+use Magento\Framework\App\Config\Scope\Converter;
+use Magento\Framework\Config\Reader;
+use Magento\Framework\Stdlib\ArrayUtils;
+
+class ReaderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var SourceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $source;
+
+    /**
+     * @var Reader
+     */
+    private $reader;
+
+    public function setUp()
+    {
+        $this->source = $this->getMockBuilder(SourceInterface::class)
+            ->getMockForAbstractClass();
+        $this->reader = new Reader([['class' => $this->source]]);
+    }
+
+    public function testRead()
+    {
+        $config = [
+            'default' => [
+                'general/locale/code'=> 'ru_RU',
+                'general/locale/timezone'=> 'America/Chicago',
+            ]
+        ];
+        $this->source->expects($this->once())
+            ->method('get')
+            ->with(null)
+            ->willReturn($config);
+        $this->assertEquals($config, $this->reader->read());
+    }
+}
diff --git a/lib/internal/Magento/Framework/DataObject/Copy/Config/Data.php b/lib/internal/Magento/Framework/DataObject/Copy/Config/Data.php
index 61802637750c691e433bab4736272d6a29e8b984..5f2a1518d485a9d7201df0c19cb0f99487c68a0c 100644
--- a/lib/internal/Magento/Framework/DataObject/Copy/Config/Data.php
+++ b/lib/internal/Magento/Framework/DataObject/Copy/Config/Data.php
@@ -1,12 +1,13 @@
 <?php
 /**
- * Fieldset configuration data container. Provides fieldset configuration data.
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Framework\DataObject\Copy\Config;
 
+/**
+ * Provides DataObject copier configuration
+ */
 class Data extends \Magento\Framework\Config\Data
 {
 }
diff --git a/lib/internal/Magento/Framework/Event/Config/Data.php b/lib/internal/Magento/Framework/Event/Config/Data.php
index 7bd082e5d465bc1299af865c42a24e0c504640b0..4b69e597934978d1ea4715159ff2125c0d4684c0 100644
--- a/lib/internal/Magento/Framework/Event/Config/Data.php
+++ b/lib/internal/Magento/Framework/Event/Config/Data.php
@@ -1,12 +1,15 @@
 <?php
 /**
- * Event configuration data container
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Framework\Event\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides event configuration
+ */
 class Data extends \Magento\Framework\Config\Data\Scoped
 {
     /**
@@ -17,17 +20,21 @@ class Data extends \Magento\Framework\Config\Data\Scoped
     protected $_scopePriorityScheme = ['global'];
 
     /**
+     * Constructor
+     *
      * @param \Magento\Framework\Event\Config\Reader $reader
      * @param \Magento\Framework\Config\ScopeInterface $configScope
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Event\Config\Reader $reader,
         \Magento\Framework\Config\ScopeInterface $configScope,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = 'event_config_cache'
+        $cacheId = 'event_config_cache',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $configScope, $cache, $cacheId);
+        parent::__construct($reader, $configScope, $cache, $cacheId, $serializer);
     }
 }
diff --git a/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php b/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php
index 181783c7b2115d8a216c681077e116e98344d15c..35d7b3ac5ee20ae669ccc66775498b3c0d9348b4 100644
--- a/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php
+++ b/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php
@@ -28,6 +28,7 @@ class Curl implements \Zend_Http_Client_Adapter_Interface
         ),
         'verifypeer' => true,
         'verifyhost' => 2,
+        'sslversion' => 6
     ];
 
     /**
@@ -53,6 +54,7 @@ class Curl implements \Zend_Http_Client_Adapter_Interface
         'protocols'    => CURLOPT_PROTOCOLS,
         'verifypeer'   => CURLOPT_SSL_VERIFYPEER,
         'verifyhost'   => CURLOPT_SSL_VERIFYHOST,
+        'sslversion'   => CURLOPT_SSLVERSION,
     ];
 
     /**
diff --git a/lib/internal/Magento/Framework/HTTP/Client/Curl.php b/lib/internal/Magento/Framework/HTTP/Client/Curl.php
index 67525f62f6336cf7de844e866a153be223dc0b5c..5ebc92abf70d9063af63683f5f530dd01470865a 100644
--- a/lib/internal/Magento/Framework/HTTP/Client/Curl.php
+++ b/lib/internal/Magento/Framework/HTTP/Client/Curl.php
@@ -9,14 +9,17 @@ namespace Magento\Framework\HTTP\Client;
  * Class to work with HTTP protocol using curl library
  *
  * @author      Magento Core Team <core@magentocommerce.com>
+ * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
  */
 class Curl implements \Magento\Framework\HTTP\ClientInterface
 {
+    const SSL_VERSION = 6;
+
     /**
      * Max supported protocol by curl CURL_SSLVERSION_TLSv1_2
      * @var int
      */
-    private static $sslVersion = 6;
+    private $sslVersion;
 
     /**
      * Hostname
@@ -86,7 +89,7 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface
 
     /**
      * Curl
-     * @var object
+     * @var resource
      */
     protected $_ch;
 
@@ -117,10 +120,11 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface
     }
 
     /**
-     * Constructor
+     * @param int|null $sslVersion
      */
-    public function __construct()
+    public function __construct($sslVersion = self::SSL_VERSION)
     {
+        $this->sslVersion = $sslVersion;
     }
 
     /**
@@ -377,10 +381,9 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface
             $this->curlOption(CURLOPT_PORT, $this->_port);
         }
 
-        //$this->curlOption(CURLOPT_HEADER, 1);
         $this->curlOption(CURLOPT_RETURNTRANSFER, 1);
         $this->curlOption(CURLOPT_HEADERFUNCTION, [$this, 'parseHeaders']);
-        $this->curlOption(CURLOPT_SSLVERSION, self::$sslVersion);
+        $this->curlOption(CURLOPT_SSLVERSION, $this->sslVersion);
 
         if (count($this->_curlUserOptions)) {
             foreach ($this->_curlUserOptions as $k => $v) {
@@ -415,6 +418,7 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface
      * @param resource $ch curl handle, not needed
      * @param string $data
      * @return int
+     * @throws \Exception
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     protected function parseHeaders($ch, $data)
@@ -422,11 +426,10 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface
         if ($this->_headerCount == 0) {
             $line = explode(" ", trim($data), 3);
             if (count($line) != 3) {
-                return $this->doError("Invalid response line returned from server: " . $data);
+                $this->doError("Invalid response line returned from server: " . $data);
             }
             $this->_responseStatus = intval($line[1]);
         } else {
-            //var_dump($data);
             $name = $value = '';
             $out = explode(": ", trim($data), 2);
             if (count($out) == 2) {
diff --git a/lib/internal/Magento/Framework/Indexer/Config/Converter.php b/lib/internal/Magento/Framework/Indexer/Config/Converter.php
index b8b17b185a1f2630842d6fe6e01b6a9de2a52107..0112b4d9a4de301a312e3e66bd146d8f477cd349 100644
--- a/lib/internal/Magento/Framework/Indexer/Config/Converter.php
+++ b/lib/internal/Magento/Framework/Indexer/Config/Converter.php
@@ -72,10 +72,10 @@ class Converter implements ConverterInterface
         $data['fieldsets'] = isset($data['fieldsets']) ? $data['fieldsets'] : [];
         switch ($childNode->nodeName) {
             case 'title':
-                $data['title'] = $this->getTranslatedNodeValue($childNode);
+                $data['title'] = $childNode->nodeValue;
                 break;
             case 'description':
-                $data['description'] = $this->getTranslatedNodeValue($childNode);
+                $data['description'] = $childNode->nodeValue;
                 break;
             case 'saveHandler':
                 $data['saveHandler'] = $this->getAttributeValue($childNode, 'class');
@@ -207,6 +207,7 @@ class Converter implements ConverterInterface
      *
      * @param \DOMNode $node
      * @return string
+     * @deprecated
      */
     protected function getTranslatedNodeValue(\DOMNode $node)
     {
diff --git a/lib/internal/Magento/Framework/Interception/Config/Config.php b/lib/internal/Magento/Framework/Interception/Config/Config.php
index 9812e505cc397226f689b7cbfe354cbf6a5ce608..0b30b2619c069751430de447b7731568bacc847d 100644
--- a/lib/internal/Magento/Framework/Interception/Config/Config.php
+++ b/lib/internal/Magento/Framework/Interception/Config/Config.php
@@ -7,6 +7,9 @@
  */
 namespace Magento\Framework\Interception\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Serialize\Serializer\Serialize;
+
 class Config implements \Magento\Framework\Interception\ConfigInterface
 {
     /**
@@ -71,6 +74,13 @@ class Config implements \Magento\Framework\Interception\ConfigInterface
     protected $_scopeList;
 
     /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * Config constructor
+     *
      * @param \Magento\Framework\Config\ReaderInterface $reader
      * @param \Magento\Framework\Config\ScopeListInterface $scopeList
      * @param \Magento\Framework\Cache\FrontendInterface $cache
@@ -78,6 +88,7 @@ class Config implements \Magento\Framework\Interception\ConfigInterface
      * @param \Magento\Framework\Interception\ObjectManager\ConfigInterface $omConfig
      * @param \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions
      * @param string $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Config\ReaderInterface $reader,
@@ -86,7 +97,8 @@ class Config implements \Magento\Framework\Interception\ConfigInterface
         \Magento\Framework\ObjectManager\RelationsInterface $relations,
         \Magento\Framework\Interception\ObjectManager\ConfigInterface $omConfig,
         \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions,
-        $cacheId = 'interception'
+        $cacheId = 'interception',
+        SerializerInterface $serializer = null
     ) {
         $this->_omConfig = $omConfig;
         $this->_relations = $relations;
@@ -95,10 +107,11 @@ class Config implements \Magento\Framework\Interception\ConfigInterface
         $this->_cacheId = $cacheId;
         $this->_reader = $reader;
         $this->_scopeList = $scopeList;
-
+        $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()
+            ->get(Serialize::class);
         $intercepted = $this->_cache->load($this->_cacheId);
         if ($intercepted !== false) {
-            $this->_intercepted = unserialize($intercepted);
+            $this->_intercepted = $this->serializer->unserialize($intercepted);
         } else {
             $this->initialize($this->_classDefinitions->getClasses());
         }
@@ -129,7 +142,7 @@ class Config implements \Magento\Framework\Interception\ConfigInterface
         foreach ($classDefinitions as $class) {
             $this->hasPlugins($class);
         }
-        $this->_cache->save(serialize($this->_intercepted), $this->_cacheId);
+        $this->_cache->save($this->serializer->serialize($this->_intercepted), $this->_cacheId);
     }
 
     /**
diff --git a/lib/internal/Magento/Framework/Interception/Definition/Compiled.php b/lib/internal/Magento/Framework/Interception/Definition/Compiled.php
deleted file mode 100644
index 6fbe9c99dce8637e8c31b9ce493b5b79c45e62c0..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Interception/Definition/Compiled.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * Compiled method plugin definitions. Must be used in production for maximum performance
- *
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\Interception\Definition;
-
-use Magento\Framework\Interception\DefinitionInterface;
-
-class Compiled implements DefinitionInterface
-{
-    /**
-     * List of plugin definitions
-     *
-     * @var array
-     */
-    protected $_definitions = [];
-
-    /**
-     * @param array $definitions
-     */
-    public function __construct(array $definitions)
-    {
-        $this->_definitions = $definitions;
-    }
-
-    /**
-     * Retrieve list of methods
-     *
-     * @param string $type
-     * @return string[]
-     */
-    public function getMethodList($type)
-    {
-        return $this->_definitions[$type];
-    }
-}
diff --git a/lib/internal/Magento/Framework/Interception/PluginList/PluginList.php b/lib/internal/Magento/Framework/Interception/PluginList/PluginList.php
index bae8f7c118c08b298bdc17b86db65181af075c3a..a84e23dc75548d059ea1007ab83a3d7728eeca40 100644
--- a/lib/internal/Magento/Framework/Interception/PluginList/PluginList.php
+++ b/lib/internal/Magento/Framework/Interception/PluginList/PluginList.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * Plugin configuration storage. Provides list of plugins configured for type.
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
@@ -17,8 +15,12 @@ use Magento\Framework\Interception\ObjectManager\ConfigInterface;
 use Magento\Framework\ObjectManager\RelationsInterface;
 use Magento\Framework\ObjectManager\DefinitionInterface as ClassDefinitions;
 use Magento\Framework\ObjectManagerInterface;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Serialize\Serializer\Serialize;
 
 /**
+ * Plugin config, provides list of plugins for a type
+ *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class PluginList extends Scoped implements InterceptionPluginList
@@ -81,6 +83,13 @@ class PluginList extends Scoped implements InterceptionPluginList
     private $logger;
 
     /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * Constructor
+     *
      * @param ReaderInterface $reader
      * @param ScopeInterface $configScope
      * @param CacheInterface $cache
@@ -90,7 +99,8 @@ class PluginList extends Scoped implements InterceptionPluginList
      * @param ObjectManagerInterface $objectManager
      * @param ClassDefinitions $classDefinitions
      * @param array $scopePriorityScheme
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -103,9 +113,11 @@ class PluginList extends Scoped implements InterceptionPluginList
         ObjectManagerInterface $objectManager,
         ClassDefinitions $classDefinitions,
         array $scopePriorityScheme = ['global'],
-        $cacheId = 'plugins'
+        $cacheId = 'plugins',
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $configScope, $cache, $cacheId);
+        $this->serializer = $serializer ?: $objectManager->get(Serialize::class);
+        parent::__construct($reader, $configScope, $cache, $cacheId, $this->serializer);
         $this->_omConfig = $omConfig;
         $this->_relations = $relations;
         $this->_definitions = $definitions;
@@ -275,7 +287,7 @@ class PluginList extends Scoped implements InterceptionPluginList
             $cacheId = implode('|', $this->_scopePriorityScheme) . "|" . $this->_cacheId;
             $data = $this->_cache->load($cacheId);
             if ($data) {
-                list($this->_data, $this->_inherited, $this->_processed) = unserialize($data);
+                list($this->_data, $this->_inherited, $this->_processed) = $this->serializer->unserialize($data);
                 foreach ($this->_scopePriorityScheme as $scopeCode) {
                     $this->_loadedScopes[$scopeCode] = true;
                 }
@@ -307,7 +319,10 @@ class PluginList extends Scoped implements InterceptionPluginList
                 foreach ($this->getClassDefinitions() as $class) {
                     $this->_inheritPlugins($class);
                 }
-                $this->_cache->save(serialize([$this->_data, $this->_inherited, $this->_processed]), $cacheId);
+                $this->_cache->save(
+                    $this->serializer->serialize([$this->_data, $this->_inherited, $this->_processed]),
+                    $cacheId
+                );
             }
             $this->_pluginInstances = [];
         }
@@ -371,10 +386,10 @@ class PluginList extends Scoped implements InterceptionPluginList
     }
 
     /**
-     * Returns logger instance
+     * Get logger
      *
-     * @deprecated
      * @return \Psr\Log\LoggerInterface
+     * @deprecated
      */
     private function getLogger()
     {
diff --git a/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php b/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php
index 992ed838b7c522af706668ae6f8443edfea8ef8c..7d15d1029bda65837aacc94111132fdc1c34e829 100644
--- a/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php
+++ b/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php
@@ -6,6 +6,8 @@
 // @codingStandardsIgnoreFile
 namespace Magento\Framework\Interception\Test\Unit\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
 require_once __DIR__ . '/../Custom/Module/Model/Item.php';
 require_once __DIR__ . '/../Custom/Module/Model/Item/Enhanced.php';
 require_once __DIR__ . '/../Custom/Module/Model/ItemContainer.php';
@@ -22,32 +24,38 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $configScopeMock;
+    private $configScopeMock;
 
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $readerMock;
+    private $readerMock;
 
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cacheMock;
+    private $cacheMock;
 
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $omConfigMock;
+    private $omConfigMock;
 
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $definitionMock;
+    private $definitionMock;
 
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $relationsMock;
+    private $relationsMock;
+
+    /** @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */
+    private $serializerMock;
+
+    /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */
+    private $objectManagerHelper;
 
     protected function setUp()
     {
@@ -67,6 +75,8 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $this->relationsMock = $this->getMockForAbstractClass(
             \Magento\Framework\ObjectManager\RelationsInterface::class
         );
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
+        $this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
     }
 
     /**
@@ -131,14 +141,22 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $this->relationsMock->expects($this->any())->method('has')->will($this->returnValue($expectedResult));
         $this->relationsMock->expects($this->any())->method('getParents')->will($this->returnValue($entityParents));
 
-        $model = new \Magento\Framework\Interception\Config\Config(
-            $this->readerMock,
-            $this->configScopeMock,
-            $this->cacheMock,
-            $this->relationsMock,
-            $this->omConfigMock,
-            $this->definitionMock,
-            'interception'
+        $this->serializerMock->expects($this->once())
+            ->method('serialize');
+
+        $this->serializerMock->expects($this->never())->method('unserialize');
+
+        $model = $this->objectManagerHelper->getObject(
+            \Magento\Framework\Interception\Config\Config::class,
+            [
+                'reader' => $this->readerMock,
+                'scopeList' => $this->configScopeMock,
+                'cache' => $this->cacheMock,
+                'relations' => $this->relationsMock,
+                'omConfig' => $this->omConfigMock,
+                'classDefinitions' => $this->definitionMock,
+                'serializer' => $this->serializerMock,
+            ]
         );
 
         $this->assertEquals($expectedResult, $model->hasPlugins($type));
@@ -163,18 +181,32 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         ];
         $this->readerMock->expects($this->never())->method('read');
         $this->cacheMock->expects($this->never())->method('save');
+        $serializedValue = 'serializedData';
         $this->cacheMock->expects($this->any())
             ->method('load')
             ->with($cacheId)
-            ->will($this->returnValue(serialize($interceptionData)));
-        $model = new \Magento\Framework\Interception\Config\Config(
-            $this->readerMock,
-            $this->configScopeMock,
-            $this->cacheMock,
-            new \Magento\Framework\ObjectManager\Relations\Runtime(),
-            $this->omConfigMock,
-            $this->definitionMock,
-            $cacheId
+            ->will($this->returnValue($serializedValue));
+
+        $this->serializerMock->expects($this->never())->method('serialize');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($serializedValue)
+            ->willReturn($interceptionData);
+
+        $model = $this->objectManagerHelper->getObject(
+            \Magento\Framework\Interception\Config\Config::class,
+            [
+                'reader' => $this->readerMock,
+                'scopeList' => $this->configScopeMock,
+                'cache' => $this->cacheMock,
+                'relations' => $this->objectManagerHelper->getObject(
+                    \Magento\Framework\ObjectManager\Relations\Runtime::class
+                ),
+                'omConfig' => $this->omConfigMock,
+                'classDefinitions' => $this->definitionMock,
+                'cacheId' => $cacheId,
+                'serializer' => $this->serializerMock,
+            ]
         );
 
         $this->assertEquals($expectedResult, $model->hasPlugins($type));
diff --git a/lib/internal/Magento/Framework/Interception/Test/Unit/Definition/CompiledTest.php b/lib/internal/Magento/Framework/Interception/Test/Unit/Definition/CompiledTest.php
deleted file mode 100644
index a64cd96b62966023daf9d910c58b6a1f526925c6..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Interception/Test/Unit/Definition/CompiledTest.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\Interception\Test\Unit\Definition;
-
-class CompiledTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var array
-     */
-    protected $_definitions = ['type' => 'definitions'];
-
-    /**
-     * @covers \Magento\Framework\Interception\Definition\Compiled::getMethodList
-     * @covers \Magento\Framework\Interception\Definition\Compiled::__construct
-     */
-    public function testGetMethodList()
-    {
-        $model = new \Magento\Framework\Interception\Definition\Compiled($this->_definitions);
-        $this->assertEquals('definitions', $model->getMethodList('type'));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Interception/Test/Unit/PluginList/PluginListTest.php b/lib/internal/Magento/Framework/Interception/Test/Unit/PluginList/PluginListTest.php
index ac1e510f28b226a9c6386a35ca31192b7900cdc4..11e8dabf6d924cb4c566746514af503091b85935 100644
--- a/lib/internal/Magento/Framework/Interception/Test/Unit/PluginList/PluginListTest.php
+++ b/lib/internal/Magento/Framework/Interception/Test/Unit/PluginList/PluginListTest.php
@@ -5,6 +5,9 @@
  */
 namespace Magento\Framework\Interception\Test\Unit\PluginList;
 
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\ObjectManagerInterface;
+
 require_once __DIR__ . '/../Custom/Module/Model/Item.php';
 require_once __DIR__ . '/../Custom/Module/Model/Item/Enhanced.php';
 require_once __DIR__ . '/../Custom/Module/Model/ItemContainer.php';
@@ -23,22 +26,32 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \Magento\Framework\Interception\PluginList\PluginList
      */
-    protected $_model;
+    private $object;
+
+    /**
+     * @var \Magento\Framework\Config\ScopeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $configScopeMock;
+
+    /**
+     * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $cacheMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_configScopeMock;
+    private $loggerMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_objectManagerMock;
+    private $serializerMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var ObjectManagerInterface||\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_cacheMock;
+    private $objectManagerMock;
 
     protected function setUp()
     {
@@ -46,10 +59,10 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
         $readerMock = $this->getMock(\Magento\Framework\ObjectManager\Config\Reader\Dom::class, [], [], '', false);
         $readerMock->expects($this->any())->method('read')->will($this->returnValueMap($readerMap));
 
-        $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class);
-        $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
+        $this->configScopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class);
+        $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class);
         // turn cache off
-        $this->_cacheMock->expects($this->any())
+        $this->cacheMock->expects($this->any())
             ->method('get')
             ->will($this->returnValue(false));
 
@@ -59,62 +72,76 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
 
         $omConfigMock->expects($this->any())->method('getOriginalInstanceType')->will($this->returnArgument(0));
 
-        $this->_objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
+        $this->objectManagerMock = $this->getMock(ObjectManagerInterface::class);
+        $this->objectManagerMock->expects($this->any())
+            ->method('get')
+            ->willReturnArgument(0);
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
 
         $definitions = new \Magento\Framework\ObjectManager\Definition\Runtime();
 
-        $this->_model = new \Magento\Framework\Interception\PluginList\PluginList(
-            $readerMock,
-            $this->_configScopeMock,
-            $this->_cacheMock,
-            new \Magento\Framework\ObjectManager\Relations\Runtime(),
-            $omConfigMock,
-            new \Magento\Framework\Interception\Definition\Runtime(),
-            $this->_objectManagerMock,
-            $definitions,
-            ['global'],
-            'interception'
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->object = $objectManagerHelper->getObject(
+            \Magento\Framework\Interception\PluginList\PluginList::class,
+            [
+                'reader' => $readerMock,
+                'configScope' => $this->configScopeMock,
+                'cache' => $this->cacheMock,
+                'relations' => new \Magento\Framework\ObjectManager\Relations\Runtime(),
+                'omConfig' => $omConfigMock,
+                'definitions' => new \Magento\Framework\Interception\Definition\Runtime(),
+                'objectManager' => $this->objectManagerMock,
+                'classDefinitions' => $definitions,
+                'scopePriorityScheme' => ['global'],
+                'cacheId' => 'interception',
+                'serializer' => $this->serializerMock
+            ]
+        );
+
+        $this->loggerMock = $this->getMock(\Psr\Log\LoggerInterface::class);
+        $objectManagerHelper->setBackwardCompatibleProperty(
+            $this->object,
+            'logger',
+            $this->loggerMock
         );
     }
 
     public function testGetPlugin()
     {
-        $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnArgument(0));
-        $this->_configScopeMock->expects($this->any())->method('getCurrentScope')->will($this->returnValue('backend'));
-        $this->_model->getNext(\Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class, 'getName');
-        $this->_model->getNext(
+        $this->configScopeMock->expects($this->any())->method('getCurrentScope')->will($this->returnValue('backend'));
+        $this->object->getNext(\Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class, 'getName');
+        $this->object->getNext(
             \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer::class,
             'getName'
         );
-        $this->_model->getNext(
+        $this->object->getNext(
             \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\StartingBackslash::class,
             'getName'
         );
-
         $this->assertEquals(
             \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemPlugin\Simple::class,
-            $this->_model->getPlugin(
+            $this->object->getPlugin(
                 \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class,
                 'simple_plugin'
             )
         );
         $this->assertEquals(
             \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemPlugin\Advanced::class,
-            $this->_model->getPlugin(
+            $this->object->getPlugin(
                 \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class,
                 'advanced_plugin'
             )
         );
         $this->assertEquals(
             \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainerPlugin\Simple::class,
-            $this->_model->getPlugin(
+            $this->object->getPlugin(
                 \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer::class,
                 'simple_plugin'
             )
         );
         $this->assertEquals(
             \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\StartingBackslash\Plugin::class,
-            $this->_model->getPlugin(
+            $this->object->getPlugin(
                 \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\StartingBackslash::class,
                 'simple_plugin'
             )
@@ -131,15 +158,14 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetPlugins($expectedResult, $type, $method, $scopeCode, $code = '__self')
     {
-        $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnArgument(0));
-        $this->_configScopeMock->expects(
+        $this->configScopeMock->expects(
             $this->any()
         )->method(
             'getCurrentScope'
         )->will(
             $this->returnValue($scopeCode)
         );
-        $this->assertEquals($expectedResult, $this->_model->getNext($type, $method, $code));
+        $this->assertEquals($expectedResult, $this->object->getNext($type, $method, $code));
     }
 
     /**
@@ -207,12 +233,26 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
      */
     public function testInheritPluginsWithNonExistingClass()
     {
-        $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnArgument(0));
-        $this->_configScopeMock->expects($this->any())
+        $this->configScopeMock->expects($this->any())
             ->method('getCurrentScope')
             ->will($this->returnValue('frontend'));
 
-        $this->_model->getNext('SomeType', 'someMethod');
+        $this->object->getNext('SomeType', 'someMethod');
+    }
+
+    public function testLoadScopedDataNotCached()
+    {
+        $this->configScopeMock->expects($this->exactly(3))
+            ->method('getCurrentScope')
+            ->will($this->returnValue('scope'));
+        $this->serializerMock->expects($this->once())
+            ->method('serialize');
+        $this->serializerMock->expects($this->never())
+            ->method('unserialize');
+        $this->cacheMock->expects($this->once())
+            ->method('save');
+
+        $this->assertEquals(null, $this->object->getNext('Type', 'method'));
     }
 
     /**
@@ -221,19 +261,14 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
      */
     public function testInheritPluginsWithNotExistingPlugin()
     {
-        $loggerMock = $this->getMock(\Psr\Log\LoggerInterface::class);
-        $this->_objectManagerMock->expects($this->once())
-            ->method('get')
-            ->with(\Psr\Log\LoggerInterface::class)
-            ->willReturn($loggerMock);
-        $loggerMock->expects($this->once())
+        $this->loggerMock->expects($this->once())
             ->method('info')
             ->with("Reference to undeclared plugin with name 'simple_plugin'.");
-        $this->_configScopeMock->expects($this->any())
+        $this->configScopeMock->expects($this->any())
             ->method('getCurrentScope')
             ->will($this->returnValue('frontend'));
 
-        $this->assertNull($this->_model->getNext('typeWithoutInstance', 'someMethod'));
+        $this->assertNull($this->object->getNext('typeWithoutInstance', 'someMethod'));
     }
 
     /**
@@ -242,19 +277,24 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
      */
     public function testLoadScopedDataCached()
     {
-        $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnArgument(0));
-        $this->_configScopeMock->expects($this->once())
+        $this->configScopeMock->expects($this->once())
             ->method('getCurrentScope')
             ->will($this->returnValue('scope'));
 
         $data = [['key'], ['key'], ['key']];
+        $serializedData = 'serialized data';
 
-        $this->_cacheMock->expects($this->once())
+        $this->serializerMock->expects($this->never())
+            ->method('serialize');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->willReturn($data);
+        $this->cacheMock->expects($this->once())
             ->method('load')
             ->with('global|scope|interception')
-            ->will($this->returnValue(serialize($data)));
+            ->willReturn($serializedData);
 
-        $this->assertEquals(null, $this->_model->getNext('Type', 'method'));
+        $this->assertEquals(null, $this->object->getNext('Type', 'method'));
     }
 
     /**
@@ -263,23 +303,23 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
      */
     public function testLoadScopeDataWithEmptyData()
     {
-        $this->_objectManagerMock->expects($this->any())
+        $this->objectManagerMock->expects($this->any())
             ->method('get')
             ->will($this->returnArgument(0));
-        $this->_configScopeMock->expects($this->any())
+        $this->configScopeMock->expects($this->any())
             ->method('getCurrentScope')
             ->will($this->returnValue('emptyscope'));
 
         $this->assertEquals(
             [4 => ['simple_plugin']],
-            $this->_model->getNext(
+            $this->object->getNext(
                 \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class,
                 'getName'
             )
         );
         $this->assertEquals(
             \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemPlugin\Simple::class,
-            $this->_model->getPlugin(
+            $this->object->getPlugin(
                 \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class,
                 'simple_plugin'
             )
diff --git a/lib/internal/Magento/Framework/Mview/Config/Data.php b/lib/internal/Magento/Framework/Mview/Config/Data.php
index d2e4ee91bea2d8c6ad5712476d3af9910b818cd1..fed3021a161ee6280f7d3f0e01e7b5e15329d88a 100644
--- a/lib/internal/Magento/Framework/Mview/Config/Data.php
+++ b/lib/internal/Magento/Framework/Mview/Config/Data.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\Framework\Mview\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides materialized view configuration
+ */
 class Data extends \Magento\Framework\Config\Data
 {
     /**
@@ -13,22 +18,26 @@ class Data extends \Magento\Framework\Config\Data
     protected $stateCollection;
 
     /**
-     * @param \Magento\Framework\Mview\Config\Reader $reader
+     * Constructor
+     *
+     * @param Reader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
      * @param \Magento\Framework\Mview\View\State\CollectionInterface $stateCollection
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Mview\Config\Reader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
         \Magento\Framework\Mview\View\State\CollectionInterface $stateCollection,
-        $cacheId = 'mview_config'
+        $cacheId = 'mview_config',
+        SerializerInterface $serializer = null
     ) {
         $this->stateCollection = $stateCollection;
 
         $isCacheExists = $cache->test($cacheId);
 
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
 
         if (!$isCacheExists) {
             $this->deleteNonexistentStates();
diff --git a/lib/internal/Magento/Framework/Mview/Test/Unit/Config/DataTest.php b/lib/internal/Magento/Framework/Mview/Test/Unit/Config/DataTest.php
index 244b1b1e1382dd962560dffdec638e16dc7d71a0..777c099d9b83844c9448f172ae07106f66a5ca13 100644
--- a/lib/internal/Magento/Framework/Mview/Test/Unit/Config/DataTest.php
+++ b/lib/internal/Magento/Framework/Mview/Test/Unit/Config/DataTest.php
@@ -10,32 +10,37 @@ class DataTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \Magento\Framework\Mview\Config\Data
      */
-    protected $model;
+    private $config;
 
     /**
      * @var \Magento\Framework\Mview\Config\Reader|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $reader;
+    private $reader;
 
     /**
      * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cache;
+    private $cache;
 
     /**
      * @var \Magento\Framework\Mview\View\State\CollectionInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $stateCollection;
+    private $stateCollection;
 
     /**
      * @var string
      */
-    protected $cacheId = 'mview_config';
+    private $cacheId = 'mview_config';
 
     /**
      * @var string
      */
-    protected $views = ['view1' => [], 'view3' => []];
+    private $views = ['view1' => [], 'view3' => []];
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
 
     protected function setUp()
     {
@@ -58,28 +63,29 @@ class DataTest extends \PHPUnit_Framework_TestCase
             true,
             ['getItems']
         );
+
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
     }
 
     public function testConstructorWithCache()
     {
         $this->cache->expects($this->once())->method('test')->with($this->cacheId)->will($this->returnValue(true));
-        $this->cache->expects(
-            $this->once()
-        )->method(
-            'load'
-        )->with(
-            $this->cacheId
-        )->will(
-            $this->returnValue(serialize($this->views))
-        );
+        $this->cache->expects($this->once())
+            ->method('load')
+            ->with($this->cacheId);
 
         $this->stateCollection->expects($this->never())->method('getItems');
 
-        $this->model = new \Magento\Framework\Mview\Config\Data(
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->willReturn($this->views);
+
+        $this->config = new \Magento\Framework\Mview\Config\Data(
             $this->reader,
             $this->cache,
             $this->stateCollection,
-            $this->cacheId
+            $this->cacheId,
+            $this->serializerMock
         );
     }
 
@@ -114,11 +120,12 @@ class DataTest extends \PHPUnit_Framework_TestCase
 
         $this->stateCollection->expects($this->once())->method('getItems')->will($this->returnValue($states));
 
-        $this->model = new \Magento\Framework\Mview\Config\Data(
+        $this->config = new \Magento\Framework\Mview\Config\Data(
             $this->reader,
             $this->cache,
             $this->stateCollection,
-            $this->cacheId
+            $this->cacheId,
+            $this->serializerMock
         );
     }
 }
diff --git a/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php b/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php
index 779e8cf0a0e5ecf15b0fcb6da1e48b80a5bb3072..0260af34ef1089281b36e37b75906203d7780684 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php
@@ -6,9 +6,14 @@
 namespace Magento\Framework\ObjectManager\Config;
 
 use Magento\Framework\ObjectManager\ConfigInterface;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Serialize\Serializer\Serialize;
 use Magento\Framework\ObjectManager\ConfigCacheInterface;
 use Magento\Framework\ObjectManager\RelationsInterface;
 
+/**
+ * Provides object manager configuration when in compiled mode
+ */
 class Compiled implements ConfigInterface
 {
     /**
@@ -27,6 +32,13 @@ class Compiled implements ConfigInterface
     private $preferences;
 
     /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * Constructor
+     *
      * @param array $data
      */
     public function __construct($data)
@@ -72,7 +84,7 @@ class Compiled implements ConfigInterface
     {
         if (isset($this->arguments[$type])) {
             if (is_string($this->arguments[$type])) {
-                $this->arguments[$type] = unserialize($this->arguments[$type]);
+                $this->arguments[$type] = $this->getSerializer()->unserialize($this->arguments[$type]);
             }
             return $this->arguments[$type];
         } else {
@@ -159,4 +171,19 @@ class Compiled implements ConfigInterface
     {
         return $this->preferences;
     }
+
+    /**
+     * Get serializer
+     *
+     * @return SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if (null === $this->serializer) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(Serialize::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/lib/internal/Magento/Framework/ObjectManager/Config/Config.php b/lib/internal/Magento/Framework/ObjectManager/Config/Config.php
index 5dc02e6ba7d97cc0a1123572c7577ae767d369af..7ad196cdd34b4d90b1179ad8559b63ea8b1fa684 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Config/Config.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Config/Config.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Framework\ObjectManager\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Framework\ObjectManager\ConfigCacheInterface;
 use Magento\Framework\ObjectManager\DefinitionInterface;
 use Magento\Framework\ObjectManager\RelationsInterface;
@@ -74,6 +75,11 @@ class Config implements \Magento\Framework\ObjectManager\ConfigInterface
      */
     protected $_mergedArguments;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param RelationsInterface $relations
      * @param DefinitionInterface $definitions
@@ -267,10 +273,12 @@ class Config implements \Magento\Framework\ObjectManager\ConfigInterface
         if ($this->_cache) {
             if (!$this->_currentCacheKey) {
                 $this->_currentCacheKey = md5(
-                    serialize([$this->_arguments, $this->_nonShared, $this->_preferences, $this->_virtualTypes])
+                    $this->getSerializer()->serialize(
+                        [$this->_arguments, $this->_nonShared, $this->_preferences, $this->_virtualTypes]
+                    )
                 );
             }
-            $key = md5($this->_currentCacheKey . serialize($configuration));
+            $key = md5($this->_currentCacheKey . $this->getSerializer()->serialize($configuration));
             $cached = $this->_cache->get($key);
             if ($cached) {
                 list(
@@ -323,4 +331,19 @@ class Config implements \Magento\Framework\ObjectManager\ConfigInterface
     {
         return $this->_preferences;
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled.php b/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled.php
deleted file mode 100644
index 2cb3b21211f23af76ab75ad6875b4cc6396f4a50..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\ObjectManager\Definition;
-
-/**
- * Compiled class definitions. Should be used for maximum performance in production.
- */
-abstract class Compiled implements \Magento\Framework\ObjectManager\DefinitionInterface
-{
-    /**
-     * Class definitions
-     *
-     * @var array
-     */
-    protected $_definitions;
-
-    /**
-     * @var \Magento\Framework\Code\Reader\ClassReaderInterface
-     */
-    protected $reader ;
-
-    /**
-     * @param array $definitions
-     * @param \Magento\Framework\Code\Reader\ClassReaderInterface $reader
-     */
-    public function __construct(array $definitions, \Magento\Framework\Code\Reader\ClassReaderInterface $reader = null)
-    {
-        list($this->_signatures, $this->_definitions) = $definitions;
-        $this->reader = $reader ?: new \Magento\Framework\Code\Reader\ClassReader();
-    }
-
-    /**
-     * Unpack signature
-     *
-     * @param string $signature
-     * @return mixed
-     */
-    abstract protected function _unpack($signature);
-
-    /**
-     * Get list of method parameters
-     *
-     * Retrieve an ordered list of constructor parameters.
-     * Each value is an array with following entries:
-     *
-     * array(
-     *     0, // string: Parameter name
-     *     1, // string|null: Parameter type
-     *     2, // bool: whether this param is required
-     *     3, // mixed: default value
-     * );
-     *
-     * @param string $className
-     * @return array|null
-     */
-    public function getParameters($className)
-    {
-        // if the definition isn't found in the list gathered from the compiled file then  using reflection to find it
-        if (!array_key_exists($className, $this->_definitions)) {
-            return $this->reader->getConstructor($className);
-        }
-
-        $definition = $this->_definitions[$className];
-        if ($definition !== null) {
-            if (is_string($this->_signatures[$definition])) {
-                $this->_signatures[$definition] = $this->_unpack($this->_signatures[$definition]);
-            }
-            return $this->_signatures[$definition];
-        }
-        return null;
-    }
-
-    /**
-     * Retrieve list of all classes covered with definitions
-     *
-     * @return array
-     */
-    public function getClasses()
-    {
-        return array_keys($this->_definitions);
-    }
-}
diff --git a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Binary.php b/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Binary.php
deleted file mode 100644
index bba816e072e6b78072c0c1297dcc70935c42a1e9..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Binary.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Igbinary serialized definition reader
- *
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\ObjectManager\Definition\Compiled;
-
-class Binary extends \Magento\Framework\ObjectManager\Definition\Compiled
-{
-    /**
-     * Mode name
-     */
-    const MODE_NAME  = 'igbinary';
-
-    /**
-     * Unpack signature
-     *
-     * @param string $signature
-     * @return mixed
-     */
-    protected function _unpack($signature)
-    {
-        return igbinary_unserialize($signature);
-    }
-}
diff --git a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Serialized.php b/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Serialized.php
deleted file mode 100644
index a799725c390991676c4162384f69b4e4e8135933..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Serialized.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Serialized definition reader
- *
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\ObjectManager\Definition\Compiled;
-
-class Serialized extends \Magento\Framework\ObjectManager\Definition\Compiled
-{
-    /**
-     * Mode name
-     */
-    const MODE_NAME  = 'serialized';
-
-    /**
-     * Unpack signature
-     *
-     * @param string $signature
-     * @return mixed
-     */
-    protected function _unpack($signature)
-    {
-        return unserialize($signature);
-    }
-}
diff --git a/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php b/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php
index 40959aa19669425dbcc0eec15df5cb1bafae6738..29431b570bc6416e2f180ab86efb37be292be893 100644
--- a/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php
+++ b/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php
@@ -1,41 +1,22 @@
 <?php
 /**
- * Object manager definition factory
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
- *
  */
-
-// @codingStandardsIgnoreFile
-
 namespace Magento\Framework\ObjectManager;
 
-use Magento\Framework\Api\Code\Generator\Mapper as MapperGenerator;
-use Magento\Framework\Api\Code\Generator\SearchResults;
 use Magento\Framework\Filesystem\DriverInterface;
 use Magento\Framework\Interception\Code\Generator as InterceptionGenerator;
-use Magento\Framework\ObjectManager\Code\Generator;
-use Magento\Framework\ObjectManager\Code\Generator\Converter as ConverterGenerator;
-use Magento\Framework\ObjectManager\Definition\Compiled\Binary;
-use Magento\Framework\ObjectManager\Definition\Compiled\Serialized;
 use Magento\Framework\ObjectManager\Definition\Runtime;
 use Magento\Framework\ObjectManager\Profiler\Code\Generator as ProfilerGenerator;
-use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
-use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Code\Generator\Autoloader;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class DefinitionFactory
 {
-    /**
-     * Directory containing compiled class metadata
-     *
-     * @var string
-     */
-    protected $_definitionDir;
-
     /**
      * Class generation dir
      *
@@ -43,13 +24,6 @@ class DefinitionFactory
      */
     protected $_generationDir;
 
-    /**
-     * Format of definitions
-     *
-     * @var string
-     */
-    protected $_definitionFormat;
-
     /**
      * Filesystem Driver
      *
@@ -57,16 +31,6 @@ class DefinitionFactory
      */
     protected $_filesystemDriver;
 
-    /**
-     * List of definition models
-     *
-     * @var array
-     */
-    protected static $definitionClasses = [
-        Binary::MODE_NAME => \Magento\Framework\ObjectManager\Definition\Compiled\Binary::class,
-        Serialized::MODE_NAME => \Magento\Framework\ObjectManager\Definition\Compiled\Serialized::class,
-    ];
-
     /**
      * @var \Magento\Framework\Code\Generator
      */
@@ -74,39 +38,26 @@ class DefinitionFactory
 
     /**
      * @param DriverInterface $filesystemDriver
-     * @param string $definitionDir
      * @param string $generationDir
-     * @param string  $definitionFormat
      */
-    public function __construct(DriverInterface $filesystemDriver, $definitionDir, $generationDir, $definitionFormat)
-    {
+    public function __construct(
+        DriverInterface $filesystemDriver,
+        $generationDir
+    ) {
         $this->_filesystemDriver = $filesystemDriver;
-        $this->_definitionDir = $definitionDir;
         $this->_generationDir = $generationDir;
-        $this->_definitionFormat = $definitionFormat;
     }
 
     /**
      * Create class definitions
      *
-     * @param mixed $definitions
-     * @return Runtime
+     * @return DefinitionInterface
      */
-    public function createClassDefinition($definitions = false)
+    public function createClassDefinition()
     {
-        if ($definitions) {
-            if (is_string($definitions)) {
-                $definitions = $this->_unpack($definitions);
-            }
-            $definitionModel = self::$definitionClasses[$this->_definitionFormat];
-            $result = new $definitionModel($definitions);
-        } else {
-            $autoloader = new \Magento\Framework\Code\Generator\Autoloader($this->getCodeGenerator());
-            spl_autoload_register([$autoloader, 'load']);
-
-            $result = new Runtime();
-        }
-        return $result;
+        $autoloader = new Autoloader($this->getCodeGenerator());
+        spl_autoload_register([$autoloader, 'load']);
+        return new Runtime();
     }
 
     /**
@@ -116,14 +67,7 @@ class DefinitionFactory
      */
     public function createPluginDefinition()
     {
-        $path = $this->_definitionDir . '/plugins.ser';
-        if ($this->_filesystemDriver->isReadable($path)) {
-            return new \Magento\Framework\Interception\Definition\Compiled(
-                $this->_unpack($this->_filesystemDriver->fileGetContents($path))
-            );
-        } else {
-            return new \Magento\Framework\Interception\Definition\Runtime();
-        }
+        return new \Magento\Framework\Interception\Definition\Runtime();
     }
 
     /**
@@ -133,36 +77,7 @@ class DefinitionFactory
      */
     public function createRelations()
     {
-        $path = $this->_definitionDir . '/' . 'relations.ser';
-        if ($this->_filesystemDriver->isReadable($path)) {
-            return new \Magento\Framework\ObjectManager\Relations\Compiled(
-                $this->_unpack($this->_filesystemDriver->fileGetContents($path))
-            );
-        } else {
-            return new \Magento\Framework\ObjectManager\Relations\Runtime();
-        }
-    }
-
-    /**
-     * Gets supported definition formats
-     *
-     * @return array
-     */
-    public static function getSupportedFormats()
-    {
-        return array_keys(self::$definitionClasses);
-    }
-
-    /**
-     * Un-compress definitions
-     *
-     * @param string $definitions
-     * @return mixed
-     */
-    protected function _unpack($definitions)
-    {
-        $extractor = $this->_definitionFormat == Binary::MODE_NAME ? 'igbinary_unserialize' : 'unserialize';
-        return $extractor($definitions);
+        return new \Magento\Framework\ObjectManager\Relations\Runtime();
     }
 
     /**
diff --git a/lib/internal/Magento/Framework/ObjectManager/Relations/Compiled.php b/lib/internal/Magento/Framework/ObjectManager/Relations/Compiled.php
deleted file mode 100644
index 71455dbf9acd49e7e7c6d93699934a89ede5827a..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/ObjectManager/Relations/Compiled.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-/**
- * List of parent classes with their parents and interfaces
- *
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\ObjectManager\Relations;
-
-class Compiled implements \Magento\Framework\ObjectManager\RelationsInterface
-{
-    /**
-     * List of class relations
-     *
-     * @var array
-     */
-    protected $_relations;
-
-    /**
-     * Default relation list
-     *
-     * @var array
-     */
-    protected $_default = [];
-
-    /**
-     * @param array $relations
-     */
-    public function __construct(array $relations)
-    {
-        $this->_relations = $relations;
-    }
-
-    /**
-     * Check whether requested type is available for read
-     *
-     * @param string $type
-     * @return bool
-     */
-    public function has($type)
-    {
-        return isset($this->_relations[$type]);
-    }
-
-    /**
-     * Retrieve parents for class
-     *
-     * @param string $type
-     * @return array
-     */
-    public function getParents($type)
-    {
-        return $this->_relations[$type];
-    }
-}
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php
index 1fcf3176540db6279e3fec6754fb3a7a22b3cc59..489dc9d814e1183432e174601b9a650bd0690eea 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php
@@ -5,87 +5,93 @@
  */
 namespace Magento\Framework\ObjectManager\Test\Unit\Config;
 
-use Magento\Framework\ObjectManager\Config\Compiled as CompiledConfig;
-use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+use Magento\Framework\ObjectManager\Config\Compiled;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManager;
+use Magento\Framework\Serialize\SerializerInterface;
 
 class CompiledTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var ObjectManagerHelper
+     * @var ObjectManager
      */
-    private $objectManagerHelper;
-
-    protected function setUp()
-    {
-        $this->objectManagerHelper = new ObjectManagerHelper($this);
-    }
+    private $objectManager;
 
     /**
-     * @param array $initialData
-     * @param array $configuration
-     * @param array $expectedArguments
-     * @param array $expectedVirtualTypes
-     * @param array $expectedPreferences
-     *
-     * @dataProvider extendDataProvider
+     * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    public function testExtend(
-        array $initialData,
-        array $configuration,
-        array $expectedArguments,
-        array $expectedVirtualTypes,
-        array $expectedPreferences
-    ) {
-        /** @var CompiledConfig $compiledConfig */
-        $compiledConfig = $this->objectManagerHelper->getObject(CompiledConfig::class, ['data' => $initialData]);
-        $compiledConfig->extend($configuration);
+    private $serializerMock;
 
-        foreach ($expectedArguments as $type => $arguments) {
-            $this->assertEquals($arguments, $compiledConfig->getArguments($type));
-        }
-
-        $this->assertEquals($expectedVirtualTypes, $compiledConfig->getVirtualTypes());
-        $this->assertEquals($expectedPreferences, $compiledConfig->getPreferences());
+    protected function setUp()
+    {
+        $this->objectManager = new ObjectManager($this);
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
     }
 
-    /**
-     * @return array
-     */
-    public function extendDataProvider()
+    public function testExtend()
     {
-        return [
-            [
-                'initialData' => [
-                    'arguments' => [
-                        'type1' => serialize(['argument1_1' => 'argumentValue1_1', 'argument1_2' => 'argumentValue1_2'])
-                    ],
-                    'instanceTypes' => [
-                        'instanceType1' => 'instanceTypeValue1', 'instanceType2' => 'instanceTypeValue2'
-                    ],
-                    'preferences' => ['preference1' => 'preferenceValue1', 'preference2' => 'preferenceValue2']
-                ],
-                'configuration' => [
-                    'arguments' => [
-                        'type1' => serialize(['argument1_1' => 'newArgumentValue1_1']),
-                        'type2' => serialize(['argument2_1' => 'newArgumentValue2_1'])
-                    ],
-                    'instanceTypes' => [
-                        'instanceType2' => 'newInstanceTypeValue2', 'instanceType3' => 'newInstanceTypeValue3'
-                    ],
-                    'preferences' => ['preference1' => 'newPreferenceValue1']
-                ],
-                'expectedArguments' => [
-                    'type1' => ['argument1_1' => 'newArgumentValue1_1'],
-                    'type2' => ['argument2_1' => 'newArgumentValue2_1']
-                ],
-                'expectedVirtualTypes' => [
-                    'instanceType1' => 'instanceTypeValue1', 'instanceType2' => 'newInstanceTypeValue2',
-                    'instanceType3' => 'newInstanceTypeValue3'
-                ],
-                'expectedPreferences' => [
-                    'preference1' => 'newPreferenceValue1', 'preference2' => 'preferenceValue2'
-                ]
+        $initialData = [
+            'arguments' => [
+                'type1' => 'initial serialized configuration for type1'
+            ],
+            'instanceTypes' => [
+                'instanceType1' => 'instanceTypeValue1',
+                'instanceType2' => 'instanceTypeValue2'
+            ],
+            'preferences' => [
+                'preference1' => 'preferenceValue1',
+                'preference2' => 'preferenceValue2'
+            ]
+        ];
+        $configuration = [
+            'arguments' => [
+                'type1' => 'serialized configuration for type1',
+                'type2' => 'serialized configuration for type2'
+            ],
+            'instanceTypes' => [
+                'instanceType2' => 'newInstanceTypeValue2',
+                'instanceType3' => 'newInstanceTypeValue3'
+            ],
+            'preferences' => [
+                'preference1' => 'newPreferenceValue1'
             ]
         ];
+        $expectedArguments = [
+            'type1' => [
+                'argument1_1' => 'newArgumentValue1_1'
+            ],
+            'type2' => [
+                'argument2_1' => 'newArgumentValue2_1'
+            ]
+        ];
+        $expectedVirtualTypes = [
+            'instanceType1' => 'instanceTypeValue1',
+            'instanceType2' => 'newInstanceTypeValue2',
+            'instanceType3' => 'newInstanceTypeValue3'
+        ];
+        $expectedPreferences = [
+            'preference1' => 'newPreferenceValue1',
+            'preference2' => 'preferenceValue2'
+        ];
+        $this->serializerMock->expects($this->at(0))
+            ->method('unserialize')
+            ->with($configuration['arguments']['type1'])
+            ->willReturn($expectedArguments['type1']);
+        $this->serializerMock->expects($this->at(1))
+            ->method('unserialize')
+            ->with($configuration['arguments']['type2'])
+            ->willReturn($expectedArguments['type2']);
+        $compiled = $this->objectManager->getObject(
+            Compiled::class,
+            [
+                'data' => $initialData,
+                'serializer' => $this->serializerMock
+            ]
+        );
+        $compiled->extend($configuration);
+        foreach ($expectedArguments as $type => $arguments) {
+            $this->assertEquals($arguments, $compiled->getArguments($type));
+        }
+        $this->assertEquals($expectedVirtualTypes, $compiled->getVirtualTypes());
+        $this->assertEquals($expectedPreferences, $compiled->getPreferences());
     }
 }
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/ConfigTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/ConfigTest.php
index 844d5fa94a62728e7f1bbbce850affd764214021..4cc51652fdb74454fde50182a3062b53b5616dc5 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/ConfigTest.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/ConfigTest.php
@@ -5,10 +5,19 @@
  */
 namespace Magento\Framework\ObjectManager\Test\Unit\Config;
 
+use Magento\Framework\Serialize\SerializerInterface;
 use \Magento\Framework\ObjectManager\Config\Config;
 
 class ConfigTest extends \PHPUnit_Framework_TestCase
 {
+    /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */
+    private $objectManagerHelper;
+
+    protected function setUp()
+    {
+        $this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+    }
+
     public function testGetArgumentsEmpty()
     {
         $config = new Config();
@@ -42,6 +51,14 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $cache->expects($this->once())->method('get')->will($this->returnValue(false));
 
         $config = new Config(null, $definitions);
+        $serializerMock = $this->getMock(SerializerInterface::class);
+        $serializerMock->expects($this->exactly(2))
+            ->method('serialize');
+        $this->objectManagerHelper->setBackwardCompatibleProperty(
+            $config,
+            'serializer',
+            $serializerMock
+        );
         $config->setCache($cache);
 
         $this->_assertFooTypeArguments($config);
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/BinaryTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/BinaryTest.php
deleted file mode 100644
index 80cf73a44e7ac694a58646bb902690d9d00ab012..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/BinaryTest.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\ObjectManager\Test\Unit\Definition\Compiled;
-
-class BinaryTest extends \PHPUnit_Framework_TestCase
-{
-    public function testGetParametersWithUnpacking()
-    {
-        if (!function_exists('igbinary_serialize')) {
-            $this->markTestSkipped('This test requires igbinary PHP extension');
-        }
-        $checkString = 'packed code';
-        $signatures = ['wonderfulClass' => igbinary_serialize($checkString)];
-        $definitions = ['wonderful' => 'wonderfulClass'];
-        $model = new \Magento\Framework\ObjectManager\Definition\Compiled\Binary([$signatures, $definitions]);
-        $this->assertEquals($checkString, $model->getParameters('wonderful'));
-    }
-}
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/SerializedTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/SerializedTest.php
deleted file mode 100644
index 9454377c3b7207dbfc355f022e1faedb75b61a52..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/SerializedTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\ObjectManager\Test\Unit\Definition\Compiled;
-
-class SerializedTest extends \PHPUnit_Framework_TestCase
-{
-    public function testGetParametersWithoutDefinition()
-    {
-        $signatures = [];
-        $definitions = ['wonderful' => null];
-        $model = new \Magento\Framework\ObjectManager\Definition\Compiled\Serialized([$signatures, $definitions]);
-        $this->assertEquals(null, $model->getParameters('wonderful'));
-    }
-
-    public function testGetParametersWithSignatureObject()
-    {
-        $wonderfulSignature = new \stdClass();
-        $signatures = ['wonderfulClass' => $wonderfulSignature];
-        $definitions = ['wonderful' => 'wonderfulClass'];
-        $model = new \Magento\Framework\ObjectManager\Definition\Compiled\Serialized([$signatures, $definitions]);
-        $this->assertEquals($wonderfulSignature, $model->getParameters('wonderful'));
-    }
-
-    public function testGetParametersWithUnpacking()
-    {
-        $checkString = 'code to pack';
-        $signatures = ['wonderfulClass' => serialize($checkString)];
-        $definitions = ['wonderful' => 'wonderfulClass'];
-        $model = new \Magento\Framework\ObjectManager\Definition\Compiled\Serialized([$signatures, $definitions]);
-        $this->assertEquals($checkString, $model->getParameters('wonderful'));
-    }
-}
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledStub.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledStub.php
deleted file mode 100644
index 16b8436a0c41aa7bf6506d34e61b58827032d5c1..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledStub.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\ObjectManager\Test\Unit\Definition;
-
-use \Magento\Framework\ObjectManager\Definition\Compiled;
-
-/**
- * Stub class for abstract Magento\Framework\ObjectManager\DefinitionInterface
- */
-class CompiledStub extends Compiled
-{
-    /**
-     * Unpack signature
-     *
-     * @param string $signature
-     * @return mixed
-     */
-    protected function _unpack($signature)
-    {
-        return unserialize($signature);
-    }
-}
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledTest.php
deleted file mode 100644
index 0e7c79e8571d2686f561df97ed6832d93768d2fa..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledTest.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\ObjectManager\Test\Unit\Definition;
-
-use \Magento\Framework\ObjectManager\Definition\Compiled;
-
-class CompiledTest extends \PHPUnit_Framework_TestCase
-{
-    public function testGetParametersWithUndefinedDefinition()
-    {
-        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-        $undefinedDefinitionSignature = new \stdClass();
-        $className = 'undefinedDefinition';
-        $readerMock = $this->getMock(
-            \Magento\Framework\Code\Reader\ClassReader::class,
-            ['getConstructor'],
-            [],
-            '',
-            false
-        );
-        $readerMock->expects($this->once())
-            ->method('getConstructor')
-            ->with($className)
-            ->willReturn($undefinedDefinitionSignature);
-        $model = $objectManager->getObject(
-            \Magento\Framework\ObjectManager\Test\Unit\Definition\CompiledStub::class,
-            [
-                'definitions' => [[], []],
-                'reader' => $readerMock
-            ]
-        );
-        $this->assertEquals($undefinedDefinitionSignature, $model->getParameters($className));
-    }
-}
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/DefinitionFactoryTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/DefinitionFactoryTest.php
index 468e01ce80aba618d1b7447b3ca2a720c52cbe85..8c587cec4351ce1156f4043af8d16e7d827895d4 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/DefinitionFactoryTest.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/DefinitionFactoryTest.php
@@ -3,119 +3,56 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Framework\ObjectManager\Test\Unit;
 
-use Magento\Framework\ObjectManager\Definition\Compiled\Serialized;
+use Magento\Framework\Filesystem\Driver\File;
+use Magento\Framework\ObjectManager\DefinitionFactory;
+use Magento\Framework\ObjectManager\DefinitionInterface;
+use Magento\Framework\Interception\DefinitionInterface as InterceptionDefinitionInterface;
+use Magento\Framework\ObjectManager\RelationsInterface;
 
 class DefinitionFactoryTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Framework\Filesystem\DriverInterface | \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $filesystemDriverMock;
-
-    /**
-     * @var \Magento\Framework\ObjectManager\DefinitionFactory
+     * @var File|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $model;
+    private $filesystemDriverMock;
 
     /**
-     * @var string
+     * @var DefinitionFactory
      */
-    protected $sampleContent;
+    private $definitionFactory;
 
     protected function setUp()
     {
-        $this->sampleContent = serialize([1, 2, 3]);
-        $this->filesystemDriverMock = $this->getMock(
-            \Magento\Framework\Filesystem\Driver\File::class,
-            [],
-            [],
-            '',
-            false
-        );
-        $this->model = new \Magento\Framework\ObjectManager\DefinitionFactory(
+        $this->filesystemDriverMock = $this->getMock(File::class);
+        $this->definitionFactory = new DefinitionFactory(
             $this->filesystemDriverMock,
-            'DefinitionDir',
-            'GenerationDir',
-            Serialized::MODE_NAME
+            'generation dir'
         );
     }
 
-    public function testCreateClassDefinitionFromString()
+    public function testCreateClassDefinition()
     {
         $this->assertInstanceOf(
-            \Magento\Framework\ObjectManager\Definition\Compiled\Serialized::class,
-            $this->model->createClassDefinition($this->sampleContent)
+            DefinitionInterface::class,
+            $this->definitionFactory->createClassDefinition()
         );
     }
 
-    /**
-     * @param string $path
-     * @param string $callMethod
-     * @param string $expectedClass
-     * @dataProvider createPluginsAndRelationsReadableDataProvider
-     */
-    public function testCreatePluginsAndRelationsReadable($path, $callMethod, $expectedClass)
-    {
-        $this->filesystemDriverMock->expects($this->once())->method('isReadable')
-            ->with($path)
-            ->will($this->returnValue(true));
-        $this->filesystemDriverMock->expects($this->once())->method('fileGetContents')
-            ->with($path)
-            ->will($this->returnValue($this->sampleContent));
-        $this->assertInstanceOf($expectedClass, $this->model->$callMethod());
-    }
-
-    public function createPluginsAndRelationsReadableDataProvider()
-    {
-        return [
-            'relations' => [
-                'DefinitionDir/relations.ser',
-                'createRelations', \Magento\Framework\ObjectManager\Relations\Compiled::class,
-            ],
-            'plugins' => [
-                'DefinitionDir/plugins.ser',
-                'createPluginDefinition', \Magento\Framework\Interception\Definition\Compiled::class,
-            ],
-        ];
-    }
-
-    /**
-     * @param string $path
-     * @param string $callMethod
-     * @param string $expectedClass
-     * @dataProvider createPluginsAndRelationsNotReadableDataProvider
-     */
-    public function testCreatePluginsAndRelationsNotReadable($path, $callMethod, $expectedClass)
+    public function testCreatePluginDefinition()
     {
-        $this->filesystemDriverMock->expects($this->once())->method('isReadable')
-            ->with($path)
-            ->will($this->returnValue(false));
-        $this->assertInstanceOf($expectedClass, $this->model->$callMethod());
-    }
-
-    public function createPluginsAndRelationsNotReadableDataProvider()
-    {
-        return [
-            'relations' => [
-                'DefinitionDir/relations.ser',
-                'createRelations', \Magento\Framework\ObjectManager\Relations\Runtime::class,
-            ],
-            'plugins' => [
-                'DefinitionDir/plugins.ser',
-                'createPluginDefinition', \Magento\Framework\Interception\Definition\Runtime::class,
-            ],
-        ];
+        $this->assertInstanceOf(
+            InterceptionDefinitionInterface::class,
+            $this->definitionFactory->createPluginDefinition()
+        );
     }
 
-    public function testGetSupportedFormats()
+    public function testCreateRelations()
     {
-        $actual = \Magento\Framework\ObjectManager\DefinitionFactory::getSupportedFormats();
-        $this->assertInternalType('array', $actual);
-        foreach ($actual as $className) {
-            $this->assertInternalType('string', $className);
-        }
+        $this->assertInstanceOf(
+            RelationsInterface::class,
+            $this->definitionFactory->createRelations()
+        );
     }
 }
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/CompiledTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/CompiledTest.php
deleted file mode 100644
index 336a798df100e156895ea5cd20768650909b2722..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/CompiledTest.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\ObjectManager\Test\Unit\Relations;
-
-class CompiledTest extends \PHPUnit_Framework_TestCase
-{
-    public function testHas()
-    {
-        $relations = ['amazing' => 'yes'];
-
-        $model = new \Magento\Framework\ObjectManager\Relations\Compiled($relations);
-        $this->assertEquals(true, $model->has('amazing'));
-        $this->assertEquals(false, $model->has('fuzzy'));
-    }
-
-    public function testGetParents()
-    {
-        $relations = ['amazing' => 'parents'];
-
-        $model = new \Magento\Framework\ObjectManager\Relations\Compiled($relations);
-        $this->assertEquals('parents', $model->getParents('amazing'));
-    }
-}
diff --git a/lib/internal/Magento/Framework/Reflection/MethodsMap.php b/lib/internal/Magento/Framework/Reflection/MethodsMap.php
index f7f402ae4b8a00c905e65678105f8461922d8571..c7a9183a78ee5e903355b06507402744349f83fc 100644
--- a/lib/internal/Magento/Framework/Reflection/MethodsMap.php
+++ b/lib/internal/Magento/Framework/Reflection/MethodsMap.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Framework\Reflection;
 
+use Magento\Framework\Serialize\SerializerInterface;
 use Zend\Code\Reflection\ClassReflection;
 use Zend\Code\Reflection\MethodReflection;
 use Zend\Code\Reflection\ParameterReflection;
@@ -45,6 +46,11 @@ class MethodsMap
      */
     private $fieldNamer;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\Cache\FrontendInterface $cache
      * @param TypeProcessor $typeProcessor
@@ -95,11 +101,11 @@ class MethodsMap
         if (!isset($this->serviceInterfaceMethodsMap[$key])) {
             $methodMap = $this->cache->load($key);
             if ($methodMap) {
-                $this->serviceInterfaceMethodsMap[$key] = unserialize($methodMap);
+                $this->serviceInterfaceMethodsMap[$key] = $this->getSerializer()->unserialize($methodMap);
             } else {
                 $methodMap = $this->getMethodMapViaReflection($interfaceName);
                 $this->serviceInterfaceMethodsMap[$key] = $methodMap;
-                $this->cache->save(serialize($this->serviceInterfaceMethodsMap[$key]), $key);
+                $this->cache->save($this->getSerializer()->serialize($this->serviceInterfaceMethodsMap[$key]), $key);
             }
         }
         return $this->serviceInterfaceMethodsMap[$key];
@@ -117,7 +123,7 @@ class MethodsMap
         $cacheId = self::SERVICE_METHOD_PARAMS_CACHE_PREFIX . hash('md5', $serviceClassName . $serviceMethodName);
         $params = $this->cache->load($cacheId);
         if ($params !== false) {
-            return unserialize($params);
+            return $this->getSerializer()->unserialize($params);
         }
         $serviceClass = new ClassReflection($serviceClassName);
         /** @var MethodReflection $serviceMethod */
@@ -133,7 +139,7 @@ class MethodsMap
                 self::METHOD_META_DEFAULT_VALUE => $isDefaultValueAvailable ? $paramReflection->getDefaultValue() : null
             ];
         }
-        $this->cache->save(serialize($params), $cacheId, [ReflectionCache::CACHE_TAG]);
+        $this->cache->save($this->getSerializer()->serialize($params), $cacheId, [ReflectionCache::CACHE_TAG]);
         return $params;
     }
 
@@ -217,4 +223,19 @@ class MethodsMap
         $methods = $this->getMethodsMap($type);
         return $methods[$methodName]['isRequired'];
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Reflection/Test/Unit/MethodsMapTest.php b/lib/internal/Magento/Framework/Reflection/Test/Unit/MethodsMapTest.php
index 6f4dc37b8faff83791030ddbdee16e80a1fdfb02..67a372c4d33ca754d7d35e9005730c55a55e4a19 100644
--- a/lib/internal/Magento/Framework/Reflection/Test/Unit/MethodsMapTest.php
+++ b/lib/internal/Magento/Framework/Reflection/Test/Unit/MethodsMapTest.php
@@ -6,9 +6,9 @@
 
 namespace Magento\Framework\Reflection\Test\Unit;
 
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Framework\Reflection\MethodsMap;
 use Magento\Framework\Reflection\TypeProcessor;
-use Magento\Framework\Reflection\FieldNamer;
 
 /**
  * MethodsMap test
@@ -18,7 +18,10 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase
     /**
      * @var MethodsMap
      */
-    private $model;
+    private $object;
+
+    /** @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */
+    private $serializerMock;
 
     /**
      * Set up helper.
@@ -39,7 +42,7 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase
             ->getMockForAbstractClass();
         $fieldNamerMock = $this->getMockBuilder(\Magento\Framework\Reflection\FieldNamer::class)
             ->getMockForAbstractClass();
-        $this->model = $objectManager->getObject(
+        $this->object = $objectManager->getObject(
             \Magento\Framework\Reflection\MethodsMap::class,
             [
                 'cache' => $cacheMock,
@@ -48,27 +51,33 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase
                 'fieldNamer' => $fieldNamerMock,
             ]
         );
+        $this->serializerMock = $this->getMock(SerializerInterface::class);
+        $objectManager->setBackwardCompatibleProperty(
+            $this->object,
+            'serializer',
+            $this->serializerMock
+        );
     }
 
     public function testGetMethodReturnType()
     {
         $this->assertEquals(
             'string',
-            $this->model->getMethodReturnType(
+            $this->object->getMethodReturnType(
                 \Magento\Framework\Reflection\FieldNamer::class,
                 'getFieldNameForMethodName'
             )
         );
         $this->assertEquals(
             'mixed',
-            $this->model->getMethodReturnType(
+            $this->object->getMethodReturnType(
                 \Magento\Framework\Reflection\TypeCaster::class,
                 'castValueToType'
             )
         );
         $this->assertEquals(
             'array',
-            $this->model->getMethodReturnType(
+            $this->object->getMethodReturnType(
                 \Magento\Framework\Reflection\MethodsMap::class,
                 'getMethodsMap'
             )
@@ -77,42 +86,46 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase
 
     public function testGetMethodsMap()
     {
-        $methodsMap = $this->model->getMethodsMap(\Magento\Framework\Reflection\MethodsMap::class);
-        $this->assertEquals(
-            [
-                'getMethodReturnType' => [
-                    'type' => 'string',
-                    'isRequired' => true,
-                    'description' => null,
-                    'parameterCount' => 2,
-                ],
-                'getMethodsMap' => [
-                    'type' => 'array',
-                    'isRequired' => true,
-                    'description' => "<pre> Service methods' reflection data stored in cache as 'methodName' => "
-                        . "'returnType' ex. [ 'create' => '\Magento\Customer\Api\Data\Customer', 'validatePassword' "
-                        . "=> 'boolean' ] </pre>",
-                    'parameterCount' => 1,
-                ],
-                'getMethodParams' => [
-                    'type' => 'array',
-                    'isRequired' => true,
-                    'description' => null,
-                    'parameterCount' => 2
-                ],
-                'isMethodValidForDataField' => [
-                    'type' => 'bool',
-                    'isRequired' => true,
-                    'description' => null,
-                    'parameterCount' => 2,
-                ],
-                'isMethodReturnValueRequired' => [
-                    'type' => 'bool',
-                    'isRequired' => true,
-                    'description' => null,
-                    'parameterCount' => 2,
-                ],
+        $data = [
+            'getMethodReturnType' => [
+                'type' => 'string',
+                'isRequired' => true,
+                'description' => null,
+                'parameterCount' => 2,
+            ],
+            'getMethodsMap' => [
+                'type' => 'array',
+                'isRequired' => true,
+                'description' => "<pre> Service methods' reflection data stored in cache as 'methodName' => "
+                    . "'returnType' ex. [ 'create' => '\Magento\Customer\Api\Data\Customer', 'validatePassword' "
+                    . "=> 'boolean' ] </pre>",
+                'parameterCount' => 1,
             ],
+            'getMethodParams' => [
+                'type' => 'array',
+                'isRequired' => true,
+                'description' => null,
+                'parameterCount' => 2
+            ],
+            'isMethodValidForDataField' => [
+                'type' => 'bool',
+                'isRequired' => true,
+                'description' => null,
+                'parameterCount' => 2,
+            ],
+            'isMethodReturnValueRequired' => [
+                'type' => 'bool',
+                'isRequired' => true,
+                'description' => null,
+                'parameterCount' => 2,
+            ],
+        ];
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($data);
+        $methodsMap = $this->object->getMethodsMap(\Magento\Framework\Reflection\MethodsMap::class);
+        $this->assertEquals(
+            $data,
             $methodsMap
         );
     }
@@ -125,7 +138,7 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase
      */
     public function testIsMethodValidForDataField($type, $methodName, $expectedResult)
     {
-        $this->assertEquals($this->model->isMethodValidForDataField($type, $methodName), $expectedResult);
+        $this->assertEquals($this->object->isMethodValidForDataField($type, $methodName), $expectedResult);
     }
 
     /**
@@ -157,7 +170,7 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase
      */
     public function testIsMethodReturnValueRequired($type, $methodName, $expectedResult)
     {
-        $this->assertEquals($this->model->isMethodValidForDataField($type, $methodName), $expectedResult);
+        $this->assertEquals($this->object->isMethodValidForDataField($type, $methodName), $expectedResult);
     }
 
     /**
diff --git a/lib/internal/Magento/Framework/Search/Request/Config.php b/lib/internal/Magento/Framework/Search/Request/Config.php
index b348f214dd4c2f1496224651854a2aad16264186..80a963af39b41e0ca6327383dcff1c50132510d0 100644
--- a/lib/internal/Magento/Framework/Search/Request/Config.php
+++ b/lib/internal/Magento/Framework/Search/Request/Config.php
@@ -5,21 +5,32 @@
  */
 namespace Magento\Framework\Search\Request;
 
+use Magento\Framework\Serialize\SerializerInterface;
+
+/**
+ * Provides search request configuration
+ */
 class Config extends \Magento\Framework\Config\Data
 {
-    /** Cache ID for Search Request*/
+    /**
+     * Cache identifier
+     */
     const CACHE_ID = 'request_declaration';
 
     /**
+     * Constructor
+     *
      * @param \Magento\Framework\Search\Request\Config\FilesystemReader $reader
      * @param \Magento\Framework\Config\CacheInterface $cache
-     * @param string $cacheId
+     * @param string|null $cacheId
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\Framework\Search\Request\Config\FilesystemReader $reader,
         \Magento\Framework\Config\CacheInterface $cache,
-        $cacheId = self::CACHE_ID
+        $cacheId = self::CACHE_ID,
+        SerializerInterface $serializer = null
     ) {
-        parent::__construct($reader, $cache, $cacheId);
+        parent::__construct($reader, $cache, $cacheId, $serializer);
     }
 }
diff --git a/lib/internal/Magento/Framework/Test/Unit/TranslateTest.php b/lib/internal/Magento/Framework/Test/Unit/TranslateTest.php
index 8d1692dd9cdc147bc76d0fa425cba4436e31ef5e..a8199768a365f5b638124b428ae6338ea9864cd3 100644
--- a/lib/internal/Magento/Framework/Test/Unit/TranslateTest.php
+++ b/lib/internal/Magento/Framework/Test/Unit/TranslateTest.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Framework\Test\Unit;
 
+use Magento\Framework\Serialize\SerializerInterface;
 use \Magento\Framework\Translate;
 
 /**
@@ -59,6 +60,7 @@ class TranslateTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->viewDesign = $this->getMock(\Magento\Framework\View\DesignInterface::class, [], [], '', false);
         $this->cache = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class, [], [], '', false);
         $this->viewFileSystem = $this->getMock(\Magento\Framework\View\FileSystem::class, [], [], '', false);
@@ -104,6 +106,21 @@ class TranslateTest extends \PHPUnit_Framework_TestCase
             $this->csvParser,
             $this->packDictionary
         );
+
+        $serializerMock = $this->getMock(SerializerInterface::class);
+        $serializerMock->method('serialize')
+            ->willReturnCallback(function ($data) {
+                return json_encode($data);
+            });
+        $serializerMock->method('unserialize')
+            ->willReturnCallback(function ($string) {
+                return json_decode($string, true);
+            });
+        $objectManager->setBackwardCompatibleProperty(
+            $this->translate,
+            'serializer',
+            $serializerMock
+        );
     }
 
     /**
@@ -119,7 +136,7 @@ class TranslateTest extends \PHPUnit_Framework_TestCase
 
         $this->cache->expects($this->exactly($forceReload ? 0 : 1))
             ->method('load')
-            ->will($this->returnValue(serialize($cachedData)));
+            ->will($this->returnValue(json_encode($cachedData)));
 
         if (!$forceReload && $cachedData !== false) {
             $this->translate->loadData($area, $forceReload);
@@ -222,7 +239,7 @@ class TranslateTest extends \PHPUnit_Framework_TestCase
     {
         $this->cache->expects($this->once())
             ->method('load')
-            ->will($this->returnValue(serialize($data)));
+            ->will($this->returnValue(json_encode($data)));
         $this->expectsSetConfig('themeId');
         $this->translate->loadData('frontend');
         $this->assertEquals($result, $this->translate->getData());
diff --git a/lib/internal/Magento/Framework/Translate.php b/lib/internal/Magento/Framework/Translate.php
index 36f693270f42f6f8e4ceda68e13cb45bde426c42..c5571ab0b8edb282ba164e5ec36f9a3b9e2c9f96 100644
--- a/lib/internal/Magento/Framework/Translate.php
+++ b/lib/internal/Magento/Framework/Translate.php
@@ -108,6 +108,11 @@ class Translate implements \Magento\Framework\TranslateInterface
      */
     protected $packDictionary;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializer;
+
     /**
      * @param \Magento\Framework\View\DesignInterface $viewDesign
      * @param \Magento\Framework\Cache\FrontendInterface $cache
@@ -474,7 +479,7 @@ class Translate implements \Magento\Framework\TranslateInterface
     {
         $data = $this->_cache->load($this->getCacheId());
         if ($data) {
-            $data = unserialize($data);
+            $data = $this->getSerializer()->unserialize($data);
         }
         return $data;
     }
@@ -486,7 +491,22 @@ class Translate implements \Magento\Framework\TranslateInterface
      */
     protected function _saveCache()
     {
-        $this->_cache->save(serialize($this->getData()), $this->getCacheId(true), [], false);
+        $this->_cache->save($this->getSerializer()->serialize($this->getData()), $this->getCacheId(true), [], false);
         return $this;
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(Serialize\SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Unserialize/README.md b/lib/internal/Magento/Framework/Unserialize/README.md
index 971bd6980abb136c2246e4618a8776be8bdaa16d..2dbf7436aa60fbc23b378102418ef4dbc8634e85 100644
--- a/lib/internal/Magento/Framework/Unserialize/README.md
+++ b/lib/internal/Magento/Framework/Unserialize/README.md
@@ -1,2 +1 @@
-Library provides custom unserialize method. Method checks if serialized string contains serialized object and do not
-unserialize it. If string doesn't contain serialized object, method calls native PHP function unserialize.
\ No newline at end of file
+This library is deprecated, please use Magento\Framework\Serialize\SerializerInterface instead.
\ No newline at end of file
diff --git a/lib/internal/Magento/Framework/Unserialize/Unserialize.php b/lib/internal/Magento/Framework/Unserialize/Unserialize.php
index 9d4785915a6dd6b8e3a03b7108fecb21b3b4712a..cfd3e81ca6b0942c879f24994feeb391e3e4cf0b 100644
--- a/lib/internal/Magento/Framework/Unserialize/Unserialize.php
+++ b/lib/internal/Magento/Framework/Unserialize/Unserialize.php
@@ -6,6 +6,9 @@
 
 namespace Magento\Framework\Unserialize;
 
+/**
+ * @deprecated
+ */
 class Unserialize
 {
     /**
diff --git a/lib/internal/Magento/Framework/Validator/Factory.php b/lib/internal/Magento/Framework/Validator/Factory.php
index d2e3837d131382becdf07413b373a944bea75f4e..76633f48dfe0b96fcbe473aa579817339173685e 100644
--- a/lib/internal/Magento/Framework/Validator/Factory.php
+++ b/lib/internal/Magento/Framework/Validator/Factory.php
@@ -1,20 +1,20 @@
 <?php
 /**
- * Magento validator config factory
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
-// @codingStandardsIgnoreFile
-
 namespace Magento\Framework\Validator;
 
 use Magento\Framework\Cache\FrontendInterface;
 
+/**
+ * @codingStandardsIgnoreFile
+ */
 class Factory
 {
-    /** cache key */
+    /**
+     * Cache key
+     */
     const CACHE_KEY = __CLASS__;
 
     /**
@@ -44,6 +44,16 @@ class Factory
      */
     private $cache;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * @var \Magento\Framework\Config\FileIteratorFactory
+     */
+    private $fileIteratorFactory;
+
     /**
      * Initialize dependencies
      *
@@ -70,9 +80,10 @@ class Factory
             $this->_configFiles = $this->cache->load(self::CACHE_KEY);
             if (!$this->_configFiles) {
                 $this->_configFiles = $this->moduleReader->getConfigurationFiles('validation.xml');
-                $this->cache->save(serialize($this->_configFiles), self::CACHE_KEY);
+                $this->cache->save($this->getSerializer()->serialize($this->_configFiles->toArray()), self::CACHE_KEY);
             } else {
-                $this->_configFiles = unserialize($this->_configFiles);
+                $filesArray = $this->getSerializer()->unserialize($this->_configFiles);
+                $this->_configFiles = $this->getFileIteratorFactory()->create(array_keys($filesArray));
             }
         }
     }
@@ -109,7 +120,7 @@ class Factory
     {
         $this->_initializeConfigList();
         $this->_initializeDefaultTranslator();
-        return $this->_objectManager->create(
+        return $this->_objectManager->create(
             \Magento\Framework\Validator\Config::class, ['configFiles' => $this->_configFiles]);
     }
 
@@ -140,4 +151,33 @@ class Factory
         $this->_initializeDefaultTranslator();
         return $this->getValidatorConfig()->createValidator($entityName, $groupName, $builderConfig);
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = $this->_objectManager->get(\Magento\Framework\Serialize\SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
+
+    /**
+     * Get file iterator factory
+     *
+     * @return \Magento\Framework\Config\FileIteratorFactory
+     * @deprecated
+     */
+    private function getFileIteratorFactory()
+    {
+        if ($this->fileIteratorFactory === null) {
+            $this->fileIteratorFactory = $this->_objectManager
+                ->get(\Magento\Framework\Config\FileIteratorFactory::class);
+        }
+        return $this->fileIteratorFactory;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Validator/Test/Unit/FactoryTest.php b/lib/internal/Magento/Framework/Validator/Test/Unit/FactoryTest.php
index bb829010795e85957dce379405fa4111300dbb36..4c4ef93bc15be7102347c06917e8806eb7aefd5d 100644
--- a/lib/internal/Magento/Framework/Validator/Test/Unit/FactoryTest.php
+++ b/lib/internal/Magento/Framework/Validator/Test/Unit/FactoryTest.php
@@ -1,98 +1,139 @@
 <?php
 /**
- * Unit test for \Magento\Framework\Validator\Factory
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Framework\Validator\Test\Unit;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class FactoryTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Framework\ObjectManagerInterface
+     * @var \Magento\Framework\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $objectManagerMock;
+
+    /**
+     * @var \Magento\Framework\Module\Dir\Reader|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $readerMock;
+
+    /**
+     * @var \Magento\Framework\Validator\Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $validatorConfigMock;
+
+    /**
+     * @var \Magento\Framework\Cache\FrontendInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $cacheMock;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_objectManager;
+    private $serializerMock;
 
     /**
-     * @var \Magento\Framework\Module\Dir\Reader
+     * @var \Magento\Framework\Config\FileIteratorFactory|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_config;
+    private $fileIteratorFactoryMock;
 
     /**
-     * @var \Magento\Framework\TranslateInterface
+     * @var \Magento\Framework\Config\FileIterator|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_translateAdapter;
+    private $fileIteratorMock;
 
     /**
-     * @var \Magento\Framework\Validator\Config
+     * @var \Magento\Framework\Translate\AdapterInterface
      */
-    protected $_validatorConfig;
+    private $defaultTranslator;
 
-    private $cache;
+    /**
+     * @var \Magento\Framework\Validator\Factory
+     */
+    private $factory;
 
     /**
-     * @var \Magento\Framework\Translate\AdapterInterface|null
+     * @var string
      */
-    protected $_defaultTranslator = null;
+    private $jsonString = '["\/tmp\/moduleOne\/etc\/validation.xml"]';
 
     /**
-     * Save default translator
+     * @var array
      */
+    private $data = ['/tmp/moduleOne/etc/validation.xml'];
+
     protected function setUp()
     {
-        $this->_defaultTranslator = \Magento\Framework\Validator\AbstractValidator::getDefaultTranslator();
-        $this->_objectManager = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
-        $this->_validatorConfig = $this->getMockBuilder(
-            \Magento\Framework\Validator\Config::class
-        )->setMethods(
-            ['createValidatorBuilder', 'createValidator']
-        )->disableOriginalConstructor()->getMock();
-
-        $this->_objectManager->expects(
-            $this->at(0)
-        )->method(
-            'create'
-        )->with(
-            \Magento\Framework\Translate\Adapter::class
-        )->will(
-            $this->returnValue(new \Magento\Framework\Translate\Adapter())
-        );
+        $this->defaultTranslator = \Magento\Framework\Validator\AbstractValidator::getDefaultTranslator();
 
-        $this->_objectManager->expects(
-            $this->at(1)
-        )->method(
-            'create'
-        )->with(
+        $this->objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class);
+        $this->validatorConfigMock = $this->getMock(
             \Magento\Framework\Validator\Config::class,
-            ['configFiles' => ['/tmp/moduleOne/etc/validation.xml']]
-        )->will(
-            $this->returnValue($this->_validatorConfig)
+            ['createValidatorBuilder', 'createValidator'],
+            [],
+            '',
+            false
         );
-
-        // Config mock
-        $this->_config = $this->getMockBuilder(
-            \Magento\Framework\Module\Dir\Reader::class
-        )->setMethods(
-            ['getConfigurationFiles']
-        )->disableOriginalConstructor()->getMock();
-        $this->_config->expects(
-            $this->once()
-        )->method(
-            'getConfigurationFiles'
-        )->with(
-            'validation.xml'
-        )->will(
-            $this->returnValue(['/tmp/moduleOne/etc/validation.xml'])
+        $translateAdapterMock = $this->getMock(\Magento\Framework\Translate\Adapter::class, [], [], '', false);
+        $this->objectManagerMock->expects($this->at(0))
+            ->method('create')
+            ->with(\Magento\Framework\Translate\Adapter::class)
+            ->willReturn($translateAdapterMock);
+        $this->fileIteratorMock = $this->getMock(
+            \Magento\Framework\Config\FileIterator::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->objectManagerMock->expects($this->at(1))
+            ->method('create')
+            ->with(
+                \Magento\Framework\Validator\Config::class,
+                ['configFiles' => $this->fileIteratorMock]
+            )
+            ->willReturn($this->validatorConfigMock);
+        $this->readerMock = $this->getMock(
+            \Magento\Framework\Module\Dir\Reader::class,
+            ['getConfigurationFiles'],
+            [],
+            '',
+            false
         );
+        $this->cacheMock = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class);
 
-        // Translate adapter mock
-        $this->_translateAdapter = $this->getMockBuilder(
-            \Magento\Framework\TranslateInterface::class
-        )->disableOriginalConstructor()->getMock();
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $this->factory = $objectManager->getObject(
+            \Magento\Framework\Validator\Factory::class,
+            [
+                'objectManager' => $this->objectManagerMock,
+                'moduleReader' => $this->readerMock,
+                'cache' => $this->cacheMock
+            ]
+        );
 
-        $this->cache = $this->getMockBuilder(\Magento\Framework\Cache\FrontendInterface::class)
-            ->getMockForAbstractClass();
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class);
+        $this->fileIteratorFactoryMock = $this->getMock(
+            \Magento\Framework\Config\FileIteratorFactory::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $objectManager->setBackwardCompatibleProperty(
+            $this->factory,
+            'serializer',
+            $this->serializerMock
+        );
+        $objectManager->setBackwardCompatibleProperty(
+            $this->factory,
+            'fileIteratorFactory',
+            $this->fileIteratorFactoryMock
+        );
     }
 
     /**
@@ -100,87 +141,103 @@ class FactoryTest extends \PHPUnit_Framework_TestCase
      */
     protected function tearDown()
     {
-        \Magento\Framework\Validator\AbstractValidator::setDefaultTranslator($this->_defaultTranslator);
-        unset($this->_defaultTranslator);
+        \Magento\Framework\Validator\AbstractValidator::setDefaultTranslator($this->defaultTranslator);
+        unset($this->defaultTranslator);
     }
 
-    /**
-     * Test getValidatorConfig created correct validator config. Check that validator translator was initialized.
-     */
     public function testGetValidatorConfig()
     {
-        $factory = new \Magento\Framework\Validator\Factory(
-            $this->_objectManager,
-            $this->_config,
-            $this->cache
-        );
-        $actualConfig = $factory->getValidatorConfig();
+        $this->readerMock->method('getConfigurationFiles')
+            ->with('validation.xml')
+            ->willReturn($this->fileIteratorMock);
+        $this->fileIteratorMock->method('toArray')
+            ->willReturn($this->data);
+        $actualConfig = $this->factory->getValidatorConfig();
         $this->assertInstanceOf(
             \Magento\Framework\Validator\Config::class,
             $actualConfig,
             'Object of incorrect type was created'
         );
-
-        // Check that validator translator was correctly instantiated
-        $validatorTranslator = \Magento\Framework\Validator\AbstractValidator::getDefaultTranslator();
         $this->assertInstanceOf(
             \Magento\Framework\Translate\Adapter::class,
-            $validatorTranslator,
+            \Magento\Framework\Validator\AbstractValidator::getDefaultTranslator(),
             'Default validator translate adapter was not set correctly'
         );
     }
 
-    /**
-     * Test createValidatorBuilder call
-     */
+    public function testGetValidatorConfigCacheNotExist()
+    {
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn(false);
+        $this->readerMock->expects($this->once())
+            ->method('getConfigurationFiles')
+            ->willReturn($this->fileIteratorMock);
+        $this->fileIteratorMock->method('toArray')
+            ->willReturn($this->data);
+        $this->cacheMock->expects($this->once())
+            ->method('save')
+            ->with($this->jsonString);
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with($this->data)
+            ->willReturn($this->jsonString);
+        $this->factory->getValidatorConfig();
+        $this->factory->getValidatorConfig();
+    }
+
+    public function testGetValidatorConfigCacheExist()
+    {
+        $this->cacheMock->expects($this->once())
+            ->method('load')
+            ->willReturn($this->jsonString);
+        $this->readerMock->expects($this->never())
+            ->method('getConfigurationFiles');
+        $this->cacheMock->expects($this->never())
+            ->method('save');
+        $this->serializerMock->expects($this->once())
+            ->method('unserialize')
+            ->with($this->jsonString)
+            ->willReturn($this->data);
+        $this->fileIteratorFactoryMock->method('create')
+            ->willReturn($this->fileIteratorMock);
+        $this->factory->getValidatorConfig();
+        $this->factory->getValidatorConfig();
+    }
+
     public function testCreateValidatorBuilder()
     {
-        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-        $this->_validatorConfig->expects(
-            $this->once()
-        )->method(
-            'createValidatorBuilder'
-        )->with(
-            'test',
-            'class',
-            []
-        )->will(
-            $this->returnValue(
-                $objectManager->getObject(\Magento\Framework\Validator\Builder::class, ['constraints' => []])
-            )
-        );
-        $factory = new \Magento\Framework\Validator\Factory(
-            $this->_objectManager,
-            $this->_config,
-            $this->cache
-        );
+        $this->readerMock->method('getConfigurationFiles')
+            ->with('validation.xml')
+            ->willReturn($this->fileIteratorMock);
+        $this->fileIteratorMock->method('toArray')
+            ->willReturn($this->data);
+        $builderMock = $this->getMock(\Magento\Framework\Validator\Builder::class, [], [], '', false);
+        $this->validatorConfigMock->expects($this->once())
+            ->method('createValidatorBuilder')
+            ->with('test', 'class', [])
+            ->willReturn($builderMock);
         $this->assertInstanceOf(
             \Magento\Framework\Validator\Builder::class,
-            $factory->createValidatorBuilder('test', 'class', [])
+            $this->factory->createValidatorBuilder('test', 'class', [])
         );
     }
 
-    /**
-     * Test createValidatorBuilder call
-     */
     public function testCreateValidator()
     {
-        $this->_validatorConfig->expects(
-            $this->once()
-        )->method(
-            'createValidator'
-        )->with(
-            'test',
-            'class',
-            []
-        )->will(
-            $this->returnValue(new \Magento\Framework\Validator())
-        );
-        $factory = new \Magento\Framework\Validator\Factory(
-            $this->_objectManager,
-            $this->_config,
-            $this->cache
+        $this->readerMock->method('getConfigurationFiles')
+            ->with('validation.xml')
+            ->willReturn($this->fileIteratorMock);
+        $this->fileIteratorMock->method('toArray')
+            ->willReturn($this->data);
+        $validatorMock = $this->getMock(\Magento\Framework\Validator::class, [], [], '', false);
+        $this->validatorConfigMock->expects($this->once())
+            ->method('createValidator')
+            ->with('test', 'class', [])
+            ->willReturn($validatorMock);
+        $this->assertInstanceOf(
+            \Magento\Framework\Validator::class,
+            $this->factory->createValidator('test', 'class', [])
         );
-        $this->assertInstanceOf(\Magento\Framework\Validator::class, $factory->createValidator('test', 'class', []));
     }
 }
diff --git a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Component/Definition.php b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Component/Definition.php
index 1980da578c248cb8ccc8cc95e2e41c6097b0c45c..3778839894adbb93edc2d65dc4e1cdf088212d04 100644
--- a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Component/Definition.php
+++ b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Component/Definition.php
@@ -39,6 +39,11 @@ class Definition
      */
     protected $componentData;
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializer;
+
     /**
      * Constructor
      *
@@ -56,9 +61,9 @@ class Definition
         $cachedData = $this->cache->load(static::CACHE_ID);
         if ($cachedData === false) {
             $data = $uiReader->read();
-            $this->cache->save(serialize($data), static::CACHE_ID);
+            $this->cache->save($this->getSerializer()->serialize($data), static::CACHE_ID);
         } else {
-            $data = unserialize($cachedData);
+            $data = $this->getSerializer()->unserialize($cachedData);
         }
         $this->prepareComponentData($data);
     }
@@ -109,4 +114,19 @@ class Definition
             $this->setComponentData($name, reset($data));
         }
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(\Magento\Framework\Serialize\SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Template.php b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Template.php
index 79d185b2b26a700ea82734bc037f8fda4c082d1c..f740a2e403bb8f86da3501e7d9716567b93917b2 100644
--- a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Template.php
+++ b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Template.php
@@ -5,9 +5,6 @@
  */
 namespace Magento\Framework\View\Element\UiComponent\Config\Provider;
 
-use Magento\Framework\Config\CacheInterface;
-use Magento\Framework\View\Element\UiComponent\Config\ReaderFactory;
-use Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface;
 use Magento\Framework\View\Element\UiComponent\Config\FileCollector\AggregatedFileCollector;
 use Magento\Framework\View\Element\UiComponent\Config\FileCollector\AggregatedFileCollectorFactory;
 
@@ -32,19 +29,19 @@ class Template
     protected $aggregatedFileCollector;
 
     /**
-     * @var DomMergerInterface
+     * @var \Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface
      */
     protected $domMerger;
 
     /**
-     * @var CacheInterface
+     * @var \Magento\Framework\Config\CacheInterface
      */
     protected $cache;
 
     /**
      * Factory for UI config reader
      *
-     * @var ReaderFactory
+     * @var \Magento\Framework\View\Element\UiComponent\Config\ReaderFactory
      */
     protected $readerFactory;
 
@@ -58,20 +55,25 @@ class Template
      */
     protected $cachedTemplates = [];
 
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface
+     */
+    private $serializer;
+
     /**
      * Constructor
      *
      * @param AggregatedFileCollector $aggregatedFileCollector
-     * @param DomMergerInterface $domMerger
-     * @param CacheInterface $cache
-     * @param ReaderFactory $readerFactory
+     * @param \Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface $domMerger
+     * @param \Magento\Framework\Config\CacheInterface $cache
+     * @param \Magento\Framework\View\Element\UiComponent\Config\ReaderFactory $readerFactory
      * @param AggregatedFileCollectorFactory $aggregatedFileCollectorFactory
      */
     public function __construct(
         AggregatedFileCollector $aggregatedFileCollector,
-        DomMergerInterface $domMerger,
-        CacheInterface $cache,
-        ReaderFactory $readerFactory,
+        \Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface $domMerger,
+        \Magento\Framework\Config\CacheInterface $cache,
+        \Magento\Framework\View\Element\UiComponent\Config\ReaderFactory $readerFactory,
         AggregatedFileCollectorFactory $aggregatedFileCollectorFactory
     ) {
         $this->aggregatedFileCollector = $aggregatedFileCollector;
@@ -81,7 +83,9 @@ class Template
         $this->aggregatedFileCollectorFactory = $aggregatedFileCollectorFactory;
 
         $cachedTemplates = $this->cache->load(static::CACHE_ID);
-        $this->cachedTemplates = $cachedTemplates === false ? [] : unserialize($cachedTemplates);
+        $this->cachedTemplates = $cachedTemplates === false ? [] : $this->getSerializer()->unserialize(
+            $cachedTemplates
+        );
     }
 
     /**
@@ -104,8 +108,23 @@ class Template
                 'domMerger' => $this->domMerger
             ]
         )->getContent();
-        $this->cache->save(serialize($this->cachedTemplates), static::CACHE_ID);
+        $this->cache->save($this->getSerializer()->serialize($this->cachedTemplates), static::CACHE_ID);
 
         return $this->cachedTemplates[$hash];
     }
+
+    /**
+     * Get serializer
+     *
+     * @return \Magento\Framework\Serialize\SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if ($this->serializer === null) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(\Magento\Framework\Serialize\SerializerInterface::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php b/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php
index 0ebb6d9be4f3dfb55cfa6650e7714519fd96748f..658755d38a4e86ea8ffcc4e8333e30e4f6507658 100644
--- a/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php
+++ b/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php
@@ -8,6 +8,7 @@
 
 namespace Magento\Framework\Webapi\Test\Unit;
 
+use Magento\Framework\Serialize\SerializerInterface;
 use Magento\Framework\Webapi\ServiceInputProcessor;
 use Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\WebapiBuilderFactory;
 use Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\AssociativeArray;
@@ -97,6 +98,16 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
                 'fieldNamer' => $this->fieldNamer
             ]
         );
+        $serializerMock = $this->getMock(SerializerInterface::class);
+        $serializerMock->method('serialize')
+            ->willReturn('serializedData');
+        $serializerMock->method('unserialize')
+            ->willReturn('unserializedData');
+        $objectManager->setBackwardCompatibleProperty(
+            $this->methodsMap,
+            'serializer',
+            $serializerMock
+        );
 
         $this->serviceInputProcessor = $objectManager->getObject(
             \Magento\Framework\Webapi\ServiceInputProcessor::class,
@@ -111,10 +122,11 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
 
         /** @var \Magento\Framework\Reflection\NameFinder $nameFinder */
         $nameFinder = $objectManager->getObject(\Magento\Framework\Reflection\NameFinder::class);
-        $serviceInputProcessorReflection = new \ReflectionClass(get_class($this->serviceInputProcessor));
-        $typeResolverReflection = $serviceInputProcessorReflection->getProperty('nameFinder');
-        $typeResolverReflection->setAccessible(true);
-        $typeResolverReflection->setValue($this->serviceInputProcessor, $nameFinder);
+        $objectManager->setBackwardCompatibleProperty(
+            $this->serviceInputProcessor,
+            'nameFinder',
+            $nameFinder
+        );
     }
 
     public function testSimpleProperties()
diff --git a/lib/web/css/source/components/_modals.less b/lib/web/css/source/components/_modals.less
index daf325efd3a0276e7ad7e7318e75451b8474cb78..ea866d4775ac23728d62bf2782be416d314cc06d 100644
--- a/lib/web/css/source/components/_modals.less
+++ b/lib/web/css/source/components/_modals.less
@@ -189,6 +189,8 @@
         //  If applied, switching outer popup scroll to inner
         &._inner-scroll {
             overflow-y: visible;
+
+            .ie11 &,
             .ie10 &,
             .ie9 & {
                 overflow-y: auto;
@@ -196,6 +198,8 @@
 
             .modal-inner-wrap {
                 max-height: 90%;
+
+                .ie11 &,
                 .ie10 &,
                 .ie9 & {
                     max-height: none;
diff --git a/lib/web/mage/adminhtml/wysiwyg/tiny_mce/setup.js b/lib/web/mage/adminhtml/wysiwyg/tiny_mce/setup.js
index 2c4ab52b896cb8fd8bf01974d7f39cfc8f11e4f4..057f492509192292022cf7290f6d18dc872c62b1 100755
--- a/lib/web/mage/adminhtml/wysiwyg/tiny_mce/setup.js
+++ b/lib/web/mage/adminhtml/wysiwyg/tiny_mce/setup.js
@@ -329,8 +329,9 @@ define([
 
         encodeDirectives: function(content) {
             // collect all HTML tags with attributes that contain directives
-            return content.gsub(/<([a-z0-9\-\_]+.+?)([a-z0-9\-\_]+=".*?\{\{.+?\}\}.*?".+?)>/i, function(match) {
+            return content.gsub(/<([a-z0-9\-\_]+.+?)([a-z0-9\-\_]+=".*?\{\{.+?\}\}.*?".*?)>/i, function(match) {
                 var attributesString = match[2];
+
                 // process tag attributes string
                 attributesString = attributesString.gsub(/([a-z0-9\-\_]+)="(.*?)(\{\{.+?\}\})(.*?)"/i, function(m) {
                     return m[1] + '="' + m[2] + this.makeDirectiveUrl(Base64.mageEncode(m[3])) + m[4] + '"';
diff --git a/app/code/Magento/Deploy/Console/Command/DeployStaticContentCommand.php b/setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php
similarity index 96%
rename from app/code/Magento/Deploy/Console/Command/DeployStaticContentCommand.php
rename to setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php
index 8a006c8154b4b97eb6d39c1d41f8363b3e4df761..e7badbf908b1015c5a47034e2aae99397451a1a3 100644
--- a/app/code/Magento/Deploy/Console/Command/DeployStaticContentCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php
@@ -3,15 +3,15 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Deploy\Console\Command;
+namespace Magento\Setup\Console\Command;
 
 use Magento\Framework\App\Utility\Files;
+use Magento\Setup\Model\ObjectManagerProvider;
 use Symfony\Component\Console\Command\Command;
 use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 use Symfony\Component\Console\Input\InputArgument;
-use Magento\Framework\App\ObjectManagerFactory;
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Framework\Validator\Locale;
 use Magento\Framework\Exception\LocalizedException;
@@ -64,13 +64,6 @@ class DeployStaticContentCommand extends Command
      */
     private $validator;
 
-    /**
-     * Factory to get object manager
-     *
-     * @var ObjectManagerFactory
-     */
-    private $objectManagerFactory;
-
     /**
      * object manager to create various objects
      *
@@ -85,19 +78,16 @@ class DeployStaticContentCommand extends Command
     /**
      * Inject dependencies
      *
-     * @param ObjectManagerFactory $objectManagerFactory
      * @param Locale $validator
-     * @param ObjectManagerInterface $objectManager
+     * @param ObjectManagerProvider $objectManagerProvider
      * @throws \LogicException When the command name is empty
      */
     public function __construct(
-        ObjectManagerFactory $objectManagerFactory,
         Locale $validator,
-        ObjectManagerInterface $objectManager
+        ObjectManagerProvider $objectManagerProvider
     ) {
-        $this->objectManagerFactory = $objectManagerFactory;
         $this->validator = $validator;
-        $this->objectManager = $objectManager;
+        $this->objectManager = $objectManagerProvider->get();
 
         parent::__construct();
     }
diff --git a/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php b/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php
deleted file mode 100644
index ac6a43189d7abe247be6ac87b91b60b3967314ed..0000000000000000000000000000000000000000
--- a/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php
+++ /dev/null
@@ -1,493 +0,0 @@
-<?php
-/**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Setup\Console\Command;
-
-use Magento\Framework\Filesystem\DriverInterface;
-use Magento\Setup\Model\ObjectManagerProvider;
-use Magento\Framework\App\ObjectManager;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Input\InputOption;
-use Magento\Framework\Api\Code\Generator\Mapper;
-use Magento\Framework\Api\Code\Generator\SearchResults;
-use Magento\Framework\Autoload\AutoloaderRegistry;
-use Magento\Framework\Component\ComponentRegistrar;
-use Magento\Framework\Interception\Code\Generator\Interceptor;
-use Magento\Framework\ObjectManager\Code\Generator\Converter;
-use Magento\Framework\ObjectManager\Code\Generator\Factory;
-use Magento\Framework\ObjectManager\Code\Generator\Proxy;
-use Magento\Framework\ObjectManager\Code\Generator\Repository;
-use Magento\Framework\ObjectManager\Code\Generator\Persistor;
-use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
-use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
-use Magento\Setup\Module\Di\Code\Scanner;
-use Magento\Setup\Module\Di\Compiler\Log\Log;
-use Magento\Setup\Module\Di\Compiler\Log\Writer;
-use Magento\Setup\Module\Di\Definition\Compressor;
-use Magento\Setup\Module\Di\Definition\Serializer\Igbinary;
-use Magento\Setup\Module\Di\Definition\Serializer\Standard;
-use \Magento\Framework\App\Filesystem\DirectoryList;
-use Magento\Framework\Code\Generator as CodeGenerator;
-
-/**
- * Command to generate all non-existing proxies and factories, and pre-compile class definitions,
- * inheritance information and plugin definitions
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
-class DiCompileMultiTenantCommand extends AbstractSetupCommand
-{
-    /**#@+
-     * Names of input options
-     */
-    const INPUT_KEY_SERIALIZER = 'serializer';
-    const INPUT_KEY_EXTRA_CLASSES_FILE = 'extra-classes-file';
-    const INPUT_KEY_GENERATION = 'generation';
-    const INPUT_KEY_DI= 'di';
-    const INPUT_KEY_EXCLUDE_PATTERN= 'exclude-pattern';
-    /**#@- */
-
-    /**#@+
-     * Possible values for serializer
-     */
-    const SERIALIZER_VALUE_SERIALIZE = 'serialize';
-    const SERIALIZER_VALUE_IGBINARY = 'igbinary';
-    /**#@- */
-
-    /** Command name */
-    const NAME = 'setup:di:compile-multi-tenant';
-
-    /**
-     * Object Manager
-     *
-     * @var ObjectManager
-     */
-    private $objectManager;
-
-    /**
-     * Filesystem Directory List
-     *
-     * @var DirectoryList
-     */
-    private $directoryList;
-
-    /**
-     *
-     * @var array
-     */
-    private $entities;
-
-    /**
-     *
-     * @var array
-     */
-    private $files = [];
-
-    /**
-     *
-     * @var CodeGenerator
-     */
-    private $generator;
-
-    /**
-     *
-     * @var Log
-     */
-    private $log;
-
-    /**
-     * @var ComponentRegistrar
-     */
-    private $componentRegistrar;
-
-    /**
-     * Constructor
-     *
-     * @param ObjectManagerProvider $objectManagerProvider
-     * @param DirectoryList $directoryList
-     * @param ComponentRegistrar $componentRegistrar
-     */
-    public function __construct(
-        ObjectManagerProvider $objectManagerProvider,
-        DirectoryList $directoryList,
-        ComponentRegistrar $componentRegistrar
-    ) {
-        $this->objectManager = $objectManagerProvider->get();
-        $this->directoryList = $directoryList;
-        $this->componentRegistrar = $componentRegistrar;
-        parent::__construct();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function configure()
-    {
-        $options = [
-            new InputOption(
-                self::INPUT_KEY_SERIALIZER,
-                null,
-                InputOption::VALUE_REQUIRED,
-                'Serializer function that should be used (' . self::SERIALIZER_VALUE_SERIALIZE . '|'
-                . self::SERIALIZER_VALUE_IGBINARY . ') default: ' . self::SERIALIZER_VALUE_SERIALIZE
-            ),
-            new InputOption(
-                self::INPUT_KEY_EXTRA_CLASSES_FILE,
-                null,
-                InputOption::VALUE_REQUIRED,
-                'Path to file with extra proxies and factories to generate'
-            ),
-            new InputOption(
-                self::INPUT_KEY_GENERATION,
-                null,
-                InputOption::VALUE_REQUIRED,
-                'Absolute path to generated classes, <magento_root>/var/generation by default'
-            ),
-            new InputOption(
-                self::INPUT_KEY_DI,
-                null,
-                InputOption::VALUE_REQUIRED,
-                'Absolute path to DI definitions directory, <magento_root>/var/di by default'
-            ),
-            new InputOption(
-                self::INPUT_KEY_EXCLUDE_PATTERN,
-                null,
-                InputOption::VALUE_REQUIRED,
-                'Allows to exclude Paths from compilation (default is #[\\\\/]m1[\\\\/]#i)'
-            ),
-        ];
-        $this->setName(self::NAME)
-            ->setDescription(
-                'Generates all non-existing proxies and factories, and pre-compile class definitions, '
-                . 'inheritance information and plugin definitions'
-            )
-            ->setDefinition($options);
-        parent::configure();
-    }
-
-    /**
-     * Get module directories exclude patterns
-     *
-     * @return array
-     */
-    private function getModuleExcludePatterns()
-    {
-        $modulesExcludePatterns = [];
-        foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $modulePath) {
-            $modulesExcludePatterns[] = "#^" . $modulePath . "/Test#";
-        }
-        return $modulesExcludePatterns;
-    }
-
-    /**
-     * Get library directories exclude patterns
-     *
-     * @return array
-     */
-    private function getLibraryExcludePatterns()
-    {
-        $libraryExcludePatterns = [];
-        foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::LIBRARY) as $libraryPath) {
-            $libraryExcludePatterns[] = "#^" . $libraryPath . "/([\\w]+/)?Test#";
-        }
-        return $libraryExcludePatterns;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function execute(InputInterface $input, OutputInterface $output)
-    {
-        $errors = $this->validate($input);
-        if ($errors) {
-            $output->writeln($errors);
-            return;
-        }
-
-        $generationDir = $input->getOption(self::INPUT_KEY_GENERATION) ? $input->getOption(self::INPUT_KEY_GENERATION)
-            : $this->directoryList->getPath(DirectoryList::GENERATION);
-        $modulesExcludePatterns = $this->getModuleExcludePatterns();
-        $testExcludePatterns = [
-            "#^" . $this->directoryList->getPath(DirectoryList::SETUP) . "/[\\w]+/[\\w]+/Test#",
-            "#^" . $this->directoryList->getRoot() . "/dev/tools/Magento/Tools/[\\w]+/Test#"
-        ];
-        $librariesExcludePatterns = $this->getLibraryExcludePatterns();
-        $testExcludePatterns = array_merge($testExcludePatterns, $modulesExcludePatterns, $librariesExcludePatterns);
-        $fileExcludePatterns = $input->getOption('exclude-pattern') ?
-            [$input->getOption(self::INPUT_KEY_EXCLUDE_PATTERN)] : ['#[\\\\/]M1[\\\\/]#i'];
-        $fileExcludePatterns = array_merge($fileExcludePatterns, $testExcludePatterns);
-        /** @var Writer\Console logWriter Writer model for success messages */
-        $logWriter = new Writer\Console($output);
-        $this->log = new Log($logWriter, $logWriter);
-        AutoloaderRegistry::getAutoloader()->addPsr4('Magento\\', $generationDir . '/Magento/');
-        // 1 Code generation
-        $this->generateCode($generationDir, $fileExcludePatterns, $input);
-        // 2. Compilation
-        $this->compileCode($generationDir, $fileExcludePatterns, $input);
-        //Reporter
-        $this->log->report();
-        if (!$this->log->hasError()) {
-            $output->writeln(
-                '<info>On *nix systems, verify the Magento application has permissions to modify files '
-                . 'created by the compiler in the "var" directory. For instance, if you run the Magento application '
-                . 'using Apache, the owner of the files in the "var" directory should be the Apache user (example '
-                . 'command: "chown -R www-data:www-data <MAGENTO_ROOT>/var" where MAGENTO_ROOT is the Magento '
-                . 'root directory).</info>'
-            );
-        }
-    }
-
-    /**
-     * Generate Code
-     *
-     * @param string $generationDir
-     * @param array $fileExcludePatterns
-     * @param InputInterface $input
-     * @return void
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     * @SuppressWarnings(PHPMD.NPathComplexity)
-     */
-    public function generateCode($generationDir, $fileExcludePatterns, $input)
-    {
-        // 1.1 Code scan
-        $filePatterns = ['php' => '/.*\.php$/', 'di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/'];
-        $directoryScanner = new Scanner\DirectoryScanner();
-        foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $codeScanDir) {
-            $this->files = array_merge_recursive(
-                $this->files,
-                $directoryScanner->scan($codeScanDir, $filePatterns, $fileExcludePatterns)
-            );
-        }
-        $this->files['di'][] = $this->directoryList->getPath(
-            \Magento\Framework\App\Filesystem\DirectoryList::CONFIG
-        ) . '/di.xml';
-        $this->files['additional'] = [$input->getOption(self::INPUT_KEY_EXTRA_CLASSES_FILE)];
-        $repositoryScanner = new Scanner\RepositoryScanner();
-        $repositories = $repositoryScanner->collectEntities($this->files['di']);
-        $scanner = new Scanner\CompositeScanner();
-        $scanner->addChild(new Scanner\PhpScanner($this->log), 'php');
-        $scanner->addChild(new Scanner\XmlScanner($this->log), 'di');
-        $scanner->addChild(new Scanner\ArrayScanner(), 'additional');
-        $this->entities = $scanner->collectEntities($this->files);
-        $interceptorScanner = new Scanner\XmlInterceptorScanner();
-        $this->entities['interceptors'] = $interceptorScanner->collectEntities($this->files['di']);
-        // 1.2 Generation of Factory and Additional Classes
-        $generatorIo = $this->objectManager->create(
-            \Magento\Framework\Code\Generator\Io::class,
-            ['generationDirectory' => $generationDir]
-        );
-        $this->generator = $this->objectManager->create(
-            \Magento\Framework\Code\Generator::class,
-            ['ioObject' => $generatorIo]
-        );
-        /** Initialize object manager for code generation based on configs */
-        $this->generator->setObjectManager($this->objectManager);
-        $generatorAutoloader = new \Magento\Framework\Code\Generator\Autoloader($this->generator);
-        spl_autoload_register([$generatorAutoloader, 'load']);
-
-        foreach ($repositories as $entityName) {
-            switch ($this->generator->generateClass($entityName)) {
-                case CodeGenerator::GENERATION_SUCCESS:
-                    $this->log->add(Log::GENERATION_SUCCESS, $entityName);
-                    break;
-                case CodeGenerator::GENERATION_ERROR:
-                    $this->log->add(Log::GENERATION_ERROR, $entityName);
-                    break;
-                case CodeGenerator::GENERATION_SKIP:
-                default:
-                    //no log
-                    break;
-            }
-        }
-        foreach (['php', 'additional'] as $type) {
-            sort($this->entities[$type]);
-            foreach ($this->entities[$type] as $entityName) {
-                switch ($this->generator->generateClass($entityName)) {
-                    case CodeGenerator::GENERATION_SUCCESS:
-                        $this->log->add(Log::GENERATION_SUCCESS, $entityName);
-                        break;
-                    case CodeGenerator::GENERATION_ERROR:
-                        $this->log->add(Log::GENERATION_ERROR, $entityName);
-                        break;
-                    case CodeGenerator::GENERATION_SKIP:
-                    default:
-                        //no log
-                        break;
-                }
-            }
-        }
-    }
-
-    /**
-     * Compile Code
-     *
-     * @param string $generationDir
-     * @param array $fileExcludePatterns
-     * @param InputInterface $input
-     * @return void
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     * @SuppressWarnings(PHPMD.NPathComplexity)
-     */
-    private function compileCode($generationDir, $fileExcludePatterns, $input)
-    {
-        $diDir = $input->getOption(self::INPUT_KEY_DI) ? $input->getOption(self::INPUT_KEY_DI) :
-            $this->directoryList->getPath(DirectoryList::DI);
-        $relationsFile = $diDir . '/relations.ser';
-        $pluginDefFile = $diDir . '/plugins.ser';
-        $compilationDirs = [
-            $this->directoryList->getPath(DirectoryList::SETUP) . '/Magento/Setup/Module',
-            $this->directoryList->getRoot() . '/dev/tools/Magento/Tools',
-        ];
-        $compilationDirs = array_merge(
-            $compilationDirs,
-            $this->componentRegistrar->getPaths(ComponentRegistrar::MODULE),
-            $this->componentRegistrar->getPaths(ComponentRegistrar::LIBRARY)
-        );
-        $serializer = $input->getOption(self::INPUT_KEY_SERIALIZER) == Igbinary::NAME ? new Igbinary() : new Standard();
-        // 2.1 Code scan
-        $validator = new \Magento\Framework\Code\Validator();
-        $validator->add(new \Magento\Framework\Code\Validator\ConstructorIntegrity());
-        $validator->add(new \Magento\Framework\Code\Validator\ContextAggregation());
-        $classesScanner = new \Magento\Setup\Module\Di\Code\Reader\ClassesScanner();
-        $classesScanner->addExcludePatterns($fileExcludePatterns);
-        $directoryInstancesNamesList = new \Magento\Setup\Module\Di\Code\Reader\Decorator\Directory(
-            $this->log,
-            new \Magento\Framework\Code\Reader\ClassReader(),
-            $classesScanner,
-            $validator,
-            $generationDir
-        );
-        foreach ($compilationDirs as $path) {
-            if (is_readable($path)) {
-                $directoryInstancesNamesList->getList($path);
-            }
-        }
-        $inheritanceScanner = new Scanner\InheritanceInterceptorScanner(
-            new \Magento\Framework\ObjectManager\InterceptableValidator()
-        );
-        $this->entities['interceptors'] = $inheritanceScanner->collectEntities(
-            get_declared_classes(),
-            $this->entities['interceptors']
-        );
-        // 2.1.1 Generation of Proxy and Interceptor Classes
-        foreach (['interceptors', 'di'] as $type) {
-            foreach ($this->entities[$type] as $entityName) {
-                switch ($this->generator->generateClass($entityName)) {
-                    case CodeGenerator::GENERATION_SUCCESS:
-                        $this->log->add(Log::GENERATION_SUCCESS, $entityName);
-                        break;
-                    case CodeGenerator::GENERATION_ERROR:
-                        $this->log->add(Log::GENERATION_ERROR, $entityName);
-                        break;
-                    case CodeGenerator::GENERATION_SKIP:
-                    default:
-                        //no log
-                        break;
-                }
-            }
-        }
-        //2.1.2 Compile relations for Proxy/Interceptor classes
-        $directoryInstancesNamesList->getList($generationDir);
-        $relations = $directoryInstancesNamesList->getRelations();
-        // 2.2 Compression
-        $relationsFileDir = dirname($relationsFile);
-        if (!file_exists($relationsFileDir)) {
-            mkdir($relationsFileDir, 0777, true);
-        }
-        $relations = array_filter($relations);
-        file_put_contents($relationsFile, $serializer->serialize($relations));
-        // 3. Plugin Definition Compilation
-        $pluginScanner = new Scanner\CompositeScanner();
-        $pluginScanner->addChild(new Scanner\PluginScanner(), 'di');
-        $pluginDefinitions = [];
-        $pluginList = $pluginScanner->collectEntities($this->files);
-        $pluginDefinitionList = new \Magento\Framework\Interception\Definition\Runtime();
-        foreach ($pluginList as $type => $entityList) {
-            foreach ($entityList as $entity) {
-                $pluginDefinitions[ltrim($entity, '\\')] = $pluginDefinitionList->getMethodList($entity);
-            }
-        }
-        $outputContent = $serializer->serialize($pluginDefinitions);
-        $pluginDefFileDir = dirname($pluginDefFile);
-        if (!file_exists($pluginDefFileDir)) {
-            mkdir($pluginDefFileDir, 0777, true);
-        }
-        file_put_contents($pluginDefFile, $outputContent);
-    }
-
-    /**
-     * Check if all option values provided by the user are valid
-     *
-     * @param InputInterface $input
-     * @return string[]
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     */
-    private function validate(InputInterface $input)
-    {
-        $errors = [];
-        $options = $input->getOptions();
-        foreach ($options as $key => $value) {
-            if (!$value) {
-                continue;
-            }
-            switch ($key) {
-                case self::INPUT_KEY_SERIALIZER:
-                    if (($value !== self::SERIALIZER_VALUE_SERIALIZE) && ($value !== self::SERIALIZER_VALUE_IGBINARY)) {
-                        $errors[] = '<error>Invalid value for command option \'' . self::INPUT_KEY_SERIALIZER
-                            . '\'. Possible values (' . self::SERIALIZER_VALUE_SERIALIZE . '|'
-                            . self::SERIALIZER_VALUE_IGBINARY . ').</error>';
-                    }
-                    break;
-                case self::INPUT_KEY_EXTRA_CLASSES_FILE:
-                    if (!file_exists($value)) {
-                        $errors[] = '<error>Path does not exist for the value of command option \''
-                            . self::INPUT_KEY_EXTRA_CLASSES_FILE . '\'.</error>';
-                    }
-                    break;
-                case self::INPUT_KEY_GENERATION:
-                    $errorMsg = $this->validateOutputPath($value, self::INPUT_KEY_GENERATION);
-                    if ($errorMsg !== '') {
-                        $errors[] = $errorMsg;
-                    }
-                    break;
-                case self::INPUT_KEY_DI:
-                    $errorMsg = $this->validateOutputPath($value, self::INPUT_KEY_DI);
-                    if ($errorMsg !== '') {
-                        $errors[] = $errorMsg;
-                    }
-                    break;
-                case self::INPUT_KEY_EXCLUDE_PATTERN:
-                    if (@preg_match($value, null) === false) {
-                        $errors[] = '<error>Invalid pattern for command option \'' . self::INPUT_KEY_EXCLUDE_PATTERN
-                            . '\'.</error>';
-                    }
-                    break;
-            }
-        }
-        return $errors;
-    }
-
-    /**
-     * Validate output path based on type
-     *
-     * @param string $value
-     * @param string $type
-     * @return string
-     */
-    private function validateOutputPath($value, $type)
-    {
-        $errorMsg = '';
-        if (!file_exists($value)) {
-            $errorMsg = '<error>Path does not exist for the value of command option \'' . $type . '\'.</error>';
-        }
-        if (file_exists($value) && !is_writeable($value)) {
-            $errorMsg .= '<error>Non-writable directory is provided by the value of command option \''
-                . $type . '\'.</error>';
-
-        }
-        return $errorMsg;
-    }
-}
diff --git a/setup/src/Magento/Setup/Console/CommandList.php b/setup/src/Magento/Setup/Console/CommandList.php
index 4bb5ac0181a794b575b420499908d1cb3871b383..e025de44602503c004bcdcd009111a31a6624a7e 100644
--- a/setup/src/Magento/Setup/Console/CommandList.php
+++ b/setup/src/Magento/Setup/Console/CommandList.php
@@ -72,6 +72,7 @@ class CommandList
             \Magento\Setup\Console\Command\RollbackCommand::class,
             \Magento\Setup\Console\Command\UpgradeCommand::class,
             \Magento\Setup\Console\Command\UninstallCommand::class,
+            \Magento\Setup\Console\Command\DeployStaticContentCommand::class
         ];
     }
 
diff --git a/setup/src/Magento/Setup/Model/ConfigGenerator.php b/setup/src/Magento/Setup/Model/ConfigGenerator.php
index 140f5a739889c829efe34689c044310a4d7d62a3..ce86ce4dd471f01876fbc3ba87d6697b5156eea7 100644
--- a/setup/src/Magento/Setup/Model/ConfigGenerator.php
+++ b/setup/src/Magento/Setup/Model/ConfigGenerator.php
@@ -116,19 +116,12 @@ class ConfigGenerator
      *
      * @param array $data
      * @return ConfigData
+     * @deprecated
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function createDefinitionsConfig(array $data)
     {
-        $configData = new ConfigData(ConfigFilePool::APP_ENV);
-
-        if (!empty($data[ConfigOptionsListConstants::INPUT_KEY_DEFINITION_FORMAT])) {
-            $configData->set(
-                ObjectManagerFactory::CONFIG_PATH_DEFINITION_FORMAT,
-                $data[ConfigOptionsListConstants::INPUT_KEY_DEFINITION_FORMAT]
-            );
-        }
-
-        return $configData;
+        return null;
     }
 
     /**
diff --git a/setup/src/Magento/Setup/Model/ConfigOptionsList.php b/setup/src/Magento/Setup/Model/ConfigOptionsList.php
index 4e8374aabb4e6b647aca8c34ca67041ca3532c54..0c1419a73cb8ebdb805dde29cc3412203dab7b07 100644
--- a/setup/src/Magento/Setup/Model/ConfigOptionsList.php
+++ b/setup/src/Magento/Setup/Model/ConfigOptionsList.php
@@ -72,13 +72,6 @@ class ConfigOptionsList implements ConfigOptionsListInterface
                 'Session save handler',
                 ConfigOptionsListConstants::SESSION_SAVE_FILES
             ),
-            new SelectConfigOption(
-                ConfigOptionsListConstants::INPUT_KEY_DEFINITION_FORMAT,
-                SelectConfigOption::FRONTEND_WIZARD_SELECT,
-                DefinitionFactory::getSupportedFormats(),
-                ObjectManagerFactory::CONFIG_PATH_DEFINITION_FORMAT,
-                'Type of definitions used by Object Manager'
-            ),
             new TextConfigOption(
                 ConfigOptionsListConstants::INPUT_KEY_DB_HOST,
                 TextConfigOption::FRONTEND_WIZARD_TEXT,
diff --git a/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php b/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php
index 703cbced8e33a637b5548eae93539d4e1f7b4ab8..851bfa8c36313852a8d7c876f4abe195a7b2ffdf 100644
--- a/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php
+++ b/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php
@@ -1,14 +1,15 @@
 <?php
 /**
- *
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Setup\Module\Di\Code\Generator;
 
 use Magento\Framework\Interception;
 
+/**
+ * Provides plugin list configuration
+ */
 class PluginList extends Interception\PluginList\PluginList
 {
     /**
diff --git a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php
index daf8425802ac535dd6255085d55c9637b62c5656..342b26a22e32ba941429d0e1dc9299af08472f49 100644
--- a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php
+++ b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php
@@ -8,8 +8,9 @@
 namespace Magento\Setup\Module\Di\Compiler\Config\Writer;
 
 use Magento\Framework\App\Filesystem\DirectoryList;
-use Magento\Framework\Filesystem\DriverInterface;
 use Magento\Setup\Module\Di\Compiler\Config\WriterInterface;
+use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\Serialize\Serializer\Serialize;
 
 class Filesystem implements WriterInterface
 {
@@ -18,6 +19,11 @@ class Filesystem implements WriterInterface
      */
     private $directoryList;
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
     /**
      * Constructor
      *
@@ -39,8 +45,10 @@ class Filesystem implements WriterInterface
     {
         $this->initialize();
 
-        $serialized = serialize($config);
-        file_put_contents($this->directoryList->getPath(DirectoryList::DI) . '/' . $key . '.ser', $serialized);
+        file_put_contents(
+            $this->directoryList->getPath(DirectoryList::DI) . '/' . $key  . '.ser',
+            $this->getSerializer()->serialize($config)
+        );
     }
 
     /**
@@ -54,4 +62,19 @@ class Filesystem implements WriterInterface
             mkdir($this->directoryList->getPath(DirectoryList::DI));
         }
     }
+
+    /**
+     * Get serializer
+     *
+     * @return SerializerInterface
+     * @deprecated
+     */
+    private function getSerializer()
+    {
+        if (null === $this->serializer) {
+            $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(Serialize::class);
+        }
+        return $this->serializer;
+    }
 }
diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/DeployStaticContentCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php
similarity index 98%
rename from app/code/Magento/Deploy/Test/Unit/Console/Command/DeployStaticContentCommandTest.php
rename to setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php
index c8fa2138e7c81fb69d562fb5ec55e049cb5deabc..82777bb6b7aee697ba5a77df1a9dfcc95d93dedc 100644
--- a/app/code/Magento/Deploy/Test/Unit/Console/Command/DeployStaticContentCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php
@@ -3,9 +3,9 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Deploy\Test\Unit\Console\Command;
+namespace Magento\Setup\Test\Unit\Console\Command;
 
-use Magento\Deploy\Console\Command\DeployStaticContentCommand;
+use Magento\Setup\Console\Command\DeployStaticContentCommand;
 use Symfony\Component\Console\Tester\CommandTester;
 use Magento\Framework\Validator\Locale;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/FunctionExistMock.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/FunctionExistMock.php
similarity index 100%
rename from app/code/Magento/Deploy/Test/Unit/Console/Command/FunctionExistMock.php
rename to setup/src/Magento/Setup/Test/Unit/Console/Command/FunctionExistMock.php
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php b/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php
index 1e37d351d8f039014ae35a9fdfbe3aaa725375fe..eaab4d28d7620ebdc31c97b9a938afdb59957f55 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php
@@ -48,32 +48,30 @@ class ConfigOptionsListTest extends \PHPUnit_Framework_TestCase
         $this->assertSame('Encryption key', $options[0]->getDescription());
         $this->assertInstanceOf(\Magento\Framework\Setup\Option\SelectConfigOption::class, $options[1]);
         $this->assertSame('Session save handler', $options[1]->getDescription());
-        $this->assertInstanceOf(\Magento\Framework\Setup\Option\SelectConfigOption::class, $options[2]);
-        $this->assertSame('Type of definitions used by Object Manager', $options[2]->getDescription());
+        $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[2]);
+        $this->assertSame('Database server host', $options[2]->getDescription());
         $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[3]);
-        $this->assertSame('Database server host', $options[3]->getDescription());
+        $this->assertSame('Database name', $options[3]->getDescription());
         $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[4]);
-        $this->assertSame('Database name', $options[4]->getDescription());
+        $this->assertSame('Database server username', $options[4]->getDescription());
         $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[5]);
-        $this->assertSame('Database server username', $options[5]->getDescription());
+        $this->assertSame('Database server engine', $options[5]->getDescription());
         $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[6]);
-        $this->assertSame('Database server engine', $options[6]->getDescription());
+        $this->assertSame('Database server password', $options[6]->getDescription());
         $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[7]);
-        $this->assertSame('Database server password', $options[7]->getDescription());
+        $this->assertSame('Database table prefix', $options[7]->getDescription());
         $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[8]);
-        $this->assertSame('Database table prefix', $options[8]->getDescription());
+        $this->assertSame('Database type', $options[8]->getDescription());
         $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[9]);
-        $this->assertSame('Database type', $options[9]->getDescription());
-        $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[10]);
-        $this->assertSame('Database  initial set of commands', $options[10]->getDescription());
-        $this->assertInstanceOf(\Magento\Framework\Setup\Option\FlagConfigOption::class, $options[11]);
+        $this->assertSame('Database  initial set of commands', $options[9]->getDescription());
+        $this->assertInstanceOf(\Magento\Framework\Setup\Option\FlagConfigOption::class, $options[10]);
         $this->assertSame(
             'If specified, then db connection validation will be skipped',
-            $options[11]->getDescription()
+            $options[10]->getDescription()
         );
-        $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[12]);
-        $this->assertSame('http Cache hosts', $options[12]->getDescription());
-        $this->assertEquals(13, count($options));
+        $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[11]);
+        $this->assertSame('http Cache hosts', $options[11]->getDescription());
+        $this->assertEquals(12, count($options));
     }
 
     public function testCreateOptions()
diff --git a/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php b/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php
index caca5509d1e14ee4500803d05275d543692393f1..238bf7ea3db9f2f48be1414aaa2f7ad9783ce78c 100644
--- a/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php
@@ -66,14 +66,6 @@ class ConfigGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals([], $returnValue->getData());
     }
 
-    public function testCreateDefinitionsConfig()
-    {
-        $testData = [ConfigOptionsListConstants::INPUT_KEY_DEFINITION_FORMAT => 'test-format'];
-        $returnValue = $this->configGeneratorObject->createDefinitionsConfig($testData);
-        $this->assertEquals(ConfigFilePool::APP_ENV, $returnValue->getFileKey());
-        $this->assertEquals(['definition' => ['format' => 'test-format']], $returnValue->getData());
-    }
-
     public function testCreateDbConfig()
     {
         $testData = [