diff --git a/.php_cs b/.php_cs
index 7ae5d11f4ad1c9c4d65a3b9b59644885e99b327e..743cab6ee0d17db99cfd1373cf35f246772921fe 100644
--- a/.php_cs
+++ b/.php_cs
@@ -15,7 +15,6 @@ $finder = Symfony\CS\Finder\DefaultFinder::create()
     ->exclude('dev/tests/functional/vendor')
     ->exclude('dev/tests/integration/tmp')
     ->exclude('dev/tests/integration/var')
-    ->exclude('lib/internal/Apache')
     ->exclude('lib/internal/CardinalCommerce')
     ->exclude('lib/internal/Cm')
     ->exclude('lib/internal/Credis')
diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message/ListAction.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message/ListAction.php
index e55da17969880f938970e312edb04d7670fd0506..c40ff5a1659cc1512af4efef6c2185ae5f7f559c 100644
--- a/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message/ListAction.php
+++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message/ListAction.php
@@ -8,24 +8,56 @@ namespace Magento\AdminNotification\Controller\Adminhtml\System\Message;
 
 class ListAction extends \Magento\Backend\App\AbstractAction
 {
+    /**
+     * @var \Magento\Framework\Json\Helper\Data
+     */
+    protected $jsonHelper;
+
+    /**
+     * @var \Magento\AdminNotification\Model\Resource\System\Message\Collection
+     */
+    protected $messageCollection;
+
+    /**
+     * Initialize ListAction
+     *
+     * @param \Magento\Backend\App\Action\Context $context
+     * @param \Magento\Framework\Json\Helper\Data $jsonHelper
+     * @param \Magento\AdminNotification\Model\Resource\System\Message\Collection $messageCollection
+     */
+    public function __construct(
+        \Magento\Backend\App\Action\Context $context,
+        \Magento\Framework\Json\Helper\Data $jsonHelper,
+        \Magento\AdminNotification\Model\Resource\System\Message\Collection $messageCollection
+    ) {
+        $this->jsonHelper = $jsonHelper;
+        $this->messageCollection = $messageCollection;
+        parent::__construct($context);
+    }
+
     /**
      * @return void
      */
     public function execute()
     {
         $severity = $this->getRequest()->getParam('severity');
-        $messageCollection = $this->_objectManager->get(
-            'Magento\AdminNotification\Model\Resource\System\Message\Collection'
-        );
         if ($severity) {
-            $messageCollection->setSeverity($severity);
+            $this->messageCollection->setSeverity($severity);
         }
         $result = [];
-        foreach ($messageCollection->getItems() as $item) {
-            $result[] = ['severity' => $item->getSeverity(), 'text' => $item->getText()];
+        foreach ($this->messageCollection->getItems() as $item) {
+            $result[] = [
+                'severity' => $item->getSeverity(),
+                'text' => $item->getText(),
+            ];
+        }
+        if (empty($result)) {
+            $result[] = [
+                'severity' => (string)\Magento\Framework\Notification\MessageInterface::SEVERITY_NOTICE,
+                'text' => 'You have viewed and resolved all recent system notices. '
+                    . 'Please refresh the web page to clear the notice alert.',
+            ];
         }
-        $this->getResponse()->representJson(
-            $this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonEncode($result)
-        );
+        $this->getResponse()->representJson($this->jsonHelper->jsonEncode($result));
     }
 }
diff --git a/app/code/Magento/AdminNotification/etc/config.xml b/app/code/Magento/AdminNotification/etc/config.xml
index 35643f62753d250562fa1f5c9f4e568ebb00f059..63c65f9ed9bfe8f6a121cc171d1778eac64f7652 100644
--- a/app/code/Magento/AdminNotification/etc/config.xml
+++ b/app/code/Magento/AdminNotification/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <system>
             <adminnotification>
diff --git a/app/code/Magento/AdminNotification/etc/module.xml b/app/code/Magento/AdminNotification/etc/module.xml
index cfc791e9072d98610989d0585f175278b306f91a..dd60aeb295b79ab9516a5482f221a1748bf27382 100644
--- a/app/code/Magento/AdminNotification/etc/module.xml
+++ b/app/code/Magento/AdminNotification/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_AdminNotification" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Authorization/Setup/InstallData.php b/app/code/Magento/Authorization/Setup/InstallData.php
index 68c2f5fdc469da597e3c0987b19306c5ebe7cd37..17fd1fd4039e10dad8ee75e402265cc6d7504f88 100644
--- a/app/code/Magento/Authorization/Setup/InstallData.php
+++ b/app/code/Magento/Authorization/Setup/InstallData.php
@@ -85,5 +85,17 @@ class InstallData implements InstallDataInterface
                 $rule->setData('resource_id', 'Magento_Backend::all')->save();
             }
         }
+
+        /**
+         * Delete rows by condition from authorization_rule
+         */
+        $setup->startSetup();
+
+        $tableName = $setup->getTable('authorization_rule');
+        if ($tableName) {
+            $setup->getConnection()->delete($tableName, ['resource_id = ?' => 'admin/system/tools/compiler']);
+        }
+
+        $setup->endSetup();
     }
 }
diff --git a/app/code/Magento/Backend/etc/adminhtml/menu.xml b/app/code/Magento/Backend/etc/adminhtml/menu.xml
index e3eee55cf4e3b90e3ce046578cc988867079c4c4..08f50423e98189a9cf95a5fa031bd62658c833b9 100644
--- a/app/code/Magento/Backend/etc/adminhtml/menu.xml
+++ b/app/code/Magento/Backend/etc/adminhtml/menu.xml
@@ -9,7 +9,7 @@
     <menu>
         <add id="Magento_Backend::system_design_schedule" title="Schedule" module="Magento_Backend" sortOrder="30" parent="Magento_Backend::system_design" action="adminhtml/system_design" resource="Magento_Backend::schedule"/>
         <add id="Magento_Backend::system_currency" title="Currency" module="Magento_Backend" sortOrder="30" parent="Magento_Backend::stores" action="adminhtml/system_currency" resource="Magento_CurrencySymbol::system_currency"/>
-        <add id="Magento_Backend::system_store" title="All Stores" module="Magento_Core" sortOrder="10" parent="Magento_Backend::stores_settings" action="adminhtml/system_store/" resource="Magento_Backend::store"/>
+        <add id="Magento_Backend::system_store" title="All Stores" module="Magento_Backend" sortOrder="10" parent="Magento_Backend::stores_settings" action="adminhtml/system_store/" resource="Magento_Backend::store"/>
         <add id="Magento_Backend::dashboard" title="Dashboard" module="Magento_Backend" sortOrder="10" action="adminhtml/dashboard" resource="Magento_Backend::dashboard"/>
         <add id="Magento_Backend::system" title="System" module="Magento_Backend" sortOrder="80" resource="Magento_Backend::system"/>
         <add id="Magento_Backend::system_tools" title="Tools" module="Magento_Backend" sortOrder="50" parent="Magento_Backend::system" resource="Magento_Backend::tools"/>
diff --git a/app/code/Magento/Backend/etc/config.xml b/app/code/Magento/Backend/etc/config.xml
index 9e58d76efd228d17e7df66ec80a1d687753d64bc..0d4c5d7180513828a1fd452c6c17d3847b8910d3 100644
--- a/app/code/Magento/Backend/etc/config.xml
+++ b/app/code/Magento/Backend/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <system>
             <media_storage_configuration>
diff --git a/app/code/Magento/Bundle/Api/Data/LinkInterface.php b/app/code/Magento/Bundle/Api/Data/LinkInterface.php
index 77ca71986d8a217100401a29533d913c5bcfd30a..e16fad7f555bee04fb7f42743598acff877c6c6b 100644
--- a/app/code/Magento/Bundle/Api/Data/LinkInterface.php
+++ b/app/code/Magento/Bundle/Api/Data/LinkInterface.php
@@ -144,4 +144,19 @@ interface LinkInterface extends \Magento\Framework\Api\ExtensibleDataInterface
      * @return $this
      */
     public function setCanChangeQuantity($canChangeQuantity);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Bundle\Api\Data\LinkExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Bundle\Api\Data\LinkExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Bundle\Api\Data\LinkExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Bundle/Api/Data/OptionInterface.php b/app/code/Magento/Bundle/Api/Data/OptionInterface.php
index f15c1856981ba02b77f560bc8040d48a4d4bb761..47d52ba713c6410e935ccab66e3ea3b66a96416e 100644
--- a/app/code/Magento/Bundle/Api/Data/OptionInterface.php
+++ b/app/code/Magento/Bundle/Api/Data/OptionInterface.php
@@ -113,4 +113,19 @@ interface OptionInterface extends \Magento\Framework\Api\ExtensibleDataInterface
      * @return $this
      */
     public function setProductLinks(array $productLinks = null);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Bundle\Api\Data\OptionExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Bundle\Api\Data\OptionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Bundle\Api\Data\OptionExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Bundle/Api/Data/OptionTypeInterface.php b/app/code/Magento/Bundle/Api/Data/OptionTypeInterface.php
index 9132f2babc7f53470b02ad93f3a2d6ef1f4d1b45..9883c8535da83ca0dd252e30d64cfe82b4144cf7 100644
--- a/app/code/Magento/Bundle/Api/Data/OptionTypeInterface.php
+++ b/app/code/Magento/Bundle/Api/Data/OptionTypeInterface.php
@@ -37,4 +37,19 @@ interface OptionTypeInterface extends \Magento\Framework\Api\ExtensibleDataInter
      * @return $this
      */
     public function setCode($code);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Bundle\Api\Data\OptionTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Bundle\Api\Data\OptionTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Bundle\Api\Data\OptionTypeExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Bundle/Api/ProductLinkManagementInterface.php b/app/code/Magento/Bundle/Api/ProductLinkManagementInterface.php
index f10ef9e27291ebad1a1a97e8d2fac5621b538c37..2109cde0f95d452be9456038b8cfc2fa8ca30726 100644
--- a/app/code/Magento/Bundle/Api/ProductLinkManagementInterface.php
+++ b/app/code/Magento/Bundle/Api/ProductLinkManagementInterface.php
@@ -21,7 +21,7 @@ interface ProductLinkManagementInterface
     /**
      * Add child product to specified Bundle option by product sku
      *
-     * @param string $productSku
+     * @param string $sku
      * @param int $optionId
      * @param \Magento\Bundle\Api\Data\LinkInterface $linkedProduct
      * @throws \Magento\Framework\Exception\NoSuchEntityException
@@ -29,7 +29,7 @@ interface ProductLinkManagementInterface
      * @throws \Magento\Framework\Exception\InputException
      * @return int
      */
-    public function addChildByProductSku($productSku, $optionId, \Magento\Bundle\Api\Data\LinkInterface $linkedProduct);
+    public function addChildByProductSku($sku, $optionId, \Magento\Bundle\Api\Data\LinkInterface $linkedProduct);
 
     /**
      * @param \Magento\Catalog\Api\Data\ProductInterface $product
@@ -49,12 +49,12 @@ interface ProductLinkManagementInterface
     /**
      * Remove product from Bundle product option
      *
-     * @param string $productSku
+     * @param string $sku
      * @param int $optionId
      * @param string $childSku
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\InputException
      * @return bool
      */
-    public function removeChild($productSku, $optionId, $childSku);
+    public function removeChild($sku, $optionId, $childSku);
 }
diff --git a/app/code/Magento/Bundle/Api/ProductOptionRepositoryInterface.php b/app/code/Magento/Bundle/Api/ProductOptionRepositoryInterface.php
index 61c942a3b15344a5ed715f7279c6a9d8b7fb9bca..26857e69449cd04a3e130a3feb1432d87aaa198c 100644
--- a/app/code/Magento/Bundle/Api/ProductOptionRepositoryInterface.php
+++ b/app/code/Magento/Bundle/Api/ProductOptionRepositoryInterface.php
@@ -11,23 +11,23 @@ interface ProductOptionRepositoryInterface
     /**
      * Get option for bundle product
      *
-     * @param string $productSku
+     * @param string $sku
      * @param int $optionId
      * @return \Magento\Bundle\Api\Data\OptionInterface
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\InputException
      */
-    public function get($productSku, $optionId);
+    public function get($sku, $optionId);
 
     /**
      * Get all options for bundle product
      *
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\Bundle\Api\Data\OptionInterface[]
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\InputException
      */
-    public function getList($productSku);
+    public function getList($sku);
 
     /**
      * Remove bundle option
@@ -42,13 +42,13 @@ interface ProductOptionRepositoryInterface
     /**
      * Remove bundle option
      *
-     * @param string $productSku
+     * @param string $sku
      * @param int $optionId
      * @return bool
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      * @throws \Magento\Framework\Exception\InputException
      */
-    public function deleteById($productSku, $optionId);
+    public function deleteById($sku, $optionId);
 
     /**
      * Add new option for bundle product
diff --git a/app/code/Magento/Bundle/Model/Link.php b/app/code/Magento/Bundle/Model/Link.php
index f20685ee211fde7efe7c4f484a7455e169f68d90..eb99eff55e334fd9c878af2054243956b76a115c 100644
--- a/app/code/Magento/Bundle/Model/Link.php
+++ b/app/code/Magento/Bundle/Model/Link.php
@@ -7,6 +7,7 @@
 namespace Magento\Bundle\Model;
 
 /**
+ * Class Link
  * @codeCoverageIgnore
  */
 class Link extends \Magento\Framework\Model\AbstractExtensibleModel implements
@@ -196,4 +197,25 @@ class Link extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::KEY_CAN_CHANGE_QUANTITY, $canChangeQuantity);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Bundle\Api\Data\LinkExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Bundle\Api\Data\LinkExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Bundle\Api\Data\LinkExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Bundle/Model/LinkManagement.php b/app/code/Magento/Bundle/Model/LinkManagement.php
index 63213342b593f31322e4919d438d8f7178738ed0..fe2c0d85d7b168d21183813afc8b72ffbb9f280e 100644
--- a/app/code/Magento/Bundle/Model/LinkManagement.php
+++ b/app/code/Magento/Bundle/Model/LinkManagement.php
@@ -95,10 +95,10 @@ class LinkManagement implements \Magento\Bundle\Api\ProductLinkManagementInterfa
     /**
      * {@inheritdoc}
      */
-    public function addChildByProductSku($productSku, $optionId, \Magento\Bundle\Api\Data\LinkInterface $linkedProduct)
+    public function addChildByProductSku($sku, $optionId, \Magento\Bundle\Api\Data\LinkInterface $linkedProduct)
     {
         /** @var \Magento\Catalog\Model\Product $product */
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         return $this->addChild($product, $optionId, $linkedProduct);
     }
 
@@ -184,12 +184,12 @@ class LinkManagement implements \Magento\Bundle\Api\ProductLinkManagementInterfa
     /**
      * {@inheritdoc}
      */
-    public function removeChild($productSku, $optionId, $childSku)
+    public function removeChild($sku, $optionId, $childSku)
     {
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
 
         if ($product->getTypeId() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
-            throw new InputException(__('Product with specified sku: %1 is not a bundle product', $productSku));
+            throw new InputException(__('Product with specified sku: %1 is not a bundle product', $sku));
         }
 
         $excludeSelectionIds = [];
diff --git a/app/code/Magento/Bundle/Model/Option.php b/app/code/Magento/Bundle/Model/Option.php
index dd265884d84999cb2f007c7a4a1c39b19f020f67..a541f00b80e24c7c6b8d221169b9f2efea55a900 100644
--- a/app/code/Magento/Bundle/Model/Option.php
+++ b/app/code/Magento/Bundle/Model/Option.php
@@ -269,5 +269,26 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::KEY_PRODUCT_LINKS, $productLinks);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Bundle\Api\Data\OptionExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Bundle\Api\Data\OptionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Bundle\Api\Data\OptionExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Bundle/Model/OptionRepository.php b/app/code/Magento/Bundle/Model/OptionRepository.php
index 0c69197c55466d31ec2251fb7c5707ccc0b55cf1..264a7f1d159eccde62e0d2b6ce90855627c648d2 100644
--- a/app/code/Magento/Bundle/Model/OptionRepository.php
+++ b/app/code/Magento/Bundle/Model/OptionRepository.php
@@ -96,9 +96,9 @@ class OptionRepository implements \Magento\Bundle\Api\ProductOptionRepositoryInt
     /**
      * {@inheritdoc}
      */
-    public function get($productSku, $optionId)
+    public function get($sku, $optionId)
     {
-        $product = $this->getProduct($productSku);
+        $product = $this->getProduct($sku);
 
         /** @var \Magento\Bundle\Model\Option $option */
         $option = $this->type->getOptionsCollection($product)->getItemById($optionId);
@@ -126,9 +126,9 @@ class OptionRepository implements \Magento\Bundle\Api\ProductOptionRepositoryInt
     /**
      * {@inheritdoc}
      */
-    public function getList($productSku)
+    public function getList($sku)
     {
-        $product = $this->getProduct($productSku);
+        $product = $this->getProduct($sku);
         return $this->productOptionList->getItems($product);
     }
 
@@ -151,9 +151,9 @@ class OptionRepository implements \Magento\Bundle\Api\ProductOptionRepositoryInt
     /**
      * {@inheritdoc}
      */
-    public function deleteById($productSku, $optionId)
+    public function deleteById($sku, $optionId)
     {
-        $product = $this->getProduct($productSku);
+        $product = $this->getProduct($sku);
         $optionCollection = $this->type->getOptionsCollection($product);
         $optionCollection->setIdFilter($optionId);
         return $this->delete($optionCollection->getFirstItem());
@@ -216,13 +216,13 @@ class OptionRepository implements \Magento\Bundle\Api\ProductOptionRepositoryInt
     }
 
     /**
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\Catalog\Api\Data\ProductInterface
      * @throws \Magento\Framework\Exception\InputException
      */
-    private function getProduct($productSku)
+    private function getProduct($sku)
     {
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         if ($product->getTypeId() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
             throw new InputException(__('Only implemented for bundle product'));
         }
diff --git a/app/code/Magento/Bundle/Model/Plugin/BundleLoadOptions.php b/app/code/Magento/Bundle/Model/Plugin/BundleLoadOptions.php
index 7e7294d98bc1e766709bb8ed2cf668e50076de1e..76b5dd84b3620c4ee3fa4da5eae8fc6490b602ce 100644
--- a/app/code/Magento/Bundle/Model/Plugin/BundleLoadOptions.php
+++ b/app/code/Magento/Bundle/Model/Plugin/BundleLoadOptions.php
@@ -15,20 +15,21 @@ class BundleLoadOptions
     protected $productOptionList;
 
     /**
-     * @var \Magento\Framework\Api\AttributeValueFactory
+     * @var \Magento\Catalog\Api\Data\ProductExtensionFactory
      */
-    protected $customAttributeFactory;
+    protected $productExtensionFactory;
 
     /**
      * @param \Magento\Bundle\Model\Product\OptionList $productOptionList
-     * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
+     * @param \Magento\Framework\Api\AttributeDataBuilder $customAttributeBuilder
+     * @param \Magento\Catalog\Api\Data\ProductExtensionFactory $productExtensionFactory
      */
     public function __construct(
         \Magento\Bundle\Model\Product\OptionList $productOptionList,
-        \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
+        \Magento\Catalog\Api\Data\ProductExtensionFactory $productExtensionFactory
     ) {
         $this->productOptionList = $productOptionList;
-        $this->customAttributeFactory = $customAttributeFactory;
+        $this->productExtensionFactory = $productExtensionFactory;
     }
 
     /**
@@ -50,11 +51,12 @@ class BundleLoadOptions
         if ($product->getTypeId() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
             return $product;
         }
-        $customAttribute = $this->customAttributeFactory->create()
-            ->setAttributeCode('bundle_product_options')
-            ->setValue($this->productOptionList->getItems($product));
-        $attributes = array_merge($product->getCustomAttributes(), ['bundle_product_options' => $customAttribute]);
-        $product->setData('custom_attributes', $attributes);
+
+        $productExtension = $this->productExtensionFactory->create();
+        $productExtension->setBundleProductOptions($this->productOptionList->getItems($product));
+
+        $product->setExtensionAttributes($productExtension);
+
         return $product;
     }
 }
diff --git a/app/code/Magento/Bundle/Model/Plugin/BundleSaveOptions.php b/app/code/Magento/Bundle/Model/Plugin/BundleSaveOptions.php
index 715feaab8e8220cc2396a076b7f2ed361647d198..b0e9ee6de4700da4651aee4c31aaed0b03db657b 100644
--- a/app/code/Magento/Bundle/Model/Plugin/BundleSaveOptions.php
+++ b/app/code/Magento/Bundle/Model/Plugin/BundleSaveOptions.php
@@ -44,13 +44,8 @@ class BundleSaveOptions
             return $result;
         }
 
-        /* @var \Magento\Framework\Api\AttributeValue $bundleProductOptionsAttrValue */
-        $bundleProductOptionsAttrValue = $product->getCustomAttribute('bundle_product_options');
-        if (is_null($bundleProductOptionsAttrValue) || !is_array($bundleProductOptionsAttrValue->getValue())) {
-            $bundleProductOptions = [];
-        } else {
-            $bundleProductOptions = $bundleProductOptionsAttrValue->getValue();
-        }
+        /* @var \Magento\Bundle\Api\Data\OptionInterface[] $options */
+        $bundleProductOptions = $product->getExtensionAttributes()->getBundleProductOptions();
 
         if (is_array($bundleProductOptions)) {
             foreach ($bundleProductOptions as $option) {
diff --git a/app/code/Magento/Bundle/Model/Source/Option/Type.php b/app/code/Magento/Bundle/Model/Source/Option/Type.php
index 711b94c2a554735aca2e24cb968e983518723316..98ecd93865d4cc25ca07963e2a1fe6866f25a04a 100644
--- a/app/code/Magento/Bundle/Model/Source/Option/Type.php
+++ b/app/code/Magento/Bundle/Model/Source/Option/Type.php
@@ -9,8 +9,12 @@
 namespace Magento\Bundle\Model\Source\Option;
 
 use Magento\Framework\Api\AttributeValueFactory;
-use Magento\Framework\Api\MetadataServiceInterface;
+use Magento\Framework\Api\ExtensionAttributesFactory;
 
+/**
+ * Class Type
+ *
+ */
 class Type extends \Magento\Framework\Model\AbstractExtensibleModel implements
     \Magento\Framework\Option\ArrayInterface,
     \Magento\Bundle\Api\Data\OptionTypeInterface
@@ -30,7 +34,7 @@ class Type extends \Magento\Framework\Model\AbstractExtensibleModel implements
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param MetadataServiceInterface $metadataService
+     * @param ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param array $options
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
@@ -40,7 +44,7 @@ class Type extends \Magento\Framework\Model\AbstractExtensibleModel implements
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        MetadataServiceInterface $metadataService,
+        ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         array $options,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
@@ -51,7 +55,7 @@ class Type extends \Magento\Framework\Model\AbstractExtensibleModel implements
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -111,5 +115,26 @@ class Type extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::KEY_CODE, $code);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Bundle\Api\Data\OptionTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Bundle\Api\Data\OptionTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Bundle\Api\Data\OptionTypeExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php b/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php
index 2ed7bdb1b29e5864135cfa067f78a7022c28ec7a..7b91140a3bfe6fd0aa0196384d298e656afbb5bd 100644
--- a/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Model/OptionRepositoryTest.php
@@ -4,6 +4,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Bundle\Test\Unit\Model;
 
 class OptionRepositoryTest extends \PHPUnit_Framework_TestCase
@@ -71,6 +74,7 @@ class OptionRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->optionFactoryMock = $this->getMockBuilder('\Magento\Bundle\Api\Data\OptionInterfaceFactory')
             ->disableOriginalConstructor()
             ->setMethods(['create'])
+            ->disableOriginalConstructor()
             ->getMock();
         $this->dataObjectHelperMock = $this->getMockBuilder('\Magento\Framework\Api\DataObjectHelper')
             ->disableOriginalConstructor()
diff --git a/app/code/Magento/Bundle/Test/Unit/Model/Plugin/BundleLoadOptionsTest.php b/app/code/Magento/Bundle/Test/Unit/Model/Plugin/BundleLoadOptionsTest.php
index 0618065c4e80bacd68fe211d7a433209636aa97a..e4050d99040ca61dacc97b54731fd79e67719af1 100644
--- a/app/code/Magento/Bundle/Test/Unit/Model/Plugin/BundleLoadOptionsTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Model/Plugin/BundleLoadOptionsTest.php
@@ -4,6 +4,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Bundle\Test\Unit\Model\Plugin;
 
 class BundleLoadOptionsTest extends \PHPUnit_Framework_TestCase
@@ -23,13 +26,20 @@ class BundleLoadOptionsTest extends \PHPUnit_Framework_TestCase
      */
     protected $attributeFactoryMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productExtensionFactory;
+
     protected function setUp()
     {
         $this->optionListMock = $this->getMock('\Magento\Bundle\Model\Product\OptionList', [], [], '', false);
-        $this->attributeFactoryMock = $this->getMock('\Magento\Framework\Api\AttributeValueFactory', [], [], '', false);
+        $this->productExtensionFactory = $this->getMockBuilder('\Magento\Catalog\Api\Data\ProductExtensionFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
         $this->model = new \Magento\Bundle\Model\Plugin\BundleLoadOptions(
             $this->optionListMock,
-            $this->attributeFactoryMock
+            $this->productExtensionFactory
         );
     }
 
@@ -50,9 +60,10 @@ class BundleLoadOptionsTest extends \PHPUnit_Framework_TestCase
 
     public function testAroundLoad()
     {
+        $this->markTestSkipped('MAGETWO-34577');
         $productMock = $this->getMock(
             '\Magento\Catalog\Model\Product',
-            ['getTypeId', 'getCustomAttributes', 'setData'],
+            ['getTypeId', 'setExtensionAttributes'],
             [],
             '',
             false
@@ -69,22 +80,19 @@ class BundleLoadOptionsTest extends \PHPUnit_Framework_TestCase
             ->method('getItems')
             ->with($productMock)
             ->willReturn([$optionMock]);
-        $customAttributeMock = $this->getMock('\Magento\Framework\Api\AttributeValue', [], [], '', false);
-        $customAttributeMock->expects($this->once())
-            ->method('setAttributeCode')
-            ->with('bundle_product_options')
-            ->willReturnSelf();
-        $customAttributeMock->expects($this->once())
-            ->method('setValue')
+        $productExtensionMock = $this->getMockBuilder('\Magento\Catalog\Api\Data\ProductExtension')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->productExtensionFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($productExtensionMock);
+        $productExtensionMock->expects($this->once())
+            ->method('setBundleProductOptions')
             ->with([$optionMock])
             ->willReturnSelf();
-        $this->attributeFactoryMock->expects($this->once())->method('create')->willReturn($customAttributeMock);
-
-        $productAttributeMock = $this->getMock('\Magento\Framework\Api\AttributeValue', [], [], '', false);
-        $productMock->expects($this->once())->method('getCustomAttributes')->willReturn([$productAttributeMock]);
         $productMock->expects($this->once())
-            ->method('setData')
-            ->with('custom_attributes', ['bundle_product_options' => $customAttributeMock, $productAttributeMock])
+            ->method('setExtensionAttributes')
+            ->with($productExtensionMock)
             ->willReturnSelf();
 
         $this->assertEquals(
diff --git a/app/code/Magento/Bundle/Test/Unit/Model/Plugin/BundleSaveOptionsTest.php b/app/code/Magento/Bundle/Test/Unit/Model/Plugin/BundleSaveOptionsTest.php
index 7bf90801c4620a0d40b47265b39aebac41531251..1615760e6dbee5b4ad44d0d30cd81b53b19e691e 100644
--- a/app/code/Magento/Bundle/Test/Unit/Model/Plugin/BundleSaveOptionsTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Model/Plugin/BundleSaveOptionsTest.php
@@ -5,6 +5,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 namespace Magento\Bundle\Test\Unit\Model\Plugin;
 
 use \Magento\Bundle\Model\Plugin\BundleSaveOptions;
@@ -31,6 +33,16 @@ class BundleSaveOptionsTest extends \PHPUnit_Framework_TestCase
      */
     protected $productMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productExtensionMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productBundleOptionsMock;
+
     /**
      * @var \Closure
      */
@@ -40,17 +52,37 @@ class BundleSaveOptionsTest extends \PHPUnit_Framework_TestCase
     {
         $this->productRepositoryMock = $this->getMock('Magento\Catalog\Api\ProductRepositoryInterface');
         $this->productOptionRepositoryMock = $this->getMock('Magento\Bundle\Api\ProductOptionRepositoryInterface');
-        $this->productMock = $this->getMock('Magento\Catalog\Model\Product', [], [], '', false);
+        $this->productMock = $this->getMock(
+            'Magento\Catalog\Model\Product',
+            ['getExtensionAttributes', 'getTypeId'],
+            [],
+            '',
+            false
+        );
         $this->closureMock = function () {
             return $this->productMock;
         };
         $this->plugin = new BundleSaveOptions($this->productOptionRepositoryMock);
+        $this->productExtensionMock = $this->getMock(
+            'Magento\Catalog\Api\Data\ProductExtension',
+            ['getBundleProductOptions'],
+            [],
+            '',
+            false
+        );
+        $this->productBundleOptionsMock = $this->getMock(
+            'Magento\Bundle\Api\Data\OptionInterface',
+            [],
+            [],
+            '',
+            false
+        );
     }
 
     public function testAroundSaveWhenProductIsSimple()
     {
         $this->productMock->expects($this->once())->method('getTypeId')->willReturn('simple');
-        $this->productMock->expects($this->never())->method('getCustomAttribute');
+        $this->productMock->expects($this->never())->method('getExtensionAttributes');
 
         $this->assertEquals(
             $this->productMock,
@@ -62,9 +94,11 @@ class BundleSaveOptionsTest extends \PHPUnit_Framework_TestCase
     {
         $this->productMock->expects($this->once())->method('getTypeId')->willReturn('bundle');
         $this->productMock->expects($this->once())
-            ->method('getCustomAttribute')
-            ->with('bundle_product_options')
-            ->willReturn(null);
+            ->method('getExtensionAttributes')
+            ->willReturn($this->productExtensionMock);
+        $this->productExtensionMock->expects($this->once())
+            ->method('getBundleProductOptions')
+            ->willReturn([]);
 
         $this->productOptionRepositoryMock->expects($this->never())->method('save');
 
@@ -76,16 +110,17 @@ class BundleSaveOptionsTest extends \PHPUnit_Framework_TestCase
 
     public function testAroundSaveWhenProductIsBundleWithOptions()
     {
-        $option = $this->getMock('\Magento\Bundle\Api\Data\OptionInterface');
-        $bundleProductOptionsAttrValue = $this->getMock('\Magento\Framework\Api\AttributeValue', [], [], '', false);
-        $bundleProductOptionsAttrValue->expects($this->atLeastOnce())->method('getValue')->willReturn([$option]);
         $this->productMock->expects($this->once())->method('getTypeId')->willReturn('bundle');
         $this->productMock->expects($this->once())
-            ->method('getCustomAttribute')
-            ->with('bundle_product_options')
-            ->willReturn($bundleProductOptionsAttrValue);
-
-        $this->productOptionRepositoryMock->expects($this->once())->method('save')->with($this->productMock, $option);
+            ->method('getExtensionAttributes')
+            ->willReturn($this->productExtensionMock);
+        $this->productExtensionMock->expects($this->once())
+            ->method('getBundleProductOptions')
+            ->willReturn([$this->productBundleOptionsMock]);
+
+        $this->productOptionRepositoryMock->expects($this->once())
+            ->method('save')
+            ->with($this->productMock, $this->productBundleOptionsMock);
 
         $this->assertEquals(
             $this->productMock,
diff --git a/app/code/Magento/Bundle/Test/Unit/Pricing/Price/DiscountCalculatorTest.php b/app/code/Magento/Bundle/Test/Unit/Pricing/Price/DiscountCalculatorTest.php
index f15939bfd5add7b635db8fd8a39a875b1cf5e91c..8ebcc1cb67a8b5d2b7dc606cc99ca5e740d2f1e5 100644
--- a/app/code/Magento/Bundle/Test/Unit/Pricing/Price/DiscountCalculatorTest.php
+++ b/app/code/Magento/Bundle/Test/Unit/Pricing/Price/DiscountCalculatorTest.php
@@ -8,8 +8,6 @@
 
 namespace Magento\Bundle\Test\Unit\Pricing\Price;
 
-use Magento\Catalog\Pricing\Price\FinalPrice;
-
 /**
  * Class DiscountCalculatorTest
  */
@@ -95,7 +93,7 @@ class DiscountCalculatorTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnValue($this->priceInfoMock));
         $this->priceInfoMock->expects($this->once())
             ->method('getPrice')
-            ->with($this->equalTo(FinalPrice::PRICE_CODE))
+            ->with($this->equalTo(\Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE))
             ->will($this->returnValue($this->finalPriceMock));
         $this->finalPriceMock->expects($this->once())
             ->method('getValue')
diff --git a/app/code/Magento/Bundle/etc/config.xml b/app/code/Magento/Bundle/etc/config.xml
index 45baec43c5ab09a3ea80b77b16e83a02da0e350d..10a14c0aab73d501f8581ba9245116e6b5246df9 100644
--- a/app/code/Magento/Bundle/etc/config.xml
+++ b/app/code/Magento/Bundle/etc/config.xml
@@ -5,5 +5,5 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
 </config>
diff --git a/app/code/Magento/Bundle/etc/data_object.xml b/app/code/Magento/Bundle/etc/data_object.xml
index 2b3da013978f971bb20baca3a5e0ca95f2b501fc..88e317dafc78c8ce9d0c9a3fe6f703b777361e4a 100644
--- a/app/code/Magento/Bundle/etc/data_object.xml
+++ b/app/code/Magento/Bundle/etc/data_object.xml
@@ -8,5 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Api/etc/data_object.xsd">
     <custom_attributes for="Magento\Catalog\Api\Data\ProductInterface">
         <attribute code="bundle_product_options" type="Magento\Bundle\Api\Data\OptionInterface[]" />
+        <attribute code="price_type" type="integer" />
+        <attribute code="price_view" type="string" />
     </custom_attributes>
 </config>
diff --git a/app/code/Magento/Bundle/etc/webapi.xml b/app/code/Magento/Bundle/etc/webapi.xml
index 36bb8f577597f238c0dce61748b7f33294bdb5a7..ec0dffcf1049e2d29da72bb80d02e8fba97ee316 100644
--- a/app/code/Magento/Bundle/etc/webapi.xml
+++ b/app/code/Magento/Bundle/etc/webapi.xml
@@ -7,7 +7,7 @@
 -->
 <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
-    <route url="/V1/bundle-products/:productSku/links/:optionId" method="POST">
+    <route url="/V1/bundle-products/:sku/links/:optionId" method="POST">
         <service class="Magento\Bundle\Api\ProductLinkManagementInterface" method="addChildByProductSku"/>
         <resources>
             <resource ref="Magento_Catalog::products"/>
@@ -19,43 +19,43 @@
             <resource ref="Magento_Catalog::products"/>
         </resources>
     </route>
-    <route url="/V1/bundle-products/:productSku/option/:optionId/child/:childSku" method="DELETE">
+    <route url="/V1/bundle-products/:sku/options/:optionId/children/:childSku" method="DELETE">
         <service class="Magento\Bundle\Api\ProductLinkManagementInterface" method="removeChild"/>
         <resources>
             <resource ref="Magento_Catalog::products"/>
         </resources>
     </route>
-    <route url="/V1/bundle-products/:productSku/option/all" method="GET">
+    <route url="/V1/bundle-products/:sku/options/all" method="GET">
         <service class="Magento\Bundle\Api\ProductOptionRepositoryInterface" method="getList" />
         <resources>
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/bundle-products/option/types" method="GET">
+    <route url="/V1/bundle-products/options/types" method="GET">
         <service class="Magento\Bundle\Api\ProductOptionTypeListInterface" method="getItems" />
         <resources>
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/bundle-products/:productSku/option/:optionId" method="GET">
+    <route url="/V1/bundle-products/:sku/options/:optionId" method="GET">
         <service class="Magento\Bundle\Api\ProductOptionRepositoryInterface" method="get" />
         <resources>
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/bundle-products/option/add" method="POST">
+    <route url="/V1/bundle-products/options/add" method="POST">
         <service class="Magento\Bundle\Api\ProductOptionManagementInterface" method="save" />
         <resources>
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/bundle-products/option/:optionId" method="PUT">
+    <route url="/V1/bundle-products/options/:optionId" method="PUT">
         <service class="Magento\Bundle\Api\ProductOptionManagementInterface" method="save" />
         <resources>
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/bundle-products/:productSku/option/:optionId" method="DELETE">
+    <route url="/V1/bundle-products/:sku/options/:optionId" method="DELETE">
         <service class="Magento\Bundle\Api\ProductOptionRepositoryInterface" method="deleteById" />
         <resources>
             <resource ref="Magento_Catalog::products" />
diff --git a/app/code/Magento/Captcha/etc/config.xml b/app/code/Magento/Captcha/etc/config.xml
index ac0f4486c7456da6bc5e3b0b397d49b326368bcd..8c91d2c706f152873ceedd4c1da7ec8de75531d6 100644
--- a/app/code/Magento/Captcha/etc/config.xml
+++ b/app/code/Magento/Captcha/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <system>
             <media_storage_configuration>
diff --git a/app/code/Magento/Catalog/Api/CategoryLinkRepositoryInterface.php b/app/code/Magento/Catalog/Api/CategoryLinkRepositoryInterface.php
index d5d2500d4b1777ddbb09f8a4a4fcda67994af507..a84719da120793448d3a12d26d4606755a219f3a 100644
--- a/app/code/Magento/Catalog/Api/CategoryLinkRepositoryInterface.php
+++ b/app/code/Magento/Catalog/Api/CategoryLinkRepositoryInterface.php
@@ -34,12 +34,12 @@ interface CategoryLinkRepositoryInterface
     /**
      * Remove the product assignment from the category by category id and sku
      *
-     * @param string $productSku
-     * @param string $productSku
+     * @param string $sku
+     * @param string $sku
      * @return bool will returned True if products successfully deleted
      *
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      * @throws \Magento\Framework\Exception\StateException
      */
-    public function deleteByIds($categoryId, $productSku);
+    public function deleteByIds($categoryId, $sku);
 }
diff --git a/app/code/Magento/Catalog/Api/Data/CategoryInterface.php b/app/code/Magento/Catalog/Api/Data/CategoryInterface.php
index fe49eab7d10b1a5e31e3bb7319ec0a14658fc9e8..8ca5780579cf2f6062e9ba8df686e1f0eba56463 100644
--- a/app/code/Magento/Catalog/Api/Data/CategoryInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/CategoryInterface.php
@@ -8,7 +8,7 @@
 
 namespace Magento\Catalog\Api\Data;
 
-interface CategoryInterface extends \Magento\Framework\Api\ExtensibleDataInterface
+interface CategoryInterface extends \Magento\Framework\Api\CustomAttributesDataInterface
 {
     /**
      * @return int|null
@@ -149,4 +149,19 @@ interface CategoryInterface extends \Magento\Framework\Api\ExtensibleDataInterfa
      * @return $this
      */
     public function setIncludeInMenu($includeInMenu);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Catalog\Api\Data\CategoryExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\CategoryExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Catalog\Api\Data\CategoryExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Catalog/Api/Data/CategoryProductLinkInterface.php b/app/code/Magento/Catalog/Api/Data/CategoryProductLinkInterface.php
index 04b8f8fe5b7a54c2e3dc4fa3857b7b8db5b9ad8b..ba9b235f9f4032658509039c0b970ae51fb2699d 100644
--- a/app/code/Magento/Catalog/Api/Data/CategoryProductLinkInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/CategoryProductLinkInterface.php
@@ -6,7 +6,9 @@
 
 namespace Magento\Catalog\Api\Data;
 
-interface CategoryProductLinkInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+interface CategoryProductLinkInterface extends ExtensibleDataInterface
 {
     /**
      * @return string|null
@@ -44,4 +46,21 @@ interface CategoryProductLinkInterface
      * @return $this
      */
     public function setCategoryId($categoryId);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Catalog\Api\Data\CategoryProductLinkExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\CategoryProductLinkExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\CategoryProductLinkExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/CategoryTreeInterface.php b/app/code/Magento/Catalog/Api/Data/CategoryTreeInterface.php
index 42f5b2c56edef8d7f18e5e438848538ecb0d10bb..66078497c25e0c479eded4aedea9fe8610a5688e 100644
--- a/app/code/Magento/Catalog/Api/Data/CategoryTreeInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/CategoryTreeInterface.php
@@ -7,7 +7,7 @@
 
 namespace Magento\Catalog\Api\Data;
 
-interface CategoryTreeInterface extends \Magento\Framework\Api\ExtensibleDataInterface
+interface CategoryTreeInterface
 {
     /**
      * @return int|null
diff --git a/app/code/Magento/Catalog/Api/Data/EavAttributeInterface.php b/app/code/Magento/Catalog/Api/Data/EavAttributeInterface.php
index 02e9c54f2dc400c37bdf46044bd1fcea28cc0824..6fa35baa0f9a8257a9ad6a128477aa9321c5d11c 100644
--- a/app/code/Magento/Catalog/Api/Data/EavAttributeInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/EavAttributeInterface.php
@@ -275,4 +275,9 @@ interface EavAttributeInterface extends \Magento\Eav\Api\Data\AttributeInterface
      * @return $this
      */
     public function setScope($scope);
+
+    /**
+     * @return \Magento\Catalog\Api\Data\EavAttributeExtensionInterface|null
+     */
+    public function getExtensionAttributes();
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductAttributeMediaGalleryEntryContentInterface.php b/app/code/Magento/Catalog/Api/Data/ProductAttributeMediaGalleryEntryContentInterface.php
index f6651f1caf686750296ee754e5d33b21a69e05d4..ccad19926c342f7a16a46c67897fcac8da48f769 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductAttributeMediaGalleryEntryContentInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductAttributeMediaGalleryEntryContentInterface.php
@@ -1,13 +1,17 @@
 <?php
 /**
- * Product Media Content
- *
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Catalog\Api\Data;
 
-interface ProductAttributeMediaGalleryEntryContentInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+/**
+ * Product Media Content
+ */
+interface ProductAttributeMediaGalleryEntryContentInterface extends ExtensibleDataInterface
 {
     const DATA = 'entry_data';
     const MIME_TYPE = 'mime_type';
@@ -57,4 +61,21 @@ interface ProductAttributeMediaGalleryEntryContentInterface
      * @return $this
      */
     public function setName($name);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductAttributeMediaGalleryEntryInterface.php b/app/code/Magento/Catalog/Api/Data/ProductAttributeMediaGalleryEntryInterface.php
index 1d9a494a8958f04aab057c7a0cb72ebd06dc9107..afac0c209edd87374d0bfbcfd40655e131a0dcc3 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductAttributeMediaGalleryEntryInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductAttributeMediaGalleryEntryInterface.php
@@ -7,14 +7,17 @@
  */
 namespace Magento\Catalog\Api\Data;
 
-interface ProductAttributeMediaGalleryEntryInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+interface ProductAttributeMediaGalleryEntryInterface extends ExtensibleDataInterface
 {
     const ID = 'id';
     const LABEL = 'label';
     const POSITION = 'position';
-    const DISABLED = 'is_disabled';
+    const DISABLED = 'disabled';
     const TYPES = 'types';
     const FILE = 'file';
+    const CONTENT = 'content';
 
     /**
      * Retrieve gallery entry ID
@@ -52,7 +55,7 @@ interface ProductAttributeMediaGalleryEntryInterface
      * @return int
      */
     public function getPosition();
-
+    
     /**
      * Set gallery entry position (sort order)
      *
@@ -65,17 +68,16 @@ interface ProductAttributeMediaGalleryEntryInterface
      * Check if gallery entry is hidden from product page
      *
      * @return bool
-     * @SuppressWarnings(PHPMD.BooleanGetMethodName)
      */
-    public function getIsDisabled();
+    public function isDisabled();
 
     /**
      * Set whether gallery entry is hidden from product page
      *
-     * @param bool $isDisabled
+     * @param bool $disabled
      * @return $this
      */
-    public function setIsDisabled($isDisabled);
+    public function setDisabled($disabled);
 
     /**
      * Retrieve gallery entry image types (thumbnail, image, small_image etc)
@@ -106,4 +108,36 @@ interface ProductAttributeMediaGalleryEntryInterface
      * @return $this
      */
     public function setFile($file);
+    
+    /**
+     * Get media gallery content
+     *
+     * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface|null
+     */
+    public function getContent();
+    
+    /**
+     * Set media gallery content
+     *
+     * @param $content \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface
+     * @return $this 
+     */
+    public function setContent($content);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductAttributeTypeInterface.php b/app/code/Magento/Catalog/Api/Data/ProductAttributeTypeInterface.php
index 759f359748a8dcf15d875a9f747cd3c473346391..eebbfb307a252827cc567bd3217d640471222f69 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductAttributeTypeInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductAttributeTypeInterface.php
@@ -1,12 +1,14 @@
 <?php
 /**
- *
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Catalog\Api\Data;
 
-interface ProductAttributeTypeInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+interface ProductAttributeTypeInterface extends ExtensibleDataInterface
 {
     const VALUE = 'value';
 
@@ -41,4 +43,21 @@ interface ProductAttributeTypeInterface
      * @return $this
      */
     public function setLabel($label);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductAttributeTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductAttributeTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductAttributeTypeExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductCustomOptionInterface.php b/app/code/Magento/Catalog/Api/Data/ProductCustomOptionInterface.php
index 8a2183bf8e8cd61f095b8daf8a6fc97050dd5a9b..352df7305118b354b5a21e560d3bb0a48ace8376 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductCustomOptionInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductCustomOptionInterface.php
@@ -18,10 +18,10 @@ interface ProductCustomOptionInterface
     /**
      * Set product SKU
      *
-     * @param string $productSku
+     * @param string $sku
      * @return $this
      */
-    public function setProductSku($productSku);
+    public function setProductSku($sku);
 
     /**
      * Get option id
diff --git a/app/code/Magento/Catalog/Api/Data/ProductCustomOptionTypeInterface.php b/app/code/Magento/Catalog/Api/Data/ProductCustomOptionTypeInterface.php
index c4f137a0cb355e74c415cf78e9728324d055e795..6a562efc3b0c73326f9d1c9a436325414f77ba72 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductCustomOptionTypeInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductCustomOptionTypeInterface.php
@@ -6,7 +6,9 @@
 
 namespace Magento\Catalog\Api\Data;
 
-interface ProductCustomOptionTypeInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+interface ProductCustomOptionTypeInterface extends ExtensibleDataInterface
 {
     /**
      * Get option type label
@@ -52,4 +54,21 @@ interface ProductCustomOptionTypeInterface
      * @return $this
      */
     public function setGroup($group);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductCustomOptionTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductCustomOptionTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductCustomOptionTypeExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductGroupPriceInterface.php b/app/code/Magento/Catalog/Api/Data/ProductGroupPriceInterface.php
index 9e2162f41f2439a5e4fa82ddaa70f4293f636465..4c2b9bd80abc1e3bdbc62958d9cd5fd0739798ec 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductGroupPriceInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductGroupPriceInterface.php
@@ -6,7 +6,9 @@
  */
 namespace Magento\Catalog\Api\Data;
 
-interface ProductGroupPriceInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+interface ProductGroupPriceInterface extends ExtensibleDataInterface
 {
     /**
      * Retrieve customer group id
@@ -37,4 +39,21 @@ interface ProductGroupPriceInterface
      * @return $this
      */
     public function setValue($value);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductGroupPriceExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductGroupPriceExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductGroupPriceExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductInterface.php b/app/code/Magento/Catalog/Api/Data/ProductInterface.php
index b0021ca89cdfa04e3e126784bad1f08dd460fb0b..34eed7fdf7bab210c1ff8c75a6690973bcc1cbca 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductInterface.php
@@ -7,7 +7,7 @@
 
 namespace Magento\Catalog\Api\Data;
 
-interface ProductInterface extends \Magento\Framework\Api\ExtensibleDataInterface
+interface ProductInterface extends \Magento\Framework\Api\CustomAttributesDataInterface
 {
     /**#@+
      * Constants defined for keys of  data array
@@ -214,4 +214,19 @@ interface ProductInterface extends \Magento\Framework\Api\ExtensibleDataInterfac
      * @return $this
      */
     public function setWeight($weight);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Catalog\Api\Data\ProductExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductLinkAttributeInterface.php b/app/code/Magento/Catalog/Api/Data/ProductLinkAttributeInterface.php
index 794d60b99b6c9d793e2ad957474b7152cbbf0938..bad462ff801c942b967308d12e30c5a68199a66c 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductLinkAttributeInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductLinkAttributeInterface.php
@@ -6,7 +6,9 @@
 
 namespace Magento\Catalog\Api\Data;
 
-interface ProductLinkAttributeInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+interface ProductLinkAttributeInterface extends ExtensibleDataInterface
 {
     /**
      * Get attribute code
@@ -37,4 +39,21 @@ interface ProductLinkAttributeInterface
      * @return $this
      */
     public function setType($type);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductLinkAttributeExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductLinkAttributeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductLinkAttributeExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductLinkInterface.php b/app/code/Magento/Catalog/Api/Data/ProductLinkInterface.php
index ddf61179c1507b0b18198a09bf7694eb31265946..7a19d3c465a4b77d79b910e641c4333193c74e0e 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductLinkInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductLinkInterface.php
@@ -18,10 +18,10 @@ interface ProductLinkInterface extends \Magento\Framework\Api\ExtensibleDataInte
     /**
      * Set product SKU
      *
-     * @param string $productSku
+     * @param string $sku
      * @return $this
      */
-    public function setProductSku($productSku);
+    public function setProductSku($sku);
 
     /**
      * Get link type
@@ -82,4 +82,21 @@ interface ProductLinkInterface extends \Magento\Framework\Api\ExtensibleDataInte
      * @return $this
      */
     public function setPosition($position);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductLinkExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductLinkExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductLinkExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductLinkTypeInterface.php b/app/code/Magento/Catalog/Api/Data/ProductLinkTypeInterface.php
index 617f9cde2c1ebad2ff2f71c6a54c4b79c590e462..a5863c09f5f099eb772b9412423523496e87c1b8 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductLinkTypeInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductLinkTypeInterface.php
@@ -6,7 +6,9 @@
 
 namespace Magento\Catalog\Api\Data;
 
-interface ProductLinkTypeInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+interface ProductLinkTypeInterface extends ExtensibleDataInterface
 {
     /**
      * Get link type code
@@ -37,4 +39,21 @@ interface ProductLinkTypeInterface
      * @return $this
      */
     public function setName($name);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductLinkTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductLinkTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductLinkTypeExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductTierPriceInterface.php b/app/code/Magento/Catalog/Api/Data/ProductTierPriceInterface.php
index ee7f92d622bb929128188ce385137db23a43f5e5..bee553af0f504824cb8c85b50d2a4c0fa485f9fe 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductTierPriceInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductTierPriceInterface.php
@@ -7,10 +7,12 @@
 
 namespace Magento\Catalog\Api\Data;
 
+use Magento\Framework\Api\ExtensibleDataInterface;
+
 /**
  * @todo remove this interface if framework support return array
  */
-interface ProductTierPriceInterface
+interface ProductTierPriceInterface extends ExtensibleDataInterface
 {
     const QTY = 'qty';
 
@@ -45,4 +47,21 @@ interface ProductTierPriceInterface
      * @return $this
      */
     public function setValue($value);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductTierPriceExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductTierPriceExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductTierPriceExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/Data/ProductTypeInterface.php b/app/code/Magento/Catalog/Api/Data/ProductTypeInterface.php
index 0d888145c3fd6db515c5d92f22d9512c84b598a1..50599c36231e1b74611c1c1238d05c541627b53f 100644
--- a/app/code/Magento/Catalog/Api/Data/ProductTypeInterface.php
+++ b/app/code/Magento/Catalog/Api/Data/ProductTypeInterface.php
@@ -1,13 +1,17 @@
 <?php
 /**
- * Product type details
- *
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Catalog\Api\Data;
 
-interface ProductTypeInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+/**
+ * Product type details
+ */
+interface ProductTypeInterface extends ExtensibleDataInterface
 {
     /**
      * Get product type code
@@ -38,4 +42,21 @@ interface ProductTypeInterface
      * @return $this
      */
     public function setLabel($label);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Catalog\Api\Data\ProductTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductTypeExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterface.php b/app/code/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterface.php
index c0e4cd9b0d8fc44291a8f75f1bb2f3850cda35fa..2dfe8e5a30976dfeb65d37dd337bf73382d81093 100644
--- a/app/code/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterface.php
+++ b/app/code/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterface.php
@@ -16,26 +16,18 @@ interface ProductAttributeMediaGalleryManagementInterface
     /**
      * Create new gallery entry
      *
-     * @param string $productSku
-     * @param \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface $entry
-     * @param \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface $entryContent
-     * @param int $storeId
+     * @param \Magento\Catalog\Api\Data\ProductInterface $product
      * @return int gallery entry ID
      * @throws \Magento\Framework\Exception\InputException
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\StateException
      */
-    public function create(
-        $productSku,
-        \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface $entry,
-        \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface $entryContent,
-        $storeId = 0
-    );
+    public function create($product);
 
     /**
      * Update gallery entry
      *
-     * @param string $productSku
+     * @param string $sku
      * @param \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface $entry
      * @param int $storeId
      * @return bool
@@ -43,7 +35,7 @@ interface ProductAttributeMediaGalleryManagementInterface
      * @throws \Magento\Framework\Exception\StateException
      */
     public function update(
-        $productSku,
+        $sku,
         \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface $entry,
         $storeId = 0
     );
@@ -51,29 +43,29 @@ interface ProductAttributeMediaGalleryManagementInterface
     /**
      * Remove gallery entry
      *
-     * @param string $productSku
+     * @param string $sku
      * @param int $entryId
      * @return bool
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\StateException
      */
-    public function remove($productSku, $entryId);
+    public function remove($sku, $entryId);
 
     /**
      * Return information about gallery entry
      *
-     * @param string $productSku
+     * @param string $sku
      * @param int $imageId
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface
      */
-    public function get($productSku, $imageId);
+    public function get($sku, $imageId);
 
     /**
      * Retrieve the list of gallery entries associated with given product
      *
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface[]
      */
-    public function getList($productSku);
+    public function getList($sku);
 }
diff --git a/app/code/Magento/Catalog/Api/ProductCustomOptionRepositoryInterface.php b/app/code/Magento/Catalog/Api/ProductCustomOptionRepositoryInterface.php
index 1b2329931b1a9dceb34256716b58aad2c548e9a8..50b45a3b3dc8b283eaf8ea6431fb365814461b83 100644
--- a/app/code/Magento/Catalog/Api/ProductCustomOptionRepositoryInterface.php
+++ b/app/code/Magento/Catalog/Api/ProductCustomOptionRepositoryInterface.php
@@ -11,19 +11,19 @@ interface ProductCustomOptionRepositoryInterface
     /**
      * Get the list of custom options for a specific product
      *
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\Catalog\Api\Data\ProductCustomOptionInterface[]
      */
-    public function getList($productSku);
+    public function getList($sku);
 
     /**
      * Get custom option for a specific product
      *
-     * @param string $productSku
+     * @param string $sku
      * @param int $optionId
      * @return \Magento\Catalog\Api\Data\ProductCustomOptionInterface
      */
-    public function get($productSku, $optionId);
+    public function get($sku, $optionId);
 
     /**
      * Delete custom option from product
@@ -42,9 +42,9 @@ interface ProductCustomOptionRepositoryInterface
     public function save(\Magento\Catalog\Api\Data\ProductCustomOptionInterface $option);
 
     /**
-     * @param string $productSku
+     * @param string $sku
      * @param int $optionId
      * @return bool
      */
-    public function deleteByIdentifier($productSku, $optionId);
+    public function deleteByIdentifier($sku, $optionId);
 }
diff --git a/app/code/Magento/Catalog/Api/ProductGroupPriceManagementInterface.php b/app/code/Magento/Catalog/Api/ProductGroupPriceManagementInterface.php
index 7278ab50c342f3493457210e665a2cac4e2b5303..bbe7fdc66fd87a18b69c7b80658b96edc30b4a2a 100644
--- a/app/code/Magento/Catalog/Api/ProductGroupPriceManagementInterface.php
+++ b/app/code/Magento/Catalog/Api/ProductGroupPriceManagementInterface.php
@@ -12,32 +12,32 @@ interface ProductGroupPriceManagementInterface
     /**
      * Set group price for product
      *
-     * @param string $productSku
+     * @param string $sku
      * @param int $customerGroupId
      * @param float $price
      * @return boolean
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      */
-    public function add($productSku, $customerGroupId, $price);
+    public function add($sku, $customerGroupId, $price);
 
     /**
      * Remove group price from product
      *
-     * @param string $productSku
+     * @param string $sku
      * @param int $customerGroupId
      * @return boolean
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      */
-    public function remove($productSku, $customerGroupId);
+    public function remove($sku, $customerGroupId);
 
     /**
      * Retrieve list of product prices
      *
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\Catalog\Api\Data\ProductGroupPriceInterface[]
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
-    public function getList($productSku);
+    public function getList($sku);
 }
diff --git a/app/code/Magento/Catalog/Api/ProductLinkManagementInterface.php b/app/code/Magento/Catalog/Api/ProductLinkManagementInterface.php
index 3daf804de0af0c205a3ac4d02cd91006e99ea45c..ee2ef0f062eab8ea68eea1fa9045272deb4f18e3 100644
--- a/app/code/Magento/Catalog/Api/ProductLinkManagementInterface.php
+++ b/app/code/Magento/Catalog/Api/ProductLinkManagementInterface.php
@@ -11,21 +11,21 @@ interface ProductLinkManagementInterface
     /**
      * Provide the list of links for a specific product
      *
-     * @param string $productSku
+     * @param string $sku
      * @param string $type
      * @return \Magento\Catalog\Api\Data\ProductLinkInterface[]
      */
-    public function getLinkedItemsByType($productSku, $type);
+    public function getLinkedItemsByType($sku, $type);
 
     /**
      * Assign a product link to another product
      *
-     * @param string $productSku
+     * @param string $sku
      * @param string $type
      * @param \Magento\Catalog\Api\Data\ProductLinkInterface[] $items
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      * @return bool
      */
-    public function setProductLinks($productSku, $type, array $items);
+    public function setProductLinks($sku, $type, array $items);
 }
diff --git a/app/code/Magento/Catalog/Api/ProductLinkRepositoryInterface.php b/app/code/Magento/Catalog/Api/ProductLinkRepositoryInterface.php
index 6af76811e585739e6e9469f82eabfcc3f4fcbef3..7b4d79d902b25835e6a28d09bb8622deef61f89f 100644
--- a/app/code/Magento/Catalog/Api/ProductLinkRepositoryInterface.php
+++ b/app/code/Magento/Catalog/Api/ProductLinkRepositoryInterface.php
@@ -32,12 +32,12 @@ interface ProductLinkRepositoryInterface
     public function delete(\Magento\Catalog\Api\Data\ProductLinkInterface $entity);
 
     /**
-     * @param string $productSku
+     * @param string $sku
      * @param string $type
      * @param string $linkedProductSku
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      * @return bool
      */
-    public function deleteById($productSku, $type, $linkedProductSku);
+    public function deleteById($sku, $type, $linkedProductSku);
 }
diff --git a/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php b/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
index bad476db4bc439ebe7fac316453722a6b30be650..8205f68fca6095f9d516c01f5ad04be1a8515725 100644
--- a/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
+++ b/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php
@@ -24,13 +24,13 @@ interface ProductRepositoryInterface
     /**
      * Get info about product by product SKU
      *
-     * @param string $productSku
+     * @param string $sku
      * @param bool $editMode
      * @param null|int $storeId
      * @return \Magento\Catalog\Api\Data\ProductInterface
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
-    public function get($productSku, $editMode = false, $storeId = null);
+    public function get($sku, $editMode = false, $storeId = null);
 
     /**
      * Get info about product by product id
@@ -53,12 +53,12 @@ interface ProductRepositoryInterface
     public function delete(\Magento\Catalog\Api\Data\ProductInterface $product);
 
     /**
-     * @param string $productSku
+     * @param string $sku
      * @return bool Will returned True if deleted
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\StateException
      */
-    public function deleteById($productSku);
+    public function deleteById($sku);
 
     /**
      * Get product list
diff --git a/app/code/Magento/Catalog/Api/ProductTierPriceManagementInterface.php b/app/code/Magento/Catalog/Api/ProductTierPriceManagementInterface.php
index 1f9dea7edc06e66a7bd0d09ab747867b9fc159db..c8e3a5361e72acfe0ca9e68ac64ed934037e52df 100644
--- a/app/code/Magento/Catalog/Api/ProductTierPriceManagementInterface.php
+++ b/app/code/Magento/Catalog/Api/ProductTierPriceManagementInterface.php
@@ -11,7 +11,7 @@ interface ProductTierPriceManagementInterface
     /**
      * Create tier price for product
      *
-     * @param string $productSku
+     * @param string $sku
      * @param string $customerGroupId
      * @param float $price
      * @param float $qty
@@ -19,27 +19,27 @@ interface ProductTierPriceManagementInterface
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      */
-    public function add($productSku, $customerGroupId, $price, $qty);
+    public function add($sku, $customerGroupId, $price, $qty);
 
     /**
      * Remove tire price from product
      *
-     * @param string $productSku
+     * @param string $sku
      * @param string $customerGroupId
      * @param float $qty
      * @return boolean
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      */
-    public function remove($productSku, $customerGroupId, $qty);
+    public function remove($sku, $customerGroupId, $qty);
 
     /**
      * Get tire price of product
      *
-     * @param string $productSku
+     * @param string $sku
      * @param string $customerGroupId
      * @return \Magento\Catalog\Api\Data\ProductTierPriceInterface[]
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
-    public function getList($productSku, $customerGroupId);
+    public function getList($sku, $customerGroupId);
 }
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassStatus.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassStatus.php
index 09c968830b1e8aeb78e6a6759634efd12e2a872b..26665c88a5f2fef3e5f49a91dee577a14a0e6415 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassStatus.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassStatus.php
@@ -74,7 +74,7 @@ class MassStatus extends \Magento\Catalog\Controller\Adminhtml\Product
                 ->updateAttributes($productIds, ['status' => $status], $storeId);
             $this->messageManager->addSuccess(__('A total of %1 record(s) have been updated.', count($productIds)));
             $this->_productPriceIndexerProcessor->reindexList($productIds);
-        } catch (\Magento\Core\Model\Exception $e) {
+        } catch (\Magento\Framework\Exception $e) {
             $this->messageManager->addError($e->getMessage());
         } catch (\Magento\Framework\Exception\LocalizedException $e) {
             $this->messageManager->addError($e->getMessage());
diff --git a/app/code/Magento/Catalog/Model/AbstractModel.php b/app/code/Magento/Catalog/Model/AbstractModel.php
index 19c70245700c41c2c56f1f42aa645ab8a4f23cc5..738a88b5c04c9a1fafbc77c767c1e20e544c3967 100644
--- a/app/code/Magento/Catalog/Model/AbstractModel.php
+++ b/app/code/Magento/Catalog/Model/AbstractModel.php
@@ -62,7 +62,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
@@ -72,7 +72,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
@@ -83,7 +83,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
diff --git a/app/code/Magento/Catalog/Model/Category.php b/app/code/Magento/Catalog/Model/Category.php
index 3ada4eb10baf9c677f028cfdbbcabe28edaea80a..88e82011381c2b1e6a929a191fe2bef1c620d1b6 100644
--- a/app/code/Magento/Catalog/Model/Category.php
+++ b/app/code/Magento/Catalog/Model/Category.php
@@ -189,12 +189,18 @@ class Category extends \Magento\Catalog\Model\AbstractModel implements
      */
     protected $categoryRepository;
 
+    /**
+     * @var \Magento\Framework\Api\MetadataServiceInterface
+     */
+    protected $metadataService;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $metadataService
      * @param Resource\Category\Tree $categoryTreeResource
      * @param Resource\Category\TreeFactory $categoryTreeFactory
      * @param \Magento\Store\Model\Resource\Store\CollectionFactory $storeCollectionFactory
@@ -215,9 +221,10 @@ class Category extends \Magento\Catalog\Model\AbstractModel implements
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
+        \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $metadataService,
         \Magento\Catalog\Model\Resource\Category\Tree $categoryTreeResource,
         \Magento\Catalog\Model\Resource\Category\TreeFactory $categoryTreeFactory,
         \Magento\Store\Model\Resource\Store\CollectionFactory $storeCollectionFactory,
@@ -234,6 +241,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel implements
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
         array $data = []
     ) {
+        $this->metadataService = $metadataService;
         $this->_treeModel = $categoryTreeResource;
         $this->_categoryTreeFactory = $categoryTreeFactory;
         $this->_storeCollectionFactory = $storeCollectionFactory;
@@ -249,7 +257,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel implements
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $storeManager,
             $resource,
@@ -274,6 +282,17 @@ class Category extends \Magento\Catalog\Model\AbstractModel implements
         }
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    protected function getCustomAttributesCodes()
+    {
+        if ($this->customAttributesCodes === null) {
+            $this->customAttributesCodes = $this->getEavAttributesCodes($this->metadataService);
+        }
+        return $this->customAttributesCodes;
+    }
+
     /**
      * Get flat resource model flag
      *
@@ -1323,5 +1342,26 @@ class Category extends \Magento\Catalog\Model\AbstractModel implements
     {
         return $this->setData(self::KEY_CHILDREN_DATA, $childrenData);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\CategoryExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\CategoryExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Catalog\Api\Data\CategoryExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Catalog/Model/Category/Attribute.php b/app/code/Magento/Catalog/Model/Category/Attribute.php
index 99659b6760e6eb7b4311559fe7be113561c6615d..faf1fbd8c12194e79b04a91ff00c5e5c0d0ac434 100644
--- a/app/code/Magento/Catalog/Model/Category/Attribute.php
+++ b/app/code/Magento/Catalog/Model/Category/Attribute.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\Catalog\Model\Category;
 
+/**
+ * Class Attribute
+ *
+ * @method \Magento\Eav\Api\Data\AttributeExtensionInterface getExtensionAttributes()
+ */
 class Attribute extends \Magento\Catalog\Model\Entity\Attribute implements
     \Magento\Catalog\Api\Data\CategoryAttributeInterface
 {
diff --git a/app/code/Magento/Catalog/Model/Category/AttributeRepository.php b/app/code/Magento/Catalog/Model/Category/AttributeRepository.php
index 7538322e36920ec192f3b49607c6a96d7278524d..38ee0f02fccdd16a5e5aad62b53a71a1429e5e9c 100644
--- a/app/code/Magento/Catalog/Model/Category/AttributeRepository.php
+++ b/app/code/Magento/Catalog/Model/Category/AttributeRepository.php
@@ -25,25 +25,17 @@ class AttributeRepository implements CategoryAttributeRepositoryInterface
     protected $eavAttributeRepository;
 
     /**
-     * @var \Magento\Eav\Model\Config
-     */
-    protected $eavConfig;
-
-    /**
-     * @param \Magento\Framework\Api\Config\MetadataConfig $metadataConfig
      * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
      * @param \Magento\Framework\Api\FilterBuilder $filterBuilder
      * @param \Magento\Eav\Api\AttributeRepositoryInterface $eavAttributeRepository
      * @param \Magento\Eav\Model\Config $eavConfig
      */
     public function __construct(
-        \Magento\Framework\Api\Config\MetadataConfig $metadataConfig,
         \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
         \Magento\Framework\Api\FilterBuilder $filterBuilder,
         \Magento\Eav\Api\AttributeRepositoryInterface $eavAttributeRepository,
         \Magento\Eav\Model\Config $eavConfig
     ) {
-        $this->metadataConfig = $metadataConfig;
         $this->searchCriteriaBuilder = $searchCriteriaBuilder;
         $this->filterBuilder = $filterBuilder;
         $this->eavAttributeRepository = $eavAttributeRepository;
@@ -74,6 +66,7 @@ class AttributeRepository implements CategoryAttributeRepositoryInterface
 
     /**
      * {@inheritdoc}
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function getCustomAttributesMetadata($dataObjectClassName = null)
     {
@@ -89,12 +82,6 @@ class AttributeRepository implements CategoryAttributeRepositoryInterface
             ]
         );
 
-        $customAttributes = [];
-        $entityAttributes = $this->getList($searchCriteria->create())->getItems();
-
-        foreach ($entityAttributes as $attributeMetadata) {
-            $customAttributes[] = $attributeMetadata;
-        }
-        return array_merge($customAttributes, $this->metadataConfig->getCustomAttributesMetadata($dataObjectClassName));
+        return $this->getList($searchCriteria->create())->getItems();
     }
 }
diff --git a/app/code/Magento/Catalog/Model/CategoryLinkRepository.php b/app/code/Magento/Catalog/Model/CategoryLinkRepository.php
index c70bc9891f6934b20038e1eb235bc65f1d22c5ef..3b407ed5d4b8d9553368ebbb3527516930985639 100644
--- a/app/code/Magento/Catalog/Model/CategoryLinkRepository.php
+++ b/app/code/Magento/Catalog/Model/CategoryLinkRepository.php
@@ -70,10 +70,10 @@ class CategoryLinkRepository implements \Magento\Catalog\Api\CategoryLinkReposit
     /**
      * {@inheritdoc}
      */
-    public function deleteByIds($categoryId, $productSku)
+    public function deleteByIds($categoryId, $sku)
     {
         $category = $this->categoryRepository->get($categoryId);
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         $productPositions = $category->getProductsPosition();
 
         $productID = $product->getId();
diff --git a/app/code/Magento/Catalog/Model/CategoryProductLink.php b/app/code/Magento/Catalog/Model/CategoryProductLink.php
index b8912fcf08e7c00f7d42114c258c5842de8040c7..2250d914d58f8e23d25c159ef1c5f9d3459829cf 100644
--- a/app/code/Magento/Catalog/Model/CategoryProductLink.php
+++ b/app/code/Magento/Catalog/Model/CategoryProductLink.php
@@ -72,4 +72,26 @@ class CategoryProductLink extends \Magento\Framework\Api\AbstractExtensibleObjec
     {
         return $this->setData(self::KEY_CATEGORY_ID, $categoryId);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\CategoryProductLinkExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\CategoryProductLinkExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\CategoryProductLinkExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/CategoryRepository.php b/app/code/Magento/Catalog/Model/CategoryRepository.php
index 1a6a232de1890fab29dbf1999f6d2dd4897125f4..6fdba349dd044588c29d85c50372ecf815aa407b 100644
--- a/app/code/Magento/Catalog/Model/CategoryRepository.php
+++ b/app/code/Magento/Catalog/Model/CategoryRepository.php
@@ -77,6 +77,8 @@ class CategoryRepository implements \Magento\Catalog\Api\CategoryRepositoryInter
         } else {
             $parentId = $category->getParentId() ?: $this->storeManager->getStore()->getRootCategoryId();
             $parentCategory = $this->get($parentId);
+            $existingData['include_in_menu'] =
+                isset($existingData['include_in_menu']) ? (bool)$existingData['include_in_menu'] : false;
             /** @var  $category Category */
             $category->setData($existingData);
             $category->setPath($parentCategory->getPath());
diff --git a/app/code/Magento/Catalog/Model/Entity/Attribute.php b/app/code/Magento/Catalog/Model/Entity/Attribute.php
index bf459585fae8f80f48880e73e473d532d9a70ce0..da907bde71f75ca5ef9f2147cfc89c3070ef8c41 100644
--- a/app/code/Magento/Catalog/Model/Entity/Attribute.php
+++ b/app/code/Magento/Catalog/Model/Entity/Attribute.php
@@ -43,6 +43,7 @@ use Magento\Framework\Api\AttributeValueFactory;
  * @method \Magento\Catalog\Model\Entity\Attribute setIsWysiwygEnabled(int $value)
  * @method int getIsUsedForPromoRules()
  * @method \Magento\Catalog\Model\Entity\Attribute setIsUsedForPromoRules(int $value)
+ * @method \Magento\Eav\Api\Data\AttributeExtensionInterface getExtensionAttributes()
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class Attribute extends \Magento\Eav\Model\Entity\Attribute
@@ -71,7 +72,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param \Magento\Eav\Model\Entity\TypeFactory $eavTypeFactory
@@ -93,7 +94,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Eav\Model\Config $eavConfig,
         \Magento\Eav\Model\Entity\TypeFactory $eavTypeFactory,
@@ -115,7 +116,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $eavConfig,
             $eavTypeFactory,
diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php
index 0b9af7cceaa0747fb642f549866b96a02e0468f1..1510c2aad137a65fe3de9b8e515c50dd001d5571 100644
--- a/app/code/Magento/Catalog/Model/Product.php
+++ b/app/code/Magento/Catalog/Model/Product.php
@@ -237,6 +237,11 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
      */
     protected $imageCacheFactory;
 
+    /**
+     * @var \Magento\Catalog\Api\ProductAttributeRepositoryInterface
+     */
+    protected $metadataService;
+
     /**
      * @var \Magento\Framework\Api\DataObjectHelper
      */
@@ -245,9 +250,10 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataService
      * @param Product\Url $url
      * @param Product\Link $productLink
      * @param Product\Configuration\Item\OptionFactory $itemOptionFactory
@@ -277,9 +283,10 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
+        \Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataService,
         Product\Url $url,
         Product\Link $productLink,
         \Magento\Catalog\Model\Product\Configuration\Item\OptionFactory $itemOptionFactory,
@@ -304,6 +311,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
         \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
         array $data = []
     ) {
+        $this->metadataService = $metadataService;
         $this->_itemOptionFactory = $itemOptionFactory;
         $this->_stockItemFactory = $stockItemFactory;
         $this->_optionInstance = $catalogProductOption;
@@ -327,7 +335,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $storeManager,
             $resource,
@@ -346,6 +354,17 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
         $this->_init('Magento\Catalog\Model\Resource\Product');
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    protected function getCustomAttributesCodes()
+    {
+        if ($this->customAttributesCodes === null) {
+            $this->customAttributesCodes = $this->getEavAttributesCodes($this->metadataService);
+        }
+        return $this->customAttributesCodes;
+    }
+
     /**
      * Retrieve Store Id
      *
@@ -2215,5 +2234,26 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
     {
         return $this->setData(self::TYPE_ID, $typeId);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Catalog\Api\Data\ProductExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Group.php b/app/code/Magento/Catalog/Model/Product/Attribute/Group.php
index 97a6572077121baa53401bac3b9b8d58c85ee848..7bbabfc9b3fc8c2b62cfbb7e95a76a0c8f54cc7c 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Group.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Group.php
@@ -20,7 +20,7 @@ class Group extends \Magento\Eav\Model\Entity\Attribute\Group
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeCollectionFactory
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
@@ -30,7 +30,7 @@ class Group extends \Magento\Eav\Model\Entity\Attribute\Group
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeCollectionFactory,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
@@ -41,7 +41,7 @@ class Group extends \Magento\Eav\Model\Entity\Attribute\Group
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php b/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php
index 03799df3732029c155c4c182a649d4b4df429575..49fdcf4a8a892783d3fde5fb652f67cfbf6eee2d 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php
@@ -44,11 +44,6 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
      */
     protected $filterManager;
 
-    /**
-     * @var \Magento\Framework\Api\Config\MetadataConfig
-     */
-    protected $metadataConfig;
-
     /**
      * @var \Magento\Framework\Api\SearchCriteriaBuilder
      */
@@ -66,7 +61,6 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
      * @param \Magento\Eav\Api\AttributeRepositoryInterface $eavAttributeRepository
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param \Magento\Eav\Model\Adminhtml\System\Config\Source\Inputtype\ValidatorFactory $validatorFactory
-     * @param \Magento\Framework\Api\Config\MetadataConfig $metadataConfig
      * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
      * @param \Magento\Framework\Api\FilterBuilder $filterBuilder
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -78,7 +72,6 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
         \Magento\Eav\Api\AttributeRepositoryInterface $eavAttributeRepository,
         \Magento\Eav\Model\Config $eavConfig,
         \Magento\Eav\Model\Adminhtml\System\Config\Source\Inputtype\ValidatorFactory $validatorFactory,
-        \Magento\Framework\Api\Config\MetadataConfig $metadataConfig,
         \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
         \Magento\Framework\Api\FilterBuilder $filterBuilder
     ) {
@@ -88,7 +81,6 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
         $this->eavAttributeRepository = $eavAttributeRepository;
         $this->eavConfig = $eavConfig;
         $this->inputtypeValidatorFactory = $validatorFactory;
-        $this->metadataConfig = $metadataConfig;
         $this->searchCriteriaBuilder = $searchCriteriaBuilder;
         $this->filterBuilder = $filterBuilder;
     }
@@ -213,6 +205,7 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
 
     /**
      * {@inheritdoc}
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function getCustomAttributesMetadata($dataObjectClassName = null)
     {
@@ -228,13 +221,7 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
             ]
         );
 
-        $customAttributes = [];
-        $entityAttributes = $this->getList($searchCriteria->create())->getItems();
-
-        foreach ($entityAttributes as $attributeMetadata) {
-            $customAttributes[] = $attributeMetadata;
-        }
-        return array_merge($customAttributes, $this->metadataConfig->getCustomAttributesMetadata($dataObjectClassName));
+        return $this->getList($searchCriteria->create())->getItems();
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Type.php b/app/code/Magento/Catalog/Model/Product/Attribute/Type.php
index f3935642a168c4cf16050825e508d9f3c0470be7..a809df6591d7c34a04951cd6d330636f07ff3c05 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Type.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Type.php
@@ -1,9 +1,9 @@
 <?php
 /**
- *
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Catalog\Model\Product\Attribute;
 
 /**
@@ -49,4 +49,26 @@ class Type extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::LABEL, $label);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductAttributeTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductAttributeTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductAttributeTypeExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/Entry.php b/app/code/Magento/Catalog/Model/Product/Gallery/Entry.php
index 116899bda07e86a3128494e4a134f45a687ee99e..54c8123415d9050806de6a0509cc1c51b4828696 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/Entry.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/Entry.php
@@ -6,11 +6,14 @@
  */
 namespace Magento\Catalog\Model\Product\Gallery;
 
+use Magento\Framework\Model\AbstractExtensibleModel;
+use Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface;
+use Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionInterface;
+
 /**
  * @codeCoverageIgnore
  */
-class Entry extends \Magento\Framework\Model\AbstractExtensibleModel implements
-    \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface
+class Entry extends AbstractExtensibleModel implements ProductAttributeMediaGalleryEntryInterface
 {
     /**
      * Retrieve gallery entry ID
@@ -46,9 +49,8 @@ class Entry extends \Magento\Framework\Model\AbstractExtensibleModel implements
      * Check if gallery entry is hidden from product page
      *
      * @return bool
-     * @SuppressWarnings(PHPMD.BooleanGetMethodName)
      */
-    public function getIsDisabled()
+    public function isDisabled()
     {
         return $this->getData(self::DISABLED);
     }
@@ -73,6 +75,14 @@ class Entry extends \Magento\Framework\Model\AbstractExtensibleModel implements
         return $this->getData(self::FILE);
     }
 
+    /**
+     * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface|null
+     */
+    public function getContent()
+    {
+        return $this->getData(self::CONTENT);
+    }
+
     /**
      * Set gallery entry alternative text
      *
@@ -98,12 +108,12 @@ class Entry extends \Magento\Framework\Model\AbstractExtensibleModel implements
     /**
      * Set whether gallery entry is hidden from product page
      *
-     * @param bool $isDisabled
+     * @param bool $disabled
      * @return $this
      */
-    public function setIsDisabled($isDisabled)
+    public function setDisabled($disabled)
     {
-        return $this->setData(self::DISABLED, $isDisabled);
+        return $this->setData(self::DISABLED, $disabled);
     }
 
     /**
@@ -127,4 +137,36 @@ class Entry extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::FILE, $file);
     }
+
+    /**
+     * Set media gallery content
+     *
+     * @param $content \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface
+     * @return $this
+     */
+    public function setContent($content)
+    {
+        return $this->setData(self::CONTENT, $content);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return ProductAttributeMediaGalleryEntryExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param ProductAttributeMediaGalleryEntryExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(ProductAttributeMediaGalleryEntryExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/GalleryManagement.php b/app/code/Magento/Catalog/Model/Product/Gallery/GalleryManagement.php
index 5e62c3b3efabad40b75def3f6236b88ede1525bc..1ed06f39bfa84a452223218604b8006f9c7b0569 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/GalleryManagement.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/GalleryManagement.php
@@ -6,14 +6,13 @@
  */
 namespace Magento\Catalog\Model\Product\Gallery;
 
-use Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface as ContentInterface;
 use Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface;
 use Magento\Catalog\Api\Data\ProductInterface as Product;
 use Magento\Catalog\Model\Product\Media\Config as MediaConfig;
+use Magento\Framework\App\Filesystem\DirectoryList;
 use Magento\Framework\Exception\InputException;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Framework\Exception\StateException;
-use Magento\Framework\App\Filesystem\DirectoryList;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -154,21 +153,21 @@ class GalleryManagement implements \Magento\Catalog\Api\ProductAttributeMediaGal
     /**
      * {@inheritdoc}
      */
-    public function create(
-        $productSku,
-        ProductAttributeMediaGalleryEntryInterface $entry,
-        ContentInterface $entryContent,
-        $storeId = 0
-    ) {
+    public function create($product)
+    {
         try {
-            $this->storeManager->getStore($storeId);
+            $this->storeManager->getStore($product->getStoreId());
         } catch (\Exception $exception) {
             throw new NoSuchEntityException(__('There is no store with provided ID.'));
         }
+        /** @var $entry ProductAttributeMediaGalleryEntryInterface */
+        $entry = $product->getCustomAttribute('media_gallery')->getValue();
+        $entryContent = $entry->getContent();
+
         if (!$this->contentValidator->isValid($entryContent)) {
             throw new InputException(__('The image content is not valid.'));
         }
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($product->getSku());
 
         $fileContent = @base64_decode($entryContent->getEntryData(), true);
         $mediaTmpPath = $this->mediaConfig->getBaseTmpMediaPath();
@@ -186,15 +185,18 @@ class GalleryManagement implements \Magento\Catalog\Api\ProductAttributeMediaGal
             $absoluteFilePath,
             $entry->getTypes(),
             true,
-            $entry->getIsDisabled()
+            $entry->isDisabled()
         );
         // Update additional fields that are still empty after addImage call
-        $productMediaGallery->updateImage($product, $imageFileUri, [
+        $productMediaGallery->updateImage(
+            $product,
+            $imageFileUri,
+            [
                 'label' => $entry->getLabel(),
                 'position' => $entry->getPosition(),
-                'disabled' => $entry->getIsDisabled(),
-            ]);
-        $product->setStoreId($storeId);
+                'disabled' => $entry->isDisabled(),
+            ]
+        );
 
         try {
             $this->productRepository->save($product);
@@ -213,14 +215,14 @@ class GalleryManagement implements \Magento\Catalog\Api\ProductAttributeMediaGal
     /**
      * {@inheritdoc}
      */
-    public function update($productSku, ProductAttributeMediaGalleryEntryInterface $entry, $storeId = 0)
+    public function update($sku, ProductAttributeMediaGalleryEntryInterface $entry, $storeId = 0)
     {
         try {
             $this->storeManager->getStore($storeId);
         } catch (\Exception $exception) {
             throw new NoSuchEntityException(__('There is no store with provided ID.'));
         }
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         /** @var $productMediaGallery \Magento\Catalog\Model\Product\Attribute\Backend\Media */
         $productMediaGallery = $this->getGalleryAttributeBackend($product);
         $filePath = $this->entryResolver->getEntryFilePathById($product, $entry->getId());
@@ -228,11 +230,15 @@ class GalleryManagement implements \Magento\Catalog\Api\ProductAttributeMediaGal
             throw new NoSuchEntityException(__('There is no image with provided ID.'));
         }
 
-        $productMediaGallery->updateImage($product, $filePath, [
-            'label' => $entry->getLabel(),
-            'position' => $entry->getPosition(),
-            'disabled' => $entry->getIsDisabled(),
-        ]);
+        $productMediaGallery->updateImage(
+            $product,
+            $filePath,
+            [
+                'label' => $entry->getLabel(),
+                'position' => $entry->getPosition(),
+                'disabled' => $entry->isDisabled(),
+            ]
+        );
         $productMediaGallery->clearMediaAttribute($product, array_keys($product->getMediaAttributes()));
         $productMediaGallery->setMediaAttribute($product, $entry->getTypes(), $filePath);
         $product->setStoreId($storeId);
@@ -248,9 +254,9 @@ class GalleryManagement implements \Magento\Catalog\Api\ProductAttributeMediaGal
     /**
      * {@inheritdoc}
      */
-    public function remove($productSku, $entryId)
+    public function remove($sku, $entryId)
     {
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         /** @var $productMediaGallery \Magento\Catalog\Model\Product\Attribute\Backend\Media */
         $productMediaGallery = $this->getGalleryAttributeBackend($product);
         $filePath = $this->entryResolver->getEntryFilePathById($product, $entryId);
@@ -266,10 +272,10 @@ class GalleryManagement implements \Magento\Catalog\Api\ProductAttributeMediaGal
     /**
      * {@inheritdoc}
      */
-    public function get($productSku, $imageId)
+    public function get($sku, $imageId)
     {
         try {
-            $product = $this->productRepository->get($productSku);
+            $product = $this->productRepository->get($sku);
         } catch (\Exception $exception) {
             throw new NoSuchEntityException(__('Such product doesn\'t exist'));
         }
@@ -298,11 +304,11 @@ class GalleryManagement implements \Magento\Catalog\Api\ProductAttributeMediaGal
     /**
      * {@inheritdoc}
      */
-    public function getList($productSku)
+    public function getList($sku)
     {
         $result = [];
         /** @var \Magento\Catalog\Model\Product $product */
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
 
         /** @var \Magento\Catalog\Api\Data\ProductAttributeInterface $galleryAttribute */
         $galleryAttribute = $this->attributeRepository->get('media_gallery');
@@ -318,7 +324,7 @@ class GalleryManagement implements \Magento\Catalog\Api\ProductAttributeMediaGal
             $entry->setId($image['value_id'])
                 ->setLabel($image['label_default'])
                 ->setTypes(array_keys($productImages, $image['file']))
-                ->setIsDisabled($image['disabled_default'])
+                ->setDisabled($image['disabled_default'])
                 ->setPosition($image['position_default'])
                 ->setFile($image['file']);
             $result[] = $entry;
diff --git a/app/code/Magento/Catalog/Model/Product/GroupPrice.php b/app/code/Magento/Catalog/Model/Product/GroupPrice.php
index 531546e1a4a086f55fc2d2170e23b1d882f91f01..740a2b1b976b47d16b07166bb7551220cf779dbf 100644
--- a/app/code/Magento/Catalog/Model/Product/GroupPrice.php
+++ b/app/code/Magento/Catalog/Model/Product/GroupPrice.php
@@ -61,4 +61,26 @@ class GroupPrice extends \Magento\Framework\Model\AbstractExtensibleModel implem
     {
         return $this->setData(self::KEY_VALUE, $value);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductGroupPriceExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductGroupPriceExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductGroupPriceExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/GroupPriceManagement.php b/app/code/Magento/Catalog/Model/Product/GroupPriceManagement.php
index de0c906c82f9978ee837ba4ed7e06fc62b59a33c..9dca54ee7ebd52fc62098ff3ab77c67f21eac864 100644
--- a/app/code/Magento/Catalog/Model/Product/GroupPriceManagement.php
+++ b/app/code/Magento/Catalog/Model/Product/GroupPriceManagement.php
@@ -72,13 +72,13 @@ class GroupPriceManagement implements \Magento\Catalog\Api\ProductGroupPriceMana
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
      */
-    public function add($productSku, $customerGroupId, $price)
+    public function add($sku, $customerGroupId, $price)
     {
         if (!\Zend_Validate::is($price, 'Float') || $price <= 0 || !\Zend_Validate::is($price, 'Float')) {
             throw new InputException(__('Please provide valid data'));
         }
         $customerGroup = $this->groupRepository->getById($customerGroupId);
-        $product = $this->productRepository->get($productSku, true);
+        $product = $this->productRepository->get($sku, true);
         $groupPrices = $product->getData('group_price');
         $websiteIdentifier = 0;
         $value = $this->config->getValue('catalog/price/scope', \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITE);
@@ -122,9 +122,9 @@ class GroupPriceManagement implements \Magento\Catalog\Api\ProductGroupPriceMana
     /**
      * {@inheritdoc}
      */
-    public function remove($productSku, $customerGroupId)
+    public function remove($sku, $customerGroupId)
     {
-        $product = $this->productRepository->get($productSku, true);
+        $product = $this->productRepository->get($sku, true);
         $websiteIdentifier = 0;
         $value = $this->config->getValue('catalog/price/scope', \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITE);
         if ($value != 0) {
@@ -137,9 +137,9 @@ class GroupPriceManagement implements \Magento\Catalog\Api\ProductGroupPriceMana
     /**
      * {@inheritdoc}
      */
-    public function getList($productSku, $websiteId = null)
+    public function getList($sku, $websiteId = null)
     {
-        $product = $this->productRepository->get($productSku, true);
+        $product = $this->productRepository->get($sku, true);
         $priceKey = 'website_price';
         $value = $this->config->getValue('catalog/price/scope', \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITE);
         if ($value == 0) {
diff --git a/app/code/Magento/Catalog/Model/Product/Media/GalleryEntryContent.php b/app/code/Magento/Catalog/Model/Product/Media/GalleryEntryContent.php
index 4844a001a86add8567c691a387fa875049f7709e..48c0b4dc10739a0c8902656999fc856e701ca841 100644
--- a/app/code/Magento/Catalog/Model/Product/Media/GalleryEntryContent.php
+++ b/app/code/Magento/Catalog/Model/Product/Media/GalleryEntryContent.php
@@ -1,9 +1,9 @@
 <?php
 /**
- *
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Catalog\Model\Product\Media;
 
 /**
@@ -68,4 +68,26 @@ class GalleryEntryContent extends \Magento\Framework\Model\AbstractExtensibleMod
     {
         return $this->setData(self::NAME, $name);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Option.php b/app/code/Magento/Catalog/Model/Product/Option.php
index a6ba38bc1703dbb1becb1ea4404385ccdd81a757..3afdf86af8f964579c65ced1115c779102f3a8c7 100644
--- a/app/code/Magento/Catalog/Model/Product/Option.php
+++ b/app/code/Magento/Catalog/Model/Product/Option.php
@@ -9,11 +9,9 @@
 namespace Magento\Catalog\Model\Product;
 
 use Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface;
-use Magento\Framework\Model\AbstractExtensibleModel;
 use Magento\Catalog\Model\Product;
 use Magento\Catalog\Model\Resource\Product\Option\Value\Collection;
 use Magento\Catalog\Pricing\Price\BasePrice;
-use Magento\Framework\Api\AttributeValueFactory;
 use Magento\Framework\Model\AbstractModel;
 use Magento\Framework\Exception\LocalizedException;
 
@@ -28,7 +26,7 @@ use Magento\Framework\Exception\LocalizedException;
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  * @SuppressWarnings(PHPMD.ExcessivePublicCount)
  */
-class Option extends AbstractExtensibleModel implements \Magento\Catalog\Api\Data\ProductCustomOptionInterface
+class Option extends AbstractModel implements \Magento\Catalog\Api\Data\ProductCustomOptionInterface
 {
     const OPTION_GROUP_TEXT = 'text';
 
@@ -118,8 +116,6 @@ class Option extends AbstractExtensibleModel implements \Magento\Catalog\Api\Dat
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
      * @param Option\Value $productOptionValue
      * @param Option\Type\Factory $optionFactory
      * @param \Magento\Framework\Stdlib\String $string
@@ -132,8 +128,6 @@ class Option extends AbstractExtensibleModel implements \Magento\Catalog\Api\Dat
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
         Option\Value $productOptionValue,
         \Magento\Catalog\Model\Product\Option\Type\Factory $optionFactory,
         \Magento\Framework\Stdlib\String $string,
@@ -149,8 +143,6 @@ class Option extends AbstractExtensibleModel implements \Magento\Catalog\Api\Dat
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
-            $customAttributeFactory,
             $resource,
             $resourceCollection,
             $data
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Repository.php b/app/code/Magento/Catalog/Model/Product/Option/Repository.php
index 90cd0dac8f12724f647e4508d4428b620e6d7dff..4d5103958d55dc2828b4350716a48ce0a0f94981 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Repository.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Repository.php
@@ -44,18 +44,18 @@ class Repository implements \Magento\Catalog\Api\ProductCustomOptionRepositoryIn
     /**
      * {@inheritdoc}
      */
-    public function getList($productSku)
+    public function getList($sku)
     {
-        $product = $this->productRepository->get($productSku, true);
+        $product = $this->productRepository->get($sku, true);
         return $product->getOptions();
     }
 
     /**
      * {@inheritdoc}
      */
-    public function get($productSku, $optionId)
+    public function get($sku, $optionId)
     {
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         $option = $product->getOptionById($optionId);
         if (is_null($option)) {
             throw NoSuchEntityException::singleField('optionId', $optionId);
@@ -77,8 +77,8 @@ class Repository implements \Magento\Catalog\Api\ProductCustomOptionRepositoryIn
      */
     public function save(\Magento\Catalog\Api\Data\ProductCustomOptionInterface $option)
     {
-        $productSku = $option->getProductSku();
-        $product = $this->productRepository->get($productSku, true);
+        $sku = $option->getProductSku();
+        $product = $this->productRepository->get($sku, true);
         $optionData = $this->converter->toArray($option);
         if ($option->getOptionId()) {
             if (!$product->getOptionById($option->getOptionId())) {
@@ -100,7 +100,7 @@ class Repository implements \Magento\Catalog\Api\ProductCustomOptionRepositoryIn
             throw new CouldNotSaveException(__('Could not save product option'));
         }
 
-        $product = $this->productRepository->get($productSku, true);
+        $product = $this->productRepository->get($sku, true);
         if (!$option->getOptionId()) {
             $currentOptions = $product->getOptions();
 
@@ -112,16 +112,16 @@ class Repository implements \Magento\Catalog\Api\ProductCustomOptionRepositoryIn
         } else {
             $newID = $option->getOptionId();
         }
-        $option = $this->get($productSku, $newID);
+        $option = $this->get($sku, $newID);
         return $option;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function deleteByIdentifier($productSku, $optionId)
+    public function deleteByIdentifier($sku, $optionId)
     {
-        $product = $this->productRepository->get($productSku, true);
+        $product = $this->productRepository->get($sku, true);
         $options = $product->getOptions();
         $option = $product->getOptionById($optionId);
         if (is_null($option)) {
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type.php b/app/code/Magento/Catalog/Model/Product/Option/Type.php
index cb69c24a1c8ee27f32df3ac87c4bbbbc44b3b7cc..045bb591e8b3ea86e53f2db46c79c1ab3b54550e 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Type.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Type.php
@@ -82,4 +82,26 @@ class Type extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::KEY_GROUP, $group);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductCustomOptionTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductCustomOptionTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductCustomOptionTypeExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Value.php b/app/code/Magento/Catalog/Model/Product/Option/Value.php
index 37f706b2a8163bc125810af9deae309bf33ff413..227f070a683e75e67bf464442b8c5c5c35b7381e 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Value.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Value.php
@@ -8,10 +8,9 @@
 
 namespace Magento\Catalog\Model\Product\Option;
 
-use Magento\Framework\Model\AbstractExtensibleModel;
+use Magento\Framework\Model\AbstractModel;
 use Magento\Catalog\Model\Product;
 use Magento\Catalog\Model\Product\Option;
-use Magento\Framework\Api\AttributeValueFactory;
 
 /**
  * Catalog product option select type model
@@ -23,7 +22,7 @@ use Magento\Framework\Api\AttributeValueFactory;
  *
  * @SuppressWarnings(PHPMD.LongVariable)
  */
-class Value extends AbstractExtensibleModel implements \Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface
+class Value extends AbstractModel implements \Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface
 {
     /**
      * Option type percent
@@ -66,8 +65,6 @@ class Value extends AbstractExtensibleModel implements \Magento\Catalog\Api\Data
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Catalog\Model\Resource\Product\Option\Value\CollectionFactory $valueCollectionFactory
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
@@ -76,8 +73,6 @@ class Value extends AbstractExtensibleModel implements \Magento\Catalog\Api\Data
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
         \Magento\Catalog\Model\Resource\Product\Option\Value\CollectionFactory $valueCollectionFactory,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
@@ -87,8 +82,6 @@ class Value extends AbstractExtensibleModel implements \Magento\Catalog\Api\Data
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
-            $customAttributeFactory,
             $resource,
             $resourceCollection,
             $data
diff --git a/app/code/Magento/Catalog/Model/Product/TierPrice.php b/app/code/Magento/Catalog/Model/Product/TierPrice.php
index 6bc86d069d488df581917d40dac7a344791b2f39..4f28981a036f82c1da0c118483cd3f1bc5a1fb8f 100644
--- a/app/code/Magento/Catalog/Model/Product/TierPrice.php
+++ b/app/code/Magento/Catalog/Model/Product/TierPrice.php
@@ -54,4 +54,26 @@ class TierPrice extends \Magento\Framework\Model\AbstractExtensibleModel impleme
     {
         return $this->setData(self::VALUE, $value);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductTierPriceExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductTierPriceExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductTierPriceExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/TierPriceManagement.php b/app/code/Magento/Catalog/Model/Product/TierPriceManagement.php
index 472381bd4e27ef0a1d5bf836465c89356582800d..73ae4f96ea9becf98147146a80eb2b87286b2695 100644
--- a/app/code/Magento/Catalog/Model/Product/TierPriceManagement.php
+++ b/app/code/Magento/Catalog/Model/Product/TierPriceManagement.php
@@ -85,12 +85,12 @@ class TierPriceManagement implements \Magento\Catalog\Api\ProductTierPriceManage
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
      */
-    public function add($productSku, $customerGroupId, $price, $qty)
+    public function add($sku, $customerGroupId, $price, $qty)
     {
         if (!\Zend_Validate::is($price, 'Float') || $price <= 0 || !\Zend_Validate::is($qty, 'Float') || $qty <= 0) {
             throw new InputException(__('Please provide valid data'));
         }
-        $product = $this->productRepository->get($productSku, ['edit_mode' => true]);
+        $product = $this->productRepository->get($sku, ['edit_mode' => true]);
         $tierPrices = $product->getData('tier_price');
         $websiteIdentifier = 0;
         $value = $this->config->getValue('catalog/price/scope', \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITE);
@@ -145,9 +145,9 @@ class TierPriceManagement implements \Magento\Catalog\Api\ProductTierPriceManage
     /**
      * {@inheritdoc}
      */
-    public function remove($productSku, $customerGroupId, $qty)
+    public function remove($sku, $customerGroupId, $qty)
     {
-        $product = $this->productRepository->get($productSku, ['edit_mode' => true]);
+        $product = $this->productRepository->get($sku, ['edit_mode' => true]);
         $websiteIdentifier = 0;
         $value = $this->config->getValue('catalog/price/scope', \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITE);
         if ($value != 0) {
@@ -160,9 +160,9 @@ class TierPriceManagement implements \Magento\Catalog\Api\ProductTierPriceManage
     /**
      * {@inheritdoc}
      */
-    public function getList($productSku, $customerGroupId)
+    public function getList($sku, $customerGroupId)
     {
-        $product = $this->productRepository->get($productSku, ['edit_mode' => true]);
+        $product = $this->productRepository->get($sku, ['edit_mode' => true]);
 
         $priceKey = 'website_price';
         $value = $this->config->getValue('catalog/price/scope', \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITE);
diff --git a/app/code/Magento/Catalog/Model/ProductLink/Attribute.php b/app/code/Magento/Catalog/Model/ProductLink/Attribute.php
index 2a2f15daa3d3856fa5aa14cf447a99f35d791253..ede2f7e22ebc204a430ca75884ab9a726df43510 100644
--- a/app/code/Magento/Catalog/Model/ProductLink/Attribute.php
+++ b/app/code/Magento/Catalog/Model/ProductLink/Attribute.php
@@ -57,4 +57,26 @@ class Attribute extends \Magento\Framework\Api\AbstractExtensibleObject implemen
     {
         return $this->setData(self::KEY_TYPE, $type);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductLinkAttributeExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductLinkAttributeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductLinkAttributeExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/ProductLink/Link.php b/app/code/Magento/Catalog/Model/ProductLink/Link.php
index e105ca4317652fdbb2bfb2ba6384ff1adf58d442..84fdd67df676b354d497de50667e43d0b949ea26 100644
--- a/app/code/Magento/Catalog/Model/ProductLink/Link.php
+++ b/app/code/Magento/Catalog/Model/ProductLink/Link.php
@@ -167,4 +167,30 @@ class Link extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::KEY_POSITION, $position);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductLinkExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        if (!$this->_getExtensionAttributes()) {
+            $this->setExtensionAttributes(
+                $this->extensionAttributesFactory->create('Magento\Catalog\Model\ProductLink\Link')
+            );
+        }
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductLinkExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Catalog\Api\Data\ProductLinkExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/ProductLink/Management.php b/app/code/Magento/Catalog/Model/ProductLink/Management.php
index 306d476f47cca3d765cdee9646ce91cbd3d41e1e..558561d22de50af6f402f9201a6138aaba441496 100644
--- a/app/code/Magento/Catalog/Model/ProductLink/Management.php
+++ b/app/code/Magento/Catalog/Model/ProductLink/Management.php
@@ -70,10 +70,10 @@ class Management implements \Magento\Catalog\Api\ProductLinkManagementInterface
     /**
      * {@inheritdoc}
      */
-    public function getLinkedItemsByType($productSku, $type)
+    public function getLinkedItemsByType($sku, $type)
     {
         $output = [];
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         try {
             $collection = $this->entityCollectionProvider->getCollection($product, $type);
         } catch (NoSuchEntityException $e) {
@@ -89,10 +89,7 @@ class Management implements \Magento\Catalog\Api\ProductLinkManagementInterface
                 ->setPosition($item['position']);
             if (isset($item['custom_attributes'])) {
                 foreach ($item['custom_attributes'] as $option) {
-                    $productLink->setCustomAttribute(
-                        $option['attribute_code'],
-                        $option['value']
-                    );
+                    $productLink->getExtensionAttributes()->setQty($option['value']);
                 }
             }
             $output[] = $productLink;
@@ -103,7 +100,7 @@ class Management implements \Magento\Catalog\Api\ProductLinkManagementInterface
     /**
      * {@inheritdoc}
      */
-    public function setProductLinks($productSku, $type, array $items)
+    public function setProductLinks($sku, $type, array $items)
     {
         $linkTypes = $this->linkTypeProvider->getLinkTypes();
 
@@ -113,7 +110,7 @@ class Management implements \Magento\Catalog\Api\ProductLinkManagementInterface
             );
         }
 
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         $assignedSkuList = [];
         /** @var \Magento\Catalog\Api\Data\ProductLinkInterface $link */
         foreach ($items as $link) {
diff --git a/app/code/Magento/Catalog/Model/ProductLink/Repository.php b/app/code/Magento/Catalog/Model/ProductLink/Repository.php
index e93b41ff0375972cd500cf5b0d668eae780fb092..282d14bb2c243d74792c7ed4e647af56812bcfcf 100644
--- a/app/code/Magento/Catalog/Model/ProductLink/Repository.php
+++ b/app/code/Magento/Catalog/Model/ProductLink/Repository.php
@@ -34,21 +34,31 @@ class Repository implements \Magento\Catalog\Api\ProductLinkRepositoryInterface
     protected $linkManagement;
 
     /**
+     * @var \Magento\Framework\Reflection\DataObjectProcessor
+     */
+    protected $dataObjectProcessor;
+
+    /**
+     * Initialize dependencies.
+     *
      * @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
      * @param CollectionProvider $entityCollectionProvider
      * @param LinksInitializer $linkInitializer
      * @param Management $linkManagement
+     * @param \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor
      */
     public function __construct(
         \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
         \Magento\Catalog\Model\ProductLink\CollectionProvider $entityCollectionProvider,
         \Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $linkInitializer,
-        \Magento\Catalog\Model\ProductLink\Management $linkManagement
+        \Magento\Catalog\Model\ProductLink\Management $linkManagement,
+        \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor
     ) {
         $this->productRepository = $productRepository;
         $this->entityCollectionProvider = $entityCollectionProvider;
         $this->linkInitializer = $linkInitializer;
         $this->linkManagement = $linkManagement;
+        $this->dataObjectProcessor = $dataObjectProcessor;
     }
 
     /**
@@ -59,11 +69,16 @@ class Repository implements \Magento\Catalog\Api\ProductLinkRepositoryInterface
         $linkedProduct = $this->productRepository->get($entity->getLinkedProductSku());
         $product = $this->productRepository->get($entity->getProductSku());
         $links = $this->entityCollectionProvider->getCollection($product, $entity->getLinkType());
-
+        $extensions = $this->dataObjectProcessor->buildOutputDataArray(
+            $entity->getExtensionAttributes(),
+            'Magento\Catalog\Api\Data\ProductLinkExtensionInterface'
+        );
+        $extensions = is_array($extensions) ? $extensions : [];
         $data = $entity->__toArray();
-        foreach ($entity->getCustomAttributes() as $attribute) {
-            $data[$attribute->getAttributeCode()] = $attribute->getValue();
+        foreach ($extensions as $attributeCode => $attribute) {
+            $data[$attributeCode] = $attribute;
         }
+        unset($data['extension_attributes']);
         $data['product_id'] = $linkedProduct->getId();
         $links[$linkedProduct->getId()] = $data;
         $this->linkInitializer->initializeLinks($product, [$entity->getLinkType() => $links]);
@@ -108,9 +123,9 @@ class Repository implements \Magento\Catalog\Api\ProductLinkRepositoryInterface
     /**
      * {@inheritdoc}
      */
-    public function deleteById($productSku, $type, $linkedProductSku)
+    public function deleteById($sku, $type, $linkedProductSku)
     {
-        $linkItems = $this->linkManagement->getLinkedItemsByType($productSku, $type);
+        $linkItems = $this->linkManagement->getLinkedItemsByType($sku, $type);
         /** @var \Magento\Catalog\Api\Data\ProductLinkInterface $linkItem */
         foreach ($linkItems as $linkItem) {
             if ($linkItem->getLinkedProductSku() == $linkedProductSku) {
@@ -121,7 +136,7 @@ class Repository implements \Magento\Catalog\Api\ProductLinkRepositoryInterface
             __(
                 'Product %1 doesn\'t have linked %2 as %3',
                 [
-                    $productSku,
+                    $sku,
                     $linkedProductSku,
                     $type
                 ]
diff --git a/app/code/Magento/Catalog/Model/ProductLink/Type.php b/app/code/Magento/Catalog/Model/ProductLink/Type.php
index 493bece24b31469e1b6d35608335a710949ec1f7..278662033f544a84c4121449205c05473f7a76f4 100644
--- a/app/code/Magento/Catalog/Model/ProductLink/Type.php
+++ b/app/code/Magento/Catalog/Model/ProductLink/Type.php
@@ -57,4 +57,26 @@ class Type extends \Magento\Framework\Api\AbstractExtensibleObject implements Pr
     {
         return $this->setData(self::KEY_NAME, $name);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductLinkTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductLinkTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductLinkTypeExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index 29eea2681c40df8de1ffcb39cacbd5535c8f63cb..ae3fd0df2e6c8a4f5963957eead7caff999ba57f 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -76,6 +76,11 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      */
     protected $eavConfig;
 
+    /**
+     * @var \Magento\Framework\Api\ExtensibleDataObjectConverter
+     */
+    protected $extensibleDataObjectConverter;
+
     /**
      * @param ProductFactory $productFactory
      * @param \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $initializationHelper
@@ -86,6 +91,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      * @param Resource\Product $resourceModel
      * @param \Magento\Framework\Api\FilterBuilder $filterBuilder
      * @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataServiceInterface
+     * @param \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter
      * @param \Magento\Eav\Model\Config $eavConfig
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
@@ -99,6 +105,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         \Magento\Catalog\Model\Resource\Product $resourceModel,
         \Magento\Framework\Api\FilterBuilder $filterBuilder,
         \Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataServiceInterface,
+        \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter,
         \Magento\Eav\Model\Config $eavConfig
     ) {
         $this->productFactory = $productFactory;
@@ -110,6 +117,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         $this->attributeRepository = $attributeRepository;
         $this->filterBuilder = $filterBuilder;
         $this->metadataService = $metadataServiceInterface;
+        $this->extensibleDataObjectConverter = $extensibleDataObjectConverter;
         $this->eavConfig = $eavConfig;
     }
 
@@ -210,8 +218,16 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      */
     public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false)
     {
+        if ($saveOptions) {
+            $productOptions = $product->getProductOptions();
+        }
+        $groupPrices = $product->getData('group_price');
+        $tierPrices = $product->getData('tier_price');
+
         $productId = $this->resourceModel->getIdBySku($product->getSku());
-        $product = $this->initializeProductData($product->toFlatArray(), empty($productId));
+        $productDataArray = $this->extensibleDataObjectConverter
+            ->toNestedArray($product, [], 'Magento\Catalog\Api\Data\ProductInterface');
+        $product = $this->initializeProductData($productDataArray, empty($productId));
         $validationResult = $this->resourceModel->validate($product);
         if (true !== $validationResult) {
             throw new \Magento\Framework\Exception\CouldNotSaveException(
@@ -220,8 +236,11 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         }
         try {
             if ($saveOptions) {
+                $product->setProductOptions($productOptions);
                 $product->setCanSaveCustomOptions(true);
             }
+            $product->setData('group_price', $groupPrices);
+            $product->setData('tier_price', $tierPrices);
             $this->resourceModel->save($product);
         } catch (\Magento\Eav\Model\Entity\Attribute\Exception $exception) {
             throw \Magento\Framework\Exception\InputException::invalidFieldValue(
@@ -242,16 +261,16 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      */
     public function delete(\Magento\Catalog\Api\Data\ProductInterface $product)
     {
-        $productSku = $product->getSku();
+        $sku = $product->getSku();
         $productId = $product->getId();
         try {
             $this->resourceModel->delete($product);
         } catch (\Exception $e) {
             throw new \Magento\Framework\Exception\StateException(
-                __('Unable to remove product %1', $productSku)
+                __('Unable to remove product %1', $sku)
             );
         }
-        unset($this->instances[$productSku]);
+        unset($this->instances[$sku]);
         unset($this->instancesById[$productId]);
         return true;
     }
@@ -259,9 +278,9 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
     /**
      * {@inheritdoc}
      */
-    public function deleteById($productSku)
+    public function deleteById($sku)
     {
-        $product = $this->get($productSku);
+        $product = $this->get($sku);
         return $this->delete($product);
     }
 
diff --git a/app/code/Magento/Catalog/Model/ProductType.php b/app/code/Magento/Catalog/Model/ProductType.php
index 2f5f266b2a6a0cf44456353cdf94252cf87f3bc3..ba9a7e5c4150d092bf100967d2ebc9599404f983 100644
--- a/app/code/Magento/Catalog/Model/ProductType.php
+++ b/app/code/Magento/Catalog/Model/ProductType.php
@@ -58,4 +58,26 @@ class ProductType extends \Magento\Framework\Api\AbstractExtensibleObject implem
     {
         return $this->setData(self::KEY_LABEL, $label);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Catalog\Api\Data\ProductTypeExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Catalog\Api\Data\ProductTypeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Catalog\Api\Data\ProductTypeExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Resource/Eav/Attribute.php b/app/code/Magento/Catalog/Model/Resource/Eav/Attribute.php
index 549772afe379118526a09896ce2a9929daa5d0f9..63b02e7e2308251a9a66f489806f2f5ef0c783e7 100644
--- a/app/code/Magento/Catalog/Model/Resource/Eav/Attribute.php
+++ b/app/code/Magento/Catalog/Model/Resource/Eav/Attribute.php
@@ -23,6 +23,7 @@ use Magento\Framework\Api\AttributeValueFactory;
  * @method int setSearchWeight(int $value)
  * @method \Magento\Catalog\Model\Resource\Eav\Attribute getIsUsedForPriceRules()
  * @method int setIsUsedForPriceRules(int $value)
+ * @method \Magento\Eav\Api\Data\AttributeExtensionInterface getExtensionAttributes()
  *
  * @author      Magento Core Team <core@magentocommerce.com>
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -88,7 +89,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute implements
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param \Magento\Eav\Model\Entity\TypeFactory $eavTypeFactory
@@ -113,7 +114,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute implements
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Eav\Model\Config $eavConfig,
         \Magento\Eav\Model\Entity\TypeFactory $eavTypeFactory,
@@ -141,7 +142,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute implements
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $eavConfig,
             $eavTypeFactory,
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Category/AttributeRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Category/AttributeRepositoryTest.php
index ffba8e8113717a370bd4cd1823ce7dd16136f3c7..c2c63a0ed168c2dab56f20bf9044fd9310bed2fa 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Category/AttributeRepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Category/AttributeRepositoryTest.php
@@ -34,11 +34,6 @@ class AttributeRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $attributeRepositoryMock;
 
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataConfigMock;
-
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
@@ -57,8 +52,6 @@ class AttributeRepositoryTest extends \PHPUnit_Framework_TestCase
             $this->getMock('Magento\Framework\Api\FilterBuilder', [], [], '', false);
         $this->attributeRepositoryMock =
             $this->getMock('Magento\Eav\Api\AttributeRepositoryInterface', [], [], '', false);
-        $this->metadataConfigMock =
-            $this->getMock('Magento\Framework\Api\Config\MetadataConfig', [], [], '', false);
         $this->searchResultMock =
             $this->getMock(
                 'Magento\Framework\Api\SearchResultsInterface',
@@ -80,7 +73,6 @@ class AttributeRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->model = (new ObjectManager($this))->getObject(
             'Magento\Catalog\Model\Category\AttributeRepository',
             [
-                'metadataConfig' => $this->metadataConfigMock,
                 'searchCriteriaBuilder' => $this->searchBuilderMock,
                 'filterBuilder' => $this->filterBuilderMock,
                 'eavAttributeRepository' => $this->attributeRepositoryMock,
@@ -131,9 +123,7 @@ class AttributeRepositoryTest extends \PHPUnit_Framework_TestCase
             $searchCriteriaMock
         )->willReturn($this->searchResultMock);
         $this->searchResultMock->expects($this->once())->method('getItems')->willReturn([$itemMock]);
-        $this->metadataConfigMock->expects($this->once())
-            ->method('getCustomAttributesMetadata')->with(null)->willReturn(['attribute']);
-        $expected = array_merge([$itemMock], ['attribute']);
+        $expected = [$itemMock];
 
         $this->assertEquals($expected, $this->model->getCustomAttributesMetadata(null));
     }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Entity/AttributeTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Entity/AttributeTest.php
index 0ecf9b024aa0704ace1dfca1bdca098d9e8a5402..ca53d6b6fec5f0d7b2276692bdb65bd86a88b0d8 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Entity/AttributeTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Entity/AttributeTest.php
@@ -4,6 +4,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 namespace Magento\Catalog\Test\Unit\Model\Entity;
 
 use Magento\Catalog\Model\Entity\Attribute;
@@ -114,6 +116,11 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
      */
     private $dataObjectHelperMock;
 
+    /**
+     * @var \Magento\Framework\Api\ExtensionAttributesFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $extensionAttributesFactory;
+
     protected function setUp()
     {
         $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Context')
@@ -124,6 +131,9 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
             ->getMock();
         $this->metadataServiceMock = $this->getMockBuilder('Magento\Framework\Api\MetadataServiceInterface')
             ->getMock();
+        $this->extensionAttributesFactory = $this->getMockBuilder('Magento\Framework\Api\ExtensionAttributesFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
         $this->attributeValueFactoryMock = $this->getMockBuilder('Magento\Framework\Api\AttributeValueFactory')
             ->disableOriginalConstructor()
             ->getMock();
@@ -181,7 +191,7 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
         $this->attribute = new Attribute(
             $this->contextMock,
             $this->registryMock,
-            $this->metadataServiceMock,
+            $this->extensionAttributesFactory,
             $this->attributeValueFactoryMock,
             $this->configMock,
             $this->typeFactoryMock,
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ObserverTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ObserverTest.php
index d9d783495bd1332cd1d432a201e86e8b0b8969ea..5da2e23ba4b8268b5ec9b21a8b910a6c75597a46 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ObserverTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ObserverTest.php
@@ -4,6 +4,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 namespace Magento\Catalog\Test\Unit\Model;
 
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
@@ -63,7 +65,6 @@ class ObserverTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $this->_observer = (new ObjectManager($this))->getObject('Magento\Catalog\Model\Observer', [
-            'urlFactory' => $this->_getCleanMock('\Magento\Catalog\Model\UrlFactory'),
             'categoryResource' => $this->_getCleanMock('\Magento\Catalog\Model\Resource\Category'),
             'catalogProduct' => $this->_getCleanMock('\Magento\Catalog\Model\Resource\Product'),
             'storeManager' => $this->_storeManager,
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/RepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/RepositoryTest.php
index 96744e487a0ddc76ed0ae8121e46e2233a152606..0689f5062dcca1d5ab7f07efd57b35de33e81b6d 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/RepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/RepositoryTest.php
@@ -87,8 +87,6 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             [],
             '',
             false);
-        $this->metadataConfigMock =
-            $this->getMock('Magento\Framework\Api\Config\MetadataConfig', [], [], '', false);
         $this->searchCriteriaBuilderMock =
             $this->getMock('Magento\Framework\Api\SearchCriteriaBuilder', [], [], '', false);
         $this->filterBuilderMock =
@@ -116,7 +114,6 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
             $this->eavAttributeRepositoryMock,
             $this->eavConfigMock,
             $this->validatorFactoryMock,
-            $this->metadataConfigMock,
             $this->searchCriteriaBuilderMock,
             $this->filterBuilderMock
         );
@@ -196,11 +193,7 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
                 $searchCriteriaMock
             )->willReturn($this->searchResultMock);
         $this->searchResultMock->expects($this->once())->method('getItems')->willReturn([$itemMock]);
-        $this->metadataConfigMock->expects($this->once())
-            ->method('getCustomAttributesMetadata')
-            ->with(null)
-            ->willReturn(['Attribute metadata']);
-        $expected = array_merge([$itemMock], ['Attribute metadata']);
+        $expected = [$itemMock];
 
         $this->assertEquals($expected, $this->model->getCustomAttributesMetadata());
     }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/GalleryManagementTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/GalleryManagementTest.php
index 1d5e2965e56891741975efd17a09321020095e1f..8da00cc15b23018240ae436100afdefd3019671e 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/GalleryManagementTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/GalleryManagementTest.php
@@ -4,6 +4,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Catalog\Test\Unit\Model\Product\Gallery;
 
 class GalleryManagementTest extends \PHPUnit_Framework_TestCase
@@ -68,6 +71,11 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
      */
     protected $dataObjectHelperMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Api\AttributeValue
+     */
+    protected $attributeValueMock;
+
     protected function setUp()
     {
         $this->storeManagerMock = $this->getMock('\Magento\Store\Model\StoreManagerInterface');
@@ -108,7 +116,17 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
         );
         $this->productMock = $this->getMock(
             '\Magento\Catalog\Model\Product',
-            ['getTypeInstance', 'getSetAttributes', 'setStoreId', 'getMediaAttributes', 'getMediaGallery', 'getData'],
+            [
+                'getTypeInstance',
+                'getSetAttributes',
+                'setStoreId',
+                'getMediaAttributes',
+                'getMediaGallery',
+                'getData',
+                'getStoreId',
+                'getSku',
+                'getCustomAttribute'
+            ],
             [],
             '',
             false
@@ -125,6 +143,9 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
             $this->mediaGalleryMock,
             $this->dataObjectHelperMock
         );
+        $this->attributeValueMock = $this->getMockBuilder('\Magento\Framework\Api\AttributeValue')
+            ->disableOriginalConstructor()
+            ->getMock();
     }
 
     /**
@@ -133,16 +154,9 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
      */
     public function testCreateWithNoStoreException()
     {
-        $productSku = 'mediaProduct';
-        $storeId = 0;
-        $entryMock = $this->getMock('\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface');
-        $entryContentMock = $this->getMock(
-            '\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface'
-        );
-        $this->storeManagerMock->expects($this->once())->method('getStore')->with($storeId)
+        $this->storeManagerMock->expects($this->once())->method('getStore')
             ->willThrowException(new \Exception());
-        $this->entryResolverMock->expects($this->never())->method('getEntryIdByFilePath');
-        $this->model->create($productSku, $entryMock, $entryContentMock, $storeId);
+        $this->model->create($this->productMock);
     }
 
     /**
@@ -151,17 +165,26 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
      */
     public function testCreateWithInvalidImageException()
     {
-        $productSku = 'mediaProduct';
-        $storeId = 0;
         $entryMock = $this->getMock('\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface');
         $entryContentMock = $this->getMock(
             '\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface'
         );
+        $entryMock->expects($this->any())->method('getContent')->willReturn($entryContentMock);
+        $this->attributeValueMock->expects($this->any())->method('getValue')->willReturn($entryMock);
+
+        $storeId = 0;
+        $this->productMock->expects($this->any())->method('getStoreId')->willReturn($storeId);
+        $this->productMock->expects($this->any())
+            ->method('getCustomAttribute')
+            ->with('media_gallery')
+            ->willReturn($this->attributeValueMock);
+
         $this->storeManagerMock->expects($this->once())->method('getStore')->with($storeId);
         $this->contentValidatorMock->expects($this->once())->method('isValid')->with($entryContentMock)
             ->willReturn(false);
         $this->entryResolverMock->expects($this->never())->method('getEntryIdByFilePath');
-        $this->model->create($productSku, $entryMock, $entryContentMock, $storeId);
+
+        $this->model->create($this->productMock);
     }
 
     /**
@@ -171,11 +194,24 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
     public function testCreateWithProductWithoutImagesSupport()
     {
         $productSku = 'mediaProduct';
-        $storeId = 0;
         $entryMock = $this->getMock('\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface');
         $entryContentMock = $this->getMock(
             '\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface'
         );
+        $entryMock->expects($this->any())->method('getContent')->willReturn($entryContentMock);
+        $this->attributeValueMock->expects($this->any())->method('getValue')->willReturn($entryMock);
+
+        $storeId = 0;
+        $this->productMock->expects($this->any())->method('getStoreId')->willReturn($storeId);
+        $this->productMock->expects($this->any())->method('getSku')->willReturn($productSku);
+        $this->productMock->expects($this->any())
+            ->method('getCustomAttribute')
+            ->with('media_gallery')
+            ->willReturn($this->attributeValueMock);
+
+        $this->storeManagerMock->expects($this->once())->method('getStore')->with($storeId);
+        $this->entryResolverMock->expects($this->never())->method('getEntryIdByFilePath');
+
         $writeInterfaceMock = $this->getMock('\Magento\Framework\Filesystem\Directory\WriteInterface');
         $entryData = 'entryData';
         $mediaTmpPath = '/media/tmp/path';
@@ -200,7 +236,7 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
         $this->productMock->expects($this->once())->method('getSetAttributes')->with($this->productMock)
             ->willReturn([]);
         $this->entryResolverMock->expects($this->never())->method('getEntryIdByFilePath');
-        $this->model->create($productSku, $entryMock, $entryContentMock, $storeId);
+        $this->model->create($this->productMock);
     }
 
     /**
@@ -210,13 +246,23 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
     public function testCreateWithCannotSaveException()
     {
         $productSku = 'mediaProduct';
-        $storeId = 0;
-        $entryPosition = 'entryPosition';
-        $absolutePath = 'absolute/path';
         $entryMock = $this->getMock('\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface');
         $entryContentMock = $this->getMock(
             '\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface'
         );
+        $entryMock->expects($this->any())->method('getContent')->willReturn($entryContentMock);
+        $this->attributeValueMock->expects($this->any())->method('getValue')->willReturn($entryMock);
+
+        $storeId = 0;
+        $this->productMock->expects($this->any())->method('getStoreId')->willReturn($storeId);
+        $this->productMock->expects($this->any())->method('getSku')->willReturn($productSku);
+        $this->productMock->expects($this->any())
+            ->method('getCustomAttribute')
+            ->with('media_gallery')
+            ->willReturn($this->attributeValueMock);
+
+        $entryPosition = 'entryPosition';
+        $absolutePath = 'absolute/path';
         $productMediaGalleryMock = $this->getMock(
             '\Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend',
             ['addImage', 'updateImage'],
@@ -252,7 +298,7 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
             ->willReturn(['media_gallery' => $attributeMock]);
         $attributeMock->expects($this->once())->method('getBackend')->willReturn($productMediaGalleryMock);
         $entryMock->expects($this->once())->method('getTypes')->willReturn(['jpg']);
-        $entryMock->expects($this->exactly(2))->method('getIsDisabled')->willReturn(false);
+        $entryMock->expects($this->exactly(2))->method('isDisabled')->willReturn(false);
         $entryMock->expects($this->once())->method('getPosition')->willReturn($entryPosition);
         $entryMock->expects($this->once())->method('getLabel')->willReturn('entryLabel');
         $productMediaGalleryMock->expects($this->once())->method('addImage')->with(
@@ -271,23 +317,33 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
                 'disabled' => false
             ]
         );
-        $this->productMock->expects($this->once())->method('setStoreId')->with($storeId);
         $this->productRepositoryMock->expects($this->once())->method('save')->with($this->productMock)
             ->willThrowException(new \Exception());
         $this->entryResolverMock->expects($this->never())->method('getEntryIdByFilePath');
-        $this->model->create($productSku, $entryMock, $entryContentMock, $storeId);
+        $this->model->create($this->productMock);
     }
 
     public function testCreate()
     {
         $productSku = 'mediaProduct';
-        $storeId = 0;
-        $entryPosition = 'entryPosition';
-        $absolutePath = 'absolute/path';
         $entryMock = $this->getMock('\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface');
         $entryContentMock = $this->getMock(
             '\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryContentInterface'
         );
+        $entryMock->expects($this->any())->method('getContent')->willReturn($entryContentMock);
+        $this->attributeValueMock->expects($this->any())->method('getValue')->willReturn($entryMock);
+
+        $storeId = 0;
+        $this->productMock->expects($this->any())->method('getStoreId')->willReturn($storeId);
+        $this->productMock->expects($this->any())->method('getSku')->willReturn($productSku);
+        $this->productMock->expects($this->any())
+            ->method('getCustomAttribute')
+            ->with('media_gallery')
+            ->willReturn($this->attributeValueMock);
+
+        $entryPosition = 'entryPosition';
+        $absolutePath = 'absolute/path';
+
         $productMediaGalleryMock = $this->getMock(
             '\Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend',
             ['addImage', 'updateImage', 'getRenamedImage'],
@@ -323,7 +379,7 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
             ->willReturn(['media_gallery' => $attributeMock]);
         $attributeMock->expects($this->once())->method('getBackend')->willReturn($productMediaGalleryMock);
         $entryMock->expects($this->once())->method('getTypes')->willReturn(['jpg']);
-        $entryMock->expects($this->exactly(2))->method('getIsDisabled')->willReturn(false);
+        $entryMock->expects($this->exactly(2))->method('isDisabled')->willReturn(false);
         $entryMock->expects($this->once())->method('getPosition')->willReturn($entryPosition);
         $entryMock->expects($this->once())->method('getLabel')->willReturn('entryLabel');
         $productMediaGalleryMock->expects($this->once())->method('addImage')->with(
@@ -342,7 +398,6 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
                 'disabled' => false
             ]
         );
-        $this->productMock->expects($this->once())->method('setStoreId')->with($storeId);
         $this->productRepositoryMock->expects($this->once())->method('save')->with($this->productMock);
         $writeInterfaceMock->expects($this->once())->method('delete')->with($relativeFilePath);
         $productMediaGalleryMock->expects($this->once())->method('getRenamedImage')->with($imageFileUri)
@@ -351,7 +406,7 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
             $this->productMock,
             'renamed'
         )->willReturn(42);
-        $this->assertEquals(42, $this->model->create($productSku, $entryMock, $entryContentMock, $storeId));
+        $this->assertEquals(42, $this->model->create($this->productMock));
     }
 
     /**
@@ -430,7 +485,7 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
         $entryMock->expects($this->once())->method('getId')->willReturn($entryId);
         $this->entryResolverMock->expects($this->once())->method('getEntryFilePathById')
             ->with($this->productMock, $entryId)->willReturn($filePath);
-        $entryMock->expects($this->once())->method('getIsDisabled')->willReturn(false);
+        $entryMock->expects($this->once())->method('isDisabled')->willReturn(false);
         $entryMock->expects($this->once())->method('getPosition')->willReturn($entryPosition);
         $entryMock->expects($this->once())->method('getLabel')->willReturn('entryLabel');
         $productMediaGalleryMock->expects($this->once())->method('updateImage')->with(
@@ -485,7 +540,7 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
         $entryMock->expects($this->once())->method('getId')->willReturn($entryId);
         $this->entryResolverMock->expects($this->once())->method('getEntryFilePathById')
             ->with($this->productMock, $entryId)->willReturn($filePath);
-        $entryMock->expects($this->once())->method('getIsDisabled')->willReturn(false);
+        $entryMock->expects($this->once())->method('isDisabled')->willReturn(false);
         $entryMock->expects($this->once())->method('getPosition')->willReturn($entryPosition);
         $entryMock->expects($this->once())->method('getLabel')->willReturn('entryLabel');
         $productMediaGalleryMock->expects($this->once())->method('updateImage')->with(
@@ -640,7 +695,7 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
             ->with($gallery[0]['label_default'])->willReturnSelf();
         $entryMock->expects($this->once())->method('setTypes')
             ->with([])->willReturnSelf();
-        $entryMock->expects($this->once())->method('setIsDisabled')
+        $entryMock->expects($this->once())->method('setDisabled')
             ->with($gallery[0]['disabled_default'])->willReturnSelf();
         $entryMock->expects($this->once())->method('setPosition')
             ->with($gallery[0]['position_default'])->willReturnSelf();
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/ManagementTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/ManagementTest.php
index 3d30639613aa6431209ca5301711bdf873e64c2b..ed28dc6fda78135af0e50f4e57d7db7c656dac67 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/ManagementTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/ManagementTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Catalog\Test\Unit\Model\ProductLink;
 
 use Magento\Framework\Exception\NoSuchEntityException;
@@ -228,7 +231,8 @@ class ManagementTest extends \PHPUnit_Framework_TestCase
                     'getLinkedProductSku', 'getProductSku', 'getLinkType',
                     '__toArray', 'getLinkedProductType', 'getPosition', 'getCustomAttribute', 'getCustomAttributes',
                     'setCustomAttribute', 'setCustomAttributes', 'getMetadataServiceInterface',
-                    'setLinkedProductSku', 'setProductSku', 'setLinkType', 'setLinkedProductType', 'setPosition',
+                    'getExtensionAttributes', 'setExtensionAttributes',
+                    'setLinkedProductSku', 'setProductSku', 'setLinkType', 'setLinkedProductType', 'setPosition'
                 ]
             );
             $productLinkMock->expects($this->any())
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php
index 24213fbc4ca9485260dff7ca74527fa015af6a0d..affded52e9586413fb24378919bf538fdf4b74fb 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductLink/RepositoryTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Catalog\Test\Unit\Model\ProductLink;
 
 class RepositoryTest extends \PHPUnit_Framework_TestCase
@@ -28,6 +31,9 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $linkInitializerMock;
 
+    /**
+     * Test method
+     */
     protected function setUp()
     {
         $linkManagementMock = $this->getMock('\Magento\Catalog\Model\ProductLink\Management', [], [], '', false);
@@ -58,6 +64,9 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
         );
     }
 
+    /**
+     * Test method
+     */
     public function testSave()
     {
         $entityMock = $this->getMock('\Magento\Catalog\Model\ProductLink\Link', [], [], '', false);
@@ -70,18 +79,14 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
                 ['linkedProduct', false, null, $linkedProductMock],
             ]
         ));
-        $customAttributeMock = $this->getMock('\Magento\Framework\Api\AttributeInterface');
-        $customAttributeMock->expects($this->once())->method('getAttributeCode')->willReturn('attribute_code');
-        $customAttributeMock->expects($this->once())->method('getValue')->willReturn('value');
         $entityMock->expects($this->once())->method('getLinkedProductSku')->willReturn('linkedProduct');
         $entityMock->expects($this->once())->method('getProductSku')->willReturn('product');
         $entityMock->expects($this->exactly(2))->method('getLinkType')->willReturn('linkType');
         $entityMock->expects($this->once())->method('__toArray')->willReturn([]);
-        $entityMock->expects($this->once())->method('getCustomAttributes')->willReturn([$customAttributeMock]);
         $linkedProductMock->expects($this->exactly(2))->method('getId')->willReturn(42);
         $this->entityCollectionProviderMock->expects($this->once())->method('getCollection')->willReturn([]);
         $this->linkInitializerMock->expects($this->once())->method('initializeLinks')->with($productMock, [
-            'linkType' => [42 => ['attribute_code' => 'value', 'product_id' => 42]]
+            'linkType' => [42 => ['product_id' => 42]]
         ]);
         $this->assertTrue($this->model->save($entityMock));
     }
@@ -101,10 +106,6 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
                 ['linkedProduct', false, null, $linkedProductMock],
             ]
         ));
-        $customAttributeMock = $this->getMock('\Magento\Framework\Api\AttributeInterface');
-        $customAttributeMock->expects($this->once())->method('getAttributeCode')->willReturn('attribute_code');
-        $customAttributeMock->expects($this->once())->method('getValue')->willReturn('value');
-        $entityMock->expects($this->once())->method('getCustomAttributes')->willReturn([$customAttributeMock]);
         $entityMock->expects($this->once())->method('getLinkedProductSku')->willReturn('linkedProduct');
         $entityMock->expects($this->once())->method('getProductSku')->willReturn('product');
         $entityMock->expects($this->exactly(2))->method('getLinkType')->willReturn('linkType');
@@ -112,12 +113,15 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase
         $linkedProductMock->expects($this->exactly(2))->method('getId')->willReturn(42);
         $this->entityCollectionProviderMock->expects($this->once())->method('getCollection')->willReturn([]);
         $this->linkInitializerMock->expects($this->once())->method('initializeLinks')->with($productMock, [
-            'linkType' => [42 => ['attribute_code' => 'value', 'product_id' => 42]]
+            'linkType' => [42 => ['product_id' => 42]]
         ]);
         $productMock->expects($this->once())->method('save')->willThrowException(new \Exception());
         $this->model->save($entityMock);
     }
 
+    /**
+     * Test method
+     */
     public function testDelete()
     {
         $entityMock = $this->getMock('\Magento\Catalog\Model\ProductLink\Link', [], [], '', false);
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
index 4a9f671bcdb570bb3a26900d7b66aa7482bb84e9..8a7930bb0f6d7243e66fc68fcbc51751d517f6d5 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
@@ -4,6 +4,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Catalog\Test\Unit\Model;
 
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
@@ -65,6 +68,11 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
      */
     protected $eavConfigMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $extensibleDataObjectConverterMock;
+
     /**
      * @var array data to create product
      */
@@ -124,6 +132,12 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
             ->willReturn(new \Magento\Framework\Object(['default_attribute_set_id' => 4]));
         $this->objectManager = new ObjectManager($this);
 
+        $this->extensibleDataObjectConverterMock = $this
+            ->getMockBuilder('\Magento\Framework\Api\ExtensibleDataObjectConverter')
+            ->setMethods(['toNestedArray'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
         $this->model = $this->objectManager->getObject(
             'Magento\Catalog\Model\ProductRepository',
             [
@@ -135,6 +149,7 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
                 'searchCriteriaBuilder' => $this->searchCriteriaBuilderMock,
                 'metadataServiceInterface' => $this->metadataServiceMock,
                 'searchResultsFactory' => $this->searchResultsFactoryMock,
+                'extensibleDataObjectConverter' => $this->extensibleDataObjectConverterMock,
                 'eavConfig' => $this->eavConfigMock,
             ]
         );
@@ -252,30 +267,34 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testSaveExisting()
     {
         $this->resourceModelMock->expects($this->exactly(2))->method('getIdBySku')->will($this->returnValue(100));
-        $this->productMock->expects($this->once())->method('toFlatArray')->will($this->returnValue($this->productData));
         $this->productFactoryMock->expects($this->once())
             ->method('create')
             ->will($this->returnValue($this->productMock));
         $this->initializationHelperMock->expects($this->once())->method('initialize')->with($this->productMock);
         $this->resourceModelMock->expects($this->once())->method('validate')->with($this->productMock)
             ->willReturn(true);
-        $this->productMock->expects($this->once())->method('toFlatArray')->will($this->returnValue($this->productData));
         $this->resourceModelMock->expects($this->once())->method('save')->with($this->productMock)->willReturn(true);
+        $this->extensibleDataObjectConverterMock
+            ->expects($this->once())
+            ->method('toNestedArray')
+            ->will($this->returnValue($this->productData));
         $this->assertEquals($this->productMock, $this->model->save($this->productMock));
     }
 
     public function testSaveNew()
     {
         $this->resourceModelMock->expects($this->exactly(1))->method('getIdBySku')->will($this->returnValue(null));
-        $this->productMock->expects($this->once())->method('toFlatArray')->will($this->returnValue($this->productData));
         $this->productFactoryMock->expects($this->once())
             ->method('create')
             ->will($this->returnValue($this->productMock));
         $this->initializationHelperMock->expects($this->never())->method('initialize')->with($this->productMock);
         $this->resourceModelMock->expects($this->once())->method('validate')->with($this->productMock)
             ->willReturn(true);
-        $this->productMock->expects($this->once())->method('toFlatArray')->will($this->returnValue($this->productData));
         $this->resourceModelMock->expects($this->once())->method('save')->with($this->productMock)->willReturn(true);
+        $this->extensibleDataObjectConverterMock
+            ->expects($this->once())
+            ->method('toNestedArray')
+            ->will($this->returnValue($this->productData));
         $this->assertEquals($this->productMock, $this->model->save($this->productMock));
     }
 
@@ -286,7 +305,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testSaveUnableToSaveException()
     {
         $this->resourceModelMock->expects($this->exactly(1))->method('getIdBySku')->will($this->returnValue(null));
-        $this->productMock->expects($this->once())->method('toFlatArray')->will($this->returnValue($this->productData));
         $this->productFactoryMock->expects($this->once())
             ->method('create')
             ->will($this->returnValue($this->productMock));
@@ -295,6 +313,10 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
             ->willReturn(true);
         $this->resourceModelMock->expects($this->once())->method('save')->with($this->productMock)
             ->willThrowException(new \Exception());
+        $this->extensibleDataObjectConverterMock
+            ->expects($this->once())
+            ->method('toNestedArray')
+            ->will($this->returnValue($this->productData));
         $this->model->save($this->productMock);
     }
 
@@ -305,7 +327,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testSaveException()
     {
         $this->resourceModelMock->expects($this->exactly(1))->method('getIdBySku')->will($this->returnValue(null));
-        $this->productMock->expects($this->once())->method('toFlatArray')->will($this->returnValue($this->productData));
         $this->productFactoryMock->expects($this->once())
             ->method('create')
             ->will($this->returnValue($this->productMock));
@@ -315,6 +336,10 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->resourceModelMock->expects($this->once())->method('save')->with($this->productMock)
             ->willThrowException(new \Magento\Eav\Model\Entity\Attribute\Exception('123'));
         $this->productMock->expects($this->never())->method('getId');
+        $this->extensibleDataObjectConverterMock
+            ->expects($this->once())
+            ->method('toNestedArray')
+            ->will($this->returnValue($this->productData));
         $this->model->save($this->productMock);
     }
 
@@ -325,7 +350,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
     public function testSaveInvalidProductException()
     {
         $this->resourceModelMock->expects($this->exactly(1))->method('getIdBySku')->will($this->returnValue(null));
-        $this->productMock->expects($this->once())->method('toFlatArray')->will($this->returnValue($this->productData));
         $this->productFactoryMock->expects($this->once())
             ->method('create')
             ->will($this->returnValue($this->productMock));
@@ -333,6 +357,10 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase
         $this->resourceModelMock->expects($this->once())->method('validate')->with($this->productMock)
             ->willReturn(['error1', 'error2']);
         $this->productMock->expects($this->never())->method('getId');
+        $this->extensibleDataObjectConverterMock
+            ->expects($this->once())
+            ->method('toNestedArray')
+            ->will($this->returnValue($this->productData));
         $this->model->save($this->productMock);
     }
 
diff --git a/app/code/Magento/Catalog/composer.json b/app/code/Magento/Catalog/composer.json
index 92b97c635b087e12dfe820a58502df8d5e23322c..f6e7adcc008d5c41bcffa81f1aad61c587900316 100644
--- a/app/code/Magento/Catalog/composer.json
+++ b/app/code/Magento/Catalog/composer.json
@@ -8,7 +8,6 @@
         "magento/module-cms": "0.42.0-beta11",
         "magento/module-indexer": "0.42.0-beta11",
         "magento/module-customer": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-theme": "0.42.0-beta11",
         "magento/module-checkout": "0.42.0-beta11",
         "magento/module-log": "0.42.0-beta11",
diff --git a/app/code/Magento/Catalog/etc/config.xml b/app/code/Magento/Catalog/etc/config.xml
index 27791541c72009b293df7ae93d4cd044c1d0ea67..9d4433c045425e2902dbc8b60c43ba01fcbeba7a 100644
--- a/app/code/Magento/Catalog/etc/config.xml
+++ b/app/code/Magento/Catalog/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <catalog>
             <navigation>
diff --git a/app/code/Magento/Catalog/etc/frontend/page_types.xml b/app/code/Magento/Catalog/etc/frontend/page_types.xml
index 2f789b816c75f328b7c05bd487c02064f88aefdc..7dc0beef39a5bfe7c47a704f09831547c1e9629d 100644
--- a/app/code/Magento/Catalog/etc/frontend/page_types.xml
+++ b/app/code/Magento/Catalog/etc/frontend/page_types.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="catalog_category_view" label="Catalog Category"/>
     <type id="catalog_product_compare_index" label="Catalog Product Compare List"/>
     <type id="catalog_product_gallery" label="Catalog Product Image Gallery Popup"/>
diff --git a/app/code/Magento/Catalog/etc/webapi.xml b/app/code/Magento/Catalog/etc/webapi.xml
index ab2485a26fd46723617e522964bb4724a5af8285..a4fb44c7eae061b3547fee1c93d61889dd923b7a 100644
--- a/app/code/Magento/Catalog/etc/webapi.xml
+++ b/app/code/Magento/Catalog/etc/webapi.xml
@@ -21,7 +21,7 @@
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/products/:productSku" method="DELETE">
+    <route url="/V1/products/:sku" method="DELETE">
         <service class="Magento\Catalog\Api\ProductRepositoryInterface" method="deleteById"/>
         <resources>
             <resource ref="Magento_Catalog::products" />
@@ -33,7 +33,7 @@
             <resource ref="anonymous" />
         </resources>
     </route>
-    <route url="/V1/products/:productSku" method="GET">
+    <route url="/V1/products/:sku" method="GET">
         <service class="Magento\Catalog\Api\ProductRepositoryInterface" method="get"/>
         <resources>
             <resource ref="anonymous" />
@@ -196,31 +196,31 @@
             <resource ref="anonymous"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/media/:imageId" method="GET">
+    <route url="/V1/products/:sku/media/:imageId" method="GET">
         <service class="Magento\Catalog\Api\ProductAttributeMediaGalleryManagementInterface" method="get"/>
         <resources>
             <resource ref="anonymous"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/media" method="POST">
+    <route url="/V1/products/media" method="POST">
         <service class="Magento\Catalog\Api\ProductAttributeMediaGalleryManagementInterface" method="create"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/media/:entryId" method="PUT">
+    <route url="/V1/products/:sku/media/:entryId" method="PUT">
         <service class="Magento\Catalog\Api\ProductAttributeMediaGalleryManagementInterface" method="update"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/media/:entryId" method="DELETE">
+    <route url="/V1/products/:sku/media/:entryId" method="DELETE">
         <service class="Magento\Catalog\Api\ProductAttributeMediaGalleryManagementInterface" method="remove"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/media" method="GET">
+    <route url="/V1/products/:sku/media" method="GET">
         <service class="Magento\Catalog\Api\ProductAttributeMediaGalleryManagementInterface" method="getList"/>
         <resources>
             <resource ref="anonymous"/>
@@ -228,19 +228,19 @@
     </route>
 
     <!-- Group Price -->
-    <route url="/V1/products/:productSku/group-prices/" method="GET">
+    <route url="/V1/products/:sku/group-prices/" method="GET">
         <service class="Magento\Catalog\Api\ProductGroupPriceManagementInterface" method="getList"/>
         <resources>
             <resource ref="anonymous"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/group-prices/:customerGroupId/price/:price" method="POST">
+    <route url="/V1/products/:sku/group-prices/:customerGroupId/price/:price" method="POST">
         <service class="Magento\Catalog\Api\ProductGroupPriceManagementInterface" method="add"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/group-prices/:customerGroupId/" method="DELETE">
+    <route url="/V1/products/:sku/group-prices/:customerGroupId/" method="DELETE">
         <service class="Magento\Catalog\Api\ProductGroupPriceManagementInterface" method="remove"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
@@ -248,19 +248,19 @@
     </route>
 
     <!-- Tear Price -->
-    <route url="/V1/products/:productSku/group-prices/:customerGroupId/tiers" method="GET">
+    <route url="/V1/products/:sku/group-prices/:customerGroupId/tiers" method="GET">
         <service class="Magento\Catalog\Api\ProductTierPriceManagementInterface" method="getList"/>
         <resources>
             <resource ref="anonymous"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/group-prices/:customerGroupId/tiers/:qty/price/:price" method="POST">
+    <route url="/V1/products/:sku/group-prices/:customerGroupId/tiers/:qty/price/:price" method="POST">
         <service class="Magento\Catalog\Api\ProductTierPriceManagementInterface" method="add"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/group-prices/:customerGroupId/tiers/:qty" method="DELETE">
+    <route url="/V1/products/:sku/group-prices/:customerGroupId/tiers/:qty" method="DELETE">
         <service class="Magento\Catalog\Api\ProductTierPriceManagementInterface" method="remove"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
@@ -311,13 +311,13 @@
             <resource ref="Magento_Catalog::catalog"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/options" method="GET">
+    <route url="/V1/products/:sku/options" method="GET">
         <service class="Magento\Catalog\Api\ProductCustomOptionRepositoryInterface" method="getList"/>
         <resources>
             <resource ref="anonymous"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/options/:optionId" method="GET">
+    <route url="/V1/products/:sku/options/:optionId" method="GET">
         <service class="Magento\Catalog\Api\ProductCustomOptionRepositoryInterface" method="get"/>
         <resources>
             <resource ref="anonymous"/>
@@ -335,7 +335,7 @@
             <resource ref="Magento_Catalog::catalog"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/options/:optionId" method="DELETE">
+    <route url="/V1/products/:sku/options/:optionId" method="DELETE">
         <service class="Magento\Catalog\Api\ProductCustomOptionRepositoryInterface" method="deleteByIdentifier"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
@@ -355,25 +355,25 @@
             <resource ref="anonymous"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/links/:type" method="GET">
+    <route url="/V1/products/:sku/links/:type" method="GET">
         <service class="Magento\Catalog\Api\ProductLinkManagementInterface" method="getLinkedItemsByType"/>
         <resources>
             <resource ref="anonymous"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/links/:type" method="POST">
+    <route url="/V1/products/:sku/links/:type" method="POST">
         <service class="Magento\Catalog\Api\ProductLinkManagementInterface" method="setProductLinks"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
         </resources>
     </route>
-    <route url="/V1/products/:productSku/links/:type/:linkedProductSku" method="DELETE">
+    <route url="/V1/products/:sku/links/:type/:linkedProductSku" method="DELETE">
         <service class="Magento\Catalog\Api\ProductLinkRepositoryInterface" method="deleteById"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
         </resources>
     </route>
-    <route url="/V1/products/:product_sku/links/:link_type" method="PUT">
+    <route url="/V1/products/:sku/links/:link_type" method="PUT">
         <service class="Magento\Catalog\Api\ProductLinkRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Catalog::catalog"/>
@@ -399,7 +399,7 @@
             <resource ref="Magento_Catalog::categories" />
         </resources>
     </route>
-    <route url="/V1/categories/:categoryId/products/:productSku" method="DELETE">
+    <route url="/V1/categories/:categoryId/products/:sku" method="DELETE">
         <service class="Magento\Catalog\Api\CategoryLinkRepositoryInterface" method="deleteByIds" />
         <resources>
             <resource ref="Magento_Catalog::categories" />
diff --git a/app/code/Magento/CatalogImportExport/etc/config.xml b/app/code/Magento/CatalogImportExport/etc/config.xml
index cdd8b60e4ccc8765bd9f371848fb36f118660528..707ae08d9c77fe25b799ff5199b36bf69f93de61 100644
--- a/app/code/Magento/CatalogImportExport/etc/config.xml
+++ b/app/code/Magento/CatalogImportExport/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <export>
         </export>
diff --git a/app/code/Magento/CatalogInventory/Api/Data/StockInterface.php b/app/code/Magento/CatalogInventory/Api/Data/StockInterface.php
index 31aa3678440faeb85e0788a651a0a56f67318197..47bd9b85cc321a7a945c15d38304b4a97bf33059 100644
--- a/app/code/Magento/CatalogInventory/Api/Data/StockInterface.php
+++ b/app/code/Magento/CatalogInventory/Api/Data/StockInterface.php
@@ -62,4 +62,21 @@ interface StockInterface extends ExtensibleDataInterface
      * @return $this
      */
     public function setStockName($stockName);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\CatalogInventory\Api\Data\StockExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\CatalogInventory\Api\Data\StockExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\CatalogInventory\Api\Data\StockExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/CatalogInventory/Api/Data/StockItemInterface.php b/app/code/Magento/CatalogInventory/Api/Data/StockItemInterface.php
index e32c4178e5767f73b989f983446eebe1d8802a54..46163c26be6d3df33831a35e9344333ffeaef7ef 100644
--- a/app/code/Magento/CatalogInventory/Api/Data/StockItemInterface.php
+++ b/app/code/Magento/CatalogInventory/Api/Data/StockItemInterface.php
@@ -398,4 +398,21 @@ interface StockItemInterface extends ExtensibleDataInterface
      * @return $this
      */
     public function setStockStatusChangedAuto($stockStatusChangedAuto);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\CatalogInventory\Api\Data\StockItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\CatalogInventory\Api\Data\StockItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\CatalogInventory\Api\Data\StockItemExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/CatalogInventory/Api/Data/StockStatusInterface.php b/app/code/Magento/CatalogInventory/Api/Data/StockStatusInterface.php
index 7788b53df36bf73670eab34f72e0532ce5f7e400..3c90ea451776a752c578ffb0e741de06fac46f3c 100644
--- a/app/code/Magento/CatalogInventory/Api/Data/StockStatusInterface.php
+++ b/app/code/Magento/CatalogInventory/Api/Data/StockStatusInterface.php
@@ -83,4 +83,21 @@ interface StockStatusInterface extends ExtensibleDataInterface
      * @return \Magento\CatalogInventory\Api\Data\StockItemInterface
      */
     public function getStockItem();
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\CatalogInventory\Api\Data\StockStatusExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\CatalogInventory\Api\Data\StockStatusExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\CatalogInventory\Api\Data\StockStatusExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php
index fe76faa8934a55a6a68915f800849af506442f84..56c05595a2c4c93020ab65fe15be63086dbba902 100644
--- a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php
+++ b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php
@@ -10,10 +10,11 @@ use Magento\CatalogInventory\Api\StockItemRepositoryInterface as StockItemReposi
 use Magento\CatalogInventory\Api\StockRegistryInterface;
 use Magento\Customer\Api\GroupManagementInterface;
 use Magento\Framework\Api\AttributeValueFactory;
-use Magento\Framework\Api\MetadataServiceInterface;
+use Magento\Framework\Api\ExtensionAttributesFactory;
 
 /**
  * Catalog Inventory Stock Model for adminhtml area
+ * @method \Magento\CatalogInventory\Api\Data\StockItemExtensionInterface getExtensionAttributes()
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class Item extends \Magento\CatalogInventory\Model\Stock\Item
@@ -26,7 +27,7 @@ class Item extends \Magento\CatalogInventory\Model\Stock\Item
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param MetadataServiceInterface $metadataService
+     * @param ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Customer\Model\Session $customerSession
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
@@ -42,7 +43,7 @@ class Item extends \Magento\CatalogInventory\Model\Stock\Item
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        MetadataServiceInterface $metadataService,
+        ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Customer\Model\Session $customerSession,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
@@ -57,7 +58,7 @@ class Item extends \Magento\CatalogInventory\Model\Stock\Item
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $customerSession,
             $storeManager,
diff --git a/app/code/Magento/CatalogInventory/Model/Stock.php b/app/code/Magento/CatalogInventory/Model/Stock.php
index 8ba03fa36a0727b8b52d13384e62d09f89d9af6e..1eed06294edaf05139695e5048ba6725e91de515 100644
--- a/app/code/Magento/CatalogInventory/Model/Stock.php
+++ b/app/code/Magento/CatalogInventory/Model/Stock.php
@@ -10,6 +10,7 @@ use Magento\Framework\Model\AbstractExtensibleModel;
 
 /**
  * Class Stock
+ *
  */
 class Stock extends AbstractExtensibleModel implements StockInterface
 {
@@ -119,5 +120,27 @@ class Stock extends AbstractExtensibleModel implements StockInterface
     {
         return $this->setData(self::STOCK_NAME, $stockName);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\CatalogInventory\Api\Data\StockExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\CatalogInventory\Api\Data\StockExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\CatalogInventory\Api\Data\StockExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/CatalogInventory/Model/Stock/Item.php b/app/code/Magento/CatalogInventory/Model/Stock/Item.php
index 322eb0812d8f88cd4e348afecb48494fb78a9921..cb622e904c6bbab1838275d66a5f9129e6640a24 100644
--- a/app/code/Magento/CatalogInventory/Model/Stock/Item.php
+++ b/app/code/Magento/CatalogInventory/Model/Stock/Item.php
@@ -11,7 +11,7 @@ use Magento\CatalogInventory\Api\StockConfigurationInterface as StockConfigurati
 use Magento\CatalogInventory\Api\StockItemRepositoryInterface as StockItemRepositoryInterface;
 use Magento\CatalogInventory\Api\StockRegistryInterface;
 use Magento\Framework\Api\AttributeValueFactory;
-use Magento\Framework\Api\MetadataServiceInterface;
+use Magento\Framework\Api\ExtensionAttributesFactory;
 use Magento\Framework\Model\AbstractExtensibleModel;
 
 /**
@@ -92,7 +92,7 @@ class Item extends AbstractExtensibleModel implements StockItemInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param MetadataServiceInterface $metadataService
+     * @param ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Customer\Model\Session $customerSession
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
@@ -107,7 +107,7 @@ class Item extends AbstractExtensibleModel implements StockItemInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        MetadataServiceInterface $metadataService,
+        ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Customer\Model\Session $customerSession,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
@@ -121,7 +121,7 @@ class Item extends AbstractExtensibleModel implements StockItemInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -807,5 +807,27 @@ class Item extends AbstractExtensibleModel implements StockItemInterface
     {
         return $this->setData(self::STOCK_STATUS_CHANGED_AUTO, $stockStatusChangedAuto);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\CatalogInventory\Api\Data\StockItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\CatalogInventory\Api\Data\StockItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\CatalogInventory\Api\Data\StockItemExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/CatalogInventory/Model/Stock/Status.php b/app/code/Magento/CatalogInventory/Model/Stock/Status.php
index a930ab4169d2f86f50f3e9429b6eabaa95da4eec..4b91ba19d267e8dea109408f44978215d7c3f29c 100644
--- a/app/code/Magento/CatalogInventory/Model/Stock/Status.php
+++ b/app/code/Magento/CatalogInventory/Model/Stock/Status.php
@@ -9,7 +9,7 @@ use Magento\CatalogInventory\Api\Data\StockItemInterface;
 use Magento\CatalogInventory\Api\Data\StockStatusInterface;
 use Magento\CatalogInventory\Api\StockRegistryInterface;
 use Magento\Framework\Api\AttributeValueFactory;
-use Magento\Framework\Api\MetadataServiceInterface;
+use Magento\Framework\Api\ExtensionAttributesFactory;
 use Magento\Framework\Model\AbstractExtensibleModel;
 
 /**
@@ -38,7 +38,7 @@ class Status extends AbstractExtensibleModel implements StockStatusInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param MetadataServiceInterface $metadataService
+     * @param ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param StockRegistryInterface $stockRegistry
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
@@ -48,7 +48,7 @@ class Status extends AbstractExtensibleModel implements StockStatusInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        MetadataServiceInterface $metadataService,
+        ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         StockRegistryInterface $stockRegistry,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
@@ -58,7 +58,7 @@ class Status extends AbstractExtensibleModel implements StockStatusInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -172,5 +172,27 @@ class Status extends AbstractExtensibleModel implements StockStatusInterface
     {
         return $this->setData(self::KEY_STOCK_STATUS, $stockStatus);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\CatalogInventory\Api\Data\StockStatusExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\CatalogInventory\Api\Data\StockStatusExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\CatalogInventory\Api\Data\StockStatusExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/CatalogInventory/etc/config.xml b/app/code/Magento/CatalogInventory/etc/config.xml
index 3b19e058fe0001cd78538f82d540785941484aef..52c6f7ce2f7b2e11a2cff2c3bd2f3e066e916835 100644
--- a/app/code/Magento/CatalogInventory/etc/config.xml
+++ b/app/code/Magento/CatalogInventory/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <cataloginventory>
             <options>
diff --git a/app/code/Magento/CatalogInventory/etc/webapi.xml b/app/code/Magento/CatalogInventory/etc/webapi.xml
index 238794f1796574fe5b3633880c7083eb0f32e8d0..80317eccf51a7dd8ba3e7d24fe0497cef61e9df2 100644
--- a/app/code/Magento/CatalogInventory/etc/webapi.xml
+++ b/app/code/Magento/CatalogInventory/etc/webapi.xml
@@ -7,25 +7,25 @@
 -->
 <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
-    <route url="/V1/stockItem/:productSku" method="GET">
+    <route url="/V1/stockItems/:productSku" method="GET">
         <service class="Magento\CatalogInventory\Api\StockRegistryInterface" method="getStockItemBySku"/>
         <resources>
             <resource ref="Magento_CatalogInventory::cataloginventory"/>
         </resources>
     </route>
-    <route url="/V1/stockItem/:productSku" method="PUT">
+    <route url="/V1/stockItems/:productSku" method="PUT">
         <service class="Magento\CatalogInventory\Api\StockRegistryInterface" method="updateStockItemBySku"/>
         <resources>
             <resource ref="Magento_CatalogInventory::cataloginventory"/>
         </resources>
     </route>
-    <route url="/V1/stockItem/lowStock/" method="GET">
+    <route url="/V1/stockItems/lowStock/" method="GET">
         <service class="Magento\CatalogInventory\Api\StockRegistryInterface" method="getLowStockItems"/>
         <resources>
             <resource ref="Magento_CatalogInventory::cataloginventory"/>
         </resources>
     </route>
-    <route url="/V1/stockStatus/:productSku" method="GET">
+    <route url="/V1/stockStatuses/:productSku" method="GET">
         <service class="Magento\CatalogInventory\Api\StockRegistryInterface" method="getStockStatusBySku"/>
         <resources>
             <resource ref="anonymous"/>
diff --git a/app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php b/app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php
index cf52ebbe0669ae45c8ec130f440f557b22865427..a4d8b53934937cd2342f00bfd5505f6d59953ecc 100644
--- a/app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php
+++ b/app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php
@@ -16,12 +16,23 @@ abstract class AbstractIndexer implements IndexerActionInterface, MviewActionInt
      */
     protected $indexBuilder;
 
+    /**
+     * Application Event Dispatcher
+     *
+     * @var \Magento\Framework\Event\ManagerInterface
+     */
+    protected $_eventManager;
+
     /**
      * @param IndexBuilder $indexBuilder
+     * @param \Magento\Framework\Event\ManagerInterface $eventManager
      */
-    public function __construct(IndexBuilder $indexBuilder)
-    {
+    public function __construct(
+        IndexBuilder $indexBuilder,
+        \Magento\Framework\Event\ManagerInterface $eventManager
+    ) {
         $this->indexBuilder = $indexBuilder;
+        $this->_eventManager = $eventManager;
     }
 
     /**
@@ -43,6 +54,20 @@ abstract class AbstractIndexer implements IndexerActionInterface, MviewActionInt
     public function executeFull()
     {
         $this->indexBuilder->reindexFull();
+        $this->_eventManager->dispatch('clean_cache_by_tags', ['object' => $this]);
+    }
+
+    /**
+     * Get affected cache tags
+     *
+     * @return array
+     */
+    public function getIdentities()
+    {
+        return [
+            \Magento\Catalog\Model\Category::CACHE_TAG,
+            \Magento\Catalog\Model\Product::CACHE_TAG
+        ];
     }
 
     /**
diff --git a/app/code/Magento/CatalogRule/Model/Rule.php b/app/code/Magento/CatalogRule/Model/Rule.php
index 61eac7c2b59f204a98ee782994d04eed6e97bfbf..99eb4752f691cb88006c3cd108782aa53600e991 100644
--- a/app/code/Magento/CatalogRule/Model/Rule.php
+++ b/app/code/Magento/CatalogRule/Model/Rule.php
@@ -143,6 +143,11 @@ class Rule extends \Magento\Rule\Model\AbstractModel
      */
     protected $dateTime;
 
+    /**
+     * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor;
+     */
+    protected $_ruleProductProcessor;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -158,6 +163,7 @@ class Rule extends \Magento\Rule\Model\AbstractModel
      * @param \Magento\CatalogRule\Helper\Data $catalogRuleData
      * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypesList
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
+     * @param \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor $ruleProductProcessor
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
      * @param array $relatedCacheTypes
@@ -179,6 +185,7 @@ class Rule extends \Magento\Rule\Model\AbstractModel
         \Magento\CatalogRule\Helper\Data $catalogRuleData,
         \Magento\Framework\App\Cache\TypeListInterface $cacheTypesList,
         \Magento\Framework\Stdlib\DateTime $dateTime,
+        \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor $ruleProductProcessor,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
         array $relatedCacheTypes = [],
@@ -195,6 +202,7 @@ class Rule extends \Magento\Rule\Model\AbstractModel
         $this->_cacheTypesList = $cacheTypesList;
         $this->_relatedCacheTypes = $relatedCacheTypes;
         $this->dateTime = $dateTime;
+        $this->_ruleProductProcessor = $ruleProductProcessor;
         parent::__construct($context, $registry, $formFactory, $localeDate, $resource, $resourceCollection, $data);
     }
 
@@ -445,4 +453,33 @@ class Rule extends \Magento\Rule\Model\AbstractModel
         }
         return $this;
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return $this
+     */
+    public function afterSave()
+    {
+        if ($this->isObjectNew()) {
+            $this->getMatchingProductIds();
+            if (!empty($this->_productIds) && is_array($this->_productIds)) {
+                $this->_ruleProductProcessor->reindexList($this->_productIds);
+            }
+        } else {
+            $this->_ruleProductProcessor->getIndexer()->invalidate();
+        }
+        return parent::afterSave();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return $this
+     */
+    public function afterDelete()
+    {
+        $this->_ruleProductProcessor->getIndexer()->invalidate();
+        return parent::afterDelete();
+    }
 }
diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/AbstractIndexerTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/AbstractIndexerTest.php
index 526ea7786417882ee711161a4021d27b66fcf7e7..b9a21020e4120a7218a7af66fc9ba0d833a2ebc8 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/AbstractIndexerTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/AbstractIndexerTest.php
@@ -18,16 +18,35 @@ class AbstractIndexerTest extends \PHPUnit_Framework_TestCase
      */
     protected $indexer;
 
+    /**
+     * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_eventManagerMock;
+
+    /**
+     * Set up test
+     *
+     * @return void
+     */
     protected function setUp()
     {
+        $this->_eventManagerMock = $this->getMock('\Magento\Framework\Event\ManagerInterface');
         $this->indexBuilder = $this->getMock('Magento\CatalogRule\Model\Indexer\IndexBuilder', [], [], '', false);
 
         $this->indexer = $this->getMockForAbstractClass(
             'Magento\CatalogRule\Model\Indexer\AbstractIndexer',
-            [$this->indexBuilder]
+            [
+                $this->indexBuilder,
+                $this->_eventManagerMock
+            ]
         );
     }
 
+    /**
+     * Test execute
+     *
+     * @return void
+     */
     public function testExecute()
     {
         $ids = [1, 2, 5];
@@ -36,9 +55,20 @@ class AbstractIndexerTest extends \PHPUnit_Framework_TestCase
         $this->indexer->execute($ids);
     }
 
+    /**
+     * Test execute full reindex action
+     *
+     * @return void
+     */
     public function testExecuteFull()
     {
         $this->indexBuilder->expects($this->once())->method('reindexFull');
+        $this->_eventManagerMock->expects($this->once())
+            ->method('dispatch')
+            ->with(
+                'clean_cache_by_tags',
+                ['object' => $this->indexer]
+            );
 
         $this->indexer->executeFull();
     }
@@ -46,12 +76,19 @@ class AbstractIndexerTest extends \PHPUnit_Framework_TestCase
     /**
      * @expectedException \Magento\CatalogRule\CatalogRuleException
      * @expectedExceptionMessage Could not rebuild index for empty products array
+     *
+     * @return void
      */
     public function testExecuteListWithEmptyIds()
     {
         $this->indexer->executeList([]);
     }
 
+    /**
+     * @throws \Magento\CatalogRule\CatalogRuleException
+     *
+     * @return void
+     */
     public function testExecuteList()
     {
         $ids = [1, 2, 5];
@@ -63,12 +100,19 @@ class AbstractIndexerTest extends \PHPUnit_Framework_TestCase
     /**
      * @expectedException \Magento\CatalogRule\CatalogRuleException
      * @expectedExceptionMessage Could not rebuild index for undefined product
+     *
+     * @return void
      */
     public function testExecuteRowWithEmptyId()
     {
         $this->indexer->executeRow(null);
     }
 
+    /**
+     * @throws \Magento\CatalogRule\CatalogRuleException
+     *
+     * @return void
+     */
     public function testExecuteRow()
     {
         $id = 5;
diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php
index 095ca9891a7405407df9b759950721b4d2676d40..4b3d8d2edd1875f00b0244b31f82a2796e6bc60e 100644
--- a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php
+++ b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php
@@ -31,6 +31,31 @@ class RuleTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Rule\Model\Condition\Combine|\PHPUnit_Framework_MockObject_MockObject */
     protected $condition;
 
+    /**
+     * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_ruleProductProcessor;
+
+    /**
+     * @var \Magento\Catalog\Model\Resource\Product\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_productCollectionFactory;
+
+    /**
+     * @var \Magento\Framework\Model\Resource\Iterator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_resourceIterator;
+
+    /**
+     * @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productModel;
+
+    /**
+     * Set up before test
+     *
+     * @return void
+     */
     protected function setUp()
     {
         $this->storeManager = $this->getMock('Magento\Store\Model\StoreManagerInterface');
@@ -74,13 +99,39 @@ class RuleTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
+        $this->_ruleProductProcessor = $this->getMock(
+            '\Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->_productCollectionFactory = $this->getMock(
+            '\Magento\Catalog\Model\Resource\Product\CollectionFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+
+        $this->_resourceIterator = $this->getMock(
+            '\Magento\Framework\Model\Resource\Iterator',
+            ['walk'],
+            [],
+            '',
+            false
+        );
 
         $this->objectManagerHelper = new ObjectManagerHelper($this);
         $this->rule = $this->objectManagerHelper->getObject(
             'Magento\CatalogRule\Model\Rule',
             [
                 'storeManager' => $this->storeManager,
-                'combineFactory' => $this->combineFactory
+                'combineFactory' => $this->combineFactory,
+                'ruleProductProcessor' => $this->_ruleProductProcessor,
+                'productCollectionFactory' => $this->_productCollectionFactory,
+                'resourceIterator' => $this->_resourceIterator,
             ]
         );
     }
@@ -88,6 +139,8 @@ class RuleTest extends \PHPUnit_Framework_TestCase
     /**
      * @dataProvider dataProviderCallbackValidateProduct
      * @param bool $validate
+     *
+     * @return void
      */
     public function testCallbackValidateProduct($validate)
     {
@@ -134,6 +187,11 @@ class RuleTest extends \PHPUnit_Framework_TestCase
         }
     }
 
+    /**
+     * Data provider for callbackValidateProduct test
+     *
+     * @return array
+     */
     public function dataProviderCallbackValidateProduct()
     {
         return [
@@ -141,4 +199,31 @@ class RuleTest extends \PHPUnit_Framework_TestCase
             [true],
         ];
     }
+
+    /**
+     * Test after delete action
+     *
+     * @return void
+     */
+    public function testAfterDelete()
+    {
+        $indexer = $this->getMock('\Magento\Indexer\Model\IndexerInterface');
+        $indexer->expects($this->once())->method('invalidate');
+        $this->_ruleProductProcessor->expects($this->once())->method('getIndexer')->will($this->returnValue($indexer));
+        $this->rule->afterDelete();
+    }
+
+    /**
+     * Test after update action
+     *
+     * @return void
+     */
+    public function testAfterUpdate()
+    {
+        $this->rule->isObjectNew(false);
+        $indexer = $this->getMock('\Magento\Indexer\Model\IndexerInterface');
+        $indexer->expects($this->once())->method('invalidate');
+        $this->_ruleProductProcessor->expects($this->once())->method('getIndexer')->will($this->returnValue($indexer));
+        $this->rule->afterSave();
+    }
 }
diff --git a/app/code/Magento/CatalogSearch/etc/config.xml b/app/code/Magento/CatalogSearch/etc/config.xml
index e6812e9c2629a7555da67222270e2f16db705ce1..a29db223f42df34564539bff7af30620bee812c4 100644
--- a/app/code/Magento/CatalogSearch/etc/config.xml
+++ b/app/code/Magento/CatalogSearch/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <catalog>
             <seo>
diff --git a/app/code/Magento/CatalogSearch/etc/frontend/page_types.xml b/app/code/Magento/CatalogSearch/etc/frontend/page_types.xml
index 8aa580b0ef888b5b82d90e1909cd79139cb89f29..5f4367132ae9b7dd9ce2095e035c01302234fe3c 100644
--- a/app/code/Magento/CatalogSearch/etc/frontend/page_types.xml
+++ b/app/code/Magento/CatalogSearch/etc/frontend/page_types.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="catalogsearch_advanced_index" label="Advanced Search Form"/>
     <type id="catalogsearch_advanced_result" label="Advanced Search Result"/>
     <type id="catalogsearch_result_index" label="Quick Search Form"/>
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/CanonicalUrlRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/CanonicalUrlRewriteGenerator.php
index 749b746ca8e8e2853b8c29f7732753adf257dde0..1e71af266597a15bc4d580dffff8afb86ccf4e26 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Category/CanonicalUrlRewriteGenerator.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/CanonicalUrlRewriteGenerator.php
@@ -39,12 +39,14 @@ class CanonicalUrlRewriteGenerator
      */
     public function generate($storeId, Category $category)
     {
-        return [
-            $this->urlRewriteFactory->create()->setStoreId($storeId)
+        $urlPath = $this->categoryUrlPathGenerator->getUrlPathWithSuffix($category, $storeId);
+        $result = [
+            $urlPath . '_' . $storeId => $this->urlRewriteFactory->create()->setStoreId($storeId)
                 ->setEntityType(CategoryUrlRewriteGenerator::ENTITY_TYPE)
                 ->setEntityId($category->getId())
-                ->setRequestPath($this->categoryUrlPathGenerator->getUrlPathWithSuffix($category, $storeId))
+                ->setRequestPath($urlPath)
                 ->setTargetPath($this->categoryUrlPathGenerator->getCanonicalUrlPath($category))
         ];
+        return $result;
     }
 }
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php
index fc7107801aca1499d67eb3ec16e6dbd385f7a588..6f0cfdb2b5ccd65a3de26d869daab89465728498 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/CurrentUrlRewritesRegenerator.php
@@ -83,7 +83,7 @@ class CurrentUrlRewritesRegenerator
         if ($this->category->getData('save_rewrites_history')) {
             $targetPath = $this->categoryUrlPathGenerator->getUrlPathWithSuffix($this->category, $storeId);
             if ($url->getRequestPath() !== $targetPath) {
-                $urls[] = $this->urlRewriteFactory->create()
+                $urls[$url->getRequestPath() . '_' . $storeId] = $this->urlRewriteFactory->create()
                     ->setEntityType(CategoryUrlRewriteGenerator::ENTITY_TYPE)
                     ->setEntityId($this->category->getId())
                     ->setRequestPath($url->getRequestPath())
@@ -108,7 +108,7 @@ class CurrentUrlRewritesRegenerator
             ? $url->getTargetPath()
             : $this->categoryUrlPathGenerator->getUrlPathWithSuffix($this->category, $storeId);
         if ($url->getRequestPath() !== $targetPath) {
-            $urls[] = $this->urlRewriteFactory->create()
+            $urls[$url->getRequestPath() . '_' . $storeId] = $this->urlRewriteFactory->create()
                 ->setEntityType(CategoryUrlRewriteGenerator::ENTITY_TYPE)
                 ->setEntityId($this->category->getId())
                 ->setRequestPath($url->getRequestPath())
diff --git a/app/code/Magento/CatalogUrlRewrite/Model/ProductUrlRewriteGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/ProductUrlRewriteGenerator.php
index a8661bfdc9eaa358ead6ad52b74989d4bf705794..74158ce4093d3be02799dba710e235bbbc305095 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/ProductUrlRewriteGenerator.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/ProductUrlRewriteGenerator.php
@@ -137,13 +137,22 @@ class ProductUrlRewriteGenerator
             }
         }
         $this->productCategories = $this->objectRegistryFactory->create(['entities' => $categories]);
+        /**
+         * @var $urls \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[]
+         */
         $urls = array_merge(
             $this->canonicalUrlRewriteGenerator->generate($storeId, $this->product),
             $this->categoriesUrlRewriteGenerator->generate($storeId, $this->product, $this->productCategories),
             $this->currentUrlRewritesRegenerator->generate($storeId, $this->product, $this->productCategories)
         );
+
+        /* Reduce duplicates. Last wins */
+        $result = [];
+        foreach ($urls as $url) {
+            $result[$url->getTargetPath() . '-' . $url->getStoreId()] = $url;
+        }
         $this->productCategories = null;
-        return $urls;
+        return $result;
     }
 
     /**
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CanonicalUrlRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CanonicalUrlRewriteGeneratorTest.php
index 93a09f24ea8ac466b08ac4d8c2ce0d0771476a81..80983cad9beeda486da557f9b373216fbb993c54 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CanonicalUrlRewriteGeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CanonicalUrlRewriteGeneratorTest.php
@@ -3,6 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+// @codingStandardsIgnoreFile
 namespace Magento\CatalogUrlRewrite\Test\Unit\Model\Category;
 
 use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
@@ -70,7 +71,7 @@ class CanonicalUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnSelf());
         $this->urlRewriteFactory->expects($this->any())->method('create')->will($this->returnValue($this->urlRewrite));
         $this->assertEquals(
-            [$this->urlRewrite],
+            ['category.html_store_id' => $this->urlRewrite],
             $this->canonicalUrlRewriteGenerator->generate($storeId, $this->category)
         );
     }
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CurrentUrlRewritesRegeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CurrentUrlRewritesRegeneratorTest.php
index db8545333579635b506339ead620e789fd8551de..4e1b56ce6eeb5c9c474b27606bda50a7c3e37456 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CurrentUrlRewritesRegeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/CurrentUrlRewritesRegeneratorTest.php
@@ -3,6 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+// @codingStandardsIgnoreFile
 namespace Magento\CatalogUrlRewrite\Test\Unit\Model\Category;
 
 use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
@@ -128,7 +129,7 @@ class CurrentUrlRewritesRegeneratorTest extends \PHPUnit_Framework_TestCase
         $this->prepareUrlRewriteMock($storeId, $categoryId, $requestPath, $targetPath, OptionProvider::PERMANENT);
 
         $this->assertEquals(
-            [$this->urlRewrite],
+            ['autogenerated.html_2' => $this->urlRewrite],
             $this->currentUrlRewritesRegenerator->generate($storeId, $this->category)
         );
     }
@@ -191,7 +192,7 @@ class CurrentUrlRewritesRegeneratorTest extends \PHPUnit_Framework_TestCase
         $this->prepareUrlRewriteMock($storeId, $categoryId, $requestPath, $targetPath, 0);
 
         $this->assertEquals(
-            [$this->urlRewrite],
+            ['generate-for-custom-without-redirect-type.html_12' => $this->urlRewrite],
             $this->currentUrlRewritesRegenerator->generate($storeId, $this->category)
         );
     }
@@ -230,7 +231,7 @@ class CurrentUrlRewritesRegeneratorTest extends \PHPUnit_Framework_TestCase
         $this->prepareUrlRewriteMock($storeId, $categoryId, $requestPath, $targetPath, 'code');
 
         $this->assertEquals(
-            [$this->urlRewrite],
+            ['generate-for-custom-without-redirect-type.html_12' => $this->urlRewrite],
             $this->currentUrlRewritesRegenerator->generate($storeId, $this->category)
         );
     }
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php
index 239dcffcbba3ee19b64ef4fe372e6eb1336a50a5..c435eda8c7bd345a5a0c9e700e097a8362ee28c6 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\CatalogUrlRewrite\Test\Unit\Model;
 
 use Magento\Catalog\Model\Category;
@@ -28,6 +31,9 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Catalog\Model\Category|\PHPUnit_Framework_MockObject_MockObject */
     protected $category;
 
+    /**
+     * Test method
+     */
     protected function setUp()
     {
         $this->currentUrlRewritesRegenerator = $this->getMockBuilder(
@@ -54,39 +60,60 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         );
     }
 
+    /**
+     * Test method
+     */
     public function testGenerationForGlobalScope()
     {
         $this->category->expects($this->any())->method('getStoreId')->will($this->returnValue(null));
         $this->category->expects($this->any())->method('getStoreIds')->will($this->returnValue([1]));
         $this->storeViewService->expects($this->once())->method('doesEntityHaveOverriddenUrlKeyForStore')
             ->will($this->returnValue(false));
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical->setTargetPath('category-1')
+            ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['canonical']));
+            ->will($this->returnValue([$canonical]));
+        $children = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $children->setTargetPath('category-2')
+            ->setStoreId(2);
         $this->childrenUrlRewriteGenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['children']));
+            ->will($this->returnValue([$children]));
+        $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $current->setTargetPath('category-3')
+            ->setStoreId(3);
         $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['current']));
+            ->will($this->returnValue([$current]));
 
         $this->assertEquals(
-            ['canonical', 'children', 'current'],
+            [$canonical, $children, $current],
             $this->categoryUrlRewriteGenerator->generate($this->category)
         );
     }
 
+    /**
+     * Test method
+     */
     public function testGenerationForSpecificStore()
     {
         $this->category->expects($this->any())->method('getStoreId')->will($this->returnValue(1));
         $this->category->expects($this->never())->method('getStoreIds');
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical->setTargetPath('category-1')
+            ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['canonical']));
+            ->will($this->returnValue([$canonical]));
         $this->childrenUrlRewriteGenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([]));
         $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([]));
 
-        $this->assertEquals(['canonical'], $this->categoryUrlRewriteGenerator->generate($this->category));
+        $this->assertEquals([$canonical], $this->categoryUrlRewriteGenerator->generate($this->category));
     }
 
+    /**
+     * Test method
+     */
     public function testSkipGenerationForGlobalScope()
     {
         $this->category->expects($this->any())->method('getStoreIds')->will($this->returnValue([1, 2]));
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductUrlRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductUrlRewriteGeneratorTest.php
index 0608f755137936d1c6b8c612f3bb97f0c55d546e..861516a338f1bc8c92f86d98815741f78ef899b5 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductUrlRewriteGeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductUrlRewriteGeneratorTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\CatalogUrlRewrite\Test\Unit\Model;
 
 use Magento\Catalog\Model\Category;
@@ -37,6 +40,9 @@ class ProductUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Catalog\Model\Resource\Category\Collection|\PHPUnit_Framework_MockObject_MockObject */
     protected $categoriesCollection;
 
+    /**
+     * Test method
+     */
     protected function setUp()
     {
         $this->product = $this->getMock('Magento\Catalog\Model\Product', [], [], '', false);
@@ -75,6 +81,9 @@ class ProductUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         );
     }
 
+    /**
+     * Test method
+     */
     public function testGenerationForGlobalScope()
     {
         $this->product->expects($this->any())->method('getStoreId')->will($this->returnValue(null));
@@ -84,19 +93,31 @@ class ProductUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->categoriesCollection->expects($this->any())->method('getIterator')
             ->willReturn(new \ArrayIterator([]));
         $this->initObjectRegistryFactory([]);
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical->setTargetPath('category-1')
+            ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['canonical']));
+            ->will($this->returnValue([$canonical]));
+        $categories = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $categories->setTargetPath('category-2')
+            ->setStoreId(2);
         $this->categoriesUrlRewriteGenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['categories']));
+            ->will($this->returnValue([$categories]));
+        $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $current->setTargetPath('category-3')
+            ->setStoreId(3);
         $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['current']));
+            ->will($this->returnValue([$current]));
 
         $this->assertEquals(
-            ['canonical', 'categories', 'current'],
+            ['category-1-1' => $canonical, 'category-2-2' => $categories, 'category-3-3' => $current],
             $this->productUrlRewriteGenerator->generate($this->product)
         );
     }
 
+    /**
+     * Test method
+     */
     public function testGenerationForSpecificStore()
     {
         $this->product->expects($this->any())->method('getStoreId')->will($this->returnValue(1));
@@ -113,16 +134,22 @@ class ProductUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->categoriesCollection->expects($this->any())->method('getIterator')
             ->willReturn(new \ArrayIterator([$category]));
         $this->initObjectRegistryFactory([$category]);
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical->setTargetPath('category-1')
+            ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['canonical']));
+            ->will($this->returnValue([$canonical]));
         $this->categoriesUrlRewriteGenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([]));
         $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([]));
 
-        $this->assertEquals(['canonical'], $this->productUrlRewriteGenerator->generate($this->product));
+        $this->assertEquals(['category-1-1' => $canonical], $this->productUrlRewriteGenerator->generate($this->product));
     }
 
+    /**
+     * Test method
+     */
     public function testSkipRootCategoryForCategoriesGenerator()
     {
         $this->product->expects($this->any())->method('getStoreId')->will($this->returnValue(1));
@@ -136,16 +163,22 @@ class ProductUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->categoriesCollection->expects($this->any())->method('getIterator')
             ->willReturn(new \ArrayIterator([$rootCategory]));
         $this->initObjectRegistryFactory([]);
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical->setTargetPath('category-1')
+            ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['canonical']));
+            ->will($this->returnValue([$canonical]));
         $this->categoriesUrlRewriteGenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([]));
         $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([]));
 
-        $this->assertEquals(['canonical'], $this->productUrlRewriteGenerator->generate($this->product));
+        $this->assertEquals(['category-1-1' => $canonical], $this->productUrlRewriteGenerator->generate($this->product));
     }
 
+    /**
+     * Test method
+     */
     public function testSkipGenerationForNotStoreRootCategory()
     {
         $this->product->expects($this->any())->method('getStoreId')->will($this->returnValue(1));
@@ -159,16 +192,22 @@ class ProductUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->categoriesCollection->expects($this->any())->method('getIterator')
             ->willReturn(new \ArrayIterator([$category]));
         $this->initObjectRegistryFactory([]);
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical->setTargetPath('category-1')
+            ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
-            ->will($this->returnValue(['canonical']));
+            ->will($this->returnValue([$canonical]));
         $this->categoriesUrlRewriteGenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([]));
         $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([]));
 
-        $this->assertEquals(['canonical'], $this->productUrlRewriteGenerator->generate($this->product));
+        $this->assertEquals(['category-1-1' => $canonical], $this->productUrlRewriteGenerator->generate($this->product));
     }
 
+    /**
+     * Test method
+     */
     public function testSkipGenerationForGlobalScope()
     {
         $this->product->expects($this->any())->method('getStoreIds')->will($this->returnValue([1, 2]));
diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Cart/IndexTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/Cart/IndexTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..43b5fb8657ded5fc413dc2aaa4f5a627d5af6183
--- /dev/null
+++ b/app/code/Magento/Checkout/Test/Unit/Controller/Cart/IndexTest.php
@@ -0,0 +1,170 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Checkout\Test\Unit\Controller\Cart;
+
+use Magento\Checkout\Controller\Cart\Index;
+
+/**
+ * Class IndexTest
+ */
+class IndexTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Index
+     */
+    protected $controller;
+
+    /**
+     * @var \Magento\Checkout\Model\Session | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $checkoutSession;
+
+    /**
+     * @var \Magento\Framework\App\Request\Http | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $request;
+
+    /**
+     * @var \Magento\Framework\App\Response\Http | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $response;
+
+    /**
+     * @var \Magento\Quote\Model\Quote | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quote;
+
+    /**
+     * @var \Magento\Framework\Event\Manager | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $eventManager;
+
+    /**
+     * @var \Magento\Framework\Event\Manager | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $objectManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $cart;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfig;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $messageManager;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $resultPageFactory;
+
+    /**
+     * @return void
+     */
+    public function setUp()
+    {
+        $this->request = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false);
+        $this->response = $this->getMock('Magento\Framework\App\Response\Http', [], [], '', false);
+        $this->quote = $this->getMock('Magento\Quote\Model\Quote', [], [], '', false);
+        $this->eventManager = $this->getMock('Magento\Framework\Event\Manager', [], [], '', false);
+        $this->checkoutSession = $this->getMock('Magento\Checkout\Model\Session', [], [], '', false);
+
+        $this->objectManagerMock = $this->getMock('Magento\Framework\ObjectManager\ObjectManager', [], [], '', false);
+
+        $this->messageManager = $this->getMockBuilder('Magento\Framework\Message\ManagerInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $context = $this->getMock('Magento\Framework\App\Action\Context', [], [], '', false);
+        $context->expects($this->once())
+            ->method('getObjectManager')
+            ->willReturn($this->objectManagerMock);
+        $context->expects($this->once())
+            ->method('getRequest')
+            ->willReturn($this->request);
+        $context->expects($this->once())
+            ->method('getResponse')
+            ->willReturn($this->response);
+        $context->expects($this->once())
+            ->method('getEventManager')
+            ->willReturn($this->eventManager);
+        $context->expects($this->once())
+            ->method('getMessageManager')
+            ->willReturn($this->messageManager);
+
+        $this->cart = $this->getMockBuilder('Magento\Checkout\Model\Cart')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->scopeConfig = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->resultPageFactory = $this->getMockBuilder('Magento\Framework\View\Result\PageFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $this->controller = $objectManagerHelper->getObject(
+            'Magento\Checkout\Controller\Cart\Index',
+            [
+                'context' => $context,
+                'checkoutSession' => $this->checkoutSession,
+                'cart' => $this->cart,
+                'scopeConfig' => $this->scopeConfig,
+                'resultPageFactory' => $this->resultPageFactory
+            ]
+        );
+    }
+
+    /**
+     * @return void
+     */
+    public function testExecuteWithMessages()
+    {
+        $layout = $this->getMockBuilder('Magento\Framework\View\Layout')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $layout->expects($this->once())
+            ->method('initMessages');
+
+        $title = $this->getMockBuilder('Magento\Framework\View\Page\Title')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $title->expects($this->once())
+            ->method('set')
+            ->with('Shopping Cart');
+
+        $config = $this->getMockBuilder('Magento\Framework\View\Page\Config')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $config->expects($this->once())
+            ->method('getTitle')
+            ->willReturn($title);
+
+        $page = $this->getMockBuilder('Magento\Framework\View\Result\Page')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $page->expects($this->once())
+            ->method('getLayout')
+            ->willReturn($layout);
+        $page->expects($this->once())
+            ->method('getConfig')
+            ->willReturn($config);
+
+        $this->resultPageFactory->expects($this->once())
+            ->method('create')
+            ->willReturn($page);
+        $result = $this->controller->execute();
+        $this->assertInstanceOf('Magento\Framework\View\Result\Page', $result);
+    }
+}
diff --git a/app/code/Magento/Checkout/composer.json b/app/code/Magento/Checkout/composer.json
index 6a4b0255686f84d78b71a80df174311f155b9999..ed8f574a7005d5cf7aa498cff6670c9cf6027f40 100644
--- a/app/code/Magento/Checkout/composer.json
+++ b/app/code/Magento/Checkout/composer.json
@@ -6,7 +6,7 @@
         "magento/module-store": "0.42.0-beta11",
         "magento/module-sales": "0.42.0-beta11",
         "magento/module-catalog-inventory": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
+        "magento/module-config": "0.42.0-beta11",
         "magento/module-customer": "0.42.0-beta11",
         "magento/module-catalog": "0.42.0-beta11",
         "magento/module-payment": "0.42.0-beta11",
diff --git a/app/code/Magento/Checkout/etc/config.xml b/app/code/Magento/Checkout/etc/config.xml
index 5d709676cb3b6ceedd9b7d25109914f1900a0a8f..31f59f6d891c5af880e55ec5d2dda30c5d26ab28 100644
--- a/app/code/Magento/Checkout/etc/config.xml
+++ b/app/code/Magento/Checkout/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <checkout>
             <options>
diff --git a/app/code/Magento/Checkout/etc/frontend/page_types.xml b/app/code/Magento/Checkout/etc/frontend/page_types.xml
index 10c6563f3e27306d7d44cd691fe0c359c35e7bc3..dc770ab1d1bb794e1de7d404ce9ea6a132badb4f 100644
--- a/app/code/Magento/Checkout/etc/frontend/page_types.xml
+++ b/app/code/Magento/Checkout/etc/frontend/page_types.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="checkout_cart_configure" label="Configure Cart Item (Any)"/>
     <type id="checkout_cart_index" label="Shopping Cart"/>
     <type id="checkout_onepage_failure" label="One Page Checkout Failure"/>
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js b/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js
index 21b896ecf549ab69eebdc51606ab470afdfa7aa1..bdc635d337b1bd760aa82fa043ec8074b25236e1 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js
@@ -234,11 +234,9 @@ define([
                             if (msg) {
                                 if (Array.isArray(msg)) {
                                     msg = msg.reduce(function (str, chunk) {
-                                        str += '\n' + $.mage.__(chunk);
+                                        str += '\n' + chunk;
                                         return str;
                                     }, '');
-                                } else {
-                                    msg = $.mage.__(msg);
                                 }
 
                                 $(this.options.countrySelector).trigger('change');
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js b/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js
index d8ccb7eecc89cffc5a06899d03e43795c139740d..ac833eb7df2a1ab41c4cf827fa36ccc6b4458de8 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js
@@ -198,9 +198,9 @@ define([
 
                                 $(this.options.countrySelector).trigger('change');
 
-                                alert($.mage.__(msg));
+                                alert(msg);
                             } else {
-                                alert($.mage.__(response.error));
+                                alert(response.error);
                             }
 
                             return;
diff --git a/app/code/Magento/CheckoutAgreements/Model/Agreement.php b/app/code/Magento/CheckoutAgreements/Model/Agreement.php
index ceca39fa477ea584e4a8531fd08c7a6baab76dc2..6f951c12d5b629bc304cb0d80933030654598d1b 100644
--- a/app/code/Magento/CheckoutAgreements/Model/Agreement.php
+++ b/app/code/Magento/CheckoutAgreements/Model/Agreement.php
@@ -6,9 +6,9 @@
 namespace Magento\CheckoutAgreements\Model;
 
 use Magento\CheckoutAgreements\Api\Data\AgreementInterface;
-use Magento\Framework\Model\AbstractExtensibleModel;
+use Magento\Framework\Model\AbstractModel;
 
-class Agreement extends AbstractExtensibleModel implements AgreementInterface
+class Agreement extends AbstractModel implements AgreementInterface
 {
     /**
      * Allowed CSS units for height field
diff --git a/app/code/Magento/CheckoutAgreements/etc/module.xml b/app/code/Magento/CheckoutAgreements/etc/module.xml
index 36bad32ebf304277292947dd3b01f54704cc0b7b..249c7b190e363da6ada252358dc4e4f8f4ca3c29 100644
--- a/app/code/Magento/CheckoutAgreements/etc/module.xml
+++ b/app/code/Magento/CheckoutAgreements/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_CheckoutAgreements" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Cms/etc/config.xml b/app/code/Magento/Cms/etc/config.xml
index 159fffe75e0734b6f1186375afda5460a90d5852..5b25edb764f4d8e03ddb79a8c404d3475707c2fb 100644
--- a/app/code/Magento/Cms/etc/config.xml
+++ b/app/code/Magento/Cms/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <web>
             <default>
diff --git a/app/code/Magento/Cms/etc/frontend/page_types.xml b/app/code/Magento/Cms/etc/frontend/page_types.xml
index ac2f917542bcc6bddaa28fa8de7701d5fa6b9aa1..a6284ce44454b14ce4a256d0fa0db37d49cb0999 100644
--- a/app/code/Magento/Cms/etc/frontend/page_types.xml
+++ b/app/code/Magento/Cms/etc/frontend/page_types.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="cms_index_defaultindex" label="CMS Home Default Page"/>
     <type id="cms_index_defaultnoroute" label="CMS No-Route Default Page"/>
     <type id="cms_index_index" label="CMS Home Page"/>
diff --git a/app/code/Magento/Cms/etc/module.xml b/app/code/Magento/Cms/etc/module.xml
index e083de84b5d1cde2788572eeca66dc552fbbb8c1..9103575c3a6b146e2e8fa1559ac1eeb91fd4625c 100644
--- a/app/code/Magento/Cms/etc/module.xml
+++ b/app/code/Magento/Cms/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Cms" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
             <module name="Magento_Theme"/>
         </sequence>
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Source/Email/TemplateTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Source/Email/TemplateTest.php
index 12a6aaa4103648be57f326ea5190e834ce51e8f0..03dd7a71d0c22c9534beca8babb44334b0ce446b 100644
--- a/app/code/Magento/Config/Test/Unit/Model/Config/Source/Email/TemplateTest.php
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Source/Email/TemplateTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Config\Test\Unit\Model\Config\Source\Email;
 
 class TemplateTest extends \PHPUnit_Framework_TestCase
@@ -23,7 +26,7 @@ class TemplateTest extends \PHPUnit_Framework_TestCase
     protected $_emailConfig;
 
     /**
-     * @var /Magento\Core\Model\Resource\Email\Template\CollectionFactory
+     * @var \Magento\Email\Model\Resource\Email\Template\CollectionFactory
      */
     protected $_templatesFactory;
 
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Structure/Element/FieldTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Structure/Element/FieldTest.php
index 900ec273d690e6853f528c8a2d92e70a64c0b444..c9457d003b374eae3006746308c56aac7709e7a6 100644
--- a/app/code/Magento/Config/Test/Unit/Model/Config/Structure/Element/FieldTest.php
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Structure/Element/FieldTest.php
@@ -5,6 +5,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Config\Test\Unit\Model\Config\Structure\Element;
 
 class FieldTest extends \PHPUnit_Framework_TestCase
@@ -171,7 +174,7 @@ class FieldTest extends \PHPUnit_Framework_TestCase
 
     public function testGetTooltipCreatesTooltipBlock()
     {
-        $this->_model->setData(['tooltip_block' => 'Magento\Core\Block\Tooltip'], 'scope');
+        $this->_model->setData(['tooltip_block' => 'Magento\Config\Block\Tooltip'], 'scope');
         $tooltipBlock = $this->getMock('Magento\Framework\View\Element\BlockInterface');
         $tooltipBlock->expects($this->once())->method('toHtml')->will($this->returnValue('tooltip block'));
         $this->_blockFactoryMock->expects(
@@ -179,7 +182,7 @@ class FieldTest extends \PHPUnit_Framework_TestCase
         )->method(
             'createBlock'
         )->with(
-            'Magento\Core\Block\Tooltip'
+            'Magento\Config\Block\Tooltip'
         )->will(
             $this->returnValue($tooltipBlock)
         );
diff --git a/app/code/Magento/Config/composer.json b/app/code/Magento/Config/composer.json
index 34ebbca138848ab22af73c0dd1f39fb0deadcebf..9fdfc97389801480818889a96c47d96ce1b2dd11 100644
--- a/app/code/Magento/Config/composer.json
+++ b/app/code/Magento/Config/composer.json
@@ -4,7 +4,6 @@
     "require": {
         "php": "~5.5.0|~5.6.0",
         "magento/framework": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-store": "0.42.0-beta11",
         "magento/module-cron": "0.42.0-beta11",
         "magento/module-email": "0.42.0-beta11",
diff --git a/app/code/Magento/Config/i18n/de_DE.csv b/app/code/Magento/Config/i18n/de_DE.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0aa412938948174cc2ccbb853f05ff5f6de51522
--- /dev/null
+++ b/app/code/Magento/Config/i18n/de_DE.csv
@@ -0,0 +1 @@
+Configuration,Configuration
diff --git a/app/code/Magento/Config/i18n/en_US.csv b/app/code/Magento/Config/i18n/en_US.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0aa412938948174cc2ccbb853f05ff5f6de51522
--- /dev/null
+++ b/app/code/Magento/Config/i18n/en_US.csv
@@ -0,0 +1 @@
+Configuration,Configuration
diff --git a/app/code/Magento/Config/i18n/es_ES.csv b/app/code/Magento/Config/i18n/es_ES.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0aa412938948174cc2ccbb853f05ff5f6de51522
--- /dev/null
+++ b/app/code/Magento/Config/i18n/es_ES.csv
@@ -0,0 +1 @@
+Configuration,Configuration
diff --git a/app/code/Magento/Config/i18n/fr_FR.csv b/app/code/Magento/Config/i18n/fr_FR.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0aa412938948174cc2ccbb853f05ff5f6de51522
--- /dev/null
+++ b/app/code/Magento/Config/i18n/fr_FR.csv
@@ -0,0 +1 @@
+Configuration,Configuration
diff --git a/app/code/Magento/Config/i18n/nl_NL.csv b/app/code/Magento/Config/i18n/nl_NL.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0aa412938948174cc2ccbb853f05ff5f6de51522
--- /dev/null
+++ b/app/code/Magento/Config/i18n/nl_NL.csv
@@ -0,0 +1 @@
+Configuration,Configuration
diff --git a/app/code/Magento/Config/i18n/pt_BR.csv b/app/code/Magento/Config/i18n/pt_BR.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0aa412938948174cc2ccbb853f05ff5f6de51522
--- /dev/null
+++ b/app/code/Magento/Config/i18n/pt_BR.csv
@@ -0,0 +1 @@
+Configuration,Configuration
diff --git a/app/code/Magento/Config/i18n/zh_CN.csv b/app/code/Magento/Config/i18n/zh_CN.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0aa412938948174cc2ccbb853f05ff5f6de51522
--- /dev/null
+++ b/app/code/Magento/Config/i18n/zh_CN.csv
@@ -0,0 +1 @@
+Configuration,Configuration
diff --git a/app/code/Magento/ConfigurableProduct/Api/Data/OptionInterface.php b/app/code/Magento/ConfigurableProduct/Api/Data/OptionInterface.php
index 8f4bbba818b2cbef6eddadca0c2a357e0a32139b..82e73fe8686e268e1b3701c216fe3bb8a2d4ee95 100644
--- a/app/code/Magento/ConfigurableProduct/Api/Data/OptionInterface.php
+++ b/app/code/Magento/ConfigurableProduct/Api/Data/OptionInterface.php
@@ -84,4 +84,21 @@ interface OptionInterface extends \Magento\Framework\Api\ExtensibleDataInterface
      * @return $this
      */
     public function setValues(array $values = null);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\ConfigurableProduct\Api\Data\OptionExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\ConfigurableProduct\Api\Data\OptionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\ConfigurableProduct\Api\Data\OptionExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/ConfigurableProduct/Api/Data/OptionValueInterface.php b/app/code/Magento/ConfigurableProduct/Api/Data/OptionValueInterface.php
index b24f4702da96fd9a496c709cf2523e53b3f86840..a6838c3b72d8d31f43457ecb7c356cefc0ed82be 100644
--- a/app/code/Magento/ConfigurableProduct/Api/Data/OptionValueInterface.php
+++ b/app/code/Magento/ConfigurableProduct/Api/Data/OptionValueInterface.php
@@ -40,4 +40,21 @@ interface OptionValueInterface extends \Magento\Framework\Api\ExtensibleDataInte
      * @return $this
      */
     public function setValueIndex($valueIndex);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\ConfigurableProduct\Api\Data\OptionValueExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\ConfigurableProduct\Api\Data\OptionValueExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\ConfigurableProduct\Api\Data\OptionValueExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/ConfigurableProduct/Api/LinkManagementInterface.php b/app/code/Magento/ConfigurableProduct/Api/LinkManagementInterface.php
index 92d408658636e4e6f58de24865b406f4de1a69a6..2b62e7c3e73eb31cfaf79d42dbef93c2a6e48914 100644
--- a/app/code/Magento/ConfigurableProduct/Api/LinkManagementInterface.php
+++ b/app/code/Magento/ConfigurableProduct/Api/LinkManagementInterface.php
@@ -11,26 +11,26 @@ interface LinkManagementInterface
     /**
      * Get all children for Bundle product
      *
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\Catalog\Api\Data\ProductInterface[]
      */
-    public function getChildren($productSku);
+    public function getChildren($sku);
 
     /**
-     * @param  string $productSku
+     * @param  string $sku
      * @param  string $childSku
      * @return bool
      */
-    public function addChild($productSku, $childSku);
+    public function addChild($sku, $childSku);
 
     /**
      * Remove configurable product option
      *
-     * @param string $productSku
+     * @param string $sku
      * @param string $childSku
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\InputException
      * @return bool
      */
-    public function removeChild($productSku, $childSku);
+    public function removeChild($sku, $childSku);
 }
diff --git a/app/code/Magento/ConfigurableProduct/Api/OptionRepositoryInterface.php b/app/code/Magento/ConfigurableProduct/Api/OptionRepositoryInterface.php
index 0c27db8c4fa4c67d4542294f2823c569e40adf38..990d8fd6dcaf8f64c36c43127a4dd8b763cdc2b1 100644
--- a/app/code/Magento/ConfigurableProduct/Api/OptionRepositoryInterface.php
+++ b/app/code/Magento/ConfigurableProduct/Api/OptionRepositoryInterface.php
@@ -11,23 +11,23 @@ interface OptionRepositoryInterface
     /**
      * Get option for configurable product
      *
-     * @param string $productSku
-     * @param int $optionId
+     * @param string $sku
+     * @param int $id
      * @return \Magento\ConfigurableProduct\Api\Data\OptionInterface
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\InputException
      */
-    public function get($productSku, $optionId);
+    public function get($sku, $id);
 
     /**
      * Get all options for configurable product
      *
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\ConfigurableProduct\Api\Data\OptionInterface[]
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\InputException
      */
-    public function getList($productSku);
+    public function getList($sku);
 
     /**
      * Remove option from configurable product
@@ -40,23 +40,23 @@ interface OptionRepositoryInterface
     /**
      * Remove option from configurable product
      *
-     * @param string $productSku
-     * @param int $optionId
+     * @param string $sku
+     * @param int $id
      * @return bool
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\InputException
      */
-    public function deleteById($productSku, $optionId);
+    public function deleteById($sku, $id);
 
     /**
      * Save option
      *
-     * @param string $productSku
+     * @param string $sku
      * @param \Magento\ConfigurableProduct\Api\Data\OptionInterface $option
      * @return int
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      * @throws \InvalidArgumentException
      */
-    public function save($productSku, \Magento\ConfigurableProduct\Api\Data\OptionInterface $option);
+    public function save($sku, \Magento\ConfigurableProduct\Api\Data\OptionInterface $option);
 }
diff --git a/app/code/Magento/ConfigurableProduct/Model/LinkManagement.php b/app/code/Magento/ConfigurableProduct/Model/LinkManagement.php
index bfd15a056fc06b6a25c2e6155eab76e3895e88ac..51f425d487f302c4062622c25db1e4fa8ef0f1bc 100644
--- a/app/code/Magento/ConfigurableProduct/Model/LinkManagement.php
+++ b/app/code/Magento/ConfigurableProduct/Model/LinkManagement.php
@@ -53,10 +53,10 @@ class LinkManagement implements \Magento\ConfigurableProduct\Api\LinkManagementI
     /**
      * {@inheritdoc}
      */
-    public function getChildren($productSku)
+    public function getChildren($sku)
     {
         /** @var \Magento\Catalog\Model\Product $product */
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         if ($product->getTypeId() != \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
             return [];
         }
@@ -92,9 +92,9 @@ class LinkManagement implements \Magento\ConfigurableProduct\Api\LinkManagementI
     /**
      * {@inheritdoc}
      */
-    public function addChild($productSku, $childSku)
+    public function addChild($sku, $childSku)
     {
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         $child = $this->productRepository->get($childSku);
 
         $childrenIds = array_values($this->configurableType->getChildrenIds($product->getId())[0]);
@@ -111,13 +111,13 @@ class LinkManagement implements \Magento\ConfigurableProduct\Api\LinkManagementI
     /**
      * {@inheritdoc}
      */
-    public function removeChild($productSku, $childSku)
+    public function removeChild($sku, $childSku)
     {
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
 
         if ($product->getTypeId() != \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
             throw new InputException(
-                __('Product with specified sku: %1 is not a configurable product', $productSku)
+                __('Product with specified sku: %1 is not a configurable product', $sku)
             );
         }
 
diff --git a/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php b/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php
index a8d9112de4b0d3111e20f8bb8287ca4adfb38cc8..da8e040874852d2af958a2d52345192c7cbc75b1 100644
--- a/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php
+++ b/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php
@@ -84,15 +84,15 @@ class OptionRepository implements \Magento\ConfigurableProduct\Api\OptionReposit
     /**
      * {@inheritdoc}
      */
-    public function get($productSku, $optionId)
+    public function get($sku, $id)
     {
-        $product = $this->getProduct($productSku);
+        $product = $this->getProduct($sku);
         $collection = $this->getConfigurableAttributesCollection($product);
-        $collection->addFieldToFilter($collection->getResource()->getIdFieldName(), $optionId);
+        $collection->addFieldToFilter($collection->getResource()->getIdFieldName(), $id);
         /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $configurableAttribute */
         $configurableAttribute = $collection->getFirstItem();
         if (!$configurableAttribute->getId()) {
-            throw new NoSuchEntityException(__('Requested option doesn\'t exist: %1', $optionId));
+            throw new NoSuchEntityException(__('Requested option doesn\'t exist: %1', $id));
         }
         $prices = $configurableAttribute->getPrices();
         if (is_array($prices)) {
@@ -112,10 +112,10 @@ class OptionRepository implements \Magento\ConfigurableProduct\Api\OptionReposit
     /**
      * {@inheritdoc}
      */
-    public function getList($productSku)
+    public function getList($sku)
     {
         $options = [];
-        $product = $this->getProduct($productSku);
+        $product = $this->getProduct($sku);
         foreach ($this->getConfigurableAttributesCollection($product) as $option) {
             $values = [];
             $prices = $option->getPrices();
@@ -153,12 +153,12 @@ class OptionRepository implements \Magento\ConfigurableProduct\Api\OptionReposit
     /**
      * {@inheritdoc}
      */
-    public function deleteById($productSku, $optionId)
+    public function deleteById($sku, $id)
     {
-        $product = $this->getProduct($productSku);
+        $product = $this->getProduct($sku);
         $attributeCollection = $this->configurableType->getConfigurableAttributeCollection($product);
         /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $option */
-        $option = $attributeCollection->getItemById($optionId);
+        $option = $attributeCollection->getItemById($id);
         if ($option === null) {
             throw new NoSuchEntityException(__('Requested option doesn\'t exist'));
         }
@@ -169,13 +169,13 @@ class OptionRepository implements \Magento\ConfigurableProduct\Api\OptionReposit
      * {@inheritdoc}
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
-    public function save($productSku, \Magento\ConfigurableProduct\Api\Data\OptionInterface $option)
+    public function save($sku, \Magento\ConfigurableProduct\Api\Data\OptionInterface $option)
     {
         /** @var $configurableAttribute \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute */
         $configurableAttribute = $this->configurableAttributeFactory->create();
         if ($option->getId()) {
             /** @var \Magento\Catalog\Model\Product $product */
-            $product = $this->getProduct($productSku);
+            $product = $this->getProduct($sku);
             $configurableAttribute->load($option->getId());
             if (!$configurableAttribute->getId() || $configurableAttribute->getProductId() != $product->getId()) {
                 throw new NoSuchEntityException(
@@ -203,7 +203,7 @@ class OptionRepository implements \Magento\ConfigurableProduct\Api\OptionReposit
         } else {
             $this->validateNewOptionData($option);
             /** @var \Magento\Catalog\Model\Product $product */
-            $product = $this->productRepository->get($productSku);
+            $product = $this->productRepository->get($sku);
             $allowedTypes = [ProductType::TYPE_SIMPLE, ProductType::TYPE_VIRTUAL, ConfigurableType::TYPE_CODE];
             if (!in_array($product->getTypeId(), $allowedTypes)) {
                 throw new \InvalidArgumentException('Incompatible product type');
@@ -244,16 +244,16 @@ class OptionRepository implements \Magento\ConfigurableProduct\Api\OptionReposit
     /**
      * Retrieve product instance by sku
      *
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\Catalog\Model\Product
      * @throws InputException
      */
-    private function getProduct($productSku)
+    private function getProduct($sku)
     {
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         if (\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE !== $product->getTypeId()) {
             throw new InputException(
-                __('Only implemented for configurable product: %1', $productSku)
+                __('Only implemented for configurable product: %1', $sku)
             );
         }
         return $product;
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
index d2e9954bd1cfa4fab7cb11016829042ebf36eb94..73c029fe5db46074da69204e5a48c6e90ea7959d 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
@@ -209,5 +209,27 @@ class Attribute extends \Magento\Framework\Model\AbstractExtensibleModel impleme
     {
         return $this->setData(self::KEY_VALUES, $values);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\ConfigurableProduct\Api\Data\OptionExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\ConfigurableProduct\Api\Data\OptionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\ConfigurableProduct\Api\Data\OptionExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/OptionValue.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/OptionValue.php
index 7acd37f43cab707da519717e3788d4cd4156f0ee..8a551ed9e5f362d998da7e1504c178be0a1cd88b 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/OptionValue.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/OptionValue.php
@@ -9,6 +9,10 @@ namespace Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 
 use Magento\ConfigurableProduct\Api\Data\OptionValueInterface;
 
+/**
+ * Class OptionValue
+ *
+ */
 class OptionValue extends \Magento\Framework\Model\AbstractExtensibleModel implements
     \Magento\ConfigurableProduct\Api\Data\OptionValueInterface
 {
@@ -44,6 +48,7 @@ class OptionValue extends \Magento\Framework\Model\AbstractExtensibleModel imple
     {
         return $this->getData(self::KEY_VALUE_INDEX);
     }
+
     /**
      * @param float $pricingValue
      * @return $this
@@ -70,5 +75,27 @@ class OptionValue extends \Magento\Framework\Model\AbstractExtensibleModel imple
     {
         return $this->setData(self::KEY_VALUE_INDEX, $valueIndex);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\ConfigurableProduct\Api\Data\OptionValueExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\ConfigurableProduct\Api\Data\OptionValueExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\ConfigurableProduct\Api\Data\OptionValueExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Validator/Plugin.php b/app/code/Magento/ConfigurableProduct/Model/Product/Validator/Plugin.php
index c5fcd0eed8f45f2dcd99255b7c3017e30a69fdde..7b9feeb1d1a64269354d2ca21ba3774e0f218e4b 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Product/Validator/Plugin.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Validator/Plugin.php
@@ -8,7 +8,6 @@ namespace Magento\ConfigurableProduct\Model\Product\Validator;
 use Closure;
 use Magento\Catalog\Model\Product;
 use Magento\Catalog\Model\ProductFactory;
-use Magento\Core\Helper;
 use Magento\Framework\App\RequestInterface;
 use Magento\Framework\Event\Manager;
 use Magento\Framework\Json\Helper\Data;
diff --git a/app/code/Magento/ConfigurableProduct/composer.json b/app/code/Magento/ConfigurableProduct/composer.json
index d893a9a579d497a9ffb1e24a944cdf351bc37447..8e5ed6d41420f3511ea04f64c73aae01705a0d98 100644
--- a/app/code/Magento/ConfigurableProduct/composer.json
+++ b/app/code/Magento/ConfigurableProduct/composer.json
@@ -7,7 +7,6 @@
         "magento/module-catalog": "0.42.0-beta11",
         "magento/module-catalog-inventory": "0.42.0-beta11",
         "magento/module-sales": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-checkout": "0.42.0-beta11",
         "magento/module-backend": "0.42.0-beta11",
         "magento/module-eav": "0.42.0-beta11",
diff --git a/app/code/Magento/ConfigurableProduct/etc/config.xml b/app/code/Magento/ConfigurableProduct/etc/config.xml
index f634fdfd21a81a63bf7c4c072c1450b1c4f30898..9cbd5d1e351f252168756cac3dd03ade2e3cc296 100644
--- a/app/code/Magento/ConfigurableProduct/etc/config.xml
+++ b/app/code/Magento/ConfigurableProduct/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <checkout>
             <cart>
diff --git a/app/code/Magento/ConfigurableProduct/etc/webapi.xml b/app/code/Magento/ConfigurableProduct/etc/webapi.xml
index d48569ce61b337753067bd160f1627a84dd261f2..9c68aa71869f44782120dda382eb7de6c34e9f2d 100644
--- a/app/code/Magento/ConfigurableProduct/etc/webapi.xml
+++ b/app/code/Magento/ConfigurableProduct/etc/webapi.xml
@@ -7,13 +7,13 @@
 -->
 <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
-    <route url="/V1/configurable-products/:productSku/children" method="GET">
+    <route url="/V1/configurable-products/:sku/children" method="GET">
         <service class="Magento\ConfigurableProduct\Api\LinkManagementInterface" method="getChildren"/>
         <resources>
             <resource ref="Magento_Catalog::products"/>
         </resources>
     </route>
-    <route url="/V1/configurable-products/:productSku/child/:childSku" method="DELETE">
+    <route url="/V1/configurable-products/:sku/children/:childSku" method="DELETE">
         <service class="Magento\ConfigurableProduct\Api\LinkManagementInterface" method="removeChild"/>
         <resources>
             <resource ref="Magento_Catalog::products"/>
@@ -25,19 +25,19 @@
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/configurable-products/:productSku/child" method="POST">
+    <route url="/V1/configurable-products/:sku/child" method="POST">
         <service class="Magento\ConfigurableProduct\Api\LinkManagementInterface" method="addChild"/>
         <resources>
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/configurable-products/:productSku/options/:optionId" method="GET">
+    <route url="/V1/configurable-products/:sku/options/:id" method="GET">
         <service class="Magento\ConfigurableProduct\Api\OptionRepositoryInterface" method="get"/>
         <resources>
             <resource ref="Magento_Catalog::products"/>
         </resources>
     </route>
-    <route url="/V1/configurable-products/:productSku/options/all" method="GET">
+    <route url="/V1/configurable-products/:sku/options/all" method="GET">
         <service class="Magento\ConfigurableProduct\Api\OptionRepositoryInterface" method="getList"/>
         <resources>
             <resource ref="Magento_Catalog::products"/>
@@ -49,19 +49,19 @@
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/configurable-products/:productSku/options" method="POST">
+    <route url="/V1/configurable-products/:sku/options" method="POST">
         <service class="Magento\ConfigurableProduct\Api\OptionRepositoryInterface" method="save" />
         <resources>
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/configurable-products/:productSku/options/:id" method="PUT">
+    <route url="/V1/configurable-products/:sku/options/:id" method="PUT">
         <service class="Magento\ConfigurableProduct\Api\OptionRepositoryInterface" method="save" />
         <resources>
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
-    <route url="/V1/configurable-products/:productSku/options/:optionId" method="DELETE">
+    <route url="/V1/configurable-products/:sku/options/:id" method="DELETE">
         <service class="Magento\ConfigurableProduct\Api\OptionRepositoryInterface" method="deleteById" />
         <resources>
             <resource ref="Magento_Catalog::products" />
diff --git a/app/code/Magento/Contact/etc/config.xml b/app/code/Magento/Contact/etc/config.xml
index f075a4e53a954f1aedaa8bbf705921857eac6dc2..fb2a17aa0100cbc9524c4692881ac265f7fe2275 100644
--- a/app/code/Magento/Contact/etc/config.xml
+++ b/app/code/Magento/Contact/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <contact>
             <contact>
diff --git a/app/code/Magento/Contact/etc/frontend/page_types.xml b/app/code/Magento/Contact/etc/frontend/page_types.xml
index 9bcf7e9ca9774e395810ebab93590bea9ef4c401..9e85e85522a1557017ebbb649332049502d381fb 100644
--- a/app/code/Magento/Contact/etc/frontend/page_types.xml
+++ b/app/code/Magento/Contact/etc/frontend/page_types.xml
@@ -5,6 +5,6 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="contact_index_index" label="Contact Us Form"/>
 </page_types>
diff --git a/app/code/Magento/Contact/etc/module.xml b/app/code/Magento/Contact/etc/module.xml
index 9962113cf348f736f2f61a98ac2e1b54761b3625..96f06a6c555a729a02b8643f7e01b3987e5a9bf0 100644
--- a/app/code/Magento/Contact/etc/module.xml
+++ b/app/code/Magento/Contact/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Contact" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Cookie/etc/config.xml b/app/code/Magento/Cookie/etc/config.xml
index cdeb99d4195ea29343fec69aaf2b69fcfd9ed508..7ebaec497d7bfd166822f31eb274c3e2feeb3692 100644
--- a/app/code/Magento/Cookie/etc/config.xml
+++ b/app/code/Magento/Cookie/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <web>
             <cookie>
diff --git a/app/code/Magento/Core/Controller/Index/NotFound.php b/app/code/Magento/Core/Controller/Index/NotFound.php
deleted file mode 100644
index 3e0a46abf199a8ac1da81af408f8940d170d09fa..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/Controller/Index/NotFound.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-/**
- *
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Core\Controller\Index;
-
-class NotFound extends \Magento\Framework\App\Action\Action
-{
-    /**
-     * 404 not found action
-     *
-     * @return void
-     */
-    public function execute()
-    {
-        $this->getResponse()->setStatusHeader(404, '1.1', 'Not Found');
-        $this->getResponse()->setBody(__('Requested resource not found'));
-    }
-}
diff --git a/app/code/Magento/Core/Setup/InstallData.php b/app/code/Magento/Core/Setup/InstallData.php
deleted file mode 100755
index 52d8e6bea687733db2bd6fb477bcc1f11a9ed24e..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/Setup/InstallData.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Core\Setup;
-
-use Magento\Framework\Module\Setup\Migration;
-use Magento\Framework\Setup\InstallDataInterface;
-use Magento\Framework\Setup\ModuleContextInterface;
-use Magento\Framework\Setup\ModuleDataSetupInterface;
-
-/**
- * @codeCoverageIgnore
- */
-class InstallData implements InstallDataInterface
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
-    {
-        $setup->startSetup();
-
-        /**
-         * Delete rows by condition from authorization_rule
-         */
-        $tableName = $setup->getTable('authorization_rule');
-        if ($tableName) {
-            $setup->getConnection()->delete($tableName, ['resource_id = ?' => 'admin/system/tools/compiler']);
-        }
-
-        $setup->endSetup();
-        
-    }
-}
diff --git a/app/code/Magento/Core/Setup/InstallSchema.php b/app/code/Magento/Core/Setup/InstallSchema.php
deleted file mode 100644
index 5a9c92b58b1e6fcaf355c817a34c16f74d5c46c5..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/Setup/InstallSchema.php
+++ /dev/null
@@ -1,231 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Core\Setup;
-
-use Magento\Framework\Setup\InstallSchemaInterface;
-use Magento\Framework\Setup\ModuleContextInterface;
-use Magento\Framework\Setup\SchemaSetupInterface;
-
-/**
- * @codeCoverageIgnore
- */
-class InstallSchema implements InstallSchemaInterface
-{
-    /**
-     * {@inheritdoc}
-     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
-     */
-    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
-    {
-        $installer = $setup;
-
-        /* @var $connection \Magento\Framework\DB\Adapter\AdapterInterface */
-        $connection = $installer->getConnection();
-
-        $installer->startSetup();
-
-        /**
-         * Create table 'core_session'
-         */
-        $table = $connection->newTable(
-            $installer->getTable('core_session')
-        )->addColumn(
-            'session_id',
-            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-            255,
-            ['nullable' => false, 'primary' => true],
-            'Session Id'
-        )->addColumn(
-            'session_expires',
-            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-            null,
-            ['unsigned' => true, 'nullable' => false, 'default' => '0'],
-            'Date of Session Expiration'
-        )->addColumn(
-            'session_data',
-            \Magento\Framework\DB\Ddl\Table::TYPE_BLOB,
-            '2M',
-            ['nullable' => false],
-            'Session Data'
-        )->setComment(
-            'Database Sessions Storage'
-        );
-        $connection->createTable($table);
-
-        /**
-         * Create table 'design_change'
-         */
-        $table = $connection->newTable(
-            $installer->getTable('design_change')
-        )->addColumn(
-            'design_change_id',
-            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-            null,
-            ['identity' => true, 'nullable' => false, 'primary' => true],
-            'Design Change Id'
-        )->addColumn(
-            'store_id',
-            \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
-            null,
-            ['unsigned' => true, 'nullable' => false, 'default' => '0'],
-            'Store Id'
-        )->addColumn(
-            'design',
-            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-            255,
-            [],
-            'Design'
-        )->addColumn(
-            'date_from',
-            \Magento\Framework\DB\Ddl\Table::TYPE_DATE,
-            null,
-            [],
-            'First Date of Design Activity'
-        )->addColumn(
-            'date_to',
-            \Magento\Framework\DB\Ddl\Table::TYPE_DATE,
-            null,
-            [],
-            'Last Date of Design Activity'
-        )->addIndex(
-            $installer->getIdxName('design_change', ['store_id']),
-            ['store_id']
-        )->addForeignKey(
-            $installer->getFkName('design_change', 'store_id', 'store', 'store_id'),
-            'store_id',
-            $installer->getTable('store'),
-            'store_id',
-            \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE,
-            \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
-        )->setComment(
-            'Design Changes'
-        );
-        $connection->createTable($table);
-
-        /**
-         * Create table 'core_cache'
-         */
-        $table = $connection->newTable(
-            $installer->getTable('core_cache')
-        )->addColumn(
-            'id',
-            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-            200,
-            ['nullable' => false, 'primary' => true],
-            'Cache Id'
-        )->addColumn(
-            'data',
-            \Magento\Framework\DB\Ddl\Table::TYPE_BLOB,
-            '2M',
-            [],
-            'Cache Data'
-        )->addColumn(
-            'create_time',
-            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-            null,
-            [],
-            'Cache Creation Time'
-        )->addColumn(
-            'update_time',
-            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-            null,
-            [],
-            'Time of Cache Updating'
-        )->addColumn(
-            'expire_time',
-            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-            null,
-            [],
-            'Cache Expiration Time'
-        )->addIndex(
-            $installer->getIdxName('core_cache', ['expire_time']),
-            ['expire_time']
-        )->setComment(
-            'Caches'
-        );
-        $connection->createTable($table);
-
-        /**
-         * Create table 'core_cache_tag'
-         */
-        $table = $connection->newTable(
-            $installer->getTable('core_cache_tag')
-        )->addColumn(
-            'tag',
-            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-            100,
-            ['nullable' => false, 'primary' => true],
-            'Tag'
-        )->addColumn(
-            'cache_id',
-            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-            200,
-            ['nullable' => false, 'primary' => true],
-            'Cache Id'
-        )->addIndex(
-            $installer->getIdxName('core_cache_tag', ['cache_id']),
-            ['cache_id']
-        )->setComment(
-            'Tag Caches'
-        );
-        $connection->createTable($table);
-
-        /**
-         * Create table 'core_flag'
-         */
-        $table = $connection->newTable(
-            $installer->getTable('core_flag')
-        )->addColumn(
-            'flag_id',
-            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-            null,
-            ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
-            'Flag Id'
-        )->addColumn(
-            'flag_code',
-            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-            255,
-            ['nullable' => false],
-            'Flag Code'
-        )->addColumn(
-            'state',
-            \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
-            null,
-            ['unsigned' => true, 'nullable' => false, 'default' => '0'],
-            'Flag State'
-        )->addColumn(
-            'flag_data',
-            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-            '64k',
-            [],
-            'Flag Data'
-        )->addColumn(
-            'last_update',
-            \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
-            null,
-            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
-            'Date of Last Flag Update'
-        )->addIndex(
-            $installer->getIdxName('core_flag', ['last_update']),
-            ['last_update']
-        )->setComment(
-            'Flag'
-        );
-        $connection->createTable($table);
-
-        /**
-         * Drop Foreign Key on core_cache_tag.cache_id
-         */
-        $connection->dropForeignKey(
-            $installer->getTable('core_cache_tag'),
-            $installer->getFkName('core_cache_tag', 'cache_id', 'core_cache', 'id')
-        );
-
-        $installer->endSetup();
-
-    }
-}
diff --git a/app/code/Magento/Core/Test/Unit/Controller/Index/NotFoundTest.php b/app/code/Magento/Core/Test/Unit/Controller/Index/NotFoundTest.php
deleted file mode 100644
index e8ceda3d3a5bbed2558b98f823443f0e9201002e..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/Test/Unit/Controller/Index/NotFoundTest.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Core\Test\Unit\Controller\Index;
-
-use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
-
-class NotFoundTest extends \PHPUnit_Framework_TestCase
-{
-    public function testExecute()
-    {
-        /**
-         * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Framework\App\Response\Http
-         */
-        $responseMock = $this->getMockBuilder('Magento\Framework\App\Response\Http')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $responseMock->expects($this->once())->method('setStatusHeader')->with(404, '1.1', 'Not Found');
-        $responseMock->expects($this->once())->method('setBody')->with('Requested resource not found');
-
-        $objectManager = new ObjectManager($this);
-
-        /**
-         * @var \Magento\Core\Controller\Index\NotFound
-         */
-        $controller = $objectManager->getObject(
-            'Magento\Core\Controller\Index\NotFound',
-            ['response' => $responseMock]
-        );
-
-        // Make the call to test
-        $controller->execute();
-    }
-}
diff --git a/app/code/Magento/Core/Test/Unit/Model/App/StateTest.php b/app/code/Magento/Core/Test/Unit/Model/App/StateTest.php
deleted file mode 100644
index 70a30989405ff292ca66ed649979877b267d1c75..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/Test/Unit/Model/App/StateTest.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Core\Test\Unit\Model\App;
-
-use Magento\Framework\App\State;
-
-class StateTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @param string $mode
-     * @dataProvider constructorDataProvider
-     */
-    public function testConstructor($mode)
-    {
-        $model = new \Magento\Framework\App\State(
-            $this->getMockForAbstractClass('Magento\Framework\Config\ScopeInterface', [], '', false),
-            $mode
-        );
-        $this->assertEquals($mode, $model->getMode());
-    }
-
-    /**
-     * @return array
-     */
-    public static function constructorDataProvider()
-    {
-        return [
-            'default mode' => [\Magento\Framework\App\State::MODE_DEFAULT],
-            'production mode' => [\Magento\Framework\App\State::MODE_PRODUCTION],
-            'developer mode' => [\Magento\Framework\App\State::MODE_DEVELOPER]
-        ];
-    }
-
-    /**
-     * @expectedException \Exception
-     * @expectedExceptionMessage Unknown application mode: unknown mode
-     */
-    public function testConstructorException()
-    {
-        new \Magento\Framework\App\State(
-            $this->getMockForAbstractClass('Magento\Framework\Config\ScopeInterface', [], '', false),
-            "unknown mode"
-        );
-    }
-}
diff --git a/app/code/Magento/Core/Test/Unit/Model/EntryPoint/_files/config.xml b/app/code/Magento/Core/Test/Unit/Model/EntryPoint/_files/config.xml
deleted file mode 100644
index b1c3bbd854f56ddf4ce0d12f797ecc123bfe0e45..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/Test/Unit/Model/EntryPoint/_files/config.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../app/code/Magento/Core/etc/config.xsd">
-    <default>
-        <resources>
-            <fixture_module_setup>
-                <setup/>
-            </fixture_module_setup>
-        </resources>
-    </default>
-</config>
diff --git a/app/code/Magento/Core/Test/Unit/Model/Resource/SessionTest.php b/app/code/Magento/Core/Test/Unit/Model/Resource/SessionTest.php
deleted file mode 100644
index 9e871c965e466f00111ec8a993d0a83e89972b5c..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/Test/Unit/Model/Resource/SessionTest.php
+++ /dev/null
@@ -1,267 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Core\Test\Unit\Model\Resource;
-
-class SessionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * Session table name
-     */
-    const SESSION_TABLE = 'session_table_name';
-
-    /**#@+
-     * Table column names
-     */
-    const COLUMN_SESSION_ID = 'session_id';
-
-    const COLUMN_SESSION_DATA = 'session_data';
-
-    const COLUMN_SESSION_EXPIRES = 'session_expires';
-
-    /**#@-*/
-
-    /**
-     * Test select object
-     */
-    const SELECT_OBJECT = 'select_object';
-
-    /**#@+
-     * Test session data
-     */
-    const SESSION_ID = 'custom_session_id';
-
-    const SESSION_DATA = 'custom_session_data';
-
-    /**#@-*/
-
-    /**
-     * Model under test
-     *
-     * @var \Magento\Framework\Session\SaveHandler\DbTable
-     */
-    protected $_model;
-
-    protected function tearDown()
-    {
-        unset($this->_model);
-    }
-
-    /**
-     * Data provider for testRead
-     *
-     * @return array
-     */
-    public function readDataProvider()
-    {
-        return [
-            'session_encoded' => ['$dataEncoded' => true],
-            'session_not_encoded' => ['$dataEncoded' => false]
-        ];
-    }
-
-    /**
-     * @param bool $isDataEncoded
-     *
-     * @dataProvider readDataProvider
-     */
-    public function testRead($isDataEncoded)
-    {
-        $this->_prepareMockForRead($isDataEncoded);
-        $result = $this->_model->read(self::SESSION_ID);
-        $this->assertEquals(self::SESSION_DATA, $result);
-    }
-
-    /**
-     * Prepares mock for test model with specified connections
-     *
-     * @param \PHPUnit_Framework_MockObject_MockObject $connection
-     */
-    protected function _prepareResourceMock($connection)
-    {
-        $resource = $this->getMock(
-            'Magento\Framework\App\Resource',
-            [],
-            [],
-            '',
-            false,
-            false
-        );
-        $resource->expects($this->once())->method('getTableName')->will($this->returnValue(self::SESSION_TABLE));
-        $resource->expects($this->once())->method('getConnection')->will($this->returnValue($connection));
-
-        $this->_model = new \Magento\Framework\Session\SaveHandler\DbTable($resource);
-    }
-
-    /**
-     * Prepare mocks for testRead
-     *
-     * @param bool $isDataEncoded
-     */
-    protected function _prepareMockForRead($isDataEncoded)
-    {
-        $connection = $this->getMock(
-            'Magento\Framework\DB\Adapter\Pdo\Mysql',
-            ['select', 'from', 'where', 'fetchOne', 'isTableExists'],
-            [],
-            '',
-            false
-        );
-        $connection->expects($this->atLeastOnce())->method('isTableExists')->will($this->returnValue(true));
-        $connection->expects($this->once())->method('select')->will($this->returnSelf());
-        $connection->expects(
-            $this->once()
-        )->method(
-            'from'
-        )->with(
-            self::SESSION_TABLE,
-            [self::COLUMN_SESSION_DATA]
-        )->will(
-            $this->returnSelf()
-        );
-        $connection->expects(
-            $this->once()
-        )->method(
-            'where'
-        )->with(
-            self::COLUMN_SESSION_ID . ' = :' . self::COLUMN_SESSION_ID
-        )->will(
-            $this->returnValue(self::SELECT_OBJECT)
-        );
-
-        $sessionData = self::SESSION_DATA;
-        if ($isDataEncoded) {
-            $sessionData = base64_encode($sessionData);
-        }
-        $connection->expects(
-            $this->once()
-        )->method(
-            'fetchOne'
-        )->with(
-            self::SELECT_OBJECT,
-            [self::COLUMN_SESSION_ID => self::SESSION_ID]
-        )->will(
-            $this->returnValue($sessionData)
-        );
-
-        $this->_prepareResourceMock($connection);
-    }
-
-    /**
-     * Data provider for testWrite
-     *
-     * @return array
-     */
-    public function writeDataProvider()
-    {
-        return [
-            'session_exists' => ['$sessionExists' => true],
-            'session_not_exists' => ['$sessionExists' => false]
-        ];
-    }
-
-    /**
-     * @param bool $sessionExists
-     *
-     * @dataProvider writeDataProvider
-     */
-    public function testWrite($sessionExists)
-    {
-        $this->_prepareMockForWrite($sessionExists);
-        $this->assertTrue($this->_model->write(self::SESSION_ID, self::SESSION_DATA));
-    }
-
-    /**
-     * Prepare mocks for testWrite
-     *
-     * @param bool $sessionExists
-     */
-    protected function _prepareMockForWrite($sessionExists)
-    {
-        $connection = $this->getMock(
-            'Magento\Framework\DB\Adapter\Pdo\Mysql',
-            ['select', 'from', 'where', 'fetchOne', 'update', 'insert', 'isTableExists'],
-            [],
-            '',
-            false
-        );
-        $connection->expects($this->atLeastOnce())->method('isTableExists')->will($this->returnValue(true));
-        $connection->expects($this->once())->method('select')->will($this->returnSelf());
-        $connection->expects($this->once())->method('from')->with(self::SESSION_TABLE)->will($this->returnSelf());
-        $connection->expects(
-            $this->once()
-        )->method(
-            'where'
-        )->with(
-            self::COLUMN_SESSION_ID . ' = :' . self::COLUMN_SESSION_ID
-        )->will(
-            $this->returnValue(self::SELECT_OBJECT)
-        );
-        $connection->expects(
-            $this->once()
-        )->method(
-            'fetchOne'
-        )->with(
-            self::SELECT_OBJECT,
-            [self::COLUMN_SESSION_ID => self::SESSION_ID]
-        )->will(
-            $this->returnValue($sessionExists)
-        );
-
-        if ($sessionExists) {
-            $connection->expects($this->never())->method('insert');
-            $connection->expects(
-                $this->once()
-            )->method(
-                'update'
-            )->will(
-                $this->returnCallback([$this, 'verifyUpdate'])
-            );
-        } else {
-            $connection->expects(
-                $this->once()
-            )->method(
-                'insert'
-            )->will(
-                $this->returnCallback([$this, 'verifyInsert'])
-            );
-            $connection->expects($this->never())->method('update');
-        }
-
-        $this->_prepareResourceMock($connection);
-    }
-
-    /**
-     * Verify arguments of insert method
-     *
-     * @param string $table
-     * @param array $bind
-     */
-    public function verifyInsert($table, array $bind)
-    {
-        $this->assertEquals(self::SESSION_TABLE, $table);
-
-        $this->assertInternalType('int', $bind[self::COLUMN_SESSION_EXPIRES]);
-        $this->assertEquals(base64_encode(self::SESSION_DATA), $bind[self::COLUMN_SESSION_DATA]);
-        $this->assertEquals(self::SESSION_ID, $bind[self::COLUMN_SESSION_ID]);
-    }
-
-    /**
-     * Verify arguments of update method
-     *
-     * @param string $table
-     * @param array $bind
-     * @param array $where
-     */
-    public function verifyUpdate($table, array $bind, array $where)
-    {
-        $this->assertEquals(self::SESSION_TABLE, $table);
-
-        $this->assertInternalType('int', $bind[self::COLUMN_SESSION_EXPIRES]);
-        $this->assertEquals(base64_encode(self::SESSION_DATA), $bind[self::COLUMN_SESSION_DATA]);
-
-        $this->assertEquals([self::COLUMN_SESSION_ID . '=?' => self::SESSION_ID], $where);
-    }
-}
diff --git a/app/code/Magento/Core/composer.json b/app/code/Magento/Core/composer.json
deleted file mode 100644
index f32ffb2a52f0fb36d5621b638074afd2626acf2f..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/composer.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-    "name": "magento/module-core",
-    "description": "N/A",
-    "require": {
-        "php": "~5.5.0|~5.6.0",
-        "magento/module-authorization": "0.42.0-beta11",
-        "magento/module-store": "0.42.0-beta11",
-        "magento/framework": "0.42.0-beta11",
-        "lib-libxml": "*",
-        "magento/magento-composer-installer": "*"
-    },
-    "type": "magento2-module",
-    "version": "0.42.0-beta11",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
-    "extra": {
-        "map": [
-            [
-                "*",
-                "Magento/Core"
-            ]
-        ]
-    }
-}
diff --git a/app/code/Magento/Core/etc/di.xml b/app/code/Magento/Core/etc/di.xml
deleted file mode 100644
index 7c0da9d131ee661dffc057d94b4c413292dfd8c5..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/etc/di.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <type name="Magento\Framework\App\Config\Initial\SchemaLocator">
-        <arguments>
-            <argument name="moduleName" xsi:type="string">Magento_Core</argument>
-        </arguments>
-    </type>
-    <type name="Magento\Framework\App\Router\Base">
-        <arguments>
-            <argument name="routerId" xsi:type="string">standard</argument>
-        </arguments>
-    </type>
-    <type name="Magento\Framework\DB\Helper">
-        <arguments>
-            <argument name="modulePrefix" xsi:type="string">core</argument>
-        </arguments>
-    </type>
-    <type name="Magento\Framework\Module\Setup\Migration">
-        <arguments>
-            <argument name="confPathToMapFile" xsi:type="string">app/etc/aliases_to_classes_map.json</argument>
-            <argument name="resourceName" xsi:type="string">core_setup</argument>
-            <argument name="moduleName" xsi:type="string">Magento_Core</argument>
-            <argument name="connectionName" xsi:type="string">\Magento\Framework\Setup\ModuleDataResourceInterface::DEFAULT_SETUP_CONNECTION</argument>
-        </arguments>
-    </type>
-    <virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">
-        <arguments>
-            <argument name="namespace" xsi:type="string">core</argument>
-        </arguments>
-    </virtualType>
-    <type name="Magento\Framework\Session\Generic">
-        <arguments>
-            <argument name="storage" xsi:type="object">Magento\Core\Model\Session\Storage</argument>
-        </arguments>
-    </type>
-    <type name="Magento\Framework\Stdlib\DateTime\Timezone">
-        <arguments>
-            <argument name="defaultTimezonePath" xsi:type="const">Magento\Directory\Helper\Data::XML_PATH_DEFAULT_TIMEZONE</argument>
-            <argument name="scopeType" xsi:type="const">Magento\Store\Model\ScopeInterface::SCOPE_STORE</argument>
-        </arguments>
-    </type>
-    <type name="Magento\Framework\Locale\Resolver">
-        <plugin name="initLocale" type="Magento\Framework\Translate\Locale\Resolver\Plugin" sortOrder="10"/>
-        <arguments>
-            <argument name="defaultLocalePath" xsi:type="const">Magento\Directory\Helper\Data::XML_PATH_DEFAULT_LOCALE</argument>
-            <argument name="scopeType" xsi:type="const">Magento\Store\Model\ScopeInterface::SCOPE_STORE</argument>
-        </arguments>
-    </type>
-</config>
diff --git a/app/code/Magento/Core/etc/frontend/di.xml b/app/code/Magento/Core/etc/frontend/di.xml
deleted file mode 100644
index a86435f16a24a2380745cfe6fdb78b11c277768d..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/etc/frontend/di.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <type name="Magento\Framework\App\FrontController">
-        <plugin name="requestPreprocessor" type="Magento\Store\App\FrontController\Plugin\RequestPreprocessor" sortOrder="50"/>
-    </type>
-</config>
diff --git a/app/code/Magento/Core/etc/frontend/routes.xml b/app/code/Magento/Core/etc/frontend/routes.xml
deleted file mode 100644
index 6fbeceb9b8ede1d5932b14e330a7a0be8aaba488..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/etc/frontend/routes.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
-    <router id="standard">
-        <route id="core" frontName="core">
-            <module name="Magento_Core" />
-        </route>
-    </router>
-</config>
\ No newline at end of file
diff --git a/app/code/Magento/Core/etc/module.xml b/app/code/Magento/Core/etc/module.xml
deleted file mode 100644
index 665171f5a6ad8f1f6fe9e10384cb1cfd0e2d9b8c..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/etc/module.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
-    <module name="Magento_Core" setup_version="2.0.1">
-    </module>
-</config>
diff --git a/app/code/Magento/Core/etc/resources.xml b/app/code/Magento/Core/etc/resources.xml
deleted file mode 100644
index 067547b086c152f7b83474548961e1dbff9e3e75..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/etc/resources.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/App/etc/resources.xsd">
-    <resource name="core_setup" extends="default_setup" />
-</config>
diff --git a/app/code/Magento/Core/i18n/de_DE.csv b/app/code/Magento/Core/i18n/de_DE.csv
deleted file mode 100644
index 7299a44c88475bd6e9038603984d8f9f7ad3d47b..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/i18n/de_DE.csv
+++ /dev/null
@@ -1,42 +0,0 @@
-Configuration,Configuration
-"-- Please Select --","-- Bitte auswählen --"
-"Custom Variables","Angepasste Variablen"
-"Requested resource not found","Requested resource not found"
-"File %1 does not exist","File %1 does not exist"
-"File %1 is not readable","File %1 is not readable"
-"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
-"database ""%1""","database ""%1"""
-"Parent directory does not exist: %1","Parent directory does not exist: %1"
-"File system",Dateisystem
-"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
-"Wrong file info format","Falsches Format Dateiinfo"
-"Path ""%value%"" is protected and cannot be used.","Der Pfad ""%value%"" ist geschützt und kann nicht verwendet werden."
-"Path ""%value%"" is not available and cannot be used.","Der Pfad ""%value%"" ist nicht verfügbar und kann nicht verwendet werden."
-"Path ""%value%"" may not include parent directory traversal (""../"", ""..\").","Der Pfad ""%value%"" darf keinen Verweis auf das übergeordnete Verzeichnis enthalten (""../"", ""..\")."
-"Please set available and/or protected paths list(s) before validation.","Bitte stellen Sie vor der Bestätigung die Liste(n) der verfügbaren und/oder geschützten Pfade ein."
-"File with an extension ""%value%"" is protected and cannot be uploaded","Dateien mit der Endung ""%value%"" sind geschützt und können nicht hochgeladen werden"
-"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
-"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
-"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
-"Start date cannot be greater than end date.","Das Anfangsdatum darf nicht nach dem Enddatum liegen."
-"Your design change for the specified store intersects with another one, please specify another date range.","Ihre Design-Änderung für den ausgewählten Store überschneidet sich mit einer anderen, bitte wählen Sie einen anderen Zeitraum."
-"Unable to create directory: %1","Unable to create directory: %1"
-"Unable to save file: %1","Unable to save file: %1"
-Copy,Copy
-"Theme isn't deletable.","Theme isn't deletable."
-"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
-"Variable Code must be unique.","Variabler Code muß eindeutig sein."
-"Validation has failed.","Prüfung fehlgeschlagen."
-%1,%1
-"Insert Variable...","Insert Variable..."
-"System(config.xml, local.xml) and modules configuration files(config.xml).","System(config.xml, local.xml) and modules configuration files(config.xml)."
-Layouts,Layouts
-"Layout building instructions.","Layout building instructions."
-"Blocks HTML output","Blocks HTML output"
-"Page blocks HTML.","Page blocks HTML."
-"View files fallback","View files fallback"
-"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
-"View files pre-processing","View files pre-processing"
-"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
-"Collections Data","Collections Data"
-"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Core/i18n/en_US.csv b/app/code/Magento/Core/i18n/en_US.csv
deleted file mode 100644
index 1505afedfcd4b501b6b295521c78d29a73a86ea2..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/i18n/en_US.csv
+++ /dev/null
@@ -1,42 +0,0 @@
-Configuration,Configuration
-"-- Please Select --","-- Please Select --"
-"Custom Variables","Custom Variables"
-"Requested resource not found","Requested resource not found"
-"File %1 does not exist","File %1 does not exist"
-"File %1 is not readable","File %1 is not readable"
-"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
-"database ""%1""","database ""%1"""
-"Parent directory does not exist: %1","Parent directory does not exist: %1"
-"File system","File system"
-"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
-"Wrong file info format","Wrong file info format"
-"Path ""%value%"" is protected and cannot be used.","Path ""%value%"" is protected and cannot be used."
-"Path ""%value%"" is not available and cannot be used.","Path ""%value%"" is not available and cannot be used."
-"Path ""%value%"" may not include parent directory traversal (""../"", ""..\").","Path ""%value%"" may not include parent directory traversal (""../"", ""..\")."
-"Please set available and/or protected paths list(s) before validation.","Please set available and/or protected paths list(s) before validation."
-"File with an extension ""%value%"" is protected and cannot be uploaded","File with an extension ""%value%"" is protected and cannot be uploaded"
-"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
-"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
-"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
-"Start date cannot be greater than end date.","Start date cannot be greater than end date."
-"Your design change for the specified store intersects with another one, please specify another date range.","Your design change for the specified store intersects with another one, please specify another date range."
-"Unable to create directory: %1","Unable to create directory: %1"
-"Unable to save file: %1","Unable to save file: %1"
-Copy,Copy
-"Theme isn't deletable.","Theme isn't deletable."
-"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
-"Variable Code must be unique.","Variable Code must be unique."
-"Validation has failed.","Validation has failed."
-%1,%1
-"Insert Variable...","Insert Variable..."
-"System(config.xml, local.xml) and modules configuration files(config.xml).","System(config.xml, local.xml) and modules configuration files(config.xml)."
-Layouts,Layouts
-"Layout building instructions.","Layout building instructions."
-"Blocks HTML output","Blocks HTML output"
-"Page blocks HTML.","Page blocks HTML."
-"View files fallback","View files fallback"
-"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
-"View files pre-processing","View files pre-processing"
-"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
-"Collections Data","Collections Data"
-"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Core/i18n/es_ES.csv b/app/code/Magento/Core/i18n/es_ES.csv
deleted file mode 100644
index eb11b11e933fbe7ccd774b0c82482028a0eb4769..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/i18n/es_ES.csv
+++ /dev/null
@@ -1,42 +0,0 @@
-Configuration,Configuration
-"-- Please Select --","-- Seleccionar, por favor --"
-"Custom Variables","Variables personalizadas"
-"Requested resource not found","Requested resource not found"
-"File %1 does not exist","File %1 does not exist"
-"File %1 is not readable","File %1 is not readable"
-"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
-"database ""%1""","database ""%1"""
-"Parent directory does not exist: %1","Parent directory does not exist: %1"
-"File system","Sistema de archivos"
-"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
-"Wrong file info format","Formato de información del archivo incorrecto"
-"Path ""%value%"" is protected and cannot be used.","La ruta ""%value%"" está protegida y no se puede utilizar."
-"Path ""%value%"" is not available and cannot be used.","La ruta ""%value%"" no está disponible y no puede usarse."
-"Path ""%value%"" may not include parent directory traversal (""../"", ""..\").","La ruta ""%value%"" no puede incluir accesos de ejecución transversal (""../"", ""..\")."
-"Please set available and/or protected paths list(s) before validation.","Por favor, indique la(s) lista(s) de rutas disponibles y/o protegidas antes de la validación."
-"File with an extension ""%value%"" is protected and cannot be uploaded","El archivo con extensión ""%value%"" está protegido y no se puede subir"
-"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
-"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
-"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
-"Start date cannot be greater than end date.","La fecha de inicio no puede ser mayor que la de fin."
-"Your design change for the specified store intersects with another one, please specify another date range.","Su cambio de diseño para la tienda especificada se superpone con otro. Especifique otro rango de fecha."
-"Unable to create directory: %1","Unable to create directory: %1"
-"Unable to save file: %1","Unable to save file: %1"
-Copy,Copy
-"Theme isn't deletable.","Theme isn't deletable."
-"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
-"Variable Code must be unique.","El código de variable debe ser único."
-"Validation has failed.","Falló la validación."
-%1,%1
-"Insert Variable...","Insert Variable..."
-"System(config.xml, local.xml) and modules configuration files(config.xml).","System(config.xml, local.xml) and modules configuration files(config.xml)."
-Layouts,Layouts
-"Layout building instructions.","Layout building instructions."
-"Blocks HTML output","Blocks HTML output"
-"Page blocks HTML.","Page blocks HTML."
-"View files fallback","View files fallback"
-"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
-"View files pre-processing","View files pre-processing"
-"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
-"Collections Data","Collections Data"
-"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Core/i18n/fr_FR.csv b/app/code/Magento/Core/i18n/fr_FR.csv
deleted file mode 100644
index 7afba82f7fea613c31c1d5403e634c92e2354c19..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/i18n/fr_FR.csv
+++ /dev/null
@@ -1,42 +0,0 @@
-Configuration,Configuration
-"-- Please Select --","-- Veuillez sélectionner --"
-"Custom Variables","Variables sur mesure"
-"Requested resource not found","Requested resource not found"
-"File %1 does not exist","File %1 does not exist"
-"File %1 is not readable","File %1 is not readable"
-"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
-"database ""%1""","database ""%1"""
-"Parent directory does not exist: %1","Parent directory does not exist: %1"
-"File system","Système de fichiers"
-"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
-"Wrong file info format","Informations du format de fichiers incorrectes"
-"Path ""%value%"" is protected and cannot be used.","Le chemin ""%value%"" est protégé et ne peut pas être utilisé."
-"Path ""%value%"" is not available and cannot be used.","Le chemin ""%value%"" est indisponible et ne peut être utilisé."
-"Path ""%value%"" may not include parent directory traversal (""../"", ""..\").","Il se peut que le chemin ""%value%"" ne contienne pas de traversée de répertoire parent (""../"", ""..\")."
-"Please set available and/or protected paths list(s) before validation.","Veuillez définir la/les liste(s) de chemins disponibles et/ou protégés avant la validation."
-"File with an extension ""%value%"" is protected and cannot be uploaded","Le fichier avec une ""%valeur%"" d'extension est protégé et ne peut être téléchargé."
-"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
-"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
-"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
-"Start date cannot be greater than end date.","La date de début ne peut pas être après la date de fin."
-"Your design change for the specified store intersects with another one, please specify another date range.","Votre changement de dessin pour la boutique spécifiée se mélange à une autre, veuillez spécifier une autre fourchette de dates."
-"Unable to create directory: %1","Unable to create directory: %1"
-"Unable to save file: %1","Unable to save file: %1"
-Copy,Copy
-"Theme isn't deletable.","Theme isn't deletable."
-"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
-"Variable Code must be unique.","La variable code doit être unique."
-"Validation has failed.","Validation a échouée"
-%1,%1
-"Insert Variable...","Insert Variable..."
-"System(config.xml, local.xml) and modules configuration files(config.xml).","System(config.xml, local.xml) and modules configuration files(config.xml)."
-Layouts,Layouts
-"Layout building instructions.","Layout building instructions."
-"Blocks HTML output","Blocks HTML output"
-"Page blocks HTML.","Page blocks HTML."
-"View files fallback","View files fallback"
-"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
-"View files pre-processing","View files pre-processing"
-"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
-"Collections Data","Collections Data"
-"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Core/i18n/nl_NL.csv b/app/code/Magento/Core/i18n/nl_NL.csv
deleted file mode 100644
index 7b321e76f829245e6e1a05eed30ed0f7556590b4..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/i18n/nl_NL.csv
+++ /dev/null
@@ -1,42 +0,0 @@
-Configuration,Configuration
-"-- Please Select --","-- Selecteer a.u.b.--"
-"Custom Variables","Aangepaste variabelen"
-"Requested resource not found","Requested resource not found"
-"File %1 does not exist","File %1 does not exist"
-"File %1 is not readable","File %1 is not readable"
-"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
-"database ""%1""","database ""%1"""
-"Parent directory does not exist: %1","Parent directory does not exist: %1"
-"File system",Bestandssysteem
-"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
-"Wrong file info format","Verkeerde bestandsinformatiebestand"
-"Path ""%value%"" is protected and cannot be used.","Pad ""%value%"" is beschermd en kan niet worden gebruikt."
-"Path ""%value%"" is not available and cannot be used.","Pad ""%value%"" is niet beschikbaar en kan niet gebruikt worden."
-"Path ""%value%"" may not include parent directory traversal (""../"", ""..\").","Pad ""%value%"" mag geen parent directory traversal bevatten (""../"", ""..\")."
-"Please set available and/or protected paths list(s) before validation.","Stel beschikbare en/of beschermde pad lijst(en) in voor validatie."
-"File with an extension ""%value%"" is protected and cannot be uploaded","Bestand met de uitgang ""%value%"" is beschermd en kan niet worden geüpload."
-"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
-"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
-"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
-"Start date cannot be greater than end date.","Begin datum kan niet later zijn dan eind datum."
-"Your design change for the specified store intersects with another one, please specify another date range.","Uw ontwerp verandering voor de gespecificeerde store komt in conflict met een andere, specificeer a.u.b. een andere datumrange."
-"Unable to create directory: %1","Unable to create directory: %1"
-"Unable to save file: %1","Unable to save file: %1"
-Copy,Copy
-"Theme isn't deletable.","Theme isn't deletable."
-"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
-"Variable Code must be unique.","Variabele Code moet uniek zijn."
-"Validation has failed.","Validatie is mislukt."
-%1,%1
-"Insert Variable...","Insert Variable..."
-"System(config.xml, local.xml) and modules configuration files(config.xml).","System(config.xml, local.xml) and modules configuration files(config.xml)."
-Layouts,Layouts
-"Layout building instructions.","Layout building instructions."
-"Blocks HTML output","Blocks HTML output"
-"Page blocks HTML.","Page blocks HTML."
-"View files fallback","View files fallback"
-"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
-"View files pre-processing","View files pre-processing"
-"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
-"Collections Data","Collections Data"
-"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Core/i18n/pt_BR.csv b/app/code/Magento/Core/i18n/pt_BR.csv
deleted file mode 100644
index cd8f160c2165c578e9847a6224bb5da8a0699c35..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/i18n/pt_BR.csv
+++ /dev/null
@@ -1,42 +0,0 @@
-Configuration,Configuration
-"-- Please Select --","- Por Favor Selecione -"
-"Custom Variables","Variáveis de Personalização."
-"Requested resource not found","Requested resource not found"
-"File %1 does not exist","File %1 does not exist"
-"File %1 is not readable","File %1 is not readable"
-"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
-"database ""%1""","database ""%1"""
-"Parent directory does not exist: %1","Parent directory does not exist: %1"
-"File system","Sistema de arquivo"
-"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
-"Wrong file info format","Formato de arquivo de informação errado"
-"Path ""%value%"" is protected and cannot be used.","Caminho ""%valor%"" é protegido e não pode ser usado."
-"Path ""%value%"" is not available and cannot be used.","Caminho ""%valor%"" não está disponível e não pode ser usado."
-"Path ""%value%"" may not include parent directory traversal (""../"", ""..\").","Caminho ""%valor%"" não pode incluir passagem pelo diretório principal (""../"", ""..\")."
-"Please set available and/or protected paths list(s) before validation.","Por favor defina lista(s) de caminhos disponíveis e/ou protegidos antes da validação."
-"File with an extension ""%value%"" is protected and cannot be uploaded","O arquivo de extensão ""%value%"" está protegido, e seu upload não pode ser feito"
-"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
-"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
-"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
-"Start date cannot be greater than end date.","Data de início não pode ser maior que a data do término."
-"Your design change for the specified store intersects with another one, please specify another date range.","Sua mudança de design para a loja especificada cruza com outra, por favor especifique outro intervalo de datas."
-"Unable to create directory: %1","Unable to create directory: %1"
-"Unable to save file: %1","Unable to save file: %1"
-Copy,Copy
-"Theme isn't deletable.","Theme isn't deletable."
-"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
-"Variable Code must be unique.","Código da Variável deve ser único."
-"Validation has failed.","Validação falhou."
-%1,%1
-"Insert Variable...","Insert Variable..."
-"System(config.xml, local.xml) and modules configuration files(config.xml).","System(config.xml, local.xml) and modules configuration files(config.xml)."
-Layouts,Layouts
-"Layout building instructions.","Layout building instructions."
-"Blocks HTML output","Blocks HTML output"
-"Page blocks HTML.","Page blocks HTML."
-"View files fallback","View files fallback"
-"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
-"View files pre-processing","View files pre-processing"
-"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
-"Collections Data","Collections Data"
-"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Core/i18n/zh_CN.csv b/app/code/Magento/Core/i18n/zh_CN.csv
deleted file mode 100644
index b1066712eddd06607c3442aee3372575c4efc924..0000000000000000000000000000000000000000
--- a/app/code/Magento/Core/i18n/zh_CN.csv
+++ /dev/null
@@ -1,42 +0,0 @@
-Configuration,Configuration
-"-- Please Select --","-- 请选择 --"
-"Custom Variables",自定义变量
-"Requested resource not found","Requested resource not found"
-"File %1 does not exist","File %1 does not exist"
-"File %1 is not readable","File %1 is not readable"
-"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
-"database ""%1""","database ""%1"""
-"Parent directory does not exist: %1","Parent directory does not exist: %1"
-"File system",文件系统
-"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
-"Wrong file info format",错误的文件信息格式
-"Path ""%value%"" is protected and cannot be used.","路径 ""%value%"" 受保护,无法使用。"
-"Path ""%value%"" is not available and cannot be used.","路径 ""%value%"" 不可用,因此无法使用。"
-"Path ""%value%"" may not include parent directory traversal (""../"", ""..\").","路径 ""%value%"" 可能不包含父目录遍历 (""../"", ""..\")."
-"Please set available and/or protected paths list(s) before validation.",请设置有效并/或受保护的路径列表,随后再验证。
-"File with an extension ""%value%"" is protected and cannot be uploaded","扩展为 ""%value%"" 的文件受到保护,无法上传"
-"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
-"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
-"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
-"Start date cannot be greater than end date.",开始日期不能大于结束日期。
-"Your design change for the specified store intersects with another one, please specify another date range.",您对指定商店设计的更改和另一个有交叉,请重新指定日期范围。
-"Unable to create directory: %1","Unable to create directory: %1"
-"Unable to save file: %1","Unable to save file: %1"
-Copy,Copy
-"Theme isn't deletable.","Theme isn't deletable."
-"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
-"Variable Code must be unique.",变量代码必须是唯一的。
-"Validation has failed.",验证失败。
-%1,%1
-"Insert Variable...","Insert Variable..."
-"System(config.xml, local.xml) and modules configuration files(config.xml).","System(config.xml, local.xml) and modules configuration files(config.xml)."
-Layouts,Layouts
-"Layout building instructions.","Layout building instructions."
-"Blocks HTML output","Blocks HTML output"
-"Page blocks HTML.","Page blocks HTML."
-"View files fallback","View files fallback"
-"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
-"View files pre-processing","View files pre-processing"
-"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
-"Collections Data","Collections Data"
-"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Customer/Api/Data/AddressInterface.php b/app/code/Magento/Customer/Api/Data/AddressInterface.php
index f1180ce71bb59440c7e10b08c0d848d903449ab4..d4828f5abc8e67580ca9abcfb338bffb8b172cdf 100644
--- a/app/code/Magento/Customer/Api/Data/AddressInterface.php
+++ b/app/code/Magento/Customer/Api/Data/AddressInterface.php
@@ -7,12 +7,10 @@
 
 namespace Magento\Customer\Api\Data;
 
-use Magento\Framework\Api\ExtensibleDataInterface;
-
 /**
  * Customer address interface.
  */
-interface AddressInterface extends ExtensibleDataInterface
+interface AddressInterface extends \Magento\Framework\Api\CustomAttributesDataInterface
 {
     /**#@+
      * Constants for keys of data array. Identical to the name of the getter in snake case
@@ -306,4 +304,19 @@ interface AddressInterface extends ExtensibleDataInterface
      * @return $this
      */
     public function setIsDefaultBilling($isDefaultBilling);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Customer\Api\Data\AddressExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Customer\Api\Data\AddressExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Customer\Api\Data\AddressExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Customer/Api/Data/AttributeMetadataInterface.php b/app/code/Magento/Customer/Api/Data/AttributeMetadataInterface.php
index 5db373c70a3ca8c662c0243ebe154209a553ad2b..d5af12db20d6176e3621b0b155eb083f704b0bba 100644
--- a/app/code/Magento/Customer/Api/Data/AttributeMetadataInterface.php
+++ b/app/code/Magento/Customer/Api/Data/AttributeMetadataInterface.php
@@ -9,7 +9,7 @@ namespace Magento\Customer\Api\Data;
 /**
  * Customer attribute metadata interface.
  */
-interface AttributeMetadataInterface
+interface AttributeMetadataInterface extends \Magento\Framework\Api\MetadataObjectInterface
 {
     /**#@+
      * Constants used as keys of data array
@@ -33,21 +33,6 @@ interface AttributeMetadataInterface
     const BACKEND_TYPE = 'backend_type';
     /**#@-*/
 
-    /**
-     * Retrieve code of the attribute.
-     *
-     * @return string
-     */
-    public function getAttributeCode();
-
-    /**
-     * Set attribute code
-     *
-     * @param string $attributeCode
-     * @return $this
-     */
-    public function setAttributeCode($attributeCode);
-
     /**
      * Frontend HTML for input element.
      *
diff --git a/app/code/Magento/Customer/Api/Data/CustomerInterface.php b/app/code/Magento/Customer/Api/Data/CustomerInterface.php
index a5b781439ae1b600a7e0495f35667be9d38a3031..78be9d556014ac871eff29a9053153033690a736 100644
--- a/app/code/Magento/Customer/Api/Data/CustomerInterface.php
+++ b/app/code/Magento/Customer/Api/Data/CustomerInterface.php
@@ -5,12 +5,10 @@
  */
 namespace Magento\Customer\Api\Data;
 
-use Magento\Framework\Api\ExtensibleDataInterface;
-
 /**
  * Customer interface.
  */
-interface CustomerInterface extends ExtensibleDataInterface
+interface CustomerInterface extends \Magento\Framework\Api\CustomAttributesDataInterface
 {
     /**#@+
      * Constants defined for keys of the data array. Identical to the name of the getter in snake case
@@ -320,4 +318,19 @@ interface CustomerInterface extends ExtensibleDataInterface
      * @return $this
      */
     public function setAddresses(array $addresses = null);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Customer\Api\Data\CustomerExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Customer\Api\Data\CustomerExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Customer\Api\Data\CustomerExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Customer/Api/Data/GroupInterface.php b/app/code/Magento/Customer/Api/Data/GroupInterface.php
index 9062e8f4732de593e20ccb813c333772e76b65a5..7bb583d433a33e3ad16129038c9c03d7abf95cb9 100644
--- a/app/code/Magento/Customer/Api/Data/GroupInterface.php
+++ b/app/code/Magento/Customer/Api/Data/GroupInterface.php
@@ -85,4 +85,19 @@ interface GroupInterface extends ExtensibleDataInterface
      * @return string|null
      */
     public function setTaxClassName($taxClassName);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Customer\Api\Data\GroupExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Customer\Api\Data\GroupExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Customer\Api\Data\GroupExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Customer/Api/Data/RegionInterface.php b/app/code/Magento/Customer/Api/Data/RegionInterface.php
index 2d698fefc473039ce85c4990262d074bee0a1c28..808274c02f051b2decca7e39a2f7d0b614ca22a6 100644
--- a/app/code/Magento/Customer/Api/Data/RegionInterface.php
+++ b/app/code/Magento/Customer/Api/Data/RegionInterface.php
@@ -65,4 +65,19 @@ interface RegionInterface extends ExtensibleDataInterface
      * @return $this
      */
     public function setRegionId($regionId);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Customer\Api\Data\RegionExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Customer\Api\Data\RegionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Customer\Api\Data\RegionExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Customer/Block/Address/Renderer/DefaultRenderer.php b/app/code/Magento/Customer/Block/Address/Renderer/DefaultRenderer.php
index eff04d6e3d725842551df57e3d37b86db0a0bff1..1db7f1964955a8e524eba4c4125aefb9beae7e33 100644
--- a/app/code/Magento/Customer/Block/Address/Renderer/DefaultRenderer.php
+++ b/app/code/Magento/Customer/Block/Address/Renderer/DefaultRenderer.php
@@ -47,7 +47,7 @@ class DefaultRenderer extends AbstractBlock implements RendererInterface
      *
      * @param \Magento\Framework\View\Element\Context $context
      * @param ElementFactory $elementFactory
-     * @param \Magento\Directory\Model\CountryFactory $countryFactory ,
+     * @param \Magento\Directory\Model\CountryFactory $countryFactory
      * @param \Magento\Customer\Api\AddressMetadataInterface $metadataService
      * @param Mapper $addressMapper
      * @param array $data
diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/PersonalInfo.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/PersonalInfo.php
index 7520b9d412947e3b731941d1b43f31547d8c3096..dfd4fcce3fd7b34aad809a63f249975896741d9a 100644
--- a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/PersonalInfo.php
+++ b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/PersonalInfo.php
@@ -7,43 +7,76 @@ namespace Magento\Customer\Block\Adminhtml\Edit\Tab\View;
 
 use Magento\Customer\Api\AccountManagementInterface;
 use Magento\Customer\Controller\RegistryConstants;
-use Magento\Customer\Model\AccountManagement;
 use Magento\Customer\Model\Address\Mapper;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
 
 /**
- * Adminhtml customer view personal information sales block
+ * Adminhtml customer view personal information sales block.
+ *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class PersonalInfo extends \Magento\Backend\Block\Template
 {
     /**
+     * Interval in minutes that shows how long customer will be marked 'Online'
+     * since his last activity. Used only if it's impossible to get such setting
+     * from configuration.
+     */
+    const DEFAULT_ONLINE_MINUTES_INTERVAL = 15;
+
+    /**
+     * Customer
+     *
      * @var \Magento\Customer\Api\Data\CustomerInterface
      */
     protected $customer;
 
     /**
+     * Customer log
+     *
+     * @var \Magento\Customer\Model\Log
+     */
+    protected $customerLog;
+
+    /**
+     * Customer logger
+     *
+     * @var \Magento\Customer\Model\Logger
+     */
+    protected $customerLogger;
+
+    /**
+     * Account management
+     *
      * @var AccountManagementInterface
      */
     protected $accountManagement;
 
     /**
+     * Customer group repository
+     *
      * @var \Magento\Customer\Api\GroupRepositoryInterface
      */
     protected $groupRepository;
 
     /**
+     * Customer data factory
+     *
      * @var \Magento\Customer\Api\Data\CustomerInterfaceFactory
      */
     protected $customerDataFactory;
 
     /**
+     * Address helper
+     *
      * @var \Magento\Customer\Helper\Address
      */
     protected $addressHelper;
 
     /**
+     * Date time
+     *
      * @var \Magento\Framework\Stdlib\DateTime
      */
     protected $dateTime;
@@ -56,11 +89,15 @@ class PersonalInfo extends \Magento\Backend\Block\Template
     protected $coreRegistry;
 
     /**
+     * Address mapper
+     *
      * @var Mapper
      */
     protected $addressMapper;
 
     /**
+     * Data object helper
+     *
      * @var \Magento\Framework\Api\DataObjectHelper
      */
     protected $dataObjectHelper;
@@ -75,6 +112,7 @@ class PersonalInfo extends \Magento\Backend\Block\Template
      * @param \Magento\Framework\Registry $registry
      * @param Mapper $addressMapper
      * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
+     * @param \Magento\Customer\Model\Logger $customerLogger
      * @param array $data
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
@@ -88,6 +126,7 @@ class PersonalInfo extends \Magento\Backend\Block\Template
         \Magento\Framework\Registry $registry,
         Mapper $addressMapper,
         \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
+        \Magento\Customer\Model\Logger $customerLogger,
         array $data = []
     ) {
         $this->coreRegistry = $registry;
@@ -98,10 +137,14 @@ class PersonalInfo extends \Magento\Backend\Block\Template
         $this->dateTime = $dateTime;
         $this->addressMapper = $addressMapper;
         $this->dataObjectHelper = $dataObjectHelper;
+        $this->customerLogger = $customerLogger;
+
         parent::__construct($context, $data);
     }
 
     /**
+     * Retrieve customer object
+     *
      * @return \Magento\Customer\Api\Data\CustomerInterface
      */
     public function getCustomer()
@@ -118,6 +161,8 @@ class PersonalInfo extends \Magento\Backend\Block\Template
     }
 
     /**
+     * Retrieve customer id
+     *
      * @return string|null
      */
     public function getCustomerId()
@@ -125,6 +170,22 @@ class PersonalInfo extends \Magento\Backend\Block\Template
         return $this->coreRegistry->registry(RegistryConstants::CURRENT_CUSTOMER_ID);
     }
 
+    /**
+     * Retrieves customer log model
+     *
+     * @return \Magento\Customer\Model\Log
+     */
+    protected function getCustomerLog()
+    {
+        if (!$this->customerLog) {
+            $this->customerLog = $this->customerLogger->get(
+                $this->getCustomer()->getId()
+            );
+        }
+
+        return $this->customerLog;
+    }
+
     /**
      * Returns customer's created date in the assigned store
      *
@@ -143,6 +204,8 @@ class PersonalInfo extends \Magento\Backend\Block\Template
     }
 
     /**
+     * Retrieve store default timezone from configuration
+     *
      * @return string
      */
     public function getStoreCreateDateTimezone()
@@ -169,6 +232,8 @@ class PersonalInfo extends \Magento\Backend\Block\Template
     }
 
     /**
+     * Check if account is confirmed
+     *
      * @return \Magento\Framework\Phrase
      */
     public function getIsConfirmedStatus()
@@ -186,6 +251,8 @@ class PersonalInfo extends \Magento\Backend\Block\Template
     }
 
     /**
+     * Retrieve store
+     *
      * @return null|string
      */
     public function getCreatedInStore()
@@ -196,6 +263,8 @@ class PersonalInfo extends \Magento\Backend\Block\Template
     }
 
     /**
+     * Retrieve billing address html
+     *
      * @return \Magento\Framework\Phrase|string
      */
     public function getBillingAddressHtml()
@@ -218,6 +287,8 @@ class PersonalInfo extends \Magento\Backend\Block\Template
     }
 
     /**
+     * Retrieve group name
+     *
      * @return string|null
      */
     public function getGroupName()
@@ -233,6 +304,8 @@ class PersonalInfo extends \Magento\Backend\Block\Template
     }
 
     /**
+     * Retrieve customer group by id
+     *
      * @param int $groupId
      * @return \Magento\Customer\Api\Data\GroupInterface|null
      */
@@ -245,4 +318,106 @@ class PersonalInfo extends \Magento\Backend\Block\Template
         }
         return $group;
     }
+
+    /**
+     * Returns timezone of the store to which customer assigned.
+     *
+     * @return string
+     */
+    public function getStoreLastLoginDateTimezone()
+    {
+        return $this->_scopeConfig->getValue(
+            $this->_localeDate->getDefaultTimezonePath(),
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $this->getCustomer()->getStoreId()
+        );
+    }
+
+    /**
+     * Get customer's current status.
+     *
+     * Customer considered 'Offline' in the next cases:
+     *
+     * - customer has never been logged in;
+     * - customer clicked 'Log Out' link\button;
+     * - predefined interval has passed since customer's last activity.
+     *
+     * In all other cases customer considered 'Online'.
+     *
+     * @return \Magento\Framework\Phrase
+     */
+    public function getCurrentStatus()
+    {
+        $lastLoginTime = $this->getCustomerLog()->getLastLoginAt();
+
+        // Customer has never been logged in.
+        if (!$lastLoginTime) {
+            return __('Offline');
+        }
+
+        $lastLogoutTime = $this->getCustomerLog()->getLastLogoutAt();
+
+        // Customer clicked 'Log Out' link\button.
+        if ($lastLogoutTime && strtotime($lastLogoutTime) > strtotime($lastLoginTime)) {
+            return __('Offline');
+        }
+
+        // Predefined interval has passed since customer's last activity.
+        $interval = $this->getOnlineMinutesInterval();
+        $currentTimestamp = (new \DateTime())->getTimestamp();
+        $lastVisitTime = $this->getCustomerLog()->getLastVisitAt();
+
+        if ($lastVisitTime && $currentTimestamp - strtotime($lastVisitTime) > $interval * 60) {
+            return __('Offline');
+        }
+
+        return __('Online');
+    }
+
+    /**
+     * Get customer last login date.
+     *
+     * @return \Magento\Framework\Phrase|string
+     */
+    public function getLastLoginDate()
+    {
+        $date = $this->getCustomerLog()->getLastLoginAt();
+
+        if ($date) {
+            return $this->formatDate($date, \IntlDateFormatter::MEDIUM, true);
+        }
+
+        return __('Never');
+    }
+
+    /**
+     * Returns customer last login date in store's timezone.
+     *
+     * @return \Magento\Framework\Phrase|string
+     */
+    public function getStoreLastLoginDate()
+    {
+        $date = strtotime($this->getCustomerLog()->getLastLoginAt());
+
+        if ($date) {
+            $date = $this->_localeDate->scopeDate($this->getCustomer()->getStoreId(), $date, true);
+            return $this->formatDate($date, \IntlDateFormatter::MEDIUM, true);
+        }
+
+        return __('Never');
+    }
+
+    /**
+     * Returns interval that shows how long customer will be considered 'Online'.
+     *
+     * @return int Interval in minutes
+     */
+    protected function getOnlineMinutesInterval()
+    {
+        $configValue = $this->_scopeConfig->getValue(
+            'customer/online_customers/online_minutes_interval',
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
+        );
+        return intval($configValue) > 0 ? intval($configValue) : self::DEFAULT_ONLINE_MINUTES_INTERVAL;
+    }
 }
diff --git a/app/code/Magento/Customer/Model/AccountManagement.php b/app/code/Magento/Customer/Model/AccountManagement.php
index 608bffc0cea3b25797c5312b268f897daee05d53..c850e8c5a8e16b1f7a2fd8a7f176099b99b123d0 100644
--- a/app/code/Magento/Customer/Model/AccountManagement.php
+++ b/app/code/Magento/Customer/Model/AccountManagement.php
@@ -30,7 +30,7 @@ use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Framework\Exception\State\ExpiredException;
 use Magento\Framework\Exception\State\InputMismatchException;
 use Magento\Framework\Exception\State\InvalidTransitionException;
-use Psr\Log\LoggerInterface as Logger;
+use Psr\Log\LoggerInterface as PsrLogger;
 use Magento\Framework\Mail\Exception as MailException;
 use Magento\Framework\Mail\Template\TransportBuilder;
 use Magento\Framework\Math\Random;
@@ -132,7 +132,7 @@ class AccountManagement implements AccountManagementInterface
     private $url;
 
     /**
-     * @var Logger
+     * @var PsrLogger
      */
     protected $logger;
 
@@ -215,7 +215,7 @@ class AccountManagement implements AccountManagementInterface
      * @param CustomerMetadataInterface $customerMetadataService
      * @param CustomerRegistry $customerRegistry
      * @param \Magento\Framework\Url $url
-     * @param Logger $logger
+     * @param PsrLogger $logger
      * @param Encryptor $encryptor
      * @param ConfigShare $configShare
      * @param StringHelper $stringHelper
@@ -243,7 +243,7 @@ class AccountManagement implements AccountManagementInterface
         CustomerMetadataInterface $customerMetadataService,
         CustomerRegistry $customerRegistry,
         \Magento\Framework\Url $url,
-        Logger $logger,
+        PsrLogger $logger,
         Encryptor $encryptor,
         ConfigShare $configShare,
         StringHelper $stringHelper,
diff --git a/app/code/Magento/Customer/Model/Address.php b/app/code/Magento/Customer/Model/Address.php
index 3aa89244fbefdb7886e674cd7e021a5d4575b984..9a66ec376f5641136eb146ddd9aae9ba66249013 100644
--- a/app/code/Magento/Customer/Model/Address.php
+++ b/app/code/Magento/Customer/Model/Address.php
@@ -9,7 +9,6 @@ use Magento\Customer\Api\AddressMetadataInterface;
 use Magento\Customer\Api\Data\AddressInterfaceFactory;
 use Magento\Customer\Api\Data\AddressInterface;
 use Magento\Customer\Api\Data\RegionInterfaceFactory;
-use Magento\Framework\Api\AttributeValueFactory;
 
 /**
  * Customer address model
@@ -45,14 +44,14 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
+     * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Directory\Helper\Data $directoryData
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param Address\Config $addressConfig
      * @param \Magento\Directory\Model\RegionFactory $regionFactory
      * @param \Magento\Directory\Model\CountryFactory $countryFactory
-     * @param AddressMetadataInterface $addressMetadataService
+     * @param AddressMetadataInterface $metadataService
      * @param AddressInterfaceFactory $addressDataFactory
      * @param RegionInterfaceFactory $regionDataFactory
      * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
@@ -66,14 +65,14 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
+        \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Directory\Helper\Data $directoryData,
         \Magento\Eav\Model\Config $eavConfig,
         \Magento\Customer\Model\Address\Config $addressConfig,
         \Magento\Directory\Model\RegionFactory $regionFactory,
         \Magento\Directory\Model\CountryFactory $countryFactory,
-        AddressMetadataInterface $addressMetadataService,
+        AddressMetadataInterface $metadataService,
         AddressInterfaceFactory $addressDataFactory,
         RegionInterfaceFactory $regionDataFactory,
         \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
@@ -88,14 +87,14 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $directoryData,
             $eavConfig,
             $addressConfig,
             $regionFactory,
             $countryFactory,
-            $addressMetadataService,
+            $metadataService,
             $addressDataFactory,
             $regionDataFactory,
             $dataObjectHelper,
diff --git a/app/code/Magento/Customer/Model/Address/AbstractAddress.php b/app/code/Magento/Customer/Model/Address/AbstractAddress.php
index 65c9db82bf0ee887255c4c05c774f8071fe7a61a..d6be608bea7a70cb267c91f215523f9e5d2a691a 100644
--- a/app/code/Magento/Customer/Model/Address/AbstractAddress.php
+++ b/app/code/Magento/Customer/Model/Address/AbstractAddress.php
@@ -12,7 +12,7 @@ use Magento\Customer\Api\Data\AddressInterface;
 use Magento\Customer\Api\Data\RegionInterfaceFactory;
 use Magento\Customer\Api\Data\RegionInterface;
 use Magento\Customer\Model\Data\Address as AddressData;
-use Magento\Framework\Api\AttributeValueFactory;
+use Magento\Framework\Model\AbstractExtensibleModel;
 
 /**
  * Address abstract model
@@ -29,7 +29,7 @@ use Magento\Framework\Api\AttributeValueFactory;
  * @method bool getShouldIgnoreValidation()
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
-class AbstractAddress extends \Magento\Framework\Model\AbstractExtensibleModel
+class AbstractAddress extends AbstractExtensibleModel
 {
     /**
      * Possible customer address types
@@ -96,7 +96,7 @@ class AbstractAddress extends \Magento\Framework\Model\AbstractExtensibleModel
     /**
      * @var AddressMetadataInterface
      */
-    protected $_addressMetadataService;
+    protected $metadataService;
 
     /**
      * @var AddressInterfaceFactory
@@ -116,14 +116,14 @@ class AbstractAddress extends \Magento\Framework\Model\AbstractExtensibleModel
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
+     * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Directory\Helper\Data $directoryData
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param Config $addressConfig
      * @param \Magento\Directory\Model\RegionFactory $regionFactory
      * @param \Magento\Directory\Model\CountryFactory $countryFactory
-     * @param AddressMetadataInterface $addressMetadataService
+     * @param AddressMetadataInterface $metadataService
      * @param AddressInterfaceFactory $addressDataFactory
      * @param RegionInterfaceFactory $regionDataFactory
      * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
@@ -135,14 +135,14 @@ class AbstractAddress extends \Magento\Framework\Model\AbstractExtensibleModel
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
+        \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Directory\Helper\Data $directoryData,
         \Magento\Eav\Model\Config $eavConfig,
         Config $addressConfig,
         \Magento\Directory\Model\RegionFactory $regionFactory,
         \Magento\Directory\Model\CountryFactory $countryFactory,
-        AddressMetadataInterface $addressMetadataService,
+        AddressMetadataInterface $metadataService,
         AddressInterfaceFactory $addressDataFactory,
         RegionInterfaceFactory $regionDataFactory,
         \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
@@ -156,14 +156,14 @@ class AbstractAddress extends \Magento\Framework\Model\AbstractExtensibleModel
         $this->_addressConfig = $addressConfig;
         $this->_regionFactory = $regionFactory;
         $this->_countryFactory = $countryFactory;
-        $this->_addressMetadataService = $addressMetadataService;
+        $this->metadataService = $metadataService;
         $this->addressDataFactory = $addressDataFactory;
         $this->regionDataFactory = $regionDataFactory;
         $this->dataObjectHelper = $dataObjectHelper;
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -488,7 +488,7 @@ class AbstractAddress extends \Magento\Framework\Model\AbstractExtensibleModel
     {
         $addressId = $this->getId();
 
-        $attributes = $this->_addressMetadataService->getAllAttributesMetadata();
+        $attributes = $this->metadataService->getAllAttributesMetadata();
         $addressData = [];
         foreach ($attributes as $attribute) {
             $code = $attribute->getAttributeCode();
diff --git a/app/code/Magento/Customer/Model/Attribute/Data/Postcode.php b/app/code/Magento/Customer/Model/Attribute/Data/Postcode.php
index dfab0a4e277e5280e96c0e2a3df6209393b7682b..247ce01208341bebd1dfbbe7088034771a0be672 100644
--- a/app/code/Magento/Customer/Model/Attribute/Data/Postcode.php
+++ b/app/code/Magento/Customer/Model/Attribute/Data/Postcode.php
@@ -9,7 +9,7 @@ use Magento\Directory\Helper\Data as DirectoryHelper;
 use Magento\Eav\Model\AttributeDataFactory;
 use Magento\Framework\App\RequestInterface;
 use Magento\Framework\Locale\ResolverInterface;
-use Psr\Log\LoggerInterface as Logger;
+use Psr\Log\LoggerInterface as PsrLogger;
 use Magento\Framework\Stdlib\DateTime\TimezoneInterface as MagentoTimezone;
 
 /**
@@ -25,13 +25,13 @@ class Postcode extends \Magento\Eav\Model\Attribute\Data\AbstractData
 
     /**
      * @param MagentoTimezone $localeDate
-     * @param Logger $logger
+     * @param PsrLogger $logger
      * @param ResolverInterface $localeResolver
      * @param DirectoryHelper $directoryHelper
      */
     public function __construct(
         MagentoTimezone $localeDate,
-        Logger $logger,
+        PsrLogger $logger,
         ResolverInterface $localeResolver,
         DirectoryHelper $directoryHelper
     ) {
@@ -108,6 +108,7 @@ class Postcode extends \Magento\Eav\Model\Attribute\Data\AbstractData
      *
      * @param string $format
      * @return string|array
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function outputValue($format = AttributeDataFactory::OUTPUT_FORMAT_TEXT)
     {
diff --git a/app/code/Magento/Customer/Model/Customer.php b/app/code/Magento/Customer/Model/Customer.php
index c4d6a3e6c360e3f38740f0710839ab483de8dca5..cefc5f867f66f30274cbf6007f18d13856189979 100644
--- a/app/code/Magento/Customer/Model/Customer.php
+++ b/app/code/Magento/Customer/Model/Customer.php
@@ -13,7 +13,6 @@ use Magento\Customer\Model\Resource\Customer as ResourceCustomer;
 use Magento\Customer\Api\Data\CustomerInterfaceFactory;
 use Magento\Customer\Model\Data\Customer as CustomerData;
 use Magento\Framework\Reflection\DataObjectProcessor;
-use Magento\Framework\Api\AttributeValueFactory;
 use Magento\Framework\Exception\EmailNotConfirmedException;
 use Magento\Framework\Exception\InvalidEmailOrPasswordException;
 use Magento\Framework\Exception\AuthenticationException;
@@ -39,7 +38,7 @@ use Magento\Framework\Exception\AuthenticationException;
  * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
-class Customer extends \Magento\Framework\Model\AbstractExtensibleModel
+class Customer extends \Magento\Framework\Model\AbstractModel
 {
     /**
      * Configuration paths for email templates and identities
@@ -194,18 +193,21 @@ class Customer extends \Magento\Framework\Model\AbstractExtensibleModel
      */
     protected $dataObjectHelper;
 
+    /**
+     * @var \Magento\Customer\Api\CustomerMetadataInterface
+     */
+    protected $metadataService;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Eav\Model\Config $config
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
-     * @param Resource\Customer $resource
-     * @param Config\Share $configShare
+     * @param ResourceCustomer $resource
+     * @param Share $configShare
      * @param AddressFactory $addressFactory
-     * @param Resource\Address\CollectionFactory $addressesFactory
+     * @param CollectionFactory $addressesFactory
      * @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
      * @param GroupRepositoryInterface $groupRepository
      * @param AttributeFactory $attributeFactory
@@ -214,6 +216,7 @@ class Customer extends \Magento\Framework\Model\AbstractExtensibleModel
      * @param CustomerInterfaceFactory $customerDataFactory
      * @param DataObjectProcessor $dataObjectProcessor
      * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
+     * @param CustomerMetadataInterface $metadataService
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
      * @param array $data
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -221,8 +224,6 @@ class Customer extends \Magento\Framework\Model\AbstractExtensibleModel
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Eav\Model\Config $config,
         \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
@@ -237,9 +238,11 @@ class Customer extends \Magento\Framework\Model\AbstractExtensibleModel
         CustomerInterfaceFactory $customerDataFactory,
         DataObjectProcessor $dataObjectProcessor,
         \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
+        \Magento\Customer\Api\CustomerMetadataInterface $metadataService,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
         array $data = []
     ) {
+        $this->metadataService = $metadataService;
         $this->_scopeConfig = $scopeConfig;
         $this->_storeManager = $storeManager;
         $this->_config = $config;
@@ -256,8 +259,6 @@ class Customer extends \Magento\Framework\Model\AbstractExtensibleModel
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
-            $customAttributeFactory,
             $resource,
             $resourceCollection,
             $data
diff --git a/app/code/Magento/Customer/Model/Data/Address.php b/app/code/Magento/Customer/Model/Data/Address.php
index a4785786c8c21bbc0fa720e86646b933acd60ab8..d44fbda0bbba599c71f28e661dd3b65695b8e2ed 100644
--- a/app/code/Magento/Customer/Model/Data/Address.php
+++ b/app/code/Magento/Customer/Model/Data/Address.php
@@ -10,20 +10,43 @@ namespace Magento\Customer\Model\Data;
 use Magento\Customer\Api\Data\RegionInterface;
 use \Magento\Framework\Api\AttributeValueFactory;
 
+/**
+ * Class Address
+ *
+ */
 class Address extends \Magento\Framework\Api\AbstractExtensibleObject implements
     \Magento\Customer\Api\Data\AddressInterface
 {
     /**
-     * @param \Magento\Customer\Api\AddressMetadataInterface $metadataService
+     * @var \Magento\Customer\Api\AddressMetadataInterface
+     */
+    protected $metadataService;
+
+    /**
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $attributeValueFactory
+     * @param \Magento\Customer\Api\AddressMetadataInterface $metadataService
      * @param array $data
      */
     public function __construct(
-        \Magento\Customer\Api\AddressMetadataInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $attributeValueFactory,
+        \Magento\Customer\Api\AddressMetadataInterface $metadataService,
         $data = []
     ) {
-        parent::__construct($metadataService, $attributeValueFactory, $data);
+        $this->metadataService = $metadataService;
+        parent::__construct($extensionFactory, $attributeValueFactory, $data);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getCustomAttributesCodes()
+    {
+        if ($this->customAttributesCodes === null) {
+            $this->customAttributesCodes = $this->getEavAttributesCodes($this->metadataService);
+        }
+        return $this->customAttributesCodes;
     }
 
     /**
@@ -403,4 +426,25 @@ class Address extends \Magento\Framework\Api\AbstractExtensibleObject implements
     {
         return $this->setData(self::DEFAULT_BILLING, $isDefaultBilling);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Customer\Api\Data\AddressExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Customer\Api\Data\AddressExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Customer\Api\Data\AddressExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Customer/Model/Data/AttributeMetadata.php b/app/code/Magento/Customer/Model/Data/AttributeMetadata.php
index 5b4010e4ebc408495d91efcd94e870e5c71be4f9..dbf7feb726e23ba71d7bbf9dcef3b79a4433c1d7 100644
--- a/app/code/Magento/Customer/Model/Data/AttributeMetadata.php
+++ b/app/code/Magento/Customer/Model/Data/AttributeMetadata.php
@@ -9,7 +9,7 @@ namespace Magento\Customer\Model\Data;
 /**
  * Customer attribute metadata class.
  */
-class AttributeMetadata extends \Magento\Framework\Api\AbstractExtensibleObject implements
+class AttributeMetadata extends \Magento\Framework\Api\AbstractSimpleObject implements
     \Magento\Customer\Api\Data\AttributeMetadataInterface
 {
     /**
diff --git a/app/code/Magento/Customer/Model/Data/Customer.php b/app/code/Magento/Customer/Model/Data/Customer.php
index 995bdd421c93383298a0106a70da28b3530b8d8a..4daf096e5ccd15268988e368107e41db8c48dcc2 100644
--- a/app/code/Magento/Customer/Model/Data/Customer.php
+++ b/app/code/Magento/Customer/Model/Data/Customer.php
@@ -6,23 +6,47 @@
 
 namespace Magento\Customer\Model\Data;
 
-use Magento\Customer\Api\Data\CustomerInterface;
 use \Magento\Framework\Api\AttributeValueFactory;
 
+/**
+ * Class Customer
+ *
+ */
 class Customer extends \Magento\Framework\Api\AbstractExtensibleObject implements
     \Magento\Customer\Api\Data\CustomerInterface
 {
     /**
-     * @param \Magento\Customer\Api\CustomerMetadataInterface $metadataService
+     * @var \Magento\Customer\Api\CustomerMetadataInterface
+     */
+    protected $metadataService;
+
+    /**
+     * Initialize dependencies.
+     *
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $attributeValueFactory
+     * @param \Magento\Customer\Api\CustomerMetadataInterface $metadataService
      * @param array $data
      */
     public function __construct(
-        \Magento\Customer\Api\CustomerMetadataInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $attributeValueFactory,
+        \Magento\Customer\Api\CustomerMetadataInterface $metadataService,
         $data = []
     ) {
-        parent::__construct($metadataService, $attributeValueFactory, $data);
+        $this->metadataService = $metadataService;
+        parent::__construct($extensionFactory, $attributeValueFactory, $data);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getCustomAttributesCodes()
+    {
+        if ($this->customAttributesCodes === null) {
+            $this->customAttributesCodes = $this->getEavAttributesCodes($this->metadataService);
+        }
+        return $this->customAttributesCodes;
     }
 
     /**
@@ -421,4 +445,25 @@ class Customer extends \Magento\Framework\Api\AbstractExtensibleObject implement
     {
         return $this->setData(self::KEY_ADDRESSES, $addresses);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Customer\Api\Data\CustomerExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Customer\Api\Data\CustomerExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Customer\Api\Data\CustomerExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Customer/Model/Data/Group.php b/app/code/Magento/Customer/Model/Data/Group.php
index 7f2883670308e7d37231282922a5d306ba661b00..9edc461f982c0a963f6c8aa29c8e391ffd81ef08 100644
--- a/app/code/Magento/Customer/Model/Data/Group.php
+++ b/app/code/Magento/Customer/Model/Data/Group.php
@@ -95,4 +95,25 @@ class Group extends \Magento\Framework\Api\AbstractExtensibleObject implements
     {
         return $this->setData(self::TAX_CLASS_NAME, $taxClassName);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Customer\Api\Data\GroupExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Customer\Api\Data\GroupExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Customer\Api\Data\GroupExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Customer/Model/Data/Option.php b/app/code/Magento/Customer/Model/Data/Option.php
index 7ebf6893d15136b692a1eb05e5d4049d1f4d97c3..080f9449ca1443555645d06ca7ad4f6d5af0d2a1 100644
--- a/app/code/Magento/Customer/Model/Data/Option.php
+++ b/app/code/Magento/Customer/Model/Data/Option.php
@@ -11,7 +11,7 @@ namespace Magento\Customer\Model\Data;
 /**
  * Class Option
  */
-class Option extends \Magento\Framework\Api\AbstractExtensibleObject implements
+class Option extends \Magento\Framework\Api\AbstractSimpleObject implements
     \Magento\Customer\Api\Data\OptionInterface
 {
     /**
diff --git a/app/code/Magento/Customer/Model/Data/Region.php b/app/code/Magento/Customer/Model/Data/Region.php
index 42b5a1c944afbca4b58284ebcb1617c40c6af27c..ddea4c3a90ceb1597c497b516cd53a656548c2dd 100644
--- a/app/code/Magento/Customer/Model/Data/Region.php
+++ b/app/code/Magento/Customer/Model/Data/Region.php
@@ -7,6 +7,7 @@ namespace Magento\Customer\Model\Data;
 
 /**
  * Data Model implementing Address Region interface
+ *
  */
 class Region extends \Magento\Framework\Api\AbstractExtensibleObject implements
     \Magento\Customer\Api\Data\RegionInterface
@@ -73,4 +74,25 @@ class Region extends \Magento\Framework\Api\AbstractExtensibleObject implements
     {
         return $this->setData(self::REGION_ID, $regionId);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Customer\Api\Data\RegionExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Customer\Api\Data\RegionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Customer\Api\Data\RegionExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Customer/Model/Data/ValidationResults.php b/app/code/Magento/Customer/Model/Data/ValidationResults.php
index 684b451360d4c8be6180ad0e86cf8ef0464a21bc..6c473ed0f167da0aa95aee4f42e8b1044549d595 100644
--- a/app/code/Magento/Customer/Model/Data/ValidationResults.php
+++ b/app/code/Magento/Customer/Model/Data/ValidationResults.php
@@ -10,7 +10,7 @@ namespace Magento\Customer\Model\Data;
 /**
  * Validation results data model.
  */
-class ValidationResults extends \Magento\Framework\Api\AbstractExtensibleObject implements
+class ValidationResults extends \Magento\Framework\Api\AbstractSimpleObject implements
     \Magento\Customer\Api\Data\ValidationResultsInterface
 {
     /**
diff --git a/app/code/Magento/Customer/Model/Data/ValidationRule.php b/app/code/Magento/Customer/Model/Data/ValidationRule.php
index 5d8234cce281a0439e083e5e1b5d997f2bff6a0f..ce5a4a419a8e2fc962dbb2e7d5df4e4cb52a10cc 100644
--- a/app/code/Magento/Customer/Model/Data/ValidationRule.php
+++ b/app/code/Magento/Customer/Model/Data/ValidationRule.php
@@ -7,7 +7,7 @@ namespace Magento\Customer\Model\Data;
 
 use Magento\Customer\Api\Data\ValidationRuleInterface;
 
-class ValidationRule extends \Magento\Framework\Api\AbstractExtensibleObject implements
+class ValidationRule extends \Magento\Framework\Api\AbstractSimpleObject implements
     \Magento\Customer\Api\Data\ValidationRuleInterface
 {
     /**
diff --git a/app/code/Magento/Customer/Model/Group.php b/app/code/Magento/Customer/Model/Group.php
index 252b62393b6d9c24136fba6bb59990ac982837cf..b11d73f55bfac12c7f9b6f7a28cc271441543e8e 100644
--- a/app/code/Magento/Customer/Model/Group.php
+++ b/app/code/Magento/Customer/Model/Group.php
@@ -5,8 +5,6 @@
  */
 namespace Magento\Customer\Model;
 
-use Magento\Framework\Api\AttributeValueFactory;
-
 /**
  * Customer group model
  *
@@ -17,7 +15,7 @@ use Magento\Framework\Api\AttributeValueFactory;
  * @method \Magento\Customer\Model\Group setTaxClassId(int $value)
  * @method Group setTaxClassName(string $value)
  */
-class Group extends \Magento\Framework\Model\AbstractExtensibleModel
+class Group extends \Magento\Framework\Model\AbstractModel
 {
     const NOT_LOGGED_IN_ID = 0;
 
@@ -63,8 +61,6 @@ class Group extends \Magento\Framework\Model\AbstractExtensibleModel
      *
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Store\Model\StoresConfig $storesConfig
      * @param \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor
      * @param \Magento\Tax\Model\ClassModelFactory $classModelFactory
@@ -76,8 +72,6 @@ class Group extends \Magento\Framework\Model\AbstractExtensibleModel
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
         \Magento\Store\Model\StoresConfig $storesConfig,
         \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor,
         \Magento\Tax\Model\ClassModelFactory $classModelFactory,
@@ -91,8 +85,6 @@ class Group extends \Magento\Framework\Model\AbstractExtensibleModel
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
-            $customAttributeFactory,
             $resource,
             $resourceCollection,
             $data
diff --git a/app/code/Magento/Customer/Model/Log.php b/app/code/Magento/Customer/Model/Log.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c65bdcb20cc46472e603af03cd819a08b0a675a
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Log.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Customer\Model;
+
+/**
+ * Customer log model.
+ *
+ * Contains customer log data.
+ */
+class Log
+{
+    /**
+     * Customer ID.
+     *
+     * @var int
+     */
+    protected $customerId;
+
+    /**
+     * Date and time of customer's last login.
+     *
+     * @var string
+     */
+    protected $lastLoginAt;
+
+    /**
+     * Date and time of customer's last logout.
+     *
+     * @var string
+     */
+    protected $lastVisitAt;
+
+    /**
+     * Date and time of customer's last visit.
+     *
+     * @var string
+     */
+    protected $lastLogoutAt;
+
+    /**
+     * @param int $customerId
+     * @param string $lastLoginAt
+     * @param string $lastVisitAt
+     * @param string $lastLogoutAt
+     */
+    public function __construct($customerId = null, $lastLoginAt = null, $lastVisitAt = null, $lastLogoutAt = null)
+    {
+        $this->customerId = $customerId;
+        $this->lastLoginAt = $lastLoginAt;
+        $this->lastVisitAt = $lastVisitAt;
+        $this->lastLogoutAt = $lastLogoutAt;
+    }
+
+    /**
+     * Retrieve customer id
+     *
+     * @return int
+     */
+    public function getCustomerId()
+    {
+        return $this->customerId;
+    }
+
+    /**
+     * Retrieve last login date as string
+     *
+     * @return string
+     */
+    public function getLastLoginAt()
+    {
+        return $this->lastLoginAt;
+    }
+
+    /**
+     * Retrieve last visit date as string
+     *
+     * @return string
+     */
+    public function getLastVisitAt()
+    {
+        return $this->lastVisitAt;
+    }
+
+    /**
+     * Retrieve last logout date as string
+     *
+     * @return string
+     */
+    public function getLastLogoutAt()
+    {
+        return $this->lastLogoutAt;
+    }
+}
diff --git a/app/code/Magento/Customer/Model/Logger.php b/app/code/Magento/Customer/Model/Logger.php
new file mode 100644
index 0000000000000000000000000000000000000000..e29ceb3cf0c09c805b8eecbf46a05b1356213e6f
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Logger.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Customer\Model;
+
+/**
+ * Customer log data logger.
+ *
+ * Saves and retrieves customer log data.
+ */
+class Logger
+{
+    /**
+     * Resource instance.
+     *
+     * @var \Magento\Framework\App\Resource
+     */
+    protected $resource;
+
+    /**
+     * @var \Magento\Customer\Model\LogFactory
+     */
+    protected $logFactory;
+
+    /**
+     * @param \Magento\Framework\App\Resource $resource
+     * @param \Magento\Customer\Model\LogFactory $logFactory
+     */
+    public function __construct(
+        \Magento\Framework\App\Resource $resource,
+        \Magento\Customer\Model\LogFactory $logFactory
+    ) {
+        $this->resource = $resource;
+        $this->logFactory = $logFactory;
+    }
+
+    /**
+     * Save (insert new or update existing) log.
+     *
+     * @param int $customerId
+     * @param array $data
+     * @return $this
+     * @throws \InvalidArgumentException
+     */
+    public function log($customerId, array $data)
+    {
+        $data = array_filter($data);
+
+        if (!$data) {
+            throw new \InvalidArgumentException("Log data is empty");
+        }
+
+        /** @var \Magento\Framework\DB\Adapter\AdapterInterface $adapter */
+        $adapter = $this->resource->getConnection('write');
+
+        $adapter->insertOnDuplicate(
+            $this->resource->getTableName('customer_log'),
+            array_merge(['customer_id' => $customerId], $data),
+            array_keys($data)
+        );
+
+        return $this;
+    }
+
+    /**
+     * Load log by Customer Id.
+     *
+     * @param int $customerId
+     * @return Log
+     */
+    public function get($customerId = null)
+    {
+        $data = (null !== $customerId) ? $this->loadLogData($customerId) : [];
+
+        return $this->logFactory->create(
+            [
+                'customerId' => isset($data['customer_id']) ? $data['customer_id'] : null,
+                'lastLoginAt' => isset($data['last_login_at']) ? $data['last_login_at'] : null,
+                'lastLogoutAt' => isset($data['last_logout_at']) ? $data['last_logout_at'] : null,
+                'lastVisitAt' => isset($data['last_visit_at']) ? $data['last_visit_at'] : null
+            ]
+        );
+    }
+
+    /**
+     * Load customer log data by customer id
+     *
+     * @param int $customerId
+     * @return array
+     */
+    protected function loadLogData($customerId)
+    {
+        /** @var \Magento\Framework\DB\Adapter\AdapterInterface $adapter */
+        $adapter = $this->resource->getConnection('read');
+
+        $select = $adapter->select()
+            ->from(
+                ['cl' => $this->resource->getTableName('customer_log')]
+            )
+            ->joinLeft(
+                ['cv' => $this->resource->getTableName('customer_visitor')],
+                'cv.customer_id = cl.customer_id',
+                ['last_visit_at']
+            )
+            ->where(
+                'cl.customer_id = ?',
+                $customerId
+            )
+            ->order(
+                'cv.visitor_id DESC'
+            )
+            ->limit(1);
+
+        return $adapter->fetchRow($select);
+    }
+}
diff --git a/app/code/Magento/Customer/Model/Metadata/AddressMetadata.php b/app/code/Magento/Customer/Model/Metadata/AddressMetadata.php
index 1fbdf3ddf5c5bb7b82579c1f5fc6703c76ff47cd..31a62c6e527d182b19050ad4fb979bc3499b41db 100644
--- a/app/code/Magento/Customer/Model/Metadata/AddressMetadata.php
+++ b/app/code/Magento/Customer/Model/Metadata/AddressMetadata.php
@@ -10,7 +10,6 @@ use Magento\Customer\Api\AddressMetadataInterface;
 use Magento\Customer\Model\AttributeMetadataConverter;
 use Magento\Customer\Model\AttributeMetadataDataProvider;
 use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
-use Magento\Framework\Api\Config\MetadataConfig;
 use Magento\Framework\Api\SimpleDataObjectConverter;
 use Magento\Framework\Exception\NoSuchEntityException;
 
@@ -24,11 +23,6 @@ class AddressMetadata implements AddressMetadataInterface
      */
     private $addressDataObjectMethods;
 
-    /**
-     * @var MetadataConfig
-     */
-    private $metadataConfig;
-
     /**
      * @var AttributeMetadataConverter
      */
@@ -40,16 +34,13 @@ class AddressMetadata implements AddressMetadataInterface
     private $attributeMetadataDataProvider;
 
     /**
-     * @param MetadataConfig $metadataConfig
      * @param AttributeMetadataConverter $attributeMetadataConverter
      * @param AttributeMetadataDataProvider $attributeMetadataDataProvider
      */
     public function __construct(
-        MetadataConfig $metadataConfig,
         AttributeMetadataConverter $attributeMetadataConverter,
         AttributeMetadataDataProvider $attributeMetadataDataProvider
     ) {
-        $this->metadataConfig = $metadataConfig;
         $this->attributeMetadataConverter = $attributeMetadataConverter;
         $this->attributeMetadataDataProvider = $attributeMetadataDataProvider;
     }
@@ -129,7 +120,6 @@ class AddressMetadata implements AddressMetadataInterface
      */
     public function getCustomAttributesMetadata($dataObjectClassName = AddressMetadataInterface::DATA_INTERFACE_NAME)
     {
-        $customAttributes = [];
         if (!$this->addressDataObjectMethods) {
             $dataObjectMethods = array_flip(get_class_methods($dataObjectClassName));
             $baseClassDataObjectMethods = array_flip(
@@ -137,6 +127,7 @@ class AddressMetadata implements AddressMetadataInterface
             );
             $this->addressDataObjectMethods = array_diff_key($dataObjectMethods, $baseClassDataObjectMethods);
         }
+        $customAttributes = [];
         foreach ($this->getAllAttributesMetadata() as $attributeMetadata) {
             $attributeCode = $attributeMetadata->getAttributeCode();
             $camelCaseKey = SimpleDataObjectConverter::snakeCaseToUpperCamelCase($attributeCode);
@@ -147,6 +138,6 @@ class AddressMetadata implements AddressMetadataInterface
                 $customAttributes[] = $attributeMetadata;
             }
         }
-        return array_merge($customAttributes, $this->metadataConfig->getCustomAttributesMetadata($dataObjectClassName));
+        return $customAttributes;
     }
 }
diff --git a/app/code/Magento/Customer/Model/Metadata/CustomerMetadata.php b/app/code/Magento/Customer/Model/Metadata/CustomerMetadata.php
index ae81cff4a29ae8ea2458510b48893c1a744d9ffb..074561544878130aa63d015151e83e9f6c8a7106 100644
--- a/app/code/Magento/Customer/Model/Metadata/CustomerMetadata.php
+++ b/app/code/Magento/Customer/Model/Metadata/CustomerMetadata.php
@@ -10,7 +10,6 @@ use Magento\Customer\Api\CustomerMetadataInterface;
 use Magento\Customer\Model\AttributeMetadataConverter;
 use Magento\Customer\Model\AttributeMetadataDataProvider;
 use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
-use Magento\Framework\Api\Config\MetadataConfig;
 use Magento\Framework\Api\SimpleDataObjectConverter;
 use Magento\Framework\Exception\NoSuchEntityException;
 
@@ -24,11 +23,6 @@ class CustomerMetadata implements CustomerMetadataInterface
      */
     private $customerDataObjectMethods;
 
-    /**
-     * @var MetadataConfig
-     */
-    private $metadataConfig;
-
     /**
      * @var AttributeMetadataConverter
      */
@@ -40,16 +34,13 @@ class CustomerMetadata implements CustomerMetadataInterface
     private $attributeMetadataDataProvider;
 
     /**
-     * @param MetadataConfig $metadataConfig
      * @param AttributeMetadataConverter $attributeMetadataConverter
      * @param AttributeMetadataDataProvider $attributeMetadataDataProvider
      */
     public function __construct(
-        MetadataConfig $metadataConfig,
         AttributeMetadataConverter $attributeMetadataConverter,
         AttributeMetadataDataProvider $attributeMetadataDataProvider
     ) {
-        $this->metadataConfig = $metadataConfig;
         $this->attributeMetadataConverter = $attributeMetadataConverter;
         $this->attributeMetadataDataProvider = $attributeMetadataDataProvider;
     }
@@ -150,6 +141,6 @@ class CustomerMetadata implements CustomerMetadataInterface
                 $customAttributes[] = $attributeMetadata;
             }
         }
-        return array_merge($customAttributes, $this->metadataConfig->getCustomAttributesMetadata($dataObjectClassName));
+        return $customAttributes;
     }
 }
diff --git a/app/code/Magento/Customer/Model/Metadata/Form/Postcode.php b/app/code/Magento/Customer/Model/Metadata/Form/Postcode.php
index c65d0e7adaa2208981f16ac3de73566ae711570c..0af212b81b191a9c2d8cca6094fafdc6b996865f 100644
--- a/app/code/Magento/Customer/Model/Metadata/Form/Postcode.php
+++ b/app/code/Magento/Customer/Model/Metadata/Form/Postcode.php
@@ -9,7 +9,7 @@ use Magento\Customer\Api\Data\AttributeMetadataInterface;
 use Magento\Customer\Model\Metadata\ElementFactory;
 use Magento\Directory\Helper\Data as DirectoryHelper;
 use Magento\Framework\Locale\ResolverInterface;
-use Psr\Log\LoggerInterface as Logger;
+use Psr\Log\LoggerInterface as PsrLogger;
 use Magento\Framework\Stdlib\DateTime\TimezoneInterface as MagentoTimezone;
 
 /**
@@ -24,7 +24,7 @@ class Postcode extends AbstractData
 
     /**
      * @param MagentoTimezone $localeDate
-     * @param Logger $logger
+     * @param PsrLogger $logger
      * @param AttributeMetadataInterface $attribute
      * @param ResolverInterface $localeResolver
      * @param string $value
@@ -34,7 +34,7 @@ class Postcode extends AbstractData
      */
     public function __construct(
         MagentoTimezone $localeDate,
-        Logger $logger,
+        PsrLogger $logger,
         AttributeMetadataInterface $attribute,
         ResolverInterface $localeResolver,
         $value,
diff --git a/app/code/Magento/Customer/Model/Observer/Log.php b/app/code/Magento/Customer/Model/Observer/Log.php
new file mode 100644
index 0000000000000000000000000000000000000000..539221b5e378f47a537816c4d1e3a14457ab6ea1
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Observer/Log.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Customer\Model\Observer;
+
+use Magento\Customer\Model\Logger;
+use Magento\Framework\Stdlib\DateTime;
+use Magento\Framework\Event\Observer;
+
+/**
+ * Customer log observer.
+ */
+class Log
+{
+    /**
+     * Logger of customer's log data.
+     *
+     * @var Logger
+     */
+    protected $logger;
+
+    /**
+     * @param Logger $logger
+     */
+    public function __construct(Logger $logger)
+    {
+        $this->logger = $logger;
+    }
+
+    /**
+     * Handler for 'customer_login' event.
+     *
+     * @param Observer $observer
+     * @return void
+     */
+    public function logLastLoginAt(Observer $observer)
+    {
+        $this->logger->log(
+            $observer->getEvent()->getCustomer()->getId(),
+            ['last_login_at' => (new \DateTime())->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT)]
+        );
+    }
+
+    /**
+     * Handler for 'customer_logout' event.
+     *
+     * @param Observer $observer
+     * @return void
+     */
+    public function logLastLogoutAt(Observer $observer)
+    {
+        $this->logger->log(
+            $observer->getEvent()->getCustomer()->getId(),
+            ['last_logout_at' => (new \DateTime())->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT)]
+        );
+    }
+}
diff --git a/app/code/Magento/Customer/Model/Resource/Visitor.php b/app/code/Magento/Customer/Model/Resource/Visitor.php
index 639590bd07e85009d7002a63e1d16f678f875f18..8cc63d45988cad52b67034d5f07a32af0bfbc338 100644
--- a/app/code/Magento/Customer/Model/Resource/Visitor.php
+++ b/app/code/Magento/Customer/Model/Resource/Visitor.php
@@ -58,6 +58,7 @@ class Visitor extends \Magento\Framework\Model\Resource\Db\AbstractDb
     protected function _prepareDataForSave(\Magento\Framework\Model\AbstractModel $visitor)
     {
         return [
+            'customer_id' => $visitor->getCustomerId(),
             'session_id' => $visitor->getSessionId(),
             'last_visit_at' => $visitor->getLastVisitAt()
         ];
diff --git a/app/code/Magento/Customer/Model/Vat.php b/app/code/Magento/Customer/Model/Vat.php
index d20d51b2f788155be9e6b62bea29cbe69e5cecad..0930595e6758900822694ea2b2b410ff490999df 100644
--- a/app/code/Magento/Customer/Model/Vat.php
+++ b/app/code/Magento/Customer/Model/Vat.php
@@ -6,7 +6,7 @@
 namespace Magento\Customer\Model;
 
 use Magento\Framework\App\Config\ScopeConfigInterface;
-use Psr\Log\LoggerInterface as Logger;
+use Psr\Log\LoggerInterface as PsrLogger;
 use Magento\Store\Model\ScopeInterface;
 
 /**
@@ -68,17 +68,17 @@ class Vat
     protected $scopeConfig;
 
     /**
-     * @var Logger
+     * @var PsrLogger
      */
     protected $logger;
 
     /**
      * @param ScopeConfigInterface $scopeConfig
-     * @param Logger $logger
+     * @param PsrLogger $logger
      */
     public function __construct(
         ScopeConfigInterface $scopeConfig,
-        Logger $logger
+        PsrLogger $logger
     ) {
         $this->scopeConfig = $scopeConfig;
         $this->logger = $logger;
diff --git a/app/code/Magento/Customer/Model/Visitor.php b/app/code/Magento/Customer/Model/Visitor.php
index 4fc1c3a8026535a7f3bad674f5c1abea19b7fb16..132fd35acc9d1c66adc5be763fd2214760fb6247 100644
--- a/app/code/Magento/Customer/Model/Visitor.php
+++ b/app/code/Magento/Customer/Model/Visitor.php
@@ -133,14 +133,15 @@ class Visitor extends \Magento\Framework\Model\AbstractModel
         if ($this->skipRequestLogging || $this->isModuleIgnored($observer)) {
             return $this;
         }
+
         if ($this->session->getVisitorData()) {
             $this->setData($this->session->getVisitorData());
         }
+
+        $this->setLastVisitAt((new \DateTime())->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT));
+
         if (!$this->getId()) {
             $this->setSessionId($this->session->getSessionId());
-            $this->setLastVisitAt(
-                (new \DateTime())->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT)
-            );
             $this->save();
             $this->_eventManager->dispatch('visitor_init', ['visitor' => $this]);
             $this->session->setVisitorData($this->getData());
diff --git a/app/code/Magento/Customer/Setup/UpgradeSchema.php b/app/code/Magento/Customer/Setup/UpgradeSchema.php
index 6ebf692405649991e59149a9f47a5ffda6508ce3..2b7a160eb3de8495fa5fa096bb76dd41a3e748e3 100644
--- a/app/code/Magento/Customer/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Customer/Setup/UpgradeSchema.php
@@ -6,6 +6,8 @@
 
 namespace Magento\Customer\Setup;
 
+use Magento\Framework\DB\Ddl\Table;
+use Magento\Framework\DB\Adapter\AdapterInterface;
 use Magento\Framework\Setup\UpgradeSchemaInterface;
 use Magento\Framework\Setup\ModuleContextInterface;
 use Magento\Framework\Setup\SchemaSetupInterface;
@@ -17,12 +19,14 @@ class UpgradeSchema implements UpgradeSchemaInterface
 {
     /**
      * {@inheritdoc}
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
     public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
     {
+        $setup->startSetup();
+
         if (version_compare($context->getVersion(), '2.0.0.1') < 0) {
             $installer = $setup;
-            $installer->startSetup();
             $connection = $installer->getConnection();
 
             $tableNames = [
@@ -57,7 +61,96 @@ class UpgradeSchema implements UpgradeSchemaInterface
             );
             $connection->dropColumn($installer->getTable('customer_entity'), 'entity_type_id');
             $connection->dropColumn($installer->getTable('customer_entity'), 'attribute_set_id');
-            $installer->endSetup();
         }
+
+        if (version_compare($context->getVersion(), '2.0.0.2') < 0) {
+            /**
+             * Update 'customer_visitor' table.
+             */
+            $setup->getConnection()
+                ->addColumn(
+                    $setup->getTable('customer_visitor'),
+                    'customer_id',
+                    [
+                        'type' => Table::TYPE_INTEGER,
+                        'after' => 'visitor_id',
+                        'comment' => 'Customer ID'
+                    ]
+                );
+
+            $setup->getConnection()
+                ->addIndex(
+                    $setup->getTable('customer_visitor'),
+                    $setup->getIdxName(
+                        $setup->getTable('customer_visitor'),
+                        ['customer_id']
+                    ),
+                    'customer_id'
+                );
+
+            /**
+             * Create 'customer_log' table.
+             */
+            $table = $setup->getConnection()
+                ->newTable(
+                    $setup->getTable('customer_log')
+                )
+                ->addColumn(
+                    'log_id',
+                    Table::TYPE_INTEGER,
+                    null,
+                    [
+                        'nullable' => false,
+                        'identity' => true,
+                        'primary' => true
+                    ],
+                    'Log ID'
+                )
+                ->addColumn(
+                    'customer_id',
+                    Table::TYPE_INTEGER,
+                    null,
+                    [
+                        'nullable' => false
+                    ],
+                    'Customer ID'
+                )
+                ->addColumn(
+                    'last_login_at',
+                    Table::TYPE_TIMESTAMP,
+                    null,
+                    [
+                        'nullable' => true,
+                        'default' => null
+                    ],
+                    'Last Login Time'
+                )
+                ->addColumn(
+                    'last_logout_at',
+                    Table::TYPE_TIMESTAMP,
+                    null,
+                    [
+                        'nullable' => true,
+                        'default' => null
+                    ],
+                    'Last Logout Time'
+                )
+                ->addIndex(
+                    $setup->getIdxName(
+                        $setup->getTable('customer_log'),
+                        ['customer_id'],
+                        AdapterInterface::INDEX_TYPE_UNIQUE
+                    ),
+                    ['customer_id'],
+                    [
+                        'type' => AdapterInterface::INDEX_TYPE_UNIQUE
+                    ]
+                )
+                ->setComment('Customer Log Table');
+
+            $setup->getConnection()->createTable($table);
+        }
+
+        $setup->endSetup();
     }
 }
diff --git a/app/code/Magento/Customer/Test/Unit/Block/Adminhtml/Edit/Tab/View/PersonalInfoTest.php b/app/code/Magento/Customer/Test/Unit/Block/Adminhtml/Edit/Tab/View/PersonalInfoTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a196a2917f99477245f5f7e8cc7fd6b74533dfcb
--- /dev/null
+++ b/app/code/Magento/Customer/Test/Unit/Block/Adminhtml/Edit/Tab/View/PersonalInfoTest.php
@@ -0,0 +1,239 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Customer\Test\Unit\Block\Adminhtml\Edit\Tab\View;
+
+use Magento\Customer\Block\Adminhtml\Edit\Tab\View\PersonalInfo;
+use Magento\Framework\Stdlib\DateTime;
+
+/**
+ * Customer personal information template block test.
+ */
+class PersonalInfoTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var string
+     */
+    protected $defaultTimezone = 'America/Los_Angeles';
+
+    /**
+     * @var string
+     */
+    protected $pathToDefaultTimezone = 'path/to/default/timezone';
+
+    /**
+     * @var PersonalInfo
+     */
+    protected $block;
+
+    /**
+     * @var \Magento\Customer\Model\Log|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $customerLog;
+
+    /**
+     * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $localeDate;
+
+    /**
+     * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfig;
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $customer = $this->getMock(
+            'Magento\Customer\Api\Data\CustomerInterface',
+            [],
+            [],
+            '',
+            false
+        );
+        $customer->expects($this->any())->method('getId')->willReturn(1);
+        $customer->expects($this->any())->method('getStoreId')->willReturn(1);
+
+        $customerDataFactory = $this->getMock(
+            'Magento\Customer\Api\Data\CustomerInterfaceFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $customerDataFactory->expects($this->any())->method('create')->willReturn($customer);
+
+        $backendSession = $this->getMock(
+            'Magento\Backend\Model\Session',
+            ['getCustomerData'],
+            [],
+            '',
+            false
+        );
+        $backendSession->expects($this->any())->method('getCustomerData')->willReturn(['account' => []]);
+
+        $this->customerLog = $this->getMock(
+            'Magento\Customer\Model\Log',
+            ['getLastLoginAt', 'getLastVisitAt', 'getLastLogoutAt'],
+            [],
+            '',
+            false
+        );
+        $this->customerLog->expects($this->any())->method('loadByCustomer')->willReturnSelf();
+
+        $customerLogger = $this->getMock(
+            'Magento\Customer\Model\Logger',
+            ['get'],
+            [],
+            '',
+            false
+        );
+        $customerLogger->expects($this->any())->method('get')->willReturn($this->customerLog);
+
+        $dateTime = $this->getMock(
+            'Magento\Framework\Stdlib\DateTime',
+            ['now'],
+            [],
+            '',
+            false
+        );
+        $dateTime->expects($this->any())->method('now')->willReturn('2015-03-04 12:00:00');
+
+        $this->localeDate = $this->getMock(
+            'Magento\Framework\Stdlib\DateTime\Timezone',
+            ['scopeDate', 'formatDateTime', 'getDefaultTimezonePath'],
+            [],
+            '',
+            false
+        );
+        $this->localeDate
+            ->expects($this->any())
+            ->method('getDefaultTimezonePath')
+            ->willReturn($this->pathToDefaultTimezone);
+
+        $this->scopeConfig = $this->getMock(
+            'Magento\Framework\App\Config',
+            ['getValue'],
+            [],
+            '',
+            false
+        );
+
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $this->block = $objectManagerHelper->getObject(
+            'Magento\Customer\Block\Adminhtml\Edit\Tab\View\PersonalInfo',
+            [
+                'customerDataFactory' => $customerDataFactory,
+                'dateTime' => $dateTime,
+                'customerLogger' => $customerLogger,
+                'localeDate' => $this->localeDate,
+                'scopeConfig' => $this->scopeConfig,
+                'backendSession' => $backendSession,
+            ]
+        );
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetStoreLastLoginDateTimezone()
+    {
+        $this->scopeConfig
+            ->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->pathToDefaultTimezone,
+                \Magento\Store\Model\ScopeInterface::SCOPE_STORE
+            )
+            ->willReturn($this->defaultTimezone);
+
+        $this->assertEquals($this->defaultTimezone, $this->block->getStoreLastLoginDateTimezone());
+    }
+
+    /**
+     * @param string $status
+     * @param string|null $lastLoginAt
+     * @param string|null $lastVisitAt
+     * @param string|null $lastLogoutAt
+     * @return void
+     * @dataProvider getCurrentStatusDataProvider
+     */
+    public function testGetCurrentStatus($status, $lastLoginAt, $lastVisitAt, $lastLogoutAt)
+    {
+        $this->customerLog->expects($this->any())->method('getLastLoginAt')->willReturn($lastLoginAt);
+        $this->customerLog->expects($this->any())->method('getLastVisitAt')->willReturn($lastVisitAt);
+        $this->customerLog->expects($this->any())->method('getLastLogoutAt')->willReturn($lastLogoutAt);
+
+        $this->assertEquals($status, (string) $this->block->getCurrentStatus());
+    }
+
+    /**
+     * @return array
+     */
+    public function getCurrentStatusDataProvider()
+    {
+        return [
+            ['Offline', null, null, null],
+            ['Offline', '2015-03-04 11:00:00', null, '2015-03-04 12:00:00'],
+            ['Offline', '2015-03-04 11:00:00', '2015-03-04 11:40:00', null],
+            ['Online', '2015-03-04 11:00:00', (new \DateTime())->format(DateTime::DATETIME_PHP_FORMAT), null]
+        ];
+    }
+
+    /**
+     * @param string $result
+     * @param string|null $lastLoginAt
+     * @dataProvider getLastLoginDateDataProvider
+     * @return void
+     */
+    public function testGetLastLoginDate($result, $lastLoginAt)
+    {
+        $this->customerLog->expects($this->once())->method('getLastLoginAt')->willReturn($lastLoginAt);
+        $this->localeDate->expects($this->any())->method('formatDateTime')->willReturn($lastLoginAt);
+
+        $this->assertEquals($result, $this->block->getLastLoginDate());
+    }
+
+    /**
+     * @return array
+     */
+    public function getLastLoginDateDataProvider()
+    {
+        return [
+            ['2015-03-04 12:00:00', '2015-03-04 12:00:00'],
+            ['Never', null]
+        ];
+    }
+
+    /**
+     * @param string $result
+     * @param string|null $lastLoginAt
+     * @dataProvider getStoreLastLoginDateDataProvider
+     * @return void
+     */
+    public function testGetStoreLastLoginDate($result, $lastLoginAt)
+    {
+        $this->customerLog->expects($this->once())->method('getLastLoginAt')->willReturn($lastLoginAt);
+
+        $this->localeDate->expects($this->any())->method('scopeDate')->will($this->returnValue($lastLoginAt));
+        $this->localeDate->expects($this->any())->method('formatDateTime')->willReturn($lastLoginAt);
+
+        $this->assertEquals($result, $this->block->getStoreLastLoginDate());
+    }
+
+    /**
+     * @return array
+     */
+    public function getStoreLastLoginDateDataProvider()
+    {
+        return [
+            ['2015-03-04 12:00:00', '2015-03-04 12:00:00'],
+            ['Never', null]
+        ];
+    }
+}
diff --git a/app/code/Magento/Customer/Test/Unit/Model/AttributeTest.php b/app/code/Magento/Customer/Test/Unit/Model/AttributeTest.php
index aed47c9e45898f0b9e4ea6dc6877c06c87f92d1f..81fdf472c365eb9e7ff2348ac3922b320a28b1bf 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/AttributeTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/AttributeTest.php
@@ -4,6 +4,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 namespace Magento\Customer\Test\Unit\Model;
 
 use Magento\Customer\Model\Attribute;
@@ -29,11 +31,6 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
      */
     protected $registryMock;
 
-    /**
-     * @var \Magento\Framework\Api\MetadataServiceInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $metadataServiceMock;
-
     /**
      * @var \Magento\Framework\Api\AttributeValueFactory|\PHPUnit_Framework_MockObject_MockObject
      */
@@ -109,6 +106,14 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
      */
     private $dataObjectHelperMock;
 
+    /**
+     * @var \Magento\Framework\Api\ExtensionAttributesFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $extensionAttributesFactory;
+
+    /**
+     * Test method
+     */
     protected function setUp()
     {
         $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Context')
@@ -116,7 +121,8 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
             ->getMock();
         $this->registryMock = $this->getMockBuilder('Magento\Framework\Registry')
             ->getMock();
-        $this->metadataServiceMock = $this->getMockBuilder('Magento\Framework\Api\MetadataServiceInterface')
+        $this->extensionAttributesFactory = $this->getMockBuilder('Magento\Framework\Api\ExtensionAttributesFactory')
+            ->disableOriginalConstructor()
             ->getMock();
         $this->attributeValueFactoryMock = $this->getMockBuilder('Magento\Framework\Api\AttributeValueFactory')
             ->disableOriginalConstructor()
@@ -173,7 +179,7 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
         $this->attribute = new Attribute(
             $this->contextMock,
             $this->registryMock,
-            $this->metadataServiceMock,
+            $this->extensionAttributesFactory,
             $this->attributeValueFactoryMock,
             $this->configMock,
             $this->typeFactoryMock,
@@ -190,6 +196,9 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
         );
     }
 
+    /**
+     * Test method
+     */
     public function testAfterSaveEavCache()
     {
         $this->configMock
@@ -199,6 +208,9 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
         $this->attribute->afterSave();
     }
 
+    /**
+     * Test method
+     */
     public function testAfterDeleteEavCache()
     {
         $this->configMock
diff --git a/app/code/Magento/Customer/Test/Unit/Model/LogTest.php b/app/code/Magento/Customer/Test/Unit/Model/LogTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..96ce27aef717692871d99e6702bfde5a5314d6a9
--- /dev/null
+++ b/app/code/Magento/Customer/Test/Unit/Model/LogTest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Customer\Test\Unit\Model;
+
+/**
+ * Customer log model test.
+ */
+class LogTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Customer log model.
+     *
+     * @var \Magento\Customer\Model\Log
+     */
+    protected $log;
+
+    /**
+     * @var array
+     */
+    protected $logData = [
+        'customer_id' => 369,
+        'last_login_at' => '2015-03-04 12:00:00',
+        'last_visit_at' => '2015-03-04 12:01:00',
+        'last_logout_at' => '2015-03-04 12:05:00',
+    ];
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $this->log = $objectManagerHelper->getObject(
+            'Magento\Customer\Model\Log',
+            [
+                'customerId' => $this->logData['customer_id'],
+                'lastLoginAt' => $this->logData['last_login_at'],
+                'lastVisitAt' => $this->logData['last_visit_at'],
+                'lastLogoutAt' => $this->logData['last_logout_at']
+            ]
+        );
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetCustomerId()
+    {
+        $this->assertEquals($this->logData['customer_id'], $this->log->getCustomerId());
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetLastLoginAt()
+    {
+        $this->assertEquals($this->logData['last_login_at'], $this->log->getLastLoginAt());
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetLastVisitAt()
+    {
+        $this->assertEquals($this->logData['last_visit_at'], $this->log->getLastVisitAt());
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetLastLogoutAt()
+    {
+        $this->assertEquals($this->logData['last_logout_at'], $this->log->getLastLogoutAt());
+    }
+}
diff --git a/app/code/Magento/Customer/Test/Unit/Model/LoggerTest.php b/app/code/Magento/Customer/Test/Unit/Model/LoggerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..88c7f55c22a3eb5ad0c5666d8ab0fcf77b87dac9
--- /dev/null
+++ b/app/code/Magento/Customer/Test/Unit/Model/LoggerTest.php
@@ -0,0 +1,193 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Customer\Test\Unit\Model;
+
+/**
+ * Customer log data logger test.
+ */
+class LoggerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Customer log data logger.
+     *
+     * @var \Magento\Customer\Model\Logger
+     */
+    protected $logger;
+
+    /**
+     * @var \Magento\Customer\Model\LogFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $logFactory;
+
+    /**
+     * Resource instance.
+     *
+     * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $resource;
+
+    /**
+     * DB connection instance.
+     *
+     * @var \Magento\Framework\DB\Adapter\Pdo|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $adapter;
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $this->adapter = $this->getMock(
+            'Magento\Framework\DB\Adapter\Pdo',
+            ['select', 'insertOnDuplicate', 'fetchRow'],
+            [],
+            '',
+            false
+        );
+        $this->resource = $this->getMock('Magento\Framework\App\Resource', [], [], '', false);
+        $this->logFactory = $this->getMock('\Magento\Customer\Model\LogFactory', ['create'], [], '', false);
+
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $this->logger = $objectManagerHelper->getObject(
+            '\Magento\Customer\Model\Logger',
+            [
+                'resource' => $this->resource,
+                'logFactory' => $this->logFactory
+            ]
+        );
+    }
+
+    /**
+     * @param int $customerId
+     * @param array $data
+     * @dataProvider testLogDataProvider
+     * @return void
+     */
+    public function testLog($customerId, $data)
+    {
+        $tableName = 'customer_log_table_name';
+        $data = array_filter($data);
+
+        if (!$data) {
+            $this->setExpectedException('\InvalidArgumentException', 'Log data is empty');
+            $this->logger->log($customerId, $data);
+            return;
+        }
+
+        $this->resource->expects($this->once())
+            ->method('getConnection')
+            ->with('write')
+            ->willReturn($this->adapter);
+        $this->resource->expects($this->once())
+            ->method('getTableName')
+            ->with('customer_log')
+            ->willReturn($tableName);
+        $this->adapter->expects($this->once())
+            ->method('insertOnDuplicate')
+            ->with($tableName, array_merge(['customer_id' => $customerId], $data), array_keys($data));
+
+        $this->assertEquals($this->logger, $this->logger->log($customerId, $data));
+    }
+
+    /**
+     * @return array
+     */
+    public function testLogDataProvider()
+    {
+        return [
+            [235, ['last_login_at' => '2015-03-04 12:00:00']],
+            [235, ['last_login_at' => null]],
+        ];
+    }
+
+    /**
+     * @param int $customerId
+     * @param array $data
+     * @dataProvider testGetDataProvider
+     * @return void
+     */
+    public function testGet($customerId, $data)
+    {
+        $logArguments = [
+            'customerId' => $data['customer_id'],
+            'lastLoginAt' => $data['last_login_at'],
+            'lastLogoutAt' => $data['last_logout_at'],
+            'lastVisitAt' => $data['last_visit_at']
+        ];
+
+        $select = $this->getMock('Magento\Framework\DB\Select', [], [], '', false);
+
+        $select->expects($this->any())->method('from')->willReturnSelf();
+        $select->expects($this->any())->method('joinLeft')->willReturnSelf();
+        $select->expects($this->any())->method('where')->willReturnSelf();
+        $select->expects($this->any())->method('order')->willReturnSelf();
+        $select->expects($this->any())->method('limit')->willReturnSelf();
+
+        $this->adapter->expects($this->any())
+            ->method('select')
+            ->willReturn($select);
+
+        $this->resource->expects($this->once())
+            ->method('getConnection')
+            ->with('read')
+            ->willReturn($this->adapter);
+        $this->adapter->expects($this->any())
+            ->method('fetchRow')
+            ->with($select)
+            ->willReturn($data);
+
+        $log = $this->getMock(
+            'Magento\Customer\Model\Log',
+            [],
+            $logArguments
+        );
+
+        $this->logFactory->expects($this->any())
+            ->method('create')
+            ->with($logArguments)
+            ->willReturn($log);
+
+        $this->assertEquals($log, $this->logger->get($customerId));
+    }
+
+    /**
+     * @return array
+     */
+    public function testGetDataProvider()
+    {
+        return [
+            [
+                235,
+                [
+                    'customer_id' => 369,
+                    'last_login_at' => '2015-03-04 12:00:00',
+                    'last_visit_at' => '2015-03-04 12:01:00',
+                    'last_logout_at' => '2015-03-04 12:05:00',
+                ]
+            ],
+            [
+                235,
+                [
+                    'customer_id' => 369,
+                    'last_login_at' => '2015-03-04 12:00:00',
+                    'last_visit_at' => '2015-03-04 12:01:00',
+                    'last_logout_at' => null,
+                ]
+            ],
+            [
+                235,
+                [
+                    'customer_id' => null,
+                    'last_login_at' => null,
+                    'last_visit_at' => null,
+                    'last_logout_at' => null,
+                ]
+            ],
+        ];
+    }
+}
diff --git a/app/code/Magento/Customer/Test/Unit/Model/Observer/LogTest.php b/app/code/Magento/Customer/Test/Unit/Model/Observer/LogTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..fcd3ff2c58f76fff1619f3804c0c079eb8c5c397
--- /dev/null
+++ b/app/code/Magento/Customer/Test/Unit/Model/Observer/LogTest.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Customer\Test\Unit\Model\Observer;
+
+use Magento\Customer\Model\Logger;
+use Magento\Framework\Stdlib\DateTime;
+use Magento\Framework\Event\Observer;
+use Magento\Customer\Model\Observer\Log;
+
+/**
+ * Class LogTest
+ */
+class LogTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Log
+     */
+    protected $logObserver;
+
+    /**
+     * @var Logger | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $loggerMock;
+
+    /**
+     * @return void
+     */
+    public function setUp()
+    {
+        $this->loggerMock = $this->getMock('Magento\Customer\Model\Logger', [], [], '', false);
+        $this->logObserver = new Log($this->loggerMock);
+    }
+
+    /**
+     * @return void
+     */
+    public function testLogLastLoginAt()
+    {
+        $id = 1;
+
+        $observerMock = $this->getMock('Magento\Framework\Event\Observer', [], [], '', false);
+        $eventMock = $this->getMock('Magento\Framework\Event', ['getCustomer'], [], '', false);
+        $customerMock = $this->getMock('Magento\Customer\Model\Customer', [], [], '', false);
+
+        $observerMock->expects($this->once())
+            ->method('getEvent')
+            ->willReturn($eventMock);
+        $eventMock->expects($this->once())
+            ->method('getCustomer')
+            ->willReturn($customerMock);
+        $customerMock->expects($this->once())
+            ->method('getId')
+            ->willReturn($id);
+
+        $this->loggerMock->expects($this->once())
+            ->method('log');
+
+        $this->logObserver->logLastLoginAt($observerMock);
+    }
+
+    /**
+     * @return void
+     */
+    public function testLogLastLogoutAt()
+    {
+        $id = 1;
+
+        $observerMock = $this->getMock('Magento\Framework\Event\Observer', [], [], '', false);
+        $eventMock = $this->getMock('Magento\Framework\Event', ['getCustomer'], [], '', false);
+        $customerMock = $this->getMock('Magento\Customer\Model\Customer', [], [], '', false);
+
+        $observerMock->expects($this->once())
+            ->method('getEvent')
+            ->willReturn($eventMock);
+        $eventMock->expects($this->once())
+            ->method('getCustomer')
+            ->willReturn($customerMock);
+        $customerMock->expects($this->once())
+            ->method('getId')
+            ->willReturn($id);
+
+        $this->loggerMock->expects($this->once())
+            ->method('log');
+
+        $this->logObserver->logLastLogoutAt($observerMock);
+    }
+}
diff --git a/app/code/Magento/Customer/etc/config.xml b/app/code/Magento/Customer/etc/config.xml
index 12d5639d3636fc6ad657bfe0b8f20da83260f10b..981e8734fd3d1b44983ad150b25d5b284e20874b 100644
--- a/app/code/Magento/Customer/etc/config.xml
+++ b/app/code/Magento/Customer/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <customer>
             <account_share>
diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml
index fb07378f191ad35ad2f3ff3e6c0105e381570bd8..acf37638c3915db937145e8245c1a59b14cac1c9 100644
--- a/app/code/Magento/Customer/etc/di.xml
+++ b/app/code/Magento/Customer/etc/di.xml
@@ -63,20 +63,6 @@
             </argument>
         </arguments>
     </type>
-    <virtualType name="Magento\Customer\Api\Config\CustomerMetadataConfig" type="Magento\Framework\Api\Config\MetadataConfig">
-    </virtualType>
-    <type name="Magento\Customer\Model\Metadata\CustomerMetadata">
-        <arguments>
-            <argument name="metadataConfig" xsi:type="object">Magento\Customer\Api\Config\CustomerMetadataConfig</argument>
-        </arguments>
-    </type>
-    <virtualType name="Magento\Customer\Api\Config\AddressMetadataConfig" type="Magento\Framework\Api\Config\MetadataConfig">
-    </virtualType>
-    <type name="Magento\Customer\Model\Metadata\AddressMetadata">
-        <arguments>
-            <argument name="metadataConfig" xsi:type="object">Magento\Customer\Api\Config\AddressMetadataConfig</argument>
-        </arguments>
-    </type>
     <type name="Magento\Framework\Model\ActionValidator\RemoveAction">
         <arguments>
             <argument name="protectedModels" xsi:type="array">
diff --git a/app/code/Magento/Customer/etc/frontend/events.xml b/app/code/Magento/Customer/etc/frontend/events.xml
index 81c65b5aa1c648e3cfe5e9f422e16ab4a268bd4e..a91b32c0ea159ab5e69b7d80732252cf72f16814 100644
--- a/app/code/Magento/Customer/etc/frontend/events.xml
+++ b/app/code/Magento/Customer/etc/frontend/events.xml
@@ -17,6 +17,7 @@
     </event>
     <event name="customer_logout">
         <observer name="customer_visitor" instance="Magento\Customer\Model\Visitor" method="bindCustomerLogout" />
+        <observer name="customer_log_logout" instance="Magento\Customer\Model\Observer\Log" method="logLastLogoutAt" />
     </event>
     <event name="sales_quote_save_after">
         <observer name="customer_visitor" instance="Magento\Customer\Model\Visitor" method="bindQuoteCreate" />
@@ -24,4 +25,7 @@
     <event name="checkout_quote_destroy">
         <observer name="customer_visitor" instance="Magento\Customer\Model\Visitor" method="bindQuoteDestroy" />
     </event>
+    <event name="customer_login">
+        <observer name="customer_log_login" instance="Magento\Customer\Model\Observer\Log" method="logLastLoginAt" />
+    </event>
 </config>
diff --git a/app/code/Magento/Customer/etc/frontend/page_types.xml b/app/code/Magento/Customer/etc/frontend/page_types.xml
index 3b4093e12cc0bb6a0250e33c66a7aa1a0ad3fb78..e895bca1e8bd6ec9f833b43d0b15754d5b0e1495 100644
--- a/app/code/Magento/Customer/etc/frontend/page_types.xml
+++ b/app/code/Magento/Customer/etc/frontend/page_types.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="customer_account_confirmation" label="Customer Account Confirmation"/>
     <type id="customer_account_create" label="Customer Account Registration Form"/>
     <type id="customer_account_createpassword" label="Reset a Password"/>
diff --git a/app/code/Magento/Customer/etc/module.xml b/app/code/Magento/Customer/etc/module.xml
index 33f923e05015b2ac6618f497ca5ea129be68bb74..973c14db73d61034756a46694f3abab1856ed480 100644
--- a/app/code/Magento/Customer/etc/module.xml
+++ b/app/code/Magento/Customer/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
-    <module name="Magento_Customer" setup_version="2.0.0.1">
+    <module name="Magento_Customer" setup_version="2.0.0.2">
         <sequence>
             <module name="Magento_Eav"/>
             <module name="Magento_Directory"/>
diff --git a/app/code/Magento/Customer/view/adminhtml/templates/tab/view/personal_info.phtml b/app/code/Magento/Customer/view/adminhtml/templates/tab/view/personal_info.phtml
index 51204820fd18123d88d90b6c07aadda993728468..e87d3005a1dad3e90d4d06b8c67ea73f561627e7 100644
--- a/app/code/Magento/Customer/view/adminhtml/templates/tab/view/personal_info.phtml
+++ b/app/code/Magento/Customer/view/adminhtml/templates/tab/view/personal_info.phtml
@@ -10,8 +10,11 @@
  * Template for block \Magento\Customer\Block\Adminhtml\Edit\Tab\View\Status\PersonalInfo
  */
 
-$createDateAdmin    = $block->getCreateDate();
-$createDateStore    = $block->getStoreCreateDate();
+$lastLoginDateAdmin = $block->getLastLoginDate();
+$lastLoginDateStore = $block->getStoreLastLoginDate();
+
+$createDateAdmin = $block->getCreateDate();
+$createDateStore = $block->getStoreCreateDate();
 ?>
 
 <div class="fieldset-wrapper customer-information">
@@ -21,6 +24,16 @@ $createDateStore    = $block->getStoreCreateDate();
     <table class="data-table">
         <tbody>
         <?php echo $block->getChildHtml(); ?>
+        <tr>
+            <th><?php echo __('Last Logged In:') ?></th>
+            <td><?php echo $lastLoginDateAdmin ?> (<?php echo $block->getCurrentStatus() ?>)</td>
+        </tr>
+        <?php if ($lastLoginDateAdmin != $lastLoginDateStore): ?>
+        <tr>
+            <th><?php echo __('Last Logged In (%1):', $block->getStoreLastLoginDateTimezone()) ?></th>
+            <td><?php echo $lastLoginDateStore ?> (<?php echo $block->getCurrentStatus() ?>)</td>
+        </tr>
+        <?php endif; ?>
         <tr>
             <th><?php echo __('Confirmed email:') ?></th>
             <td><?php echo $block->getIsConfirmedStatus() ?></td>
diff --git a/app/code/Magento/CustomerImportExport/etc/config.xml b/app/code/Magento/CustomerImportExport/etc/config.xml
index 02000ca611d79749eb2fa68a74a39ff5bd3953be..000eef6ea21c83cdda49761e7cc61d40484fa993 100644
--- a/app/code/Magento/CustomerImportExport/etc/config.xml
+++ b/app/code/Magento/CustomerImportExport/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <export>
             <customer_page_size>
diff --git a/app/code/Magento/DesignEditor/etc/config.xml b/app/code/Magento/DesignEditor/etc/config.xml
index c343d59d0bb703575be2d01364566f11d74aafd6..f977f5d456b01c2edeed42f04491d9050fd87e6a 100644
--- a/app/code/Magento/DesignEditor/etc/config.xml
+++ b/app/code/Magento/DesignEditor/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <theme>
             <customization>
diff --git a/app/code/Magento/DesignEditor/view/adminhtml/web/js/dialog.js b/app/code/Magento/DesignEditor/view/adminhtml/web/js/dialog.js
index ad58d32bcbe86077a511d6c2971e2e2efbe943ea..d19339d3f2552893755b919cf4232eef13dc86e3 100644
--- a/app/code/Magento/DesignEditor/view/adminhtml/web/js/dialog.js
+++ b/app/code/Magento/DesignEditor/view/adminhtml/web/js/dialog.js
@@ -99,9 +99,6 @@ define([
          * @param {Array.<Object>|Object} buttons
          */
         set: function (title, text, buttons) {
-            title = $.mage.__(title);
-            text = $.mage.__(text);
-
             this.text.set(text);
             this.title.set(title);
             this.setButtons(buttons);
@@ -120,9 +117,6 @@ define([
                 if ($.type(buttons) !== 'array') {
                     buttons = [buttons];
                 }
-                buttons.each(function(button){
-                    button.text = $.mage.__(button.text)
-                });
             }
 
             var hasToAddCancel = (addCancel == undefined && buttons.length <= 1) || addCancel == true;
@@ -146,8 +140,6 @@ define([
          * @param {number} position
          */
         addButton: function(button, position) {
-            button.text = $.mage.__(button.text)
-
             var buttons = this.options.buttons;
             buttons.splice(position, 0, button);
             this._setOption('buttons', buttons);
@@ -166,7 +158,7 @@ define([
                 position = buttonPointer;
             } else {
                 //Find 1st button with given title
-                var title = $.mage.__(buttonPointer);
+                var title = buttonPointer;
                 this.options.buttons.each(function(button, index) {
                     if (button.text == title) {
                         position = index;
diff --git a/app/code/Magento/Developer/etc/config.xml b/app/code/Magento/Developer/etc/config.xml
index a669e0d6b6d8407587ffb65f7e694d68497b6214..e89e173e832768926551bac312375247c148205b 100644
--- a/app/code/Magento/Developer/etc/config.xml
+++ b/app/code/Magento/Developer/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <dev>
             <restrict>
diff --git a/app/code/Magento/Dhl/composer.json b/app/code/Magento/Dhl/composer.json
index 024ef97396a6f20436526ca37ff0c47b86c4bb56..6c64a3d0f59f0196fa54970d40fb641cf582323c 100644
--- a/app/code/Magento/Dhl/composer.json
+++ b/app/code/Magento/Dhl/composer.json
@@ -8,7 +8,6 @@
         "magento/module-shipping": "0.42.0-beta11",
         "magento/module-backend": "0.42.0-beta11",
         "magento/module-directory": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-sales": "0.42.0-beta11",
         "magento/module-checkout": "0.42.0-beta11",
         "magento/module-catalog": "0.42.0-beta11",
diff --git a/app/code/Magento/Dhl/etc/config.xml b/app/code/Magento/Dhl/etc/config.xml
index c491e6e10f53538c51ba195997e5be8ca846f498..0d60e087a0e35b88c4d858b5332e5338dea2385c 100644
--- a/app/code/Magento/Dhl/etc/config.xml
+++ b/app/code/Magento/Dhl/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <system>
             <media_storage_configuration>
diff --git a/app/code/Magento/Directory/composer.json b/app/code/Magento/Directory/composer.json
index 8e66ab394fbb810a2f46479afb74b859b3472301..d13968038ae92aa7d937ba680efeaaf6f043de8f 100644
--- a/app/code/Magento/Directory/composer.json
+++ b/app/code/Magento/Directory/composer.json
@@ -5,7 +5,6 @@
         "php": "~5.5.0|~5.6.0",
         "magento/module-config": "0.42.0-beta11",
         "magento/module-store": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-backend": "0.42.0-beta11",
         "magento/framework": "0.42.0-beta11",
         "lib-libxml": "*",
diff --git a/app/code/Magento/Directory/etc/config.xml b/app/code/Magento/Directory/etc/config.xml
index 60328d17d8c195a18c7ff7434a4f22abd4aac4ab..54cec22d63ee92e7b5143778d51b003a09dc604f 100644
--- a/app/code/Magento/Directory/etc/config.xml
+++ b/app/code/Magento/Directory/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <system>
             <currency>
diff --git a/app/code/Magento/Directory/etc/module.xml b/app/code/Magento/Directory/etc/module.xml
index c2f5119fbd915909fea91d4cdabe08b702d6de7a..385b4422a936a867361ddb7f3c0cc21f94f5b52b 100644
--- a/app/code/Magento/Directory/etc/module.xml
+++ b/app/code/Magento/Directory/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Directory" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Downloadable/Api/Data/File/ContentInterface.php b/app/code/Magento/Downloadable/Api/Data/File/ContentInterface.php
index ce1e4b8afa1e879f97a18a87ad68bbc2d35f2a68..01194703cbb86cb65e151634f862f7fa794f46df 100644
--- a/app/code/Magento/Downloadable/Api/Data/File/ContentInterface.php
+++ b/app/code/Magento/Downloadable/Api/Data/File/ContentInterface.php
@@ -39,4 +39,21 @@ interface ContentInterface extends \Magento\Framework\Api\ExtensibleDataInterfac
      * @return $this
      */
     public function setName($name);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Downloadable\Api\Data\File\ContentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Downloadable\Api\Data\File\ContentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Downloadable\Api\Data\File\ContentExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Downloadable/Api/Data/LinkContentInterface.php b/app/code/Magento/Downloadable/Api/Data/LinkContentInterface.php
index ec82d46a008cbfd001d906913eefbd35a81497c7..1972068f435512611b3d564f875ec666f6d20b56 100644
--- a/app/code/Magento/Downloadable/Api/Data/LinkContentInterface.php
+++ b/app/code/Magento/Downloadable/Api/Data/LinkContentInterface.php
@@ -174,4 +174,21 @@ interface LinkContentInterface extends \Magento\Framework\Api\ExtensibleDataInte
      * @return $this
      */
     public function setSampleType($sampleType);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Downloadable\Api\Data\LinkContentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Downloadable\Api\Data\LinkContentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Downloadable\Api\Data\LinkContentExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Downloadable/Api/Data/LinkInterface.php b/app/code/Magento/Downloadable/Api/Data/LinkInterface.php
index df4f97a055ee838142ac05c0e5ee91f9bd0663b9..0152a1a256540db9b0cab423e2804bd906475245 100644
--- a/app/code/Magento/Downloadable/Api/Data/LinkInterface.php
+++ b/app/code/Magento/Downloadable/Api/Data/LinkInterface.php
@@ -173,4 +173,19 @@ interface LinkInterface extends \Magento\Framework\Api\ExtensibleDataInterface
      * @return $this
      */
     public function setSampleUrl($sampleUrl);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Downloadable\Api\Data\LinkExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Downloadable\Api\Data\LinkExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Downloadable\Api\Data\LinkExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Downloadable/Api/Data/SampleContentInterface.php b/app/code/Magento/Downloadable/Api/Data/SampleContentInterface.php
index 03864afad3dd6a7b98683ed4a7ae53bf2e1f0734..b4b0580bda1879b6aa75ab70371f6c522b7d1100 100644
--- a/app/code/Magento/Downloadable/Api/Data/SampleContentInterface.php
+++ b/app/code/Magento/Downloadable/Api/Data/SampleContentInterface.php
@@ -84,4 +84,21 @@ interface SampleContentInterface extends \Magento\Framework\Api\ExtensibleDataIn
      * @return $this
      */
     public function setSampleUrl($sampleUrl);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Downloadable\Api\Data\SampleContentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Downloadable\Api\Data\SampleContentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Downloadable\Api\Data\SampleContentExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Downloadable/Api/Data/SampleInterface.php b/app/code/Magento/Downloadable/Api/Data/SampleInterface.php
index aff31bf3f413f1b8ae20691678faaa0261d6b023..3d6dfc937f3871a4a489e43c1f1912c5a7498082 100644
--- a/app/code/Magento/Downloadable/Api/Data/SampleInterface.php
+++ b/app/code/Magento/Downloadable/Api/Data/SampleInterface.php
@@ -96,4 +96,21 @@ interface SampleInterface extends \Magento\Framework\Api\ExtensibleDataInterface
      * @return $this
      */
     public function setSampleUrl($sampleUrl);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Downloadable\Api\Data\SampleExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Downloadable\Api\Data\SampleExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Downloadable\Api\Data\SampleExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Downloadable/Api/LinkRepositoryInterface.php b/app/code/Magento/Downloadable/Api/LinkRepositoryInterface.php
index 58bad33a356c9262d1bee8cb6308ed87560e8d3c..a8bd6f83d9be190834e0e92d34c039010a4d870c 100644
--- a/app/code/Magento/Downloadable/Api/LinkRepositoryInterface.php
+++ b/app/code/Magento/Downloadable/Api/LinkRepositoryInterface.php
@@ -12,29 +12,29 @@ interface LinkRepositoryInterface
     /**
      * List of samples for downloadable product
      *
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\Downloadable\Api\Data\SampleInterface[]
      */
-    public function getSamples($productSku);
+    public function getSamples($sku);
 
     /**
      * List of links with associated samples
      *
-     * @param string $productSku
+     * @param string $sku
      * @return \Magento\Downloadable\Api\Data\LinkInterface[]
      */
-    public function getLinks($productSku);
+    public function getLinks($sku);
 
     /**
      * Update downloadable link of the given product (link type and its resources cannot be changed)
      *
-     * @param string $productSku
+     * @param string $sku
      * @param \Magento\Downloadable\Api\Data\LinkContentInterface $linkContent
      * @param int $linkId
      * @param bool $isGlobalScopeContent
      * @return int
      */
-    public function save($productSku, LinkContentInterface $linkContent, $linkId = null, $isGlobalScopeContent = false);
+    public function save($sku, LinkContentInterface $linkContent, $linkId = null, $isGlobalScopeContent = false);
 
     /**
      * Delete downloadable link
diff --git a/app/code/Magento/Downloadable/Model/File/Content.php b/app/code/Magento/Downloadable/Model/File/Content.php
index e59ffc9dd605df594e47245d6fb41c15396615c1..5fdd65fa9440b49cde9988cf97516e42a335fbed 100644
--- a/app/code/Magento/Downloadable/Model/File/Content.php
+++ b/app/code/Magento/Downloadable/Model/File/Content.php
@@ -56,4 +56,26 @@ class Content extends \Magento\Framework\Model\AbstractExtensibleModel implement
     {
         return $this->setData(self::NAME, $name);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Downloadable\Api\Data\File\ContentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Downloadable\Api\Data\File\ContentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Downloadable\Api\Data\File\ContentExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Downloadable/Model/Link.php b/app/code/Magento/Downloadable/Model/Link.php
index 776e2983fdac58a8d627c637cac8237363b81f03..84de54915ab0edec47b492ac19a2fde4f5d131b4 100644
--- a/app/code/Magento/Downloadable/Model/Link.php
+++ b/app/code/Magento/Downloadable/Model/Link.php
@@ -6,7 +6,6 @@
 namespace Magento\Downloadable\Model;
 
 use Magento\Downloadable\Api\Data\LinkInterface;
-use Magento\Framework\Api\MetadataServiceInterface;
 use Magento\Downloadable\Model\Resource\Link as Resource;
 
 /**
@@ -50,15 +49,10 @@ class Link extends \Magento\Framework\Model\AbstractExtensibleModel implements C
     const KEY_SAMPLE_URL = 'sample_url';
     /**#@-*/
 
-    /**
-     * @var MetadataServiceInterface
-     */
-    protected $metadataService;
-
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
@@ -67,7 +61,7 @@ class Link extends \Magento\Framework\Model\AbstractExtensibleModel implements C
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
@@ -76,7 +70,7 @@ class Link extends \Magento\Framework\Model\AbstractExtensibleModel implements C
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -367,5 +361,26 @@ class Link extends \Magento\Framework\Model\AbstractExtensibleModel implements C
     {
         return $this->setData(self::KEY_SAMPLE_URL, $sampleUrl);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Downloadable\Api\Data\LinkExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Downloadable\Api\Data\LinkExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Downloadable\Api\Data\LinkExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Downloadable/Model/Link/Content.php b/app/code/Magento/Downloadable/Model/Link/Content.php
index 071e130a25de07bdc7af2306dacd793eec172f52..a40f76faf1cff5c353a8406943c9b51b4f95e428 100644
--- a/app/code/Magento/Downloadable/Model/Link/Content.php
+++ b/app/code/Magento/Downloadable/Model/Link/Content.php
@@ -243,4 +243,26 @@ class Content extends \Magento\Framework\Model\AbstractExtensibleModel implement
     {
         return $this->setData(self::SAMPLE_TYPE, $sampleType);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Downloadable\Api\Data\LinkContentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Downloadable\Api\Data\LinkContentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Downloadable\Api\Data\LinkContentExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Downloadable/Model/LinkRepository.php b/app/code/Magento/Downloadable/Model/LinkRepository.php
index 72d953a39f87a703eab71117a3cbe53ecbd9e209..426e8bf63f21ed644dae4394470c8bf71d6482b4 100644
--- a/app/code/Magento/Downloadable/Model/LinkRepository.php
+++ b/app/code/Magento/Downloadable/Model/LinkRepository.php
@@ -90,11 +90,11 @@ class LinkRepository implements \Magento\Downloadable\Api\LinkRepositoryInterfac
     /**
      * {@inheritdoc}
      */
-    public function getLinks($productSku)
+    public function getLinks($sku)
     {
         $linkList = [];
         /** @var \Magento\Catalog\Model\Product $product */
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         $links = $this->downloadableType->getLinks($product);
         /** @var \Magento\Downloadable\Model\Link $link */
         foreach ($links as $link) {
@@ -150,11 +150,11 @@ class LinkRepository implements \Magento\Downloadable\Api\LinkRepositoryInterfac
     /**
      * {@inheritdoc}
      */
-    public function getSamples($productSku)
+    public function getSamples($sku)
     {
         $sampleList = [];
         /** @var \Magento\Catalog\Model\Product $product */
-        $product = $this->productRepository->get($productSku);
+        $product = $this->productRepository->get($sku);
         $samples = $this->downloadableType->getSamples($product);
         /** @var \Magento\Downloadable\Model\Sample $sample */
         foreach ($samples as $sample) {
@@ -181,9 +181,9 @@ class LinkRepository implements \Magento\Downloadable\Api\LinkRepositoryInterfac
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
      */
-    public function save($productSku, LinkContentInterface $linkContent, $linkId = null, $isGlobalScopeContent = false)
+    public function save($sku, LinkContentInterface $linkContent, $linkId = null, $isGlobalScopeContent = false)
     {
-        $product = $this->productRepository->get($productSku, true);
+        $product = $this->productRepository->get($sku, true);
         if ($linkId) {
 
             /** @var $link \Magento\Downloadable\Model\Link */
@@ -222,7 +222,7 @@ class LinkRepository implements \Magento\Downloadable\Api\LinkRepositoryInterfac
                 ->save();
             return $link->getId();
         } else {
-            $product = $this->productRepository->get($productSku, true);
+            $product = $this->productRepository->get($sku, true);
             if ($product->getTypeId() !== \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE) {
                 throw new InputException(__('Product type of the product must be \'downloadable\'.'));
             }
diff --git a/app/code/Magento/Downloadable/Model/Sample.php b/app/code/Magento/Downloadable/Model/Sample.php
index 23cd6bd9408e61195d3f1eb6955363cc77fa514c..07dd821050aad1d60ae18abc38211afdd1fb4a55 100644
--- a/app/code/Magento/Downloadable/Model/Sample.php
+++ b/app/code/Magento/Downloadable/Model/Sample.php
@@ -33,7 +33,7 @@ class Sample extends \Magento\Framework\Model\AbstractExtensibleModel implements
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
@@ -42,7 +42,7 @@ class Sample extends \Magento\Framework\Model\AbstractExtensibleModel implements
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
@@ -51,7 +51,7 @@ class Sample extends \Magento\Framework\Model\AbstractExtensibleModel implements
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -224,4 +224,25 @@ class Sample extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::KEY_SAMPLE_URL, $sampleUrl);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Downloadable\Api\Data\SampleExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Downloadable\Api\Data\SampleExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Downloadable\Api\Data\SampleExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Downloadable/Model/Sample/Content.php b/app/code/Magento/Downloadable/Model/Sample/Content.php
index f60f92f9d11f91e86de522f3d346030e694f5178..0fcf613353966548cfbf6ec83e2ca47837ff9f54 100644
--- a/app/code/Magento/Downloadable/Model/Sample/Content.php
+++ b/app/code/Magento/Downloadable/Model/Sample/Content.php
@@ -117,4 +117,26 @@ class Content extends \Magento\Framework\Model\AbstractExtensibleModel implement
     {
         return $this->setData(self::SAMPLE_URL, $sampleUrl);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Downloadable\Api\Data\SampleContentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Downloadable\Api\Data\SampleContentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Downloadable\Api\Data\SampleContentExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Downloadable/etc/config.xml b/app/code/Magento/Downloadable/etc/config.xml
index e0460f6028eeb68ff4c51eb964a9d97e9ac32198..4cd8938ad25e8124510f74e2ce8e4395de9573ef 100644
--- a/app/code/Magento/Downloadable/etc/config.xml
+++ b/app/code/Magento/Downloadable/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <catalog>
             <downloadable>
diff --git a/app/code/Magento/Downloadable/etc/frontend/page_types.xml b/app/code/Magento/Downloadable/etc/frontend/page_types.xml
index caa1839665d6da8eb350758d7d39f415e3bb1bba..609bc5837c17881bbedddb11c42a5e61e8de729a 100644
--- a/app/code/Magento/Downloadable/etc/frontend/page_types.xml
+++ b/app/code/Magento/Downloadable/etc/frontend/page_types.xml
@@ -5,6 +5,6 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="downloadable_customer_products" label="Customer My Account Downloadable Items"/>
 </page_types>
diff --git a/app/code/Magento/Downloadable/etc/webapi.xml b/app/code/Magento/Downloadable/etc/webapi.xml
index 7a95a353ded05feb876d90d6b96361cce19ef9eb..0291fe5322f8328380ab63b58dfd7b8b8322dbe2 100644
--- a/app/code/Magento/Downloadable/etc/webapi.xml
+++ b/app/code/Magento/Downloadable/etc/webapi.xml
@@ -7,25 +7,25 @@
 -->
 <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
-    <route url="/V1/products/:productSku/downloadable-links" method="GET">
+    <route url="/V1/products/:sku/downloadable-links" method="GET">
         <service class="Magento\Downloadable\Api\LinkRepositoryInterface" method="getLinks"/>
         <resources>
             <resource ref="Magento_Downloadable::downloadable" />
         </resources>
     </route>
-    <route url="/V1/products/:productSku/downloadable-links/samples" method="GET">
+    <route url="/V1/products/:sku/downloadable-links/samples" method="GET">
         <service class="Magento\Downloadable\Api\LinkRepositoryInterface" method="getSamples"/>
         <resources>
             <resource ref="Magento_Downloadable::downloadable" />
         </resources>
     </route>
-    <route url="/V1/products/:productSku/downloadable-links" method="POST">
+    <route url="/V1/products/:sku/downloadable-links" method="POST">
         <service class="Magento\Downloadable\Api\LinkRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Downloadable::downloadable" />
         </resources>
     </route>
-    <route url="/V1/products/:productSku/downloadable-links/:linkId" method="PUT">
+    <route url="/V1/products/:sku/downloadable-links/:linkId" method="PUT">
         <service class="Magento\Downloadable\Api\LinkRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Downloadable::downloadable" />
@@ -37,13 +37,13 @@
             <resource ref="Magento_Downloadable::downloadable" />
         </resources>
     </route>
-    <route url="/V1/products/:productSku/downloadable-links/samples" method="POST">
+    <route url="/V1/products/:sku/downloadable-links/samples" method="POST">
         <service class="Magento\Downloadable\Api\SampleRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Downloadable::downloadable" />
         </resources>
     </route>
-    <route url="/V1/products/:productSku/downloadable-links/samples/:sampleId" method="PUT">
+    <route url="/V1/products/:sku/downloadable-links/samples/:sampleId" method="PUT">
     <service class="Magento\Downloadable\Api\SampleRepositoryInterface" method="save"/>
     <resources>
         <resource ref="Magento_Downloadable::downloadable" />
diff --git a/app/code/Magento/Eav/Api/Data/AttributeGroupInterface.php b/app/code/Magento/Eav/Api/Data/AttributeGroupInterface.php
index 074bc9c6721d0cbf944c5d5b5a07542b69143c1b..9c02bda805670c87d5870d4e8828769666d474ae 100644
--- a/app/code/Magento/Eav/Api/Data/AttributeGroupInterface.php
+++ b/app/code/Magento/Eav/Api/Data/AttributeGroupInterface.php
@@ -1,12 +1,13 @@
 <?php
 /**
- *
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Eav\Api\Data;
 
-interface AttributeGroupInterface
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+interface AttributeGroupInterface extends ExtensibleDataInterface
 {
     const GROUP_ID = 'attribute_group_id';
 
@@ -58,4 +59,21 @@ interface AttributeGroupInterface
      * @return $this
      */
     public function setAttributeSetId($attributeSetId);
+
+    /**
+     * Retrieve existing extension attributes object.
+     *
+     * @return \Magento\Eav\Api\Data\AttributeGroupExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Eav\Api\Data\AttributeGroupExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Eav\Api\Data\AttributeGroupExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Eav/Api/Data/AttributeInterface.php b/app/code/Magento/Eav/Api/Data/AttributeInterface.php
index 45f61ee56dd2aa920b225bbb66a2404fdd81ba3c..614d75a1279454b3aed41b98788e85cd15c193d8 100644
--- a/app/code/Magento/Eav/Api/Data/AttributeInterface.php
+++ b/app/code/Magento/Eav/Api/Data/AttributeInterface.php
@@ -6,7 +6,7 @@
  */
 namespace Magento\Eav\Api\Data;
 
-interface AttributeInterface extends \Magento\Framework\Api\ExtensibleDataInterface
+interface AttributeInterface extends \Magento\Framework\Api\CustomAttributesDataInterface
 {
     const ATTRIBUTE_ID = 'attribute_id';
 
@@ -297,4 +297,9 @@ interface AttributeInterface extends \Magento\Framework\Api\ExtensibleDataInterf
      * @return $this
      */
     public function setValidationRules(array $validationRules = null);
+
+    /**
+     * @return \Magento\Eav\Api\Data\AttributeExtensionInterface|null
+     */
+    public function getExtensionAttributes();
 }
diff --git a/app/code/Magento/Eav/Api/Data/AttributeSetInterface.php b/app/code/Magento/Eav/Api/Data/AttributeSetInterface.php
index 0c8e66dae0f0e09bf519e21875ca6acc90bcc24e..a44a0bd4dae93040d2903c97b4355362ce872b2d 100644
--- a/app/code/Magento/Eav/Api/Data/AttributeSetInterface.php
+++ b/app/code/Magento/Eav/Api/Data/AttributeSetInterface.php
@@ -5,7 +5,7 @@
  */
 namespace Magento\Eav\Api\Data;
 
-interface AttributeSetInterface
+interface AttributeSetInterface extends \Magento\Framework\Api\ExtensibleDataInterface
 {
     /**
      * Get attribute set ID
@@ -66,4 +66,19 @@ interface AttributeSetInterface
      * @return $this
      */
     public function setEntityTypeId($entityTypeId);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Eav\Api\Data\AttributeSetExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Eav\Api\Data\AttributeSetExtensionInterface|null $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Eav\Api\Data\AttributeSetExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Eav/Model/EavCustomAttributeTypeLocator.php b/app/code/Magento/Eav/Model/EavCustomAttributeTypeLocator.php
new file mode 100644
index 0000000000000000000000000000000000000000..958c645190806499496440018d332fb1caf0f750
--- /dev/null
+++ b/app/code/Magento/Eav/Model/EavCustomAttributeTypeLocator.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Eav\Model;
+
+use Magento\Eav\Api\AttributeRepositoryInterface;
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Webapi\CustomAttributeTypeLocatorInterface;
+
+class EavCustomAttributeTypeLocator implements CustomAttributeTypeLocatorInterface
+{
+    /**
+     * @var AttributeRepositoryInterface
+     */
+    private $attributeRepository;
+
+    /**
+     * @var array
+     */
+    private $serviceEntityTypeMap;
+
+    /**
+     * @var array
+     */
+    private $serviceBackendModelDataInterfaceMap;
+
+    /**
+     * Initialize EavCustomAttributeTypeLocator
+     *
+     * @param AttributeRepositoryInterface $attributeRepository
+     * @param array $serviceEntityTypeMap
+     * @param array $serviceBackendModelDataInterfaceMap
+     */
+    public function __construct(
+        AttributeRepositoryInterface $attributeRepository,
+        array $serviceEntityTypeMap = [],
+        array $serviceBackendModelDataInterfaceMap = []
+    ) {
+        $this->attributeRepository = $attributeRepository;
+        $this->serviceEntityTypeMap = $serviceEntityTypeMap;
+        $this->serviceBackendModelDataInterfaceMap = $serviceBackendModelDataInterfaceMap;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType($attributeCode, $serviceClass)
+    {
+        if (!$serviceClass || !$attributeCode || !isset($this->serviceEntityTypeMap[$serviceClass])
+            || !isset($this->serviceBackendModelDataInterfaceMap[$serviceClass])
+        ) {
+            return null;
+        }
+
+        try {
+            $backendModel = $this->attributeRepository
+                ->get($this->serviceEntityTypeMap[$serviceClass], $attributeCode)
+                ->getBackendModel();
+        } catch (NoSuchEntityException $e) {
+            return null;
+        }
+
+        $dataInterface = isset($this->serviceBackendModelDataInterfaceMap[$serviceClass][$backendModel])
+            ? $this->serviceBackendModelDataInterfaceMap[$serviceClass][$backendModel]
+            : null;
+
+        return $dataInterface;
+    }
+}
diff --git a/app/code/Magento/Eav/Model/Entity/AbstractEntity.php b/app/code/Magento/Eav/Model/Entity/AbstractEntity.php
index 5a2b8365a25204491b4c079f86ef3aca4768b3b6..6c2dcc71ed12a164f6a8675b18aef512523a97d0 100644
--- a/app/code/Magento/Eav/Model/Entity/AbstractEntity.php
+++ b/app/code/Magento/Eav/Model/Entity/AbstractEntity.php
@@ -1024,6 +1024,9 @@ abstract class AbstractEntity extends \Magento\Framework\Model\Resource\Abstract
         if (empty($attributes)) {
             $this->loadAllAttributes($object);
         } else {
+            if (!is_array($attributes)) {
+                $attributes = [$attributes];
+            }
             foreach ($attributes as $attrCode) {
                 $this->getAttribute($attrCode);
             }
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute.php b/app/code/Magento/Eav/Model/Entity/Attribute.php
index ef74bb1e59e968598de052ba3c08707c67f402cd..df877f97a92afdec4ea0cdb857e10d3a90f84ba9 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute.php
@@ -12,6 +12,7 @@ use Magento\Framework\Api\AttributeValueFactory;
  * EAV Entity attribute model
  *
  * @method \Magento\Eav\Model\Entity\Attribute setOption($value)
+ * @method \Magento\Eav\Api\Data\AttributeExtensionInterface getExtensionAttributes()
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class Attribute extends \Magento\Eav\Model\Entity\Attribute\AbstractAttribute implements
@@ -66,7 +67,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute\AbstractAttribute im
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param TypeFactory $eavTypeFactory
@@ -87,7 +88,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute\AbstractAttribute im
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Eav\Model\Config $eavConfig,
         \Magento\Eav\Model\Entity\TypeFactory $eavTypeFactory,
@@ -107,7 +108,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute\AbstractAttribute im
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $eavConfig,
             $eavTypeFactory,
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/AbstractAttribute.php b/app/code/Magento/Eav/Model/Entity/Attribute/AbstractAttribute.php
index 155f3a0f0e1fb2ed46c73c472a57ee8b9b92ee9c..d241a3234fa697bfdb4c833f511a8159d1998d06 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/AbstractAttribute.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/AbstractAttribute.php
@@ -114,7 +114,7 @@ abstract class AbstractAttribute extends \Magento\Framework\Model\AbstractExtens
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param \Magento\Eav\Model\Entity\TypeFactory $eavTypeFactory
@@ -132,7 +132,7 @@ abstract class AbstractAttribute extends \Magento\Framework\Model\AbstractExtens
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Eav\Model\Config $eavConfig,
         \Magento\Eav\Model\Entity\TypeFactory $eavTypeFactory,
@@ -149,7 +149,7 @@ abstract class AbstractAttribute extends \Magento\Framework\Model\AbstractExtens
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -1184,4 +1184,25 @@ abstract class AbstractAttribute extends \Magento\Framework\Model\AbstractExtens
     {
         return $this->setData(self::VALIDATE_RULES, $validationRules);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Eav\Api\Data\AttributeExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Eav\Api\Data\AttributeExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Eav\Api\Data\AttributeExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Backend/Time/Created.php b/app/code/Magento/Eav/Model/Entity/Attribute/Backend/Time/Created.php
index 5e14ddca8729ee2299fc60b3c4dd28488d75eb10..b12ddf75a716d052c30e7b0a2d4edeb623f076dc 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Backend/Time/Created.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Backend/Time/Created.php
@@ -26,7 +26,7 @@ class Created extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBacken
     /**
      * Set created date
      *
-     * @param \Magento\Core\Model\Object $object
+     * @param \Magento\Framework\Model\AbstractModel $object
      * @return $this
      */
     public function beforeSave($object)
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Group.php b/app/code/Magento/Eav/Model/Entity/Attribute/Group.php
index 1e68ac3ccbf19c3e0961a381b7c334b99f082114..4248f1523d4d517c4061b453cb6353832206d4b0 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Group.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Group.php
@@ -3,6 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Eav\Model\Entity\Attribute;
 
 /**
@@ -124,5 +125,27 @@ class Group extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::ATTRIBUTE_SET_ID, $attributeSetId);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Eav\Api\Data\AttributeGroupExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Eav\Api\Data\AttributeGroupExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Eav\Api\Data\AttributeGroupExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Option.php b/app/code/Magento/Eav/Model/Entity/Attribute/Option.php
index f884585623b3be172c84067a7293f53c3ac95237..57cbb324ef7c81b39cdb76d140ed697b90ce999f 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Option.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Option.php
@@ -6,7 +6,7 @@
 namespace Magento\Eav\Model\Entity\Attribute;
 
 use Magento\Eav\Api\Data\AttributeOptionInterface;
-use Magento\Framework\Model\AbstractExtensibleModel;
+use Magento\Framework\Model\AbstractModel;
 
 /**
  * Emtity attribute option model
@@ -18,7 +18,7 @@ use Magento\Framework\Model\AbstractExtensibleModel;
  *
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-class Option extends AbstractExtensibleModel implements AttributeOptionInterface
+class Option extends AbstractModel implements AttributeOptionInterface
 {
     /**
      * Resource initialization
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/OptionLabel.php b/app/code/Magento/Eav/Model/Entity/Attribute/OptionLabel.php
index 5319477495b36e0e87e8a3e294db2a6d5c3a8ece..dfb45c211041d8dd89fb05974df32a7af9930901 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/OptionLabel.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/OptionLabel.php
@@ -6,13 +6,13 @@
 namespace Magento\Eav\Model\Entity\Attribute;
 
 use Magento\Eav\Api\Data\AttributeOptionLabelInterface;
-use Magento\Framework\Model\AbstractExtensibleModel;
+use Magento\Framework\Model\AbstractModel;
 
 /**
  * Entity attribute option label model
  *
  */
-class OptionLabel extends AbstractExtensibleModel implements AttributeOptionLabelInterface
+class OptionLabel extends AbstractModel implements AttributeOptionLabelInterface
 {
     /**
      * {@inheritdoc}
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Set.php b/app/code/Magento/Eav/Model/Entity/Attribute/Set.php
index 75122ca097d4d06a0b459d2d688632dcf925dd8d..c8eb151622d4d235b8460fc548ac202d504b0e4a 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Set.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Set.php
@@ -19,8 +19,8 @@
  */
 namespace Magento\Eav\Model\Entity\Attribute;
 
-use Magento\Eav\Model\Entity\Type;
 use Magento\Eav\Exception as EavException;
+use Magento\Eav\Model\Entity\Type;
 use Magento\Framework\Api\AttributeValueFactory;
 
 /**
@@ -47,6 +47,7 @@ class Set extends \Magento\Framework\Model\AbstractExtensibleModel implements
 
     /**
      * Prefix of model events names
+     *
      * @var string
      */
     protected $_eventPrefix = 'eav_entity_attribute_set';
@@ -74,7 +75,7 @@ class Set extends \Magento\Framework\Model\AbstractExtensibleModel implements
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param GroupFactory $attrGroupFactory
@@ -88,7 +89,7 @@ class Set extends \Magento\Framework\Model\AbstractExtensibleModel implements
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Eav\Model\Config $eavConfig,
         \Magento\Eav\Model\Entity\Attribute\GroupFactory $attrGroupFactory,
@@ -101,7 +102,7 @@ class Set extends \Magento\Framework\Model\AbstractExtensibleModel implements
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -439,5 +440,26 @@ class Set extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::KEY_ENTITY_TYPE_ID, $entityTypeId);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Eav\Api\Data\AttributeSetExtensionInterface|null|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Eav\Api\Data\AttributeSetExtensionInterface|null $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Eav\Api\Data\AttributeSetExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/ValidationRule.php b/app/code/Magento/Eav/Model/Entity/Attribute/ValidationRule.php
index c3d4743674af8fa0a459ef9dd42ee344973d31f7..ee9367705335ae4fe6f4212bb23beabee05760e4 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/ValidationRule.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/ValidationRule.php
@@ -9,7 +9,7 @@ namespace Magento\Eav\Model\Entity\Attribute;
 /**
  * @codeCoverageIgnore
  */
-class ValidationRule extends \Magento\Framework\Model\AbstractExtensibleModel implements
+class ValidationRule extends \Magento\Framework\Model\AbstractModel implements
     \Magento\Eav\Api\Data\AttributeValidationRuleInterface
 {
     /**
diff --git a/app/code/Magento/Eav/Test/Unit/Model/EavCustomAttributeTypeLocatorTest.php b/app/code/Magento/Eav/Test/Unit/Model/EavCustomAttributeTypeLocatorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..89690484c74835f76a52415371a65c2f3ce6c531
--- /dev/null
+++ b/app/code/Magento/Eav/Test/Unit/Model/EavCustomAttributeTypeLocatorTest.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+// @codingStandardsIgnoreFile
+
+namespace Magento\Eav\Test\Unit\Model;
+
+use Magento\Eav\Api\AttributeRepositoryInterface;
+use Magento\Eav\Model\EavCustomAttributeTypeLocator;
+
+class EavCustomAttributeTypeLocatorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var EavCustomAttributeTypeLocator
+     */
+    private $eavCustomAttributeTypeLocator;
+
+    /**
+     * @var AttributeRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $attributeRepository = [];
+
+    protected function setUp()
+    {
+        $this->attributeRepository = $this->getMock(
+            'Magento\Eav\Model\AttributeRepository',
+            ['get'],
+            [],
+            '',
+            false
+        );
+    }
+
+    /**
+     * Test getType method
+     *
+     * @param string $attributeCode
+     * @param string $serviceClass
+     * @param array $attributeRepositoryResponse
+     * @param array $serviceEntityTypeMapData
+     * @param array $serviceBackendModelDataInterfaceMapData
+     * @param string $expected
+     * @dataProvider getTypeDataProvider
+     */
+    public function testGetType(
+        $attributeCode,
+        $serviceClass,
+        $attributeRepositoryResponse,
+        $serviceEntityTypeMapData,
+        $serviceBackendModelDataInterfaceMapData,
+        $expected
+    ) {
+        $this->attributeRepository
+            ->expects($this->any())
+            ->method('get')
+            ->willReturn($attributeRepositoryResponse);
+
+
+        $this->eavCustomAttributeTypeLocator = new EavCustomAttributeTypeLocator(
+            $this->attributeRepository,
+            $serviceEntityTypeMapData,
+            $serviceBackendModelDataInterfaceMapData
+        );
+
+        $type = $this->eavCustomAttributeTypeLocator->getType($attributeCode, $serviceClass);
+
+        $this->assertEquals($expected, $type, 'Expected: ' . $expected . 'but got: ' . $type);
+    }
+
+    public function getTypeDataProvider()
+    {
+        $serviceInterface = 'Magento\Catalog\Api\Data\ProductInterface';
+        $eavEntityType = 'catalog_product';
+        $mediaBackEndModelClass = 'Magento\Catalog\Model\Product\Attribute\Backend\Media';
+        $mediaAttributeDataInterface = '\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface';
+        $serviceBackendModelDataInterfaceMapData = [
+            $serviceInterface => [$mediaBackEndModelClass => $mediaAttributeDataInterface]
+        ];
+
+        $attribute = $this->getMock(
+            'Magento\Catalog\Model\Resource\Eav\Attribute',
+            ['getBackendModel'],
+            [],
+            '',
+            false
+        );
+
+        $attribute->expects($this->any())
+            ->method('getBackendModel')
+            ->willReturn($mediaBackEndModelClass);
+
+        $attributeNoBackendModel = $this->getMock(
+            'Magento\Catalog\Model\Resource\Eav\Attribute',
+            ['getBackendModel'],
+            [],
+            '',
+            false
+        );
+
+        $attributeNoBackendModel->expects($this->any())
+            ->method('getBackendModel')
+            ->willReturn(null);
+
+        return [
+            [
+                'attributeCode' => 'media_galley',
+                'serviceClass' => $serviceInterface,
+                'attributeRepositoryResponse' => $attribute,
+                'serviceEntityTypeMapData' => [$serviceInterface => $eavEntityType],
+                'serviceBackendModelDataInterfaceMapData' => $serviceBackendModelDataInterfaceMapData,
+                'expected' => $mediaAttributeDataInterface
+            ],
+            [
+                'attributeCode' => null,
+                'serviceClass' => $serviceInterface,
+                'attributeRepositoryResponse' => $attribute,
+                'serviceEntityTypeMapData' => [$serviceInterface => $eavEntityType],
+                'serviceBackendModelDataInterfaceMapData' => $serviceBackendModelDataInterfaceMapData,
+                'expected' => null
+            ],
+            [
+                'attributeCode' => 'media_galley',
+                'serviceClass' => null,
+                'attributeRepositoryResponse' => $attribute,
+                'serviceEntityTypeMapData' => [$serviceInterface => $eavEntityType],
+                'serviceBackendModelDataInterfaceMapData' => $serviceBackendModelDataInterfaceMapData,
+                'expected' => null
+            ],
+            [
+                'attributeCode' => 'media_galley',
+                'serviceClass' => $serviceInterface,
+                'attributeRepositoryResponse' => $attributeNoBackendModel,
+                'serviceEntityTypeMapData' => [],
+                'serviceBackendModelDataInterfaceMapData' => [],
+                'expected' => null
+            ],
+            [
+                'attributeCode' => 'media_galley',
+                'serviceClass' => 'Magento\Catalog\Api\Data\ProductInterface',
+                'attributeRepositoryResponse' => $attribute,
+                'serviceEntityTypeMapData' => [$serviceInterface => $eavEntityType],
+                'serviceBackendModelDataInterfaceMapData' => [],
+                'expected' => null
+            ]
+        ];
+    }
+}
diff --git a/app/code/Magento/Eav/etc/config.xml b/app/code/Magento/Eav/etc/config.xml
index f5d8d72d90d6b0706f3a102fcf33b1b263342e81..d6b5873aaf92e121cf985d6d1ad03f42c16e55ff 100644
--- a/app/code/Magento/Eav/etc/config.xml
+++ b/app/code/Magento/Eav/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <general>
             <validator_data>
diff --git a/app/code/Magento/Eav/etc/di.xml b/app/code/Magento/Eav/etc/di.xml
index 42c3fc13ef7d9524b43f34797a689b27d9f227ce..3dfebf456c7ff4ae26f6f8a118431872c7c2f67e 100644
--- a/app/code/Magento/Eav/etc/di.xml
+++ b/app/code/Magento/Eav/etc/di.xml
@@ -23,6 +23,8 @@
     <preference for="Magento\Eav\Api\Data\AttributeSearchResultsInterface" type="Magento\Framework\Api\SearchResults" />
     <preference for="Magento\Eav\Api\Data\AttributeSetSearchResultsInterface" type="Magento\Framework\Api\SearchResults" />
     <preference for="Magento\Eav\Api\Data\AttributeGroupSearchResultsInterface" type="Magento\Framework\Api\SearchResults" />
+    <preference for="Magento\Framework\Webapi\CustomAttributeTypeLocatorInterface" type="Magento\Eav\Model\EavCustomAttributeTypeLocator" />
+
     <type name="Magento\Eav\Model\Entity\Attribute\Config">
         <arguments>
             <argument name="reader" xsi:type="object">Magento\Eav\Model\Entity\Attribute\Config\Reader\Proxy</argument>
@@ -43,4 +45,16 @@
     <type name="Magento\Eav\Model\Resource\Entity\Attribute">
         <plugin name="storeLabelCaching" type="Magento\Eav\Plugin\Model\Resource\Entity\Attribute" />
     </type>
+    <type name="Magento\Eav\Model\EavCustomAttributeTypeLocator">
+        <arguments>
+            <argument name="serviceEntityTypeMap" xsi:type="array">
+                <item name="Magento\Catalog\Api\Data\ProductInterface" xsi:type="const">Magento\Catalog\Api\Data\ProductAttributeInterface::ENTITY_TYPE_CODE</item>
+            </argument>
+            <argument name="serviceBackendModelDataInterfaceMap" xsi:type="array">
+                <item name="Magento\Catalog\Api\Data\ProductInterface" xsi:type="array">
+                    <item name="Magento\Catalog\Model\Product\Attribute\Backend\Media" xsi:type="string">Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface</item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Eav/etc/module.xml b/app/code/Magento/Eav/etc/module.xml
index 156e78c1bdd64de754d9f2ee5274ef9dc65788d7..c4b4e458bd89df75bbe667371a54c90867752df2 100644
--- a/app/code/Magento/Eav/etc/module.xml
+++ b/app/code/Magento/Eav/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Eav" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Eav/etc/webapi.xml b/app/code/Magento/Eav/etc/webapi.xml
index ca246c7cf3a97038d6b11bac5e949149bdfdcdc7..bb5bd767dc8fad16cc1ec95fc814174777cdae55 100644
--- a/app/code/Magento/Eav/etc/webapi.xml
+++ b/app/code/Magento/Eav/etc/webapi.xml
@@ -31,7 +31,7 @@
             <resource ref="Magento_Catalog::sets"/>
         </resources>
     </route>
-    <route url="/V1/eav/attribute-sets" method="PUT">
+    <route url="/V1/eav/attribute-sets/:attributeSetId" method="PUT">
         <service class="Magento\Eav\Api\AttributeSetRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Catalog::sets"/>
diff --git a/app/code/Magento/Email/Test/Unit/Model/AbstractTemplateTest.php b/app/code/Magento/Email/Test/Unit/Model/AbstractTemplateTest.php
index e9ea334e776dab2079d0167ca86a9e67c5380ebf..bfdd32f7e55421599563f7da80f170a757111b31 100644
--- a/app/code/Magento/Email/Test/Unit/Model/AbstractTemplateTest.php
+++ b/app/code/Magento/Email/Test/Unit/Model/AbstractTemplateTest.php
@@ -4,6 +4,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 /**
  * Test class for \Magento\Email\Model\AbstractTemplate.
  */
@@ -56,4 +58,46 @@ class AbstractTemplateTest extends \PHPUnit_Framework_TestCase
     {
         return [[[]], [['area' => 'some_area']], [['store' => 'any_store']]];
     }
+
+    public function testEmulateDesignAndRevertDesign()
+    {
+        $originalConfig = ['area' => 'some_area', 'store' => 1];
+        $expectedConfig = ['area' => 'frontend', 'store' => 2];
+        $this->_model->setDesignConfig($originalConfig);
+
+        $this->_model->emulateDesign(2);
+        // assert config data has been emulated
+        $this->assertEquals($expectedConfig, $this->_model->getDesignConfig()->getData());
+
+        $this->_model->revertDesign();
+        // assert config data has been reverted to the original state
+        $this->assertEquals($originalConfig, $this->_model->getDesignConfig()->getData());
+    }
+
+    public function testGetDesignConfig()
+    {
+        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $designMock = $this->getMock('Magento\Framework\View\DesignInterface');
+        $designMock->expects($this->any())->method('getArea')->willReturn('test_area');
+
+        $storeMock = $this->getMock('Magento\Store\Model\Store', [], [], '', false);
+        $storeMock->expects($this->any())->method('getId')->willReturn(2);
+        $storeManagerMock = $this->getMock('Magento\Store\Model\StoreManagerInterface');
+        $storeManagerMock->expects($this->any())->method('getStore')->willReturn($storeMock);
+
+        $model = $this->getMockForAbstractClass(
+            'Magento\Email\Model\AbstractTemplate',
+            $helper->getConstructArguments(
+                'Magento\Email\Model\AbstractTemplate',
+                [
+                    'design' => $designMock,
+                    'storeManager' => $storeManagerMock
+                ]
+            )
+        );
+
+        $expectedConfig = ['area' => 'test_area', 'store' => 2];
+        $this->assertEquals($expectedConfig, $model->getDesignConfig()->getData());
+    }
 }
diff --git a/app/code/Magento/Email/Test/Unit/Model/BackendTemplateTest.php b/app/code/Magento/Email/Test/Unit/Model/BackendTemplateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a51e983e3b53191e4265d5f9f7d857825c86d1f
--- /dev/null
+++ b/app/code/Magento/Email/Test/Unit/Model/BackendTemplateTest.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+// @codingStandardsIgnoreFile
+
+/**
+ * Test class for Magento\Email\Model\BackendTemplate.
+ */
+namespace Magento\Email\Test\Unit\Model;
+
+use Magento\Email\Model\BackendTemplate;
+
+class BackendTemplateTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Backend template mock
+     *
+     * @var BackendTemplate
+     */
+    protected $model;
+
+    /**
+     * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfigMock;
+
+    /**
+     * @var \Magento\Config\Model\Config\Structure|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $structureMock;
+
+    /**
+     * @var \Magento\Email\Model\Resource\Template|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $resourceModelMock;
+
+    protected function setUp()
+    {
+        $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $this->scopeConfigMock = $this->getMock('Magento\Framework\App\Config\ScopeConfigInterface');
+        $this->scopeConfigMock->expects($this->any())->method('getValue')->willReturn(['test' => 1]);
+
+        $this->structureMock = $this->getMock('Magento\Config\Model\Config\Structure', [], [], '', false);
+        $this->structureMock->expects($this->any())->method('getFieldPathsByAttribute')->willReturn(['path' => 'test']);
+
+        $this->resourceModelMock = $this->getMock('Magento\Email\Model\Resource\Template', [], [], '', false);
+        $this->resourceModelMock->expects($this->any())->method('getSystemConfigByPathsAndTemplateId')->willReturn(['test_config' => 2015]);
+        $objectManagerMock = $this->getMock('Magento\Framework\ObjectManagerInterface');
+        $objectManagerMock->expects($this->any())
+            ->method('get')
+            ->with('Magento\Email\Model\Resource\Template')
+            ->will($this->returnValue($this->resourceModelMock));
+        \Magento\Framework\App\ObjectManager::setInstance($objectManagerMock);
+
+        $this->model = $helper->getObject(
+            'Magento\Email\Model\BackendTemplate',
+            ['scopeConfig' => $this->scopeConfigMock, 'structure' => $this->structureMock]
+        );
+    }
+
+    public function testGetSystemConfigPathsWhereUsedAsDefaultNoTemplateCode()
+    {
+        $this->assertEquals([], $this->model->getSystemConfigPathsWhereUsedAsDefault());
+    }
+
+    public function testGetSystemConfigPathsWhereUsedAsDefaultValidTemplateCode()
+    {
+        $this->model->setData('orig_template_code', 1);
+        $this->assertEquals([['path' => 'test']], $this->model->getSystemConfigPathsWhereUsedAsDefault());
+    }
+
+    public function testGetSystemConfigPathsWhereUsedCurrentlyNoId()
+    {
+        $this->assertEquals([], $this->model->getSystemConfigPathsWhereUsedCurrently());
+    }
+
+    public function testGetSystemConfigPathsWhereUsedCurrentlyValidId()
+    {
+        $this->model->setId(1);
+        $this->assertEquals(['test_config' => 2015], $this->model->getSystemConfigPathsWhereUsedCurrently());
+    }
+}
diff --git a/app/code/Magento/Email/composer.json b/app/code/Magento/Email/composer.json
index 7eae5d149b013397761753c02789deb21b2abc46..cf75e8fdd529bb89688f2cc12bdd4d92efc527f0 100644
--- a/app/code/Magento/Email/composer.json
+++ b/app/code/Magento/Email/composer.json
@@ -3,7 +3,6 @@
     "description": "N/A",
     "require": {
         "php": "~5.5.0|~5.6.0",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-config": "0.42.0-beta11",
         "magento/module-store": "0.42.0-beta11",
         "magento/module-cms": "0.42.0-beta11",
diff --git a/app/code/Magento/Email/etc/config.xml b/app/code/Magento/Email/etc/config.xml
index e966e4c1ed4c14dbcdfb5f0d4275f01a170d238a..700f625c9541c224cdbbf74dfdbcec7bf7390370 100644
--- a/app/code/Magento/Email/etc/config.xml
+++ b/app/code/Magento/Email/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <system>
             <media_storage_configuration>
diff --git a/app/code/Magento/Email/etc/module.xml b/app/code/Magento/Email/etc/module.xml
index 30252dd178b9eaefd8b68eca5814954dd5935310..3e5126d0e7e3a7c4997164f737f0fd6428bc9ead 100644
--- a/app/code/Magento/Email/etc/module.xml
+++ b/app/code/Magento/Email/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Email" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
             <module name="Magento_Cms"/>
         </sequence>
diff --git a/app/code/Magento/Fedex/composer.json b/app/code/Magento/Fedex/composer.json
index 9959c31c0264e069e40a70b15d0c145f6222819e..8997dc97ac88704304a484e44b7062d5a0399953 100644
--- a/app/code/Magento/Fedex/composer.json
+++ b/app/code/Magento/Fedex/composer.json
@@ -6,11 +6,11 @@
         "magento/module-store": "0.42.0-beta11",
         "magento/module-shipping": "0.42.0-beta11",
         "magento/module-directory": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-catalog": "0.42.0-beta11",
         "magento/module-sales": "0.42.0-beta11",
         "magento/module-catalog-inventory": "0.42.0-beta11",
         "magento/module-quote": "0.42.0-beta11",
+        "magento/module-config": "0.42.0-beta11",
         "magento/framework": "0.42.0-beta11",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
diff --git a/app/code/Magento/Fedex/etc/config.xml b/app/code/Magento/Fedex/etc/config.xml
index d20fd9f2d1b1f66350a8bf1b1bb98cac7abc6c59..9d99b8997487bad3eae596d0b7b026be93f524d3 100644
--- a/app/code/Magento/Fedex/etc/config.xml
+++ b/app/code/Magento/Fedex/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <carriers>
             <fedex>
diff --git a/app/code/Magento/GiftMessage/Api/Data/MessageInterface.php b/app/code/Magento/GiftMessage/Api/Data/MessageInterface.php
index c360ca4e8f1f2539e7be29789da17de5108ceb1c..a044e7c0ab0c72253dc3b375c1ed2677fb47c389 100644
--- a/app/code/Magento/GiftMessage/Api/Data/MessageInterface.php
+++ b/app/code/Magento/GiftMessage/Api/Data/MessageInterface.php
@@ -91,4 +91,21 @@ interface MessageInterface extends \Magento\Framework\Api\ExtensibleDataInterfac
      * @return $this
      */
     public function setMessage($message);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\GiftMessage\Api\Data\MessageExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\GiftMessage\Api\Data\MessageExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\GiftMessage\Api\Data\MessageExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/GiftMessage/Model/Message.php b/app/code/Magento/GiftMessage/Model/Message.php
index 4dda8d5546d9fd788a4f295555297e8936f4d1e9..be07b6cfb242c50d11fc7a9cf691d91b717150ef 100644
--- a/app/code/Magento/GiftMessage/Model/Message.php
+++ b/app/code/Magento/GiftMessage/Model/Message.php
@@ -26,7 +26,7 @@ class Message extends \Magento\Framework\Model\AbstractExtensibleModel implement
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param Resource\Message $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
@@ -36,7 +36,7 @@ class Message extends \Magento\Framework\Model\AbstractExtensibleModel implement
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\GiftMessage\Model\Resource\Message $resource,
         \Magento\Framework\Data\Collection\Db $resourceCollection,
@@ -47,7 +47,7 @@ class Message extends \Magento\Framework\Model\AbstractExtensibleModel implement
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -164,5 +164,26 @@ class Message extends \Magento\Framework\Model\AbstractExtensibleModel implement
     {
         return $this->setData(self::MESSAGE, $message);
     }
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\GiftMessage\Api\Data\MessageExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\GiftMessage\Api\Data\MessageExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\GiftMessage\Api\Data\MessageExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/GiftMessage/composer.json b/app/code/Magento/GiftMessage/composer.json
index cdc15af4279b4934754adee08f63e97497cdec0e..575d83a28cc8e0fd75f7b8262697cfe213d19845 100644
--- a/app/code/Magento/GiftMessage/composer.json
+++ b/app/code/Magento/GiftMessage/composer.json
@@ -15,9 +15,6 @@
         "magento/framework": "0.42.0-beta11",
         "magento/magento-composer-installer": "*"
     },
-    "suggest": {
-        "magento/module-core": "0.42.0-beta11"
-    },
     "type": "magento2-module",
     "version": "0.42.0-beta11",
     "license": [
diff --git a/app/code/Magento/GiftMessage/etc/config.xml b/app/code/Magento/GiftMessage/etc/config.xml
index 2bebc1173ef729e22de095815520c3be2d900759..dc21f3cfecaf4055397c3ee28d0e225f3135eb2c 100644
--- a/app/code/Magento/GiftMessage/etc/config.xml
+++ b/app/code/Magento/GiftMessage/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <sales>
             <gift_messages>
diff --git a/app/code/Magento/GoogleAdwords/etc/config.xml b/app/code/Magento/GoogleAdwords/etc/config.xml
index 1fa6ffc95967943ca3106e10c4e21960e85ac912..71bd7813ad22278703215c1cb7c052cc72d16b5f 100644
--- a/app/code/Magento/GoogleAdwords/etc/config.xml
+++ b/app/code/Magento/GoogleAdwords/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <google>
             <adwords>
diff --git a/app/code/Magento/GoogleAnalytics/etc/module.xml b/app/code/Magento/GoogleAnalytics/etc/module.xml
index 0012f962d97a81dbd3ff8bbcc3f0f3db09443cd8..bcb1b0ed7573d5f672b2c5bf77f1869b1ff16c1a 100644
--- a/app/code/Magento/GoogleAnalytics/etc/module.xml
+++ b/app/code/Magento/GoogleAnalytics/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_GoogleAnalytics" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/GoogleOptimizer/etc/config.xml b/app/code/Magento/GoogleOptimizer/etc/config.xml
index 5c2c3fde8a40869d6fbb9a203289c06c3eefcb57..fa510197464776407fb36f4f791bc34f827669f1 100644
--- a/app/code/Magento/GoogleOptimizer/etc/config.xml
+++ b/app/code/Magento/GoogleOptimizer/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <google>
             <optimizer>
diff --git a/app/code/Magento/GoogleShopping/etc/config.xml b/app/code/Magento/GoogleShopping/etc/config.xml
index d5daf823e33eec7a1104abb4abfda0ec2a2a47fa..82d68fde8927948a6bbdd118a543e1628a100f25 100644
--- a/app/code/Magento/GoogleShopping/etc/config.xml
+++ b/app/code/Magento/GoogleShopping/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <google>
             <googleshopping>
diff --git a/app/code/Magento/GroupedProduct/etc/config.xml b/app/code/Magento/GroupedProduct/etc/config.xml
index 6dcf6efdac0dc24ff4f21b451e2982c991743713..676a5554de340408a34f6244f78d2a3571c138f7 100644
--- a/app/code/Magento/GroupedProduct/etc/config.xml
+++ b/app/code/Magento/GroupedProduct/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <checkout>
             <cart>
diff --git a/app/code/Magento/ImportExport/etc/config.xml b/app/code/Magento/ImportExport/etc/config.xml
index 84e0568291fb3e97e06338107c3e60bc03e455b5..b10fbc4e34c2cfe47314390998c47d13001f77a6 100644
--- a/app/code/Magento/ImportExport/etc/config.xml
+++ b/app/code/Magento/ImportExport/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <general>
             <file>
diff --git a/app/code/Magento/Indexer/etc/module.xml b/app/code/Magento/Indexer/etc/module.xml
index 4105ec2268543b68e0694380f2337541e7e3a8e7..f03aca19f0cc4ce32b6ce1b4b168d3d1ab391c37 100644
--- a/app/code/Magento/Indexer/etc/module.xml
+++ b/app/code/Magento/Indexer/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Indexer" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Integration/Service/V1/AdminTokenService.php b/app/code/Magento/Integration/Service/V1/AdminTokenService.php
index b0dc1997f5ffe24d005eeb6b4a3dd1dd50cca855..7fb947eacd8204163b825656ec3b702c85cef445 100644
--- a/app/code/Magento/Integration/Service/V1/AdminTokenService.php
+++ b/app/code/Magento/Integration/Service/V1/AdminTokenService.php
@@ -22,7 +22,7 @@ class AdminTokenService implements AdminTokenServiceInterface
 {
     /**
      * Token Model
-     *
+     *a
      * @var TokenModelFactory
      */
     private $tokenModelFactory;
diff --git a/app/code/Magento/Integration/etc/config.xml b/app/code/Magento/Integration/etc/config.xml
index 8f525ccda1b7c6fa654df5a6b79fc1792df0f25c..6223b5bdc2d90b1dcd5c7facf13b46fa189589c8 100644
--- a/app/code/Magento/Integration/etc/config.xml
+++ b/app/code/Magento/Integration/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <oauth>
             <cleanup>
diff --git a/app/code/Magento/Integration/etc/module.xml b/app/code/Magento/Integration/etc/module.xml
index 7ae7bc0918f138db78083e39678ac75e08ee10a9..ca7838bfbb11cdfa6f9b6eeddf527786b87493f5 100644
--- a/app/code/Magento/Integration/etc/module.xml
+++ b/app/code/Magento/Integration/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Integration" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
             <module name="Magento_User"/>
         </sequence>
diff --git a/app/code/Magento/LayeredNavigation/etc/config.xml b/app/code/Magento/LayeredNavigation/etc/config.xml
index 21e2b707da9e34d6b927bfc2c9ff47b42af2d01d..d8cfd0f552c797148358e62578f119f794cf695a 100644
--- a/app/code/Magento/LayeredNavigation/etc/config.xml
+++ b/app/code/Magento/LayeredNavigation/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <catalog>
             <layered_navigation>
diff --git a/app/code/Magento/Log/Block/Adminhtml/Customer/Edit/Tab/View/Status.php b/app/code/Magento/Log/Block/Adminhtml/Customer/Edit/Tab/View/Status.php
deleted file mode 100644
index c95e4ba9827f3facf32bf1257a2c4081a48e3a18..0000000000000000000000000000000000000000
--- a/app/code/Magento/Log/Block/Adminhtml/Customer/Edit/Tab/View/Status.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Log\Block\Adminhtml\Customer\Edit\Tab\View;
-
-/**
- * Class Status
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
-class Status extends \Magento\Backend\Block\Template
-{
-    /**
-     * @var \Magento\Customer\Api\Data\CustomerInterface
-     */
-    protected $customer;
-
-    /**
-     * @var \Magento\Log\Model\Customer
-     */
-    protected $customerLog;
-
-    /**
-     * @var \Magento\Log\Model\Visitor
-     */
-    protected $modelLog;
-
-    /**
-     * @var \Magento\Log\Model\CustomerFactory
-     */
-    protected $logFactory;
-
-    /**
-     * @var \Magento\Customer\Api\Data\CustomerInterfaceFactory
-     */
-    protected $customerFactory;
-
-    /**
-     * @var \Magento\Framework\Api\DataObjectHelper
-     */
-    protected $dataObjectHelper;
-
-    /**
-     * @param \Magento\Backend\Block\Template\Context $context
-     * @param \Magento\Log\Model\CustomerFactory $logFactory
-     * @param \Magento\Log\Model\Log $modelLog
-     * @param \Magento\Framework\Stdlib\DateTime $dateTime
-     * @param \Magento\Customer\Api\Data\CustomerInterfaceFactory $customerFactory
-     * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
-     * @param array $data
-     */
-    public function __construct(
-        \Magento\Backend\Block\Template\Context $context,
-        \Magento\Log\Model\CustomerFactory $logFactory,
-        \Magento\Log\Model\Log $modelLog,
-        \Magento\Framework\Stdlib\DateTime $dateTime,
-        \Magento\Customer\Api\Data\CustomerInterfaceFactory $customerFactory,
-        \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
-        array $data = []
-    ) {
-        $this->logFactory = $logFactory;
-        $this->modelLog = $modelLog;
-        $this->dateTime = $dateTime;
-        $this->customerFactory = $customerFactory;
-        $this->dataObjectHelper = $dataObjectHelper;
-        parent::__construct($context, $data);
-    }
-
-    /**
-     * @return string
-     */
-    public function getStoreLastLoginDateTimezone()
-    {
-        return $this->_scopeConfig->getValue(
-            $this->_localeDate->getDefaultTimezonePath(),
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $this->getCustomer()->getStoreId()
-        );
-    }
-
-    /**
-     * @return \Magento\Customer\Api\Data\CustomerInterface
-     */
-    public function getCustomer()
-    {
-        if (!$this->customer) {
-            $this->customer = $this->customerFactory->create();
-            $this->dataObjectHelper
-                ->populateWithArray(
-                    $this->customer,
-                    $this->_backendSession->getCustomerData()['account'],
-                    '\Magento\Customer\Api\Data\CustomerInterface'
-                );
-        }
-        return $this->customer;
-    }
-
-    /**
-     * Get customer's current status
-     *
-     * @return \Magento\Framework\Phrase
-     */
-    public function getCurrentStatus()
-    {
-        $log = $this->getCustomerLog();
-        $interval = $this->modelLog->getOnlineMinutesInterval();
-        if ($log->getLogoutAt() ||
-            (new \DateTime())->getTimestamp() - strtotime($log->getLastVisitAt()) > $interval * 60
-        ) {
-            return __('Offline');
-        }
-        return __('Online');
-    }
-
-    /**
-     * Get customer last login date
-     *
-     * @return \Magento\Framework\Phrase|string
-     */
-    public function getLastLoginDate()
-    {
-        $date = $this->getCustomerLog()->getLoginAt();
-        if ($date) {
-            return $this->formatDate($date, \IntlDateFormatter::MEDIUM, true);
-        }
-        return __('Never');
-    }
-
-    /**
-     * @return \Magento\Framework\Phrase|string
-     */
-    public function getStoreLastLoginDate()
-    {
-        $date = $this->getCustomerLog()->getLoginAtTimestamp();
-        if ($date) {
-            $date = $this->_localeDate->scopeDate($this->getCustomer()->getStoreId(), $date, true);
-            return $this->formatDate($date, \IntlDateFormatter::MEDIUM, true);
-        }
-        return __('Never');
-    }
-
-    /**
-     * Load Customer Log model
-     *
-     * @return \Magento\Log\Model\Customer
-     */
-    public function getCustomerLog()
-    {
-        if (!$this->customerLog) {
-            $this->customerLog = $this->logFactory->create()->loadByCustomer($this->getCustomer()->getId());
-        }
-        return $this->customerLog;
-    }
-}
diff --git a/app/code/Magento/Log/Test/Unit/Block/Adminhtml/Customer/Edit/Tab/View/StatusTest.php b/app/code/Magento/Log/Test/Unit/Block/Adminhtml/Customer/Edit/Tab/View/StatusTest.php
deleted file mode 100644
index c155c22aca514c592d5a87f4b04c3d99ef491e35..0000000000000000000000000000000000000000
--- a/app/code/Magento/Log/Test/Unit/Block/Adminhtml/Customer/Edit/Tab/View/StatusTest.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Log\Test\Unit\Block\Adminhtml\Customer\Edit\Tab\View;
-
-use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
-
-/**
- * Class StatusTest
- * @package Magento\Log\Block\Adminhtml\Edit\Tab\View
- */
-class StatusTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Log\Block\Adminhtml\Customer\Edit\Tab\View\Status
-     */
-    protected $block;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $logFactory;
-
-    /**
-     * @var \Magento\Log\Model\Customer|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $customerLog;
-
-    /**
-     * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $localeDate;
-
-    /**
-     * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $scopeConfig;
-
-    protected function setUp()
-    {
-        $log = $this->getMock('Magento\Log\Model\Log', ['getOnlineMinutesInterval'], [], '', false);
-        $log->expects($this->any())->method('getOnlineMinutesInterval')->will($this->returnValue(1));
-
-        $this->customerLog = $this->getMockBuilder('Magento\Log\Model\Customer')->disableOriginalConstructor()
-            ->setMethods(['getLoginAt', 'getLoginAtTimestamp', 'loadByCustomer', 'getLogoutAt', 'getLastVisitAt'])
-            ->getMock();
-        $this->customerLog->expects($this->any())->method('loadByCustomer')->will($this->returnSelf());
-
-        $this->logFactory = $this->getMockBuilder('Magento\Log\Model\CustomerFactory')->setMethods(['create'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->logFactory->expects($this->any())->method('create')->will($this->returnValue($this->customerLog));
-
-        $dateTime = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime')->setMethods(['now'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $dateTime->expects($this->any())->method('now')->will($this->returnCallback(function () {
-            return date('Y-m-d H:i:s');
-        }));
-
-        $customer = $this->getMock('\Magento\Customer\Api\Data\CustomerInterface');
-        $customer->expects($this->any())->method('getId')->will($this->returnValue(1));
-        $customer->expects($this->any())->method('getStoreId')->will($this->returnValue(1));
-
-        $customerFactory = $this->getMockBuilder('\Magento\Customer\Api\Data\CustomerInterfaceFactory')
-            ->setMethods(['create'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $customerFactory->expects($this->any())->method('create')
-            ->will($this->returnValue($customer));
-
-        $customerData = ['account' => ['id' => 1, 'store_id' => 1]];
-        $backendSession = $this->getMockBuilder('\Magento\Backend\Model\Session')
-            ->setMethods(['getCustomerData'])->disableOriginalConstructor()->getMock();
-        $backendSession->expects($this->any())->method('getCustomerData')->will($this->returnValue($customerData));
-
-        $this->localeDate = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\Timezone')
-            ->setMethods(['scopeDate', 'formatDateTime', 'getDefaultTimezonePath'])
-            ->disableOriginalConstructor()->getMock();
-        $this->localeDate->expects($this->any())->method('getDefaultTimezonePath')
-            ->will($this->returnValue('path/to/default/timezone'));
-
-        $this->scopeConfig = $this->getMockBuilder('Magento\Framework\App\Config')
-            ->setMethods(['getValue'])
-            ->disableOriginalConstructor()->getMock();
-
-        $objectManagerHelper = new ObjectManagerHelper($this);
-        $this->block = $objectManagerHelper->getObject(
-            'Magento\Log\Block\Adminhtml\Customer\Edit\Tab\View\Status',
-            [
-                'logFactory' => $this->logFactory,
-                'localeDate' => $this->localeDate,
-                'scopeConfig' => $this->scopeConfig,
-                'modelLog' => $log,
-                'dateTime' => $dateTime,
-                'customerFactory' => $customerFactory,
-                'backendSession' => $backendSession
-            ]
-        );
-    }
-
-    public function testGetCustomerLog()
-    {
-        $this->logFactory->expects($this->once())->method('create')->will($this->returnValue($this->customerLog));
-        $this->assertSame($this->customerLog, $this->block->getCustomerLog());
-    }
-
-    public function testGetCurrentStatusOffline()
-    {
-        $date = date('Y-m-d H:i:s');
-        $this->customerLog->expects($this->any())->method('getLogoutAt')->will($this->returnValue($date));
-        $this->assertEquals('Offline', $this->block->getCurrentStatus());
-    }
-
-    public function testGetCurrentStatusOnline()
-    {
-        $date = date('Y-m-d H:i:s');
-        $this->customerLog->expects($this->any())->method('getLogoutAt')->will($this->returnValue(0));
-        $this->customerLog->expects($this->any())->method('getLastVisitAt')->will($this->returnValue($date));
-        $this->assertEquals('Online', $this->block->getCurrentStatus());
-    }
-
-    public function testGetLastLoginDate()
-    {
-        $date = date('Y-m-d H:i:s');
-        $this->customerLog->expects($this->any())->method('getLoginAt')->will($this->returnValue($date));
-        $this->localeDate->expects($this->once())->method('formatDateTime')->will($this->returnValue($date));
-        $this->assertEquals($date, $this->block->getLastLoginDate());
-    }
-
-    public function testAfterGetLastLoginDateNever()
-    {
-        $this->assertEquals('Never', $this->block->getLastLoginDate());
-    }
-
-    public function testGetStoreLastLoginDate()
-    {
-        $date = date('Y-m-d H:i:s');
-        $time = strtotime($date);
-
-        $this->localeDate->expects($this->once())->method('scopeDate')->will($this->returnValue($date));
-        $this->localeDate->expects($this->once())->method('formatDateTime')->will($this->returnValue($date));
-
-        $this->customerLog->expects($this->any())->method('getLoginAtTimestamp')->will($this->returnValue($time));
-        $this->assertEquals($date, $this->block->getStoreLastLoginDate());
-    }
-
-    public function testGetStoreLastLoginDateNever()
-    {
-        $this->assertEquals('Never', $this->block->getStoreLastLoginDate());
-    }
-
-    public function testGetStoreLastLoginDateTimezone()
-    {
-        $this->scopeConfig->expects($this->once())->method('getValue')
-            ->with('path/to/default/timezone', 'store', 1)
-            ->will($this->returnValue('America/Los_Angeles'));
-        $this->block->getStoreLastLoginDateTimezone();
-    }
-}
diff --git a/app/code/Magento/Log/etc/config.xml b/app/code/Magento/Log/etc/config.xml
index f77e48a2099d1be7ffdd14754097719b9f701434..0ca74bb05b554e466039793a3e89238a1ac18ebe 100644
--- a/app/code/Magento/Log/etc/config.xml
+++ b/app/code/Magento/Log/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <log>
             <visitor>
diff --git a/app/code/Magento/Log/view/adminhtml/layout/customer_form.xml b/app/code/Magento/Log/view/adminhtml/layout/customer_form.xml
deleted file mode 100644
index f53b7241321ea6154c32b08cab9e066644c755d2..0000000000000000000000000000000000000000
--- a/app/code/Magento/Log/view/adminhtml/layout/customer_form.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
-    <body>
-        <referenceBlock name="personal_info">
-            <block class="Magento\Log\Block\Adminhtml\Customer\Edit\Tab\View\Status" name="view_customer_status" template="customer/status.phtml"/>
-        </referenceBlock>
-    </body>
-</page>
diff --git a/app/code/Magento/Log/view/adminhtml/templates/customer/status.phtml b/app/code/Magento/Log/view/adminhtml/templates/customer/status.phtml
deleted file mode 100644
index 3d8c1ac2912e2e312967a447b2908791598aae14..0000000000000000000000000000000000000000
--- a/app/code/Magento/Log/view/adminhtml/templates/customer/status.phtml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-// @codingStandardsIgnoreFile
-
-/**
- * Template for block \Magento\Log\Block\Adminhtml\Customer\Edit\Tab\View\Status
- */
-
-$lastLoginDateAdmin = $block->getLastLoginDate();
-$lastLoginDateStore = $block->getStoreLastLoginDate();
-?>
-<tr>
-    <th><?php echo __('Last Logged In:') ?></th>
-    <td><?php echo $lastLoginDateAdmin ?> (<?php echo $block->getCurrentStatus() ?>)</td>
-</tr>
-<?php if ($lastLoginDateAdmin != $lastLoginDateStore): ?>
-<tr>
-    <th><?php echo __('Last Logged In (%1):', $block->getStoreLastLoginDateTimezone()) ?></th>
-    <td><?php echo $lastLoginDateStore ?> (<?php echo $block->getCurrentStatus() ?>)</td>
-</tr>
-<?php endif; ?>
diff --git a/app/code/Magento/Core/LICENSE.txt b/app/code/Magento/MediaStorage/LICENSE.txt
similarity index 100%
rename from app/code/Magento/Core/LICENSE.txt
rename to app/code/Magento/MediaStorage/LICENSE.txt
diff --git a/app/code/Magento/Core/LICENSE_AFL.txt b/app/code/Magento/MediaStorage/LICENSE_AFL.txt
similarity index 100%
rename from app/code/Magento/Core/LICENSE_AFL.txt
rename to app/code/Magento/MediaStorage/LICENSE_AFL.txt
diff --git a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/_files/config.xml b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/_files/config.xml
index beb583cb58d9941ab51927d7f124495d0547f07c..4cffed1a1cc9e003d9a125797275c1787eca1afc 100644
--- a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/_files/config.xml
+++ b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/_files/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Store/etc/config.xsd">
     <default>
         <resources>
             <fixture_module_setup>
diff --git a/app/code/Magento/MediaStorage/composer.json b/app/code/Magento/MediaStorage/composer.json
index bfd1965a73ff2009fb06f04efa3d4d43a4620706..ccc5a944717a31326fcdcb7af0248c7781ab14ce 100644
--- a/app/code/Magento/MediaStorage/composer.json
+++ b/app/code/Magento/MediaStorage/composer.json
@@ -5,7 +5,6 @@
         "php": "~5.5.0|~5.6.0",
         "magento/module-store": "0.42.0-beta11",
         "magento/module-backend": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-config": "0.42.0-beta11",
         "magento/framework": "0.42.0-beta11",
         "magento/magento-composer-installer": "*"
diff --git a/app/code/Magento/MediaStorage/i18n/de_DE.csv b/app/code/Magento/MediaStorage/i18n/de_DE.csv
new file mode 100644
index 0000000000000000000000000000000000000000..7cfc4ae6c12b63ecc839587142d3f9d8c6c9f8f6
--- /dev/null
+++ b/app/code/Magento/MediaStorage/i18n/de_DE.csv
@@ -0,0 +1,10 @@
+"Requested resource not found","Requested resource not found"
+"File %1 does not exist","File %1 does not exist"
+"File %1 is not readable","File %1 is not readable"
+"Parent directory does not exist: %1","Parent directory does not exist: %1"
+"File system",Dateisystem
+"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
+"Wrong file info format","Falsches Format Dateiinfo"
+"Please set available and/or protected paths list(s) before validation.","Bitte stellen Sie vor der Bestätigung die Liste(n) der verfügbaren und/oder geschützten Pfade ein."
+"Unable to create directory: %1","Unable to create directory: %1"
+"Unable to save file: %1","Unable to save file: %1"
diff --git a/app/code/Magento/MediaStorage/i18n/en_US.csv b/app/code/Magento/MediaStorage/i18n/en_US.csv
new file mode 100644
index 0000000000000000000000000000000000000000..b5cc34a4d49630ed633b764052b2d4e443bb615e
--- /dev/null
+++ b/app/code/Magento/MediaStorage/i18n/en_US.csv
@@ -0,0 +1,10 @@
+"Requested resource not found","Requested resource not found"
+"File %1 does not exist","File %1 does not exist"
+"File %1 is not readable","File %1 is not readable"
+"Parent directory does not exist: %1","Parent directory does not exist: %1"
+"File system","File system"
+"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
+"Wrong file info format","Wrong file info format"
+"Please set available and/or protected paths list(s) before validation.","Please set available and/or protected paths list(s) before validation."
+"Unable to create directory: %1","Unable to create directory: %1"
+"Unable to save file: %1","Unable to save file: %1"
diff --git a/app/code/Magento/MediaStorage/i18n/es_ES.csv b/app/code/Magento/MediaStorage/i18n/es_ES.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0ad1da242f2a656889e6444a114fb019844bd88f
--- /dev/null
+++ b/app/code/Magento/MediaStorage/i18n/es_ES.csv
@@ -0,0 +1,10 @@
+"Requested resource not found","Requested resource not found"
+"File %1 does not exist","File %1 does not exist"
+"File %1 is not readable","File %1 is not readable"
+"Parent directory does not exist: %1","Parent directory does not exist: %1"
+"File system","Sistema de archivos"
+"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
+"Wrong file info format","Formato de información del archivo incorrecto"
+"Please set available and/or protected paths list(s) before validation.","Por favor, indique la(s) lista(s) de rutas disponibles y/o protegidas antes de la validación."
+"Unable to create directory: %1","Unable to create directory: %1"
+"Unable to save file: %1","Unable to save file: %1"
diff --git a/app/code/Magento/MediaStorage/i18n/fr_FR.csv b/app/code/Magento/MediaStorage/i18n/fr_FR.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0d2d7dab58b82227c16c77ffbf4bee0805edb2e9
--- /dev/null
+++ b/app/code/Magento/MediaStorage/i18n/fr_FR.csv
@@ -0,0 +1,10 @@
+"Requested resource not found","Requested resource not found"
+"File %1 does not exist","File %1 does not exist"
+"File %1 is not readable","File %1 is not readable"
+"Parent directory does not exist: %1","Parent directory does not exist: %1"
+"File system","Système de fichiers"
+"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
+"Wrong file info format","Informations du format de fichiers incorrectes"
+"Please set available and/or protected paths list(s) before validation.","Veuillez définir la/les liste(s) de chemins disponibles et/ou protégés avant la validation."
+"Unable to create directory: %1","Unable to create directory: %1"
+"Unable to save file: %1","Unable to save file: %1"
diff --git a/app/code/Magento/MediaStorage/i18n/nl_NL.csv b/app/code/Magento/MediaStorage/i18n/nl_NL.csv
new file mode 100644
index 0000000000000000000000000000000000000000..abedda328cd459219fe19ec933cbaebc8d7115bd
--- /dev/null
+++ b/app/code/Magento/MediaStorage/i18n/nl_NL.csv
@@ -0,0 +1,10 @@
+"Requested resource not found","Requested resource not found"
+"File %1 does not exist","File %1 does not exist"
+"File %1 is not readable","File %1 is not readable"
+"Parent directory does not exist: %1","Parent directory does not exist: %1"
+"File system",Bestandssysteem
+"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
+"Wrong file info format","Verkeerde bestandsinformatiebestand"
+"Please set available and/or protected paths list(s) before validation.","Stel beschikbare en/of beschermde pad lijst(en) in voor validatie."
+"Unable to create directory: %1","Unable to create directory: %1"
+"Unable to save file: %1","Unable to save file: %1"
diff --git a/app/code/Magento/MediaStorage/i18n/pt_BR.csv b/app/code/Magento/MediaStorage/i18n/pt_BR.csv
new file mode 100644
index 0000000000000000000000000000000000000000..d9022058d08f66c809ffd2c697aff9cea6bf7e56
--- /dev/null
+++ b/app/code/Magento/MediaStorage/i18n/pt_BR.csv
@@ -0,0 +1,10 @@
+"Requested resource not found","Requested resource not found"
+"File %1 does not exist","File %1 does not exist"
+"File %1 is not readable","File %1 is not readable"
+"Parent directory does not exist: %1","Parent directory does not exist: %1"
+"File system","Sistema de arquivo"
+"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
+"Wrong file info format","Formato de arquivo de informação errado"
+"Please set available and/or protected paths list(s) before validation.","Por favor defina lista(s) de caminhos disponíveis e/ou protegidos antes da validação."
+"Unable to create directory: %1","Unable to create directory: %1"
+"Unable to save file: %1","Unable to save file: %1"
diff --git a/app/code/Magento/MediaStorage/i18n/zh_CN.csv b/app/code/Magento/MediaStorage/i18n/zh_CN.csv
new file mode 100644
index 0000000000000000000000000000000000000000..c0847a9f4600e53e9662f2b682a52efa1b48d1f1
--- /dev/null
+++ b/app/code/Magento/MediaStorage/i18n/zh_CN.csv
@@ -0,0 +1,10 @@
+"Requested resource not found","Requested resource not found"
+"File %1 does not exist","File %1 does not exist"
+"File %1 is not readable","File %1 is not readable"
+"Parent directory does not exist: %1","Parent directory does not exist: %1"
+"File system",文件系统
+"Unable to save file ""%1"" at ""%2""","Unable to save file ""%1"" at ""%2"""
+"Wrong file info format",错误的文件信息格式
+"Please set available and/or protected paths list(s) before validation.",请设置有效并/或受保护的路径列表,随后再验证。
+"Unable to create directory: %1","Unable to create directory: %1"
+"Unable to save file: %1","Unable to save file: %1"
diff --git a/app/code/Magento/Msrp/etc/config.xml b/app/code/Magento/Msrp/etc/config.xml
index e0a72f95dab6a9f8cf3dff985f3561407f87a41d..dd50e9de8178b9fb198156ab16074b9eede44a8f 100644
--- a/app/code/Magento/Msrp/etc/config.xml
+++ b/app/code/Magento/Msrp/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <sales>
             <msrp>
diff --git a/app/code/Magento/Multishipping/etc/config.xml b/app/code/Magento/Multishipping/etc/config.xml
index 76621b4a03bff0de66ee39c828fbb18e6feabce5..c08c0590401b67429190c650e3ae3f80a9d728f7 100644
--- a/app/code/Magento/Multishipping/etc/config.xml
+++ b/app/code/Magento/Multishipping/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <multishipping>
             <options>
diff --git a/app/code/Magento/Multishipping/etc/frontend/page_types.xml b/app/code/Magento/Multishipping/etc/frontend/page_types.xml
index 11be8441bb63b38b3ba5fc75319e8b988f241ab3..f58e8c5bb6a69f2c9d05fb543fd08eec5f1fd284 100644
--- a/app/code/Magento/Multishipping/etc/frontend/page_types.xml
+++ b/app/code/Magento/Multishipping/etc/frontend/page_types.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="checkout_cart_multishipping" label="Catalog Quick Search Form Suggestions"/>
     <type id="checkout_cart_multishipping_address_editaddress" label="Multishipping Checkout One Address Edit Form"/>
     <type id="checkout_cart_multishipping_address_editbilling" label="Multishipping Checkout Billing Address Edit Form"/>
diff --git a/app/code/Magento/Multishipping/etc/module.xml b/app/code/Magento/Multishipping/etc/module.xml
index 3ea0ac29db5ebb261f3a9dd4a7d17704bac1acfc..b6ea0b6ce80cad9020365e8fc77bfe09629ddbb9 100644
--- a/app/code/Magento/Multishipping/etc/module.xml
+++ b/app/code/Magento/Multishipping/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Multishipping" setup_version="2.0.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
             <module name="Magento_Catalog"/>
         </sequence>
diff --git a/app/code/Magento/Newsletter/etc/config.xml b/app/code/Magento/Newsletter/etc/config.xml
index 1ee0d4f45b4dbc1eb4560a5d34128003dd4b30ec..92b70813d46942884b7a4a55c7c69627612fef32 100644
--- a/app/code/Magento/Newsletter/etc/config.xml
+++ b/app/code/Magento/Newsletter/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <newsletter>
             <subscription>
diff --git a/app/code/Magento/Newsletter/etc/frontend/page_types.xml b/app/code/Magento/Newsletter/etc/frontend/page_types.xml
index 39889513a5efc5bd26ece50a48f04713cd008cfc..f6976324e9a862bec0d095ce8ada89ced4ee086f 100644
--- a/app/code/Magento/Newsletter/etc/frontend/page_types.xml
+++ b/app/code/Magento/Newsletter/etc/frontend/page_types.xml
@@ -5,6 +5,6 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="newsletter_manage_index" label="Customer My Account Newsletter Subscriptions"/>
 </page_types>
diff --git a/app/code/Magento/Newsletter/etc/module.xml b/app/code/Magento/Newsletter/etc/module.xml
index 13a4697cc7900c7ff670756ad6768ca439988b36..7d5356b547755df7fd21858f504d8208d1339fd8 100644
--- a/app/code/Magento/Newsletter/etc/module.xml
+++ b/app/code/Magento/Newsletter/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Newsletter" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
             <module name="Magento_Customer"/>
             <module name="Magento_Eav"/>
diff --git a/app/code/Magento/OfflinePayments/Model/Banktransfer.php b/app/code/Magento/OfflinePayments/Model/Banktransfer.php
index 4cc48a575272039644fe0c1211c4172249647f60..9eee92e1e2478a960e71e599bc4d78bea4d97334 100644
--- a/app/code/Magento/OfflinePayments/Model/Banktransfer.php
+++ b/app/code/Magento/OfflinePayments/Model/Banktransfer.php
@@ -7,6 +7,8 @@ namespace Magento\OfflinePayments\Model;
 
 /**
  * Bank Transfer payment method model
+ *
+ * @method \Magento\Quote\Api\Data\PaymentMethodExtensionInterface getExtensionAttributes()
  */
 class Banktransfer extends \Magento\Payment\Model\Method\AbstractMethod
 {
diff --git a/app/code/Magento/OfflinePayments/Model/Cashondelivery.php b/app/code/Magento/OfflinePayments/Model/Cashondelivery.php
index c1a125463d926cf328e42fb4b9c43b9102112430..06f2862acd07e6e7ed30da8a1dd3351e639014d8 100644
--- a/app/code/Magento/OfflinePayments/Model/Cashondelivery.php
+++ b/app/code/Magento/OfflinePayments/Model/Cashondelivery.php
@@ -7,6 +7,8 @@ namespace Magento\OfflinePayments\Model;
 
 /**
  * Cash on delivery payment method model
+ *
+ * @method \Magento\Quote\Api\Data\PaymentMethodExtensionInterface getExtensionAttributes()
  */
 class Cashondelivery extends \Magento\Payment\Model\Method\AbstractMethod
 {
diff --git a/app/code/Magento/OfflinePayments/Model/Checkmo.php b/app/code/Magento/OfflinePayments/Model/Checkmo.php
index 2de8ab28e97bc2e099d3579e75965cb49726fbd3..e282b502979df74feecf1ffc6a6509e7de651a71 100644
--- a/app/code/Magento/OfflinePayments/Model/Checkmo.php
+++ b/app/code/Magento/OfflinePayments/Model/Checkmo.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\OfflinePayments\Model;
 
+/**
+ * Class Checkmo
+ *
+ * @method \Magento\Quote\Api\Data\PaymentMethodExtensionInterface getExtensionAttributes()
+ */
 class Checkmo extends \Magento\Payment\Model\Method\AbstractMethod
 {
     /**
diff --git a/app/code/Magento/OfflinePayments/Model/Purchaseorder.php b/app/code/Magento/OfflinePayments/Model/Purchaseorder.php
index 180ec57133db7e6eadf0964a33cea8797fd60eca..3a4aa15d089031bbb5aafd87523d4bba1999516f 100644
--- a/app/code/Magento/OfflinePayments/Model/Purchaseorder.php
+++ b/app/code/Magento/OfflinePayments/Model/Purchaseorder.php
@@ -5,6 +5,11 @@
  */
 namespace Magento\OfflinePayments\Model;
 
+/**
+ * Class Purchaseorder
+ *
+ * @method \Magento\Quote\Api\Data\PaymentMethodExtensionInterface getExtensionAttributes()
+ */
 class Purchaseorder extends \Magento\Payment\Model\Method\AbstractMethod
 {
     /**
diff --git a/app/code/Magento/OfflinePayments/etc/config.xml b/app/code/Magento/OfflinePayments/etc/config.xml
index 3aac1bcdd6ca892ca4fa3c7a4f766f22963f84e6..67b15cb57e22d428d611630b43dd3fbf39af3c83 100644
--- a/app/code/Magento/OfflinePayments/etc/config.xml
+++ b/app/code/Magento/OfflinePayments/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <payment>
             <checkmo>
diff --git a/app/code/Magento/OfflinePayments/etc/module.xml b/app/code/Magento/OfflinePayments/etc/module.xml
index e458b0120953520956ab910a5e7a0ad7f49b54b6..c6cc2bf889da1d50dd65d60f2205c291d3f94b8d 100644
--- a/app/code/Magento/OfflinePayments/etc/module.xml
+++ b/app/code/Magento/OfflinePayments/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_OfflinePayments" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
             <module name="Magento_Catalog"/>
         </sequence>
diff --git a/app/code/Magento/OfflineShipping/etc/config.xml b/app/code/Magento/OfflineShipping/etc/config.xml
index e10269983be960658e0244257c2e3a513dfe1434..09dd89a88e3aa8da935ca5297094b58f1b67ee05 100644
--- a/app/code/Magento/OfflineShipping/etc/config.xml
+++ b/app/code/Magento/OfflineShipping/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <carriers>
             <flatrate>
diff --git a/app/code/Magento/PageCache/etc/config.xml b/app/code/Magento/PageCache/etc/config.xml
index 8bb6fd48f64a1ef1e00e1400ac914a63cb11d3c2..a1530794673bb554448856fb64d4346d5a44c40b 100644
--- a/app/code/Magento/PageCache/etc/config.xml
+++ b/app/code/Magento/PageCache/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <system>
             <full_page_cache>
diff --git a/app/code/Magento/PageCache/etc/module.xml b/app/code/Magento/PageCache/etc/module.xml
index 27fb178b409af4f29751c943930b30bd3edaac66..bd152d0a9e584b886647f50874c10a515eccd8d6 100644
--- a/app/code/Magento/PageCache/etc/module.xml
+++ b/app/code/Magento/PageCache/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_PageCache" setup_version="1.6.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Payment/Model/Info.php b/app/code/Magento/Payment/Model/Info.php
index f00d9117f4f5792fbc69b4236c278889e47f9cb6..0fd732033538183850c40b55d5bf32f233362def 100644
--- a/app/code/Magento/Payment/Model/Info.php
+++ b/app/code/Magento/Payment/Model/Info.php
@@ -5,7 +5,6 @@
  */
 namespace Magento\Payment\Model;
 
-use Magento\Framework\Api\AttributeValueFactory;
 use Magento\Framework\Model\AbstractExtensibleModel;
 
 /**
@@ -35,8 +34,8 @@ class Info extends AbstractExtensibleModel
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
+     * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
      * @param \Magento\Payment\Helper\Data $paymentData
      * @param \Magento\Framework\Encryption\EncryptorInterface $encryptor
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
@@ -46,8 +45,8 @@ class Info extends AbstractExtensibleModel
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
+        \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Payment\Helper\Data $paymentData,
         \Magento\Framework\Encryption\EncryptorInterface $encryptor,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
@@ -59,7 +58,7 @@ class Info extends AbstractExtensibleModel
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
diff --git a/app/code/Magento/Payment/Model/Method/AbstractMethod.php b/app/code/Magento/Payment/Model/Method/AbstractMethod.php
index fa331dd477414a2113dceee2ed2a447f2c7c8a07..926017b8bcce80f53a492ad3cb6849d4cbc2d2eb 100644
--- a/app/code/Magento/Payment/Model/Method/AbstractMethod.php
+++ b/app/code/Magento/Payment/Model/Method/AbstractMethod.php
@@ -222,7 +222,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Payment\Helper\Data $paymentData
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
@@ -233,7 +233,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Payment\Helper\Data $paymentData,
         \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
@@ -244,7 +244,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -848,4 +848,25 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl
     {
         $this->_debug($debugData);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Quote\Api\Data\PaymentMethodExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Quote\Api\Data\PaymentMethodExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\PaymentMethodExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Payment/Model/Method/Cc.php b/app/code/Magento/Payment/Model/Method/Cc.php
index 23e7dfda59a9b40a4da2e115d01deb1ff1017307..8fdec55da4492bdcbe1c38fd2c3587bcf4a830eb 100644
--- a/app/code/Magento/Payment/Model/Method/Cc.php
+++ b/app/code/Magento/Payment/Model/Method/Cc.php
@@ -6,6 +6,7 @@
 namespace Magento\Payment\Model\Method;
 
 /**
+ * @method \Magento\Quote\Api\Data\PaymentMethodExtensionInterface getExtensionAttributes()
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class Cc extends \Magento\Payment\Model\Method\AbstractMethod
@@ -45,7 +46,7 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Payment\Helper\Data $paymentData
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
@@ -60,7 +61,7 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Payment\Helper\Data $paymentData,
         \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
@@ -74,7 +75,7 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $paymentData,
             $scopeConfig,
diff --git a/app/code/Magento/Payment/Model/Method/Free.php b/app/code/Magento/Payment/Model/Method/Free.php
index 00c4145d7ba58687e1361b1d109a2645c79775c4..3793669383195a50c582674ed89ce19c634f6e82 100644
--- a/app/code/Magento/Payment/Model/Method/Free.php
+++ b/app/code/Magento/Payment/Model/Method/Free.php
@@ -9,6 +9,7 @@ use Magento\Framework\Pricing\PriceCurrencyInterface;
 
 /**
  * Free payment method
+ * @method \Magento\Quote\Api\Data\PaymentMethodExtensionInterface getExtensionAttributes()
  */
 class Free extends \Magento\Payment\Model\Method\AbstractMethod
 {
@@ -43,7 +44,7 @@ class Free extends \Magento\Payment\Model\Method\AbstractMethod
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Payment\Helper\Data $paymentData
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
@@ -56,7 +57,7 @@ class Free extends \Magento\Payment\Model\Method\AbstractMethod
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Payment\Helper\Data $paymentData,
         \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
@@ -68,7 +69,7 @@ class Free extends \Magento\Payment\Model\Method\AbstractMethod
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $paymentData,
             $scopeConfig,
diff --git a/app/code/Magento/Payment/Model/Method/Substitution.php b/app/code/Magento/Payment/Model/Method/Substitution.php
index 98563e5092d778de27d06e54b523c7e5753bf216..819ecc267d130dee4be334565a961cb5a8184d9d 100644
--- a/app/code/Magento/Payment/Model/Method/Substitution.php
+++ b/app/code/Magento/Payment/Model/Method/Substitution.php
@@ -8,6 +8,8 @@ namespace Magento\Payment\Model\Method;
 
 /**
  * Substitution payment method for non-existing payments
+ *
+ * @method \Magento\Quote\Api\Data\PaymentMethodExtensionInterface getExtensionAttributes()
  */
 class Substitution extends AbstractMethod
 {
diff --git a/app/code/Magento/Payment/Test/Unit/Model/Method/FreeTest.php b/app/code/Magento/Payment/Test/Unit/Model/Method/FreeTest.php
index 064beb8b5428e3468b0c12a64e5652412d8d49ef..9976a46c96dee56bd06824421b160a98ef2e91e2 100644
--- a/app/code/Magento/Payment/Test/Unit/Model/Method/FreeTest.php
+++ b/app/code/Magento/Payment/Test/Unit/Model/Method/FreeTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Payment\Test\Unit\Model\Method;
 
 class FreeTest extends \PHPUnit_Framework_TestCase
@@ -27,13 +30,19 @@ class FreeTest extends \PHPUnit_Framework_TestCase
         $context->expects($this->any())->method('getEventDispatcher')->willReturn($eventManagerMock);
 
         $registry = $this->getMock('\Magento\Framework\Registry', [], [], '', false);
-        $metadataService = $this->getMock('\Magento\Framework\Api\MetadataServiceInterface');
+        $extensionAttributesFactory = $this->getMock(
+            'Magento\Framework\Api\ExtensionAttributesFactory',
+            [],
+            [],
+            '',
+            false
+        );
         $customAttributeFactory = $this->getMock('\Magento\Framework\Api\AttributeValueFactory', [], [], '', false);
 
         $this->methodFree = new \Magento\Payment\Model\Method\Free(
             $context,
             $registry,
-            $metadataService,
+            $extensionAttributesFactory,
             $customAttributeFactory,
             $paymentData,
             $this->scopeConfig,
diff --git a/app/code/Magento/Payment/etc/config.xml b/app/code/Magento/Payment/etc/config.xml
index 79f703ef82aa1d1b1d7654b66f348ceac4c51a99..3fc78a9194a2cb6e78fc764c2734fa904cb8664d 100644
--- a/app/code/Magento/Payment/etc/config.xml
+++ b/app/code/Magento/Payment/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <payment>
             <free>
diff --git a/app/code/Magento/Persistent/etc/config.xml b/app/code/Magento/Persistent/etc/config.xml
index 0dd16042c81fe4e9c0cac6dd176c65a1faedc591..c34916a7735a29fff1ff7e2c9c6dbc90face6310 100644
--- a/app/code/Magento/Persistent/etc/config.xml
+++ b/app/code/Magento/Persistent/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <persistent>
             <options>
diff --git a/app/code/Magento/ProductAlert/etc/config.xml b/app/code/Magento/ProductAlert/etc/config.xml
index 23edc92c8f01e34aa136710ef54008f2382c9ea2..aae9903bfd345db05443b7180a285e3026c85aa5 100644
--- a/app/code/Magento/ProductAlert/etc/config.xml
+++ b/app/code/Magento/ProductAlert/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <catalog>
             <productalert>
diff --git a/app/code/Magento/Quote/Api/Data/AddressInterface.php b/app/code/Magento/Quote/Api/Data/AddressInterface.php
index 689ec768e2b5a8082057fed91962eceffa03b780..4b0487a3431dcb3859814f8bcdaefe14a2c8719a 100644
--- a/app/code/Magento/Quote/Api/Data/AddressInterface.php
+++ b/app/code/Magento/Quote/Api/Data/AddressInterface.php
@@ -334,4 +334,19 @@ interface AddressInterface extends \Magento\Framework\Api\ExtensibleDataInterfac
      * @return $this
      */
     public function setEmail($email);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Quote\Api\Data\AddressExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Quote\Api\Data\AddressExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\AddressExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Quote/Api/Data/CartInterface.php b/app/code/Magento/Quote/Api/Data/CartInterface.php
index 1fe5372c518bb2fabc106f13a11ef7d289181e65..2a56c448336bf4f8ad5bd9da2b588b6ac7582598 100644
--- a/app/code/Magento/Quote/Api/Data/CartInterface.php
+++ b/app/code/Magento/Quote/Api/Data/CartInterface.php
@@ -345,4 +345,19 @@ interface CartInterface extends \Magento\Framework\Api\ExtensibleDataInterface
      * @return $this
      */
     public function setCustomerTaxClassId($customerTaxClassId);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Quote\Api\Data\CartExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Quote\Api\Data\CartExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\CartExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Quote/Api/Data/CartItemInterface.php b/app/code/Magento/Quote/Api/Data/CartItemInterface.php
index 511184992ab89c18d0177a9eca99ce3312bfb20f..4951fe1698006419285934bc95c4645537394e1c 100644
--- a/app/code/Magento/Quote/Api/Data/CartItemInterface.php
+++ b/app/code/Magento/Quote/Api/Data/CartItemInterface.php
@@ -130,4 +130,19 @@ interface CartItemInterface extends \Magento\Framework\Api\ExtensibleDataInterfa
      * @return $this
      */
     public function setQuoteId($quoteId);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Quote\Api\Data\CartItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Quote\Api\Data\CartItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\CartItemExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Quote/Api/Data/CurrencyInterface.php b/app/code/Magento/Quote/Api/Data/CurrencyInterface.php
index b00350c5f600c2fc3917dbaa33c4315f56bf8c03..81a0ff8d3fad21400625f7c51c0634ede6dc2901 100644
--- a/app/code/Magento/Quote/Api/Data/CurrencyInterface.php
+++ b/app/code/Magento/Quote/Api/Data/CurrencyInterface.php
@@ -147,4 +147,19 @@ interface CurrencyInterface extends \Magento\Framework\Api\ExtensibleDataInterfa
      * @return $this
      */
     public function setBaseToQuoteRate($baseToQuoteRate);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Quote\Api\Data\CurrencyExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Quote\Api\Data\CurrencyExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\CurrencyExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Quote/Api/Data/PaymentInterface.php b/app/code/Magento/Quote/Api/Data/PaymentInterface.php
index 7d437b97e2326a9044b57a481e06ce8393346f77..7f0704edbfe32782368afd6ff87d0d633037dbd5 100644
--- a/app/code/Magento/Quote/Api/Data/PaymentInterface.php
+++ b/app/code/Magento/Quote/Api/Data/PaymentInterface.php
@@ -147,4 +147,19 @@ interface PaymentInterface extends \Magento\Framework\Api\ExtensibleDataInterfac
      * @return $this
      */
     public function setAdditionalData($additionalData);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Quote\Api\Data\PaymentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Quote\Api\Data\PaymentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\PaymentExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Quote/Api/Data/PaymentMethodInterface.php b/app/code/Magento/Quote/Api/Data/PaymentMethodInterface.php
index 3be900400f305ed076761bfab80a498dd7637d24..4ae7a9100508b4dadbaad4713f342061c7c93e93 100644
--- a/app/code/Magento/Quote/Api/Data/PaymentMethodInterface.php
+++ b/app/code/Magento/Quote/Api/Data/PaymentMethodInterface.php
@@ -20,4 +20,21 @@ interface PaymentMethodInterface extends \Magento\Framework\Api\ExtensibleDataIn
      * @return string
      */
     public function getTitle();
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Quote\Api\Data\PaymentMethodExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Quote\Api\Data\PaymentMethodExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Quote\Api\Data\PaymentMethodExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Quote/Api/Data/ShippingMethodInterface.php b/app/code/Magento/Quote/Api/Data/ShippingMethodInterface.php
index 92a60cbb3ad1f70d1d80391f89d4b156e0df33f7..ccebbdaa679e0a002971379aa4d5b6206bbd88b0 100644
--- a/app/code/Magento/Quote/Api/Data/ShippingMethodInterface.php
+++ b/app/code/Magento/Quote/Api/Data/ShippingMethodInterface.php
@@ -147,4 +147,21 @@ interface ShippingMethodInterface extends \Magento\Framework\Api\ExtensibleDataI
      * @return $this
      */
     public function setAvailable($available);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Quote\Api\Data\ShippingMethodExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Quote\Api\Data\ShippingMethodExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Quote\Api\Data\ShippingMethodExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Quote/Api/Data/TotalsInterface.php b/app/code/Magento/Quote/Api/Data/TotalsInterface.php
index b3594a9209f6bb063537a6cda701ce4ad5cf09c4..76684c5a75e196a29cec604f56cd5d5ca5a5402e 100644
--- a/app/code/Magento/Quote/Api/Data/TotalsInterface.php
+++ b/app/code/Magento/Quote/Api/Data/TotalsInterface.php
@@ -402,4 +402,19 @@ interface TotalsInterface extends \Magento\Framework\Api\ExtensibleDataInterface
      * @return $this
      */
     public function setItems(array $items = null);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Quote\Api\Data\TotalsExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Quote\Api\Data\TotalsExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\TotalsExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Quote/Api/Data/TotalsItemInterface.php b/app/code/Magento/Quote/Api/Data/TotalsItemInterface.php
index a37c78802f8ae767b08cc4fb0c3e4ae00faffa94..21b895553a4daeb6438b6000cd117f7a112bdf88 100644
--- a/app/code/Magento/Quote/Api/Data/TotalsItemInterface.php
+++ b/app/code/Magento/Quote/Api/Data/TotalsItemInterface.php
@@ -332,4 +332,19 @@ interface TotalsItemInterface extends \Magento\Framework\Api\ExtensibleDataInter
      * @return $this
      */
     public function setBaseRowTotalInclTax($baseRowTotalInclTax);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Quote\Api\Data\TotalsItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Quote\Api\Data\TotalsItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\TotalsItemExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Quote/Model/Cart/Currency.php b/app/code/Magento/Quote/Model/Cart/Currency.php
index 67e6e95b32a572717dfd6b8ff4f1ead6a06ba184..5f7b57a9508168e2b6f4ab136aa0c716fd30806c 100644
--- a/app/code/Magento/Quote/Model/Cart/Currency.php
+++ b/app/code/Magento/Quote/Model/Cart/Currency.php
@@ -162,4 +162,25 @@ class Currency extends \Magento\Framework\Model\AbstractExtensibleModel implemen
     {
         return $this->setData(self::KEY_BASE_TO_QUOTE_RATE, $baseToQuoteRate);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Quote\Api\Data\CurrencyExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Quote\Api\Data\CurrencyExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\CurrencyExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Quote/Model/Cart/ShippingMethod.php b/app/code/Magento/Quote/Model/Cart/ShippingMethod.php
index da61bf9820df6263a6d079a7b30ec6a3644818ec..75cba2f03cad98c8b53e727e1f4c0e699dde4bdd 100644
--- a/app/code/Magento/Quote/Model/Cart/ShippingMethod.php
+++ b/app/code/Magento/Quote/Model/Cart/ShippingMethod.php
@@ -162,4 +162,26 @@ class ShippingMethod extends \Magento\Framework\Api\AbstractExtensibleObject imp
     {
         return $this->setData(self::KEY_AVAILABLE, $available);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Quote\Api\Data\ShippingMethodExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Quote\Api\Data\ShippingMethodExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Quote\Api\Data\ShippingMethodExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Quote/Model/Cart/Totals.php b/app/code/Magento/Quote/Model/Cart/Totals.php
index a1c8969dc954b50b4efd34192860fa855ee839c7..4612824f9cebb05dc6c4dedbb00bd8827e4019a3 100644
--- a/app/code/Magento/Quote/Model/Cart/Totals.php
+++ b/app/code/Magento/Quote/Model/Cart/Totals.php
@@ -498,4 +498,25 @@ class Totals extends AbstractExtensibleModel implements TotalsInterface
     {
         return $this->setData(self::KEY_ITEMS, $items);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Quote\Api\Data\TotalsExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Quote\Api\Data\TotalsExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\TotalsExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Quote/Model/Cart/Totals/Item.php b/app/code/Magento/Quote/Model/Cart/Totals/Item.php
index 1cd39994d7c644a1277d83906765625c5fbfc79c..0cd716b5082d7ae9f7ef82f82806a2b894959dd3 100644
--- a/app/code/Magento/Quote/Model/Cart/Totals/Item.php
+++ b/app/code/Magento/Quote/Model/Cart/Totals/Item.php
@@ -350,4 +350,25 @@ class Item extends AbstractExtensibleObject implements TotalsItemInterface
     {
         return $this->setData(self::KEY_BASE_ROW_TOTAL_INCL_TAX, $baseRowTotalInclTax);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Quote\Api\Data\TotalsItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Quote\Api\Data\TotalsItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\TotalsItemExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Quote/Model/Quote.php b/app/code/Magento/Quote/Model/Quote.php
index 8d81ca2cebc9928ed442985fd44008ab4e9bf247..ef130e2e6597203b74b35e6066678fedc712ac20 100644
--- a/app/code/Magento/Quote/Model/Quote.php
+++ b/app/code/Magento/Quote/Model/Quote.php
@@ -325,7 +325,7 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param QuoteValidator $quoteValidator
      * @param \Magento\Catalog\Helper\Product $catalogProduct
@@ -363,7 +363,7 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Quote\Model\QuoteValidator $quoteValidator,
         \Magento\Catalog\Helper\Product $catalogProduct,
@@ -428,7 +428,7 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -2525,4 +2525,25 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C
     {
         return \count($this->getAllShippingAddresses()) > 1;
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Quote\Api\Data\CartExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Quote\Api\Data\CartExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\CartExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Quote/Model/Quote/Address.php b/app/code/Magento/Quote/Model/Quote/Address.php
index 01b4582cea36f116cddf6fba40e123c25c1c91d4..c57a8d0d5e8163661cdb1e240d60924801c3e5bb 100644
--- a/app/code/Magento/Quote/Model/Quote/Address.php
+++ b/app/code/Magento/Quote/Model/Quote/Address.php
@@ -8,7 +8,6 @@ namespace Magento\Quote\Model\Quote;
 use Magento\Customer\Api\AddressMetadataInterface;
 use Magento\Customer\Api\Data\AddressInterfaceFactory;
 use Magento\Customer\Api\Data\RegionInterfaceFactory;
-use Magento\Framework\Api\AttributeValueFactory;
 
 /**
  * Sales Quote address model
@@ -228,14 +227,14 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress implements
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
+     * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Directory\Helper\Data $directoryData
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param \Magento\Customer\Model\Address\Config $addressConfig
      * @param \Magento\Directory\Model\RegionFactory $regionFactory
      * @param \Magento\Directory\Model\CountryFactory $countryFactory
-     * @param AddressMetadataInterface $addressMetadataService
+     * @param AddressMetadataInterface $metadataService
      * @param AddressInterfaceFactory $addressDataFactory
      * @param RegionInterfaceFactory $regionDataFactory
      * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
@@ -260,14 +259,14 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress implements
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
+        \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Directory\Helper\Data $directoryData,
         \Magento\Eav\Model\Config $eavConfig,
         \Magento\Customer\Model\Address\Config $addressConfig,
         \Magento\Directory\Model\RegionFactory $regionFactory,
         \Magento\Directory\Model\CountryFactory $countryFactory,
-        AddressMetadataInterface $addressMetadataService,
+        AddressMetadataInterface $metadataService,
         AddressInterfaceFactory $addressDataFactory,
         RegionInterfaceFactory $regionDataFactory,
         \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
@@ -305,14 +304,14 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress implements
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $directoryData,
             $eavConfig,
             $addressConfig,
             $regionFactory,
             $countryFactory,
-            $addressMetadataService,
+            $metadataService,
             $addressDataFactory,
             $regionDataFactory,
             $dataObjectHelper,
@@ -1611,4 +1610,25 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress implements
         return $this->setData(self::KEY_REGION_CODE, $regionCode);
     }
     //@codeCoverageIgnoreEnd
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Quote\Api\Data\AddressExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Quote\Api\Data\AddressExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\AddressExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Quote/Model/Quote/Item.php b/app/code/Magento/Quote/Model/Quote/Item.php
index 8f48eadab4877255c12fe54372edda53fed1947e..8dab6a6d2bf42f326b6397b3e239e943003954a0 100644
--- a/app/code/Magento/Quote/Model/Quote/Item.php
+++ b/app/code/Magento/Quote/Model/Quote/Item.php
@@ -9,7 +9,7 @@
 namespace Magento\Quote\Model\Quote;
 
 use Magento\Framework\Api\AttributeValueFactory;
-use Magento\Framework\Api\MetadataServiceInterface;
+use Magento\Framework\Api\ExtensionAttributesFactory;
 
 /**
  * Sales Quote Item Model
@@ -181,7 +181,7 @@ class Item extends \Magento\Quote\Model\Quote\Item\AbstractItem implements \Mage
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param MetadataServiceInterface $metadataService
+     * @param ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
      * @param \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency
@@ -199,7 +199,7 @@ class Item extends \Magento\Quote\Model\Quote\Item\AbstractItem implements \Mage
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        MetadataServiceInterface $metadataService,
+        ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
         \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency,
@@ -220,7 +220,7 @@ class Item extends \Magento\Quote\Model\Quote\Item\AbstractItem implements \Mage
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $productRepository,
             $priceCurrency,
@@ -1002,4 +1002,25 @@ class Item extends \Magento\Quote\Model\Quote\Item\AbstractItem implements \Mage
         return $this->setData(self::KEY_QUOTE_ID, $quoteId);
     }
     //@codeCoverageIgnoreEnd
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Quote\Api\Data\CartItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Quote\Api\Data\CartItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\CartItemExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php
index 5a689e03d994a9afb8185c9fe8b6ea5a5c5034bf..8542ee1e6abb22406a447ba1386c372fc564a7db 100644
--- a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php
+++ b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php
@@ -83,7 +83,7 @@ abstract class AbstractItem extends \Magento\Framework\Model\AbstractExtensibleM
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
      * @param \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency
@@ -94,7 +94,7 @@ abstract class AbstractItem extends \Magento\Framework\Model\AbstractExtensibleM
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
         \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency,
@@ -105,7 +105,7 @@ abstract class AbstractItem extends \Magento\Framework\Model\AbstractExtensibleM
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
diff --git a/app/code/Magento/Quote/Model/Quote/Payment.php b/app/code/Magento/Quote/Model/Quote/Payment.php
index f420bad2202e58d972379a4202203b1a3f210ac7..f071b845cbb1fe3509696882da93882829db3f2a 100644
--- a/app/code/Magento/Quote/Model/Quote/Payment.php
+++ b/app/code/Magento/Quote/Model/Quote/Payment.php
@@ -5,8 +5,6 @@
  */
 namespace Magento\Quote\Model\Quote;
 
-use Magento\Framework\Api\AttributeValueFactory;
-
 /**
  * Quote payment information
  *
@@ -63,8 +61,8 @@ class Payment extends \Magento\Payment\Model\Info implements \Magento\Quote\Api\
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
+     * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Payment\Helper\Data $paymentData
      * @param \Magento\Framework\Encryption\EncryptorInterface $encryptor
      * @param \Magento\Payment\Model\Checks\SpecificationFactory $methodSpecificationFactory
@@ -76,8 +74,8 @@ class Payment extends \Magento\Payment\Model\Info implements \Magento\Quote\Api\
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
+        \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Payment\Helper\Data $paymentData,
         \Magento\Framework\Encryption\EncryptorInterface $encryptor,
         \Magento\Payment\Model\Checks\SpecificationFactory $methodSpecificationFactory,
@@ -89,7 +87,7 @@ class Payment extends \Magento\Payment\Model\Info implements \Magento\Quote\Api\
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $paymentData,
             $encryptor,
@@ -414,4 +412,25 @@ class Payment extends \Magento\Payment\Model\Info implements \Magento\Quote\Api\
         return $this->setData(self::KEY_ADDITIONAL_DATA, $additionalData);
     }
     //@codeCoverageIgnoreEnd
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Quote\Api\Data\PaymentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Quote\Api\Data\PaymentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Quote\Api\Data\PaymentExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Quote/Test/Unit/Model/Quote/Payment/ToOrderPaymentTest.php b/app/code/Magento/Quote/Test/Unit/Model/Quote/Payment/ToOrderPaymentTest.php
index 8349a6e8f19e669d1b664c1f627616934d3e9da2..b68aeb602acb6cfd7d7d8af9cf45b60595dcd6c6 100644
--- a/app/code/Magento/Quote/Test/Unit/Model/Quote/Payment/ToOrderPaymentTest.php
+++ b/app/code/Magento/Quote/Test/Unit/Model/Quote/Payment/ToOrderPaymentTest.php
@@ -4,6 +4,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 namespace Magento\Quote\Test\Unit\Model\Quote\Payment;
 
 use Magento\Payment\Model\Method\Substitution;
@@ -79,7 +81,7 @@ class ToOrderPaymentTest extends \PHPUnit_Framework_TestCase
         $data = ['some_id' => 1];
         $paymentMethodTitle = 'TestTitle';
         $additionalInfo = ['token' => 'TOKEN-123'];
-        
+
         $this->paymentMock->expects($this->once())->method('getMethodInstance')->willReturn($methodInterface);
         $methodInterface->expects($this->once())->method('getTitle')->willReturn($paymentMethodTitle);
         $this->objectCopyMock->expects($this->once())->method('getDataFromFieldset')->with(
diff --git a/app/code/Magento/Quote/etc/webapi.xml b/app/code/Magento/Quote/etc/webapi.xml
index e1502c718e95058cd007262ba45d5339598673a4..412dab6361b1f7ef5e24168ebcb9b1b980a32c48 100644
--- a/app/code/Magento/Quote/etc/webapi.xml
+++ b/app/code/Magento/Quote/etc/webapi.xml
@@ -13,7 +13,7 @@
             <resource ref="anonymous" />
         </resources>
     </route>
-    <route url="/V1/carts" method="PUT">
+    <route url="/V1/carts" method="GET">
         <service class="Magento\Quote\Api\CartRepositoryInterface" method="getList"/>
         <resources>
             <resource ref="anonymous" />
diff --git a/app/code/Magento/Reports/etc/config.xml b/app/code/Magento/Reports/etc/config.xml
index c9147001358680ef25a77c435a07519271a7cf79..d17146e739d84bf0c22e62bfc25178beec63eac4 100644
--- a/app/code/Magento/Reports/etc/config.xml
+++ b/app/code/Magento/Reports/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <catalog>
             <recently_products>
diff --git a/app/code/Magento/Review/composer.json b/app/code/Magento/Review/composer.json
index 8f961213f7b34a0da431534a402c1b818d09a957..3ac2d8c5deab3948d3df18d6cea4946bdac565c4 100644
--- a/app/code/Magento/Review/composer.json
+++ b/app/code/Magento/Review/composer.json
@@ -15,8 +15,7 @@
         "magento/magento-composer-installer": "*"
     },
     "suggest": {
-        "magento/module-cookie": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11"
+        "magento/module-cookie": "0.42.0-beta11"
     },
     "type": "magento2-module",
     "version": "0.42.0-beta11",
diff --git a/app/code/Magento/Review/etc/config.xml b/app/code/Magento/Review/etc/config.xml
index 0dc643e9ea43169759e13fcc12adee5f6da4de9a..1e46875b6f3d5b5d7039771ee813f121bacbc029 100644
--- a/app/code/Magento/Review/etc/config.xml
+++ b/app/code/Magento/Review/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <catalog>
             <review>
diff --git a/app/code/Magento/Review/etc/frontend/page_types.xml b/app/code/Magento/Review/etc/frontend/page_types.xml
index 113b431de418f9aeb97c2b31649fcd7b14b376b1..63fc47b5e2400951e22f07e860cd19cabb7dc541 100644
--- a/app/code/Magento/Review/etc/frontend/page_types.xml
+++ b/app/code/Magento/Review/etc/frontend/page_types.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="review_customer_index" label="Customer My Account Product Reviews"/>
     <type id="review_customer_view" label="Customer My Account Review Details"/>
     <type id="review_product_list" label="Catalog Product Reviews List"/>
diff --git a/app/code/Magento/Review/etc/module.xml b/app/code/Magento/Review/etc/module.xml
index ee43b6223153ea479b1e96ffd2b62e218223779c..226eb11213df86f11563660935e6075c5767608c 100644
--- a/app/code/Magento/Review/etc/module.xml
+++ b/app/code/Magento/Review/etc/module.xml
@@ -9,7 +9,6 @@
     <module name="Magento_Review" setup_version="2.0.0">
         <sequence>
             <module name="Magento_Catalog"/>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Rss/etc/frontend/page_types.xml b/app/code/Magento/Rss/etc/frontend/page_types.xml
index b252b8816bb399134cb281360e6e1927cfc09cb2..f834bd2faf9f9ccd1fa13abd01929bccde29db45 100644
--- a/app/code/Magento/Rss/etc/frontend/page_types.xml
+++ b/app/code/Magento/Rss/etc/frontend/page_types.xml
@@ -5,6 +5,6 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="rss_index_index" label="RSS Feeds List"/>
 </page_types>
diff --git a/app/code/Magento/Rule/etc/module.xml b/app/code/Magento/Rule/etc/module.xml
index b1ee185e3ec299014f691f1cb80ea6f8220fc61f..3a3987c2fb25336a2a7d1e174c36bfd051e7f9ce 100644
--- a/app/code/Magento/Rule/etc/module.xml
+++ b/app/code/Magento/Rule/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Rule" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Sales/Api/Data/CreditmemoCommentInterface.php b/app/code/Magento/Sales/Api/Data/CreditmemoCommentInterface.php
index 4d8ce351eddeb4cfa5f96c0ea73a963465e9e938..28afae3c0f9528343770c22dfe283b82324a7c5a 100644
--- a/app/code/Magento/Sales/Api/Data/CreditmemoCommentInterface.php
+++ b/app/code/Magento/Sales/Api/Data/CreditmemoCommentInterface.php
@@ -124,4 +124,21 @@ interface CreditmemoCommentInterface extends \Magento\Framework\Api\ExtensibleDa
      * @return $this
      */
     public function setComment($comment);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\CreditmemoCommentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\CreditmemoCommentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\CreditmemoCommentExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Sales/Api/Data/CreditmemoInterface.php b/app/code/Magento/Sales/Api/Data/CreditmemoInterface.php
index 8063c5d64e3aa6c766f21955d9731c30c61f6be1..205d5c37b3f1033132c9679a240e036223a2e5e8 100644
--- a/app/code/Magento/Sales/Api/Data/CreditmemoInterface.php
+++ b/app/code/Magento/Sales/Api/Data/CreditmemoInterface.php
@@ -960,4 +960,19 @@ interface CreditmemoInterface extends \Magento\Framework\Api\ExtensibleDataInter
      * @return $this
      */
     public function setDiscountDescription($description);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\CreditmemoExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\CreditmemoExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\CreditmemoExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Api/Data/CreditmemoItemInterface.php b/app/code/Magento/Sales/Api/Data/CreditmemoItemInterface.php
index c01bb4c6ee75d2ebb127aa20d6211cc3f0a95892..f93eedf1cff1f281cdc2ca9cbff68719cc67f6bb 100644
--- a/app/code/Magento/Sales/Api/Data/CreditmemoItemInterface.php
+++ b/app/code/Magento/Sales/Api/Data/CreditmemoItemInterface.php
@@ -645,4 +645,21 @@ interface CreditmemoItemInterface extends \Magento\Framework\Api\ExtensibleDataI
      * @return $this
      */
     public function setWeeeTaxAppliedRowAmount($amount);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\CreditmemoItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\CreditmemoItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\CreditmemoItemExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Sales/Api/Data/InvoiceCommentInterface.php b/app/code/Magento/Sales/Api/Data/InvoiceCommentInterface.php
index 05e605a530f94a822ed1496cf73abc5729b119c1..10c86a870231cd4cd0c24a165c1cc5cf022bcdaf 100644
--- a/app/code/Magento/Sales/Api/Data/InvoiceCommentInterface.php
+++ b/app/code/Magento/Sales/Api/Data/InvoiceCommentInterface.php
@@ -122,4 +122,21 @@ interface InvoiceCommentInterface extends \Magento\Framework\Api\ExtensibleDataI
      * @return $this
      */
     public function setComment($comment);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\InvoiceCommentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\InvoiceCommentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\InvoiceCommentExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Sales/Api/Data/InvoiceInterface.php b/app/code/Magento/Sales/Api/Data/InvoiceInterface.php
index 6cd291831bf5892bb8180223d8b007a48eb082d3..e17decc98e0bbd364313f43a2d7373cbfd7990cc 100644
--- a/app/code/Magento/Sales/Api/Data/InvoiceInterface.php
+++ b/app/code/Magento/Sales/Api/Data/InvoiceInterface.php
@@ -881,4 +881,19 @@ interface InvoiceInterface extends \Magento\Framework\Api\ExtensibleDataInterfac
      * @return $this
      */
     public function setDiscountDescription($description);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\InvoiceExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\InvoiceExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\InvoiceExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Api/Data/InvoiceItemInterface.php b/app/code/Magento/Sales/Api/Data/InvoiceItemInterface.php
index 127318da2ef1ca63d43a73c1958fff462ee03cf8..6dc2d85022e727245aaa71475e4355f2ef05060c 100644
--- a/app/code/Magento/Sales/Api/Data/InvoiceItemInterface.php
+++ b/app/code/Magento/Sales/Api/Data/InvoiceItemInterface.php
@@ -471,4 +471,19 @@ interface InvoiceItemInterface extends \Magento\Framework\Api\ExtensibleDataInte
      * @return $this
      */
     public function setBaseHiddenTaxAmount($amount);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\InvoiceItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\InvoiceItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\InvoiceItemExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php b/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php
index 10c62d33ee5ce320785a1cee71af02e9c7208f89..9e9e53f1727a00ba597fae6a2e4402c943b717c0 100644
--- a/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php
+++ b/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php
@@ -508,4 +508,19 @@ interface OrderAddressInterface extends \Magento\Framework\Api\ExtensibleDataInt
      * @return $this
      */
     public function setVatRequestSuccess($vatRequestSuccess);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\OrderAddressExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\OrderAddressExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\OrderAddressExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Api/Data/OrderInterface.php b/app/code/Magento/Sales/Api/Data/OrderInterface.php
index b01e0d81d76047e60d7aad7bd8ac56269c5b1a88..7bd62fbe1c3228b2241690b981a7f0ab8c2f84eb 100644
--- a/app/code/Magento/Sales/Api/Data/OrderInterface.php
+++ b/app/code/Magento/Sales/Api/Data/OrderInterface.php
@@ -2672,4 +2672,19 @@ interface OrderInterface extends \Magento\Framework\Api\ExtensibleDataInterface
      * @return $this
      */
     public function setBaseShippingInclTax($amount);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\OrderExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\OrderExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\OrderExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Api/Data/OrderItemInterface.php b/app/code/Magento/Sales/Api/Data/OrderItemInterface.php
index 286f79aefd34631c48fb7d1e07e77881e3cdd8cf..6e59b03a98370feb88a6d6522c9fb84560e12bf3 100644
--- a/app/code/Magento/Sales/Api/Data/OrderItemInterface.php
+++ b/app/code/Magento/Sales/Api/Data/OrderItemInterface.php
@@ -1797,4 +1797,19 @@ interface OrderItemInterface extends \Magento\Framework\Api\ExtensibleDataInterf
      * @return $this
      */
     public function setBaseWeeeTaxRowDisposition($baseWeeeTaxRowDisposition);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\OrderItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\OrderItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\OrderItemExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Api/Data/OrderPaymentInterface.php b/app/code/Magento/Sales/Api/Data/OrderPaymentInterface.php
index d080a1cd765a3446e8ddb3eb285bbed44079b09a..44fda2cdbcc1c5424b4d8518ae9917cefb3c1932 100644
--- a/app/code/Magento/Sales/Api/Data/OrderPaymentInterface.php
+++ b/app/code/Magento/Sales/Api/Data/OrderPaymentInterface.php
@@ -1035,4 +1035,19 @@ interface OrderPaymentInterface extends \Magento\Framework\Api\ExtensibleDataInt
      * @return $this
      */
     public function setAddressStatus($addressStatus);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\OrderPaymentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\OrderPaymentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\OrderPaymentExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Api/Data/OrderStatusHistoryInterface.php b/app/code/Magento/Sales/Api/Data/OrderStatusHistoryInterface.php
index dafc6547d77052f68cb63ed0d5a531a0b68f2fce..4ef7daf322d37f0ca1b26f0ab7501e7ad5a79fcf 100644
--- a/app/code/Magento/Sales/Api/Data/OrderStatusHistoryInterface.php
+++ b/app/code/Magento/Sales/Api/Data/OrderStatusHistoryInterface.php
@@ -161,4 +161,21 @@ interface OrderStatusHistoryInterface extends \Magento\Framework\Api\ExtensibleD
      * @return $this
      */
     public function setEntityName($entityName);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\OrderStatusHistoryExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\OrderStatusHistoryExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\OrderStatusHistoryExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Sales/Api/Data/ShipmentCommentInterface.php b/app/code/Magento/Sales/Api/Data/ShipmentCommentInterface.php
index 56346939103c84913e7bd883235b69e97fce9463..213b7c2e5e4931bd9f9295aee3b537f817891a68 100644
--- a/app/code/Magento/Sales/Api/Data/ShipmentCommentInterface.php
+++ b/app/code/Magento/Sales/Api/Data/ShipmentCommentInterface.php
@@ -122,4 +122,21 @@ interface ShipmentCommentInterface extends \Magento\Framework\Api\ExtensibleData
      * @return $this
      */
     public function setComment($comment);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\ShipmentCommentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\ShipmentCommentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\ShipmentCommentExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Sales/Api/Data/ShipmentInterface.php b/app/code/Magento/Sales/Api/Data/ShipmentInterface.php
index dbd2854e9ce220d14bf785de3ee60339336d619a..3af3b16ebf66154df3527aa22d298881cab5466e 100644
--- a/app/code/Magento/Sales/Api/Data/ShipmentInterface.php
+++ b/app/code/Magento/Sales/Api/Data/ShipmentInterface.php
@@ -350,4 +350,19 @@ interface ShipmentInterface extends \Magento\Framework\Api\ExtensibleDataInterfa
      * @return $this
      */
     public function setUpdatedAt($timestamp);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\ShipmentExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\ShipmentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\ShipmentExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Api/Data/ShipmentItemInterface.php b/app/code/Magento/Sales/Api/Data/ShipmentItemInterface.php
index 5b78e92571050f0a0cb7f40f83c3969f9916c54b..ad75b14cde2a155b5e684da289997b1d488b324c 100644
--- a/app/code/Magento/Sales/Api/Data/ShipmentItemInterface.php
+++ b/app/code/Magento/Sales/Api/Data/ShipmentItemInterface.php
@@ -244,4 +244,19 @@ interface ShipmentItemInterface extends \Magento\Framework\Api\ExtensibleDataInt
      * @return $this
      */
     public function setSku($sku);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\ShipmentItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\ShipmentItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\ShipmentItemExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Api/Data/ShipmentPackageInterface.php b/app/code/Magento/Sales/Api/Data/ShipmentPackageInterface.php
index 9172405a3f7d531a9da67966c552e6a8a00b3ba9..00b79d6f50e6d725fadb4a92e2ced0a456179cd0 100644
--- a/app/code/Magento/Sales/Api/Data/ShipmentPackageInterface.php
+++ b/app/code/Magento/Sales/Api/Data/ShipmentPackageInterface.php
@@ -13,4 +13,20 @@ namespace Magento\Sales\Api\Data;
  */
 interface ShipmentPackageInterface extends \Magento\Framework\Api\ExtensibleDataInterface
 {
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\ShipmentPackageExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\ShipmentPackageExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\ShipmentPackageExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Sales/Api/Data/ShipmentTrackInterface.php b/app/code/Magento/Sales/Api/Data/ShipmentTrackInterface.php
index 7160fc3fff2d8a7c415d5a143f5192ed08dbc9cb..7ace1ead4114db6c8c81c9a3921d56f1e9195727 100644
--- a/app/code/Magento/Sales/Api/Data/ShipmentTrackInterface.php
+++ b/app/code/Magento/Sales/Api/Data/ShipmentTrackInterface.php
@@ -218,4 +218,21 @@ interface ShipmentTrackInterface extends \Magento\Framework\Api\ExtensibleDataIn
      * @return $this
      */
     public function setCarrierCode($code);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\ShipmentTrackExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\ShipmentTrackExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\ShipmentTrackExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Sales/Api/Data/TransactionInterface.php b/app/code/Magento/Sales/Api/Data/TransactionInterface.php
index 1e350f1388372111181a71a1b276912925274d42..224d9765582f0e3381846f159814103e72111351 100644
--- a/app/code/Magento/Sales/Api/Data/TransactionInterface.php
+++ b/app/code/Magento/Sales/Api/Data/TransactionInterface.php
@@ -212,4 +212,19 @@ interface TransactionInterface extends \Magento\Framework\Api\ExtensibleDataInte
      * @throws \Magento\Framework\Exception\LocalizedException
      */
     public function setAdditionalInformation($key, $value);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Sales\Api\Data\TransactionExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Sales\Api\Data\TransactionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\TransactionExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Sales/Model/AbstractModel.php b/app/code/Magento/Sales/Model/AbstractModel.php
index b87d43e79f47cb97ceedab4e14bdd9babb13e002..a506b7efd3b3b02c5683a5ea2bc87611422c7de0 100644
--- a/app/code/Magento/Sales/Model/AbstractModel.php
+++ b/app/code/Magento/Sales/Model/AbstractModel.php
@@ -27,7 +27,7 @@ abstract class AbstractModel extends AbstractExtensibleModel
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -38,7 +38,7 @@ abstract class AbstractModel extends AbstractExtensibleModel
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -49,7 +49,7 @@ abstract class AbstractModel extends AbstractExtensibleModel
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
diff --git a/app/code/Magento/Sales/Model/Order.php b/app/code/Magento/Sales/Model/Order.php
index fa437025ad8487896f2a011d7d4248e45f8025ab..6a27ad12b323da64252cbdaf0ac2005f9cbd62f9 100644
--- a/app/code/Magento/Sales/Model/Order.php
+++ b/app/code/Magento/Sales/Model/Order.php
@@ -9,7 +9,7 @@ use Magento\Directory\Model\Currency;
 use Magento\Framework\Api\AttributeValueFactory;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Framework\Pricing\PriceCurrencyInterface;
-use Magento\Sales\Api\Data\OrderInterface as ApiOrderInterface;
+use Magento\Sales\Api\Data\OrderInterface;
 use Magento\Sales\Api\Data\OrderStatusHistoryInterface;
 use Magento\Sales\Model\Order\Payment;
 use Magento\Sales\Model\Resource\Order\Address\Collection;
@@ -50,7 +50,7 @@ use Magento\Sales\Model\Resource\Order\Status\History\Collection as HistoryColle
  * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
-class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
+class Order extends AbstractModel implements EntityInterface, OrderInterface
 {
     const ENTITY = 'order';
 
@@ -260,7 +260,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -290,7 +290,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -338,7 +338,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
@@ -1944,13 +1944,13 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getItems()
     {
-        if ($this->getData(ApiOrderInterface::ITEMS) == null) {
+        if ($this->getData(OrderInterface::ITEMS) == null) {
             $this->setData(
-                ApiOrderInterface::ITEMS,
+                OrderInterface::ITEMS,
                 $this->getItemsCollection()->getItems()
             );
         }
-        return $this->getData(ApiOrderInterface::ITEMS);
+        return $this->getData(OrderInterface::ITEMS);
     }
 
     /**
@@ -1958,7 +1958,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setItems($items)
     {
-        return $this->setData(ApiOrderInterface::ITEMS, $items);
+        return $this->setData(OrderInterface::ITEMS, $items);
     }
 
     /**
@@ -1966,13 +1966,13 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getPayments()
     {
-        if ($this->getData(ApiOrderInterface::PAYMENTS) == null) {
+        if ($this->getData(OrderInterface::PAYMENTS) == null) {
             $this->setData(
-                ApiOrderInterface::PAYMENTS,
+                OrderInterface::PAYMENTS,
                 $this->getPaymentsCollection()->getItems()
             );
         }
-        return $this->getData(ApiOrderInterface::PAYMENTS);
+        return $this->getData(OrderInterface::PAYMENTS);
     }
 
     /**
@@ -1980,7 +1980,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setPayments(array $payments = null)
     {
-        return $this->setData(ApiOrderInterface::PAYMENTS, $payments);
+        return $this->setData(OrderInterface::PAYMENTS, $payments);
     }
 
     /**
@@ -1988,13 +1988,13 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getAddresses()
     {
-        if ($this->getData(ApiOrderInterface::ADDRESSES) == null) {
+        if ($this->getData(OrderInterface::ADDRESSES) == null) {
             $this->setData(
-                ApiOrderInterface::ADDRESSES,
+                OrderInterface::ADDRESSES,
                 $this->getAddressesCollection()->getItems()
             );
         }
-        return $this->getData(ApiOrderInterface::ADDRESSES);
+        return $this->getData(OrderInterface::ADDRESSES);
     }
 
     /**
@@ -2002,7 +2002,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setAddresses(array $addresses = null)
     {
-        return $this->setData(ApiOrderInterface::ADDRESSES, $addresses);
+        return $this->setData(OrderInterface::ADDRESSES, $addresses);
     }
 
     /**
@@ -2012,7 +2012,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getAdjustmentNegative()
     {
-        return $this->getData(ApiOrderInterface::ADJUSTMENT_NEGATIVE);
+        return $this->getData(OrderInterface::ADJUSTMENT_NEGATIVE);
     }
 
     /**
@@ -2022,7 +2022,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getAdjustmentPositive()
     {
-        return $this->getData(ApiOrderInterface::ADJUSTMENT_POSITIVE);
+        return $this->getData(OrderInterface::ADJUSTMENT_POSITIVE);
     }
 
     /**
@@ -2032,7 +2032,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getAppliedRuleIds()
     {
-        return $this->getData(ApiOrderInterface::APPLIED_RULE_IDS);
+        return $this->getData(OrderInterface::APPLIED_RULE_IDS);
     }
 
     /**
@@ -2042,7 +2042,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseAdjustmentNegative()
     {
-        return $this->getData(ApiOrderInterface::BASE_ADJUSTMENT_NEGATIVE);
+        return $this->getData(OrderInterface::BASE_ADJUSTMENT_NEGATIVE);
     }
 
     /**
@@ -2052,7 +2052,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseAdjustmentPositive()
     {
-        return $this->getData(ApiOrderInterface::BASE_ADJUSTMENT_POSITIVE);
+        return $this->getData(OrderInterface::BASE_ADJUSTMENT_POSITIVE);
     }
 
     /**
@@ -2062,7 +2062,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseCurrencyCode()
     {
-        return $this->getData(ApiOrderInterface::BASE_CURRENCY_CODE);
+        return $this->getData(OrderInterface::BASE_CURRENCY_CODE);
     }
 
     /**
@@ -2072,7 +2072,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseDiscountAmount()
     {
-        return $this->getData(ApiOrderInterface::BASE_DISCOUNT_AMOUNT);
+        return $this->getData(OrderInterface::BASE_DISCOUNT_AMOUNT);
     }
 
     /**
@@ -2082,7 +2082,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseDiscountCanceled()
     {
-        return $this->getData(ApiOrderInterface::BASE_DISCOUNT_CANCELED);
+        return $this->getData(OrderInterface::BASE_DISCOUNT_CANCELED);
     }
 
     /**
@@ -2092,7 +2092,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseDiscountInvoiced()
     {
-        return $this->getData(ApiOrderInterface::BASE_DISCOUNT_INVOICED);
+        return $this->getData(OrderInterface::BASE_DISCOUNT_INVOICED);
     }
 
     /**
@@ -2102,7 +2102,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseDiscountRefunded()
     {
-        return $this->getData(ApiOrderInterface::BASE_DISCOUNT_REFUNDED);
+        return $this->getData(OrderInterface::BASE_DISCOUNT_REFUNDED);
     }
 
     /**
@@ -2112,7 +2112,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseGrandTotal()
     {
-        return $this->getData(ApiOrderInterface::BASE_GRAND_TOTAL);
+        return $this->getData(OrderInterface::BASE_GRAND_TOTAL);
     }
 
     /**
@@ -2122,7 +2122,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseHiddenTaxAmount()
     {
-        return $this->getData(ApiOrderInterface::BASE_HIDDEN_TAX_AMOUNT);
+        return $this->getData(OrderInterface::BASE_HIDDEN_TAX_AMOUNT);
     }
 
     /**
@@ -2132,7 +2132,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseHiddenTaxInvoiced()
     {
-        return $this->getData(ApiOrderInterface::BASE_HIDDEN_TAX_INVOICED);
+        return $this->getData(OrderInterface::BASE_HIDDEN_TAX_INVOICED);
     }
 
     /**
@@ -2142,7 +2142,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseHiddenTaxRefunded()
     {
-        return $this->getData(ApiOrderInterface::BASE_HIDDEN_TAX_REFUNDED);
+        return $this->getData(OrderInterface::BASE_HIDDEN_TAX_REFUNDED);
     }
 
     /**
@@ -2152,7 +2152,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseShippingAmount()
     {
-        return $this->getData(ApiOrderInterface::BASE_SHIPPING_AMOUNT);
+        return $this->getData(OrderInterface::BASE_SHIPPING_AMOUNT);
     }
 
     /**
@@ -2162,7 +2162,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseShippingCanceled()
     {
-        return $this->getData(ApiOrderInterface::BASE_SHIPPING_CANCELED);
+        return $this->getData(OrderInterface::BASE_SHIPPING_CANCELED);
     }
 
     /**
@@ -2172,7 +2172,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseShippingDiscountAmount()
     {
-        return $this->getData(ApiOrderInterface::BASE_SHIPPING_DISCOUNT_AMOUNT);
+        return $this->getData(OrderInterface::BASE_SHIPPING_DISCOUNT_AMOUNT);
     }
 
     /**
@@ -2182,7 +2182,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseShippingHiddenTaxAmnt()
     {
-        return $this->getData(ApiOrderInterface::BASE_SHIPPING_HIDDEN_TAX_AMNT);
+        return $this->getData(OrderInterface::BASE_SHIPPING_HIDDEN_TAX_AMNT);
     }
 
     /**
@@ -2192,7 +2192,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseShippingInclTax()
     {
-        return $this->getData(ApiOrderInterface::BASE_SHIPPING_INCL_TAX);
+        return $this->getData(OrderInterface::BASE_SHIPPING_INCL_TAX);
     }
 
     /**
@@ -2202,7 +2202,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseShippingInvoiced()
     {
-        return $this->getData(ApiOrderInterface::BASE_SHIPPING_INVOICED);
+        return $this->getData(OrderInterface::BASE_SHIPPING_INVOICED);
     }
 
     /**
@@ -2212,7 +2212,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseShippingRefunded()
     {
-        return $this->getData(ApiOrderInterface::BASE_SHIPPING_REFUNDED);
+        return $this->getData(OrderInterface::BASE_SHIPPING_REFUNDED);
     }
 
     /**
@@ -2222,7 +2222,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseShippingTaxAmount()
     {
-        return $this->getData(ApiOrderInterface::BASE_SHIPPING_TAX_AMOUNT);
+        return $this->getData(OrderInterface::BASE_SHIPPING_TAX_AMOUNT);
     }
 
     /**
@@ -2232,7 +2232,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseShippingTaxRefunded()
     {
-        return $this->getData(ApiOrderInterface::BASE_SHIPPING_TAX_REFUNDED);
+        return $this->getData(OrderInterface::BASE_SHIPPING_TAX_REFUNDED);
     }
 
     /**
@@ -2242,7 +2242,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseSubtotal()
     {
-        return $this->getData(ApiOrderInterface::BASE_SUBTOTAL);
+        return $this->getData(OrderInterface::BASE_SUBTOTAL);
     }
 
     /**
@@ -2252,7 +2252,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseSubtotalCanceled()
     {
-        return $this->getData(ApiOrderInterface::BASE_SUBTOTAL_CANCELED);
+        return $this->getData(OrderInterface::BASE_SUBTOTAL_CANCELED);
     }
 
     /**
@@ -2262,7 +2262,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseSubtotalInclTax()
     {
-        return $this->getData(ApiOrderInterface::BASE_SUBTOTAL_INCL_TAX);
+        return $this->getData(OrderInterface::BASE_SUBTOTAL_INCL_TAX);
     }
 
     /**
@@ -2272,7 +2272,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseSubtotalInvoiced()
     {
-        return $this->getData(ApiOrderInterface::BASE_SUBTOTAL_INVOICED);
+        return $this->getData(OrderInterface::BASE_SUBTOTAL_INVOICED);
     }
 
     /**
@@ -2282,7 +2282,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseSubtotalRefunded()
     {
-        return $this->getData(ApiOrderInterface::BASE_SUBTOTAL_REFUNDED);
+        return $this->getData(OrderInterface::BASE_SUBTOTAL_REFUNDED);
     }
 
     /**
@@ -2292,7 +2292,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTaxAmount()
     {
-        return $this->getData(ApiOrderInterface::BASE_TAX_AMOUNT);
+        return $this->getData(OrderInterface::BASE_TAX_AMOUNT);
     }
 
     /**
@@ -2302,7 +2302,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTaxCanceled()
     {
-        return $this->getData(ApiOrderInterface::BASE_TAX_CANCELED);
+        return $this->getData(OrderInterface::BASE_TAX_CANCELED);
     }
 
     /**
@@ -2312,7 +2312,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTaxInvoiced()
     {
-        return $this->getData(ApiOrderInterface::BASE_TAX_INVOICED);
+        return $this->getData(OrderInterface::BASE_TAX_INVOICED);
     }
 
     /**
@@ -2322,7 +2322,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTaxRefunded()
     {
-        return $this->getData(ApiOrderInterface::BASE_TAX_REFUNDED);
+        return $this->getData(OrderInterface::BASE_TAX_REFUNDED);
     }
 
     /**
@@ -2332,7 +2332,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTotalCanceled()
     {
-        return $this->getData(ApiOrderInterface::BASE_TOTAL_CANCELED);
+        return $this->getData(OrderInterface::BASE_TOTAL_CANCELED);
     }
 
     /**
@@ -2342,7 +2342,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTotalInvoiced()
     {
-        return $this->getData(ApiOrderInterface::BASE_TOTAL_INVOICED);
+        return $this->getData(OrderInterface::BASE_TOTAL_INVOICED);
     }
 
     /**
@@ -2352,7 +2352,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTotalInvoicedCost()
     {
-        return $this->getData(ApiOrderInterface::BASE_TOTAL_INVOICED_COST);
+        return $this->getData(OrderInterface::BASE_TOTAL_INVOICED_COST);
     }
 
     /**
@@ -2362,7 +2362,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTotalOfflineRefunded()
     {
-        return $this->getData(ApiOrderInterface::BASE_TOTAL_OFFLINE_REFUNDED);
+        return $this->getData(OrderInterface::BASE_TOTAL_OFFLINE_REFUNDED);
     }
 
     /**
@@ -2372,7 +2372,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTotalOnlineRefunded()
     {
-        return $this->getData(ApiOrderInterface::BASE_TOTAL_ONLINE_REFUNDED);
+        return $this->getData(OrderInterface::BASE_TOTAL_ONLINE_REFUNDED);
     }
 
     /**
@@ -2382,7 +2382,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTotalPaid()
     {
-        return $this->getData(ApiOrderInterface::BASE_TOTAL_PAID);
+        return $this->getData(OrderInterface::BASE_TOTAL_PAID);
     }
 
     /**
@@ -2392,7 +2392,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTotalQtyOrdered()
     {
-        return $this->getData(ApiOrderInterface::BASE_TOTAL_QTY_ORDERED);
+        return $this->getData(OrderInterface::BASE_TOTAL_QTY_ORDERED);
     }
 
     /**
@@ -2402,7 +2402,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseTotalRefunded()
     {
-        return $this->getData(ApiOrderInterface::BASE_TOTAL_REFUNDED);
+        return $this->getData(OrderInterface::BASE_TOTAL_REFUNDED);
     }
 
     /**
@@ -2412,7 +2412,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseToGlobalRate()
     {
-        return $this->getData(ApiOrderInterface::BASE_TO_GLOBAL_RATE);
+        return $this->getData(OrderInterface::BASE_TO_GLOBAL_RATE);
     }
 
     /**
@@ -2422,7 +2422,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBaseToOrderRate()
     {
-        return $this->getData(ApiOrderInterface::BASE_TO_ORDER_RATE);
+        return $this->getData(OrderInterface::BASE_TO_ORDER_RATE);
     }
 
     /**
@@ -2432,7 +2432,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getBillingAddressId()
     {
-        return $this->getData(ApiOrderInterface::BILLING_ADDRESS_ID);
+        return $this->getData(OrderInterface::BILLING_ADDRESS_ID);
     }
 
     /**
@@ -2442,7 +2442,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCanShipPartially()
     {
-        return $this->getData(ApiOrderInterface::CAN_SHIP_PARTIALLY);
+        return $this->getData(OrderInterface::CAN_SHIP_PARTIALLY);
     }
 
     /**
@@ -2452,7 +2452,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCanShipPartiallyItem()
     {
-        return $this->getData(ApiOrderInterface::CAN_SHIP_PARTIALLY_ITEM);
+        return $this->getData(OrderInterface::CAN_SHIP_PARTIALLY_ITEM);
     }
 
     /**
@@ -2462,7 +2462,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCouponCode()
     {
-        return $this->getData(ApiOrderInterface::COUPON_CODE);
+        return $this->getData(OrderInterface::COUPON_CODE);
     }
 
     /**
@@ -2472,7 +2472,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCreatedAt()
     {
-        return $this->getData(ApiOrderInterface::CREATED_AT);
+        return $this->getData(OrderInterface::CREATED_AT);
     }
 
     /**
@@ -2482,7 +2482,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerDob()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_DOB);
+        return $this->getData(OrderInterface::CUSTOMER_DOB);
     }
 
     /**
@@ -2492,7 +2492,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerEmail()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_EMAIL);
+        return $this->getData(OrderInterface::CUSTOMER_EMAIL);
     }
 
     /**
@@ -2502,7 +2502,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerFirstname()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_FIRSTNAME);
+        return $this->getData(OrderInterface::CUSTOMER_FIRSTNAME);
     }
 
     /**
@@ -2512,7 +2512,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerGender()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_GENDER);
+        return $this->getData(OrderInterface::CUSTOMER_GENDER);
     }
 
     /**
@@ -2522,7 +2522,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerGroupId()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_GROUP_ID);
+        return $this->getData(OrderInterface::CUSTOMER_GROUP_ID);
     }
 
     /**
@@ -2532,7 +2532,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerId()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_ID);
+        return $this->getData(OrderInterface::CUSTOMER_ID);
     }
 
     /**
@@ -2542,7 +2542,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerIsGuest()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_IS_GUEST);
+        return $this->getData(OrderInterface::CUSTOMER_IS_GUEST);
     }
 
     /**
@@ -2552,7 +2552,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerLastname()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_LASTNAME);
+        return $this->getData(OrderInterface::CUSTOMER_LASTNAME);
     }
 
     /**
@@ -2562,7 +2562,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerMiddlename()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_MIDDLENAME);
+        return $this->getData(OrderInterface::CUSTOMER_MIDDLENAME);
     }
 
     /**
@@ -2572,7 +2572,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerNote()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_NOTE);
+        return $this->getData(OrderInterface::CUSTOMER_NOTE);
     }
 
     /**
@@ -2582,7 +2582,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerNoteNotify()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_NOTE_NOTIFY);
+        return $this->getData(OrderInterface::CUSTOMER_NOTE_NOTIFY);
     }
 
     /**
@@ -2592,7 +2592,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerPrefix()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_PREFIX);
+        return $this->getData(OrderInterface::CUSTOMER_PREFIX);
     }
 
     /**
@@ -2602,7 +2602,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerSuffix()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_SUFFIX);
+        return $this->getData(OrderInterface::CUSTOMER_SUFFIX);
     }
 
     /**
@@ -2612,7 +2612,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getCustomerTaxvat()
     {
-        return $this->getData(ApiOrderInterface::CUSTOMER_TAXVAT);
+        return $this->getData(OrderInterface::CUSTOMER_TAXVAT);
     }
 
     /**
@@ -2622,7 +2622,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getDiscountAmount()
     {
-        return $this->getData(ApiOrderInterface::DISCOUNT_AMOUNT);
+        return $this->getData(OrderInterface::DISCOUNT_AMOUNT);
     }
 
     /**
@@ -2632,7 +2632,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getDiscountCanceled()
     {
-        return $this->getData(ApiOrderInterface::DISCOUNT_CANCELED);
+        return $this->getData(OrderInterface::DISCOUNT_CANCELED);
     }
 
     /**
@@ -2642,7 +2642,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getDiscountDescription()
     {
-        return $this->getData(ApiOrderInterface::DISCOUNT_DESCRIPTION);
+        return $this->getData(OrderInterface::DISCOUNT_DESCRIPTION);
     }
 
     /**
@@ -2652,7 +2652,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getDiscountInvoiced()
     {
-        return $this->getData(ApiOrderInterface::DISCOUNT_INVOICED);
+        return $this->getData(OrderInterface::DISCOUNT_INVOICED);
     }
 
     /**
@@ -2662,7 +2662,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getDiscountRefunded()
     {
-        return $this->getData(ApiOrderInterface::DISCOUNT_REFUNDED);
+        return $this->getData(OrderInterface::DISCOUNT_REFUNDED);
     }
 
     /**
@@ -2672,7 +2672,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getEditIncrement()
     {
-        return $this->getData(ApiOrderInterface::EDIT_INCREMENT);
+        return $this->getData(OrderInterface::EDIT_INCREMENT);
     }
 
     /**
@@ -2682,7 +2682,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getEmailSent()
     {
-        return $this->getData(ApiOrderInterface::EMAIL_SENT);
+        return $this->getData(OrderInterface::EMAIL_SENT);
     }
 
     /**
@@ -2692,7 +2692,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getExtCustomerId()
     {
-        return $this->getData(ApiOrderInterface::EXT_CUSTOMER_ID);
+        return $this->getData(OrderInterface::EXT_CUSTOMER_ID);
     }
 
     /**
@@ -2702,7 +2702,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getExtOrderId()
     {
-        return $this->getData(ApiOrderInterface::EXT_ORDER_ID);
+        return $this->getData(OrderInterface::EXT_ORDER_ID);
     }
 
     /**
@@ -2712,7 +2712,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getForcedShipmentWithInvoice()
     {
-        return $this->getData(ApiOrderInterface::FORCED_SHIPMENT_WITH_INVOICE);
+        return $this->getData(OrderInterface::FORCED_SHIPMENT_WITH_INVOICE);
     }
 
     /**
@@ -2722,7 +2722,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getGlobalCurrencyCode()
     {
-        return $this->getData(ApiOrderInterface::GLOBAL_CURRENCY_CODE);
+        return $this->getData(OrderInterface::GLOBAL_CURRENCY_CODE);
     }
 
     /**
@@ -2732,7 +2732,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getGrandTotal()
     {
-        return $this->getData(ApiOrderInterface::GRAND_TOTAL);
+        return $this->getData(OrderInterface::GRAND_TOTAL);
     }
 
     /**
@@ -2742,7 +2742,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getHiddenTaxAmount()
     {
-        return $this->getData(ApiOrderInterface::HIDDEN_TAX_AMOUNT);
+        return $this->getData(OrderInterface::HIDDEN_TAX_AMOUNT);
     }
 
     /**
@@ -2752,7 +2752,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getHiddenTaxInvoiced()
     {
-        return $this->getData(ApiOrderInterface::HIDDEN_TAX_INVOICED);
+        return $this->getData(OrderInterface::HIDDEN_TAX_INVOICED);
     }
 
     /**
@@ -2762,7 +2762,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getHiddenTaxRefunded()
     {
-        return $this->getData(ApiOrderInterface::HIDDEN_TAX_REFUNDED);
+        return $this->getData(OrderInterface::HIDDEN_TAX_REFUNDED);
     }
 
     /**
@@ -2772,7 +2772,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getHoldBeforeState()
     {
-        return $this->getData(ApiOrderInterface::HOLD_BEFORE_STATE);
+        return $this->getData(OrderInterface::HOLD_BEFORE_STATE);
     }
 
     /**
@@ -2782,7 +2782,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getHoldBeforeStatus()
     {
-        return $this->getData(ApiOrderInterface::HOLD_BEFORE_STATUS);
+        return $this->getData(OrderInterface::HOLD_BEFORE_STATUS);
     }
 
     /**
@@ -2792,7 +2792,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getIsVirtual()
     {
-        return $this->getData(ApiOrderInterface::IS_VIRTUAL);
+        return $this->getData(OrderInterface::IS_VIRTUAL);
     }
 
     /**
@@ -2802,7 +2802,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getOrderCurrencyCode()
     {
-        return $this->getData(ApiOrderInterface::ORDER_CURRENCY_CODE);
+        return $this->getData(OrderInterface::ORDER_CURRENCY_CODE);
     }
 
     /**
@@ -2812,7 +2812,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getOriginalIncrementId()
     {
-        return $this->getData(ApiOrderInterface::ORIGINAL_INCREMENT_ID);
+        return $this->getData(OrderInterface::ORIGINAL_INCREMENT_ID);
     }
 
     /**
@@ -2822,7 +2822,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getPaymentAuthorizationAmount()
     {
-        return $this->getData(ApiOrderInterface::PAYMENT_AUTHORIZATION_AMOUNT);
+        return $this->getData(OrderInterface::PAYMENT_AUTHORIZATION_AMOUNT);
     }
 
     /**
@@ -2832,7 +2832,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getPaymentAuthExpiration()
     {
-        return $this->getData(ApiOrderInterface::PAYMENT_AUTH_EXPIRATION);
+        return $this->getData(OrderInterface::PAYMENT_AUTH_EXPIRATION);
     }
 
     /**
@@ -2842,7 +2842,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getProtectCode()
     {
-        return $this->getData(ApiOrderInterface::PROTECT_CODE);
+        return $this->getData(OrderInterface::PROTECT_CODE);
     }
 
     /**
@@ -2852,7 +2852,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getQuoteAddressId()
     {
-        return $this->getData(ApiOrderInterface::QUOTE_ADDRESS_ID);
+        return $this->getData(OrderInterface::QUOTE_ADDRESS_ID);
     }
 
     /**
@@ -2862,7 +2862,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getQuoteId()
     {
-        return $this->getData(ApiOrderInterface::QUOTE_ID);
+        return $this->getData(OrderInterface::QUOTE_ID);
     }
 
     /**
@@ -2872,7 +2872,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getRelationChildId()
     {
-        return $this->getData(ApiOrderInterface::RELATION_CHILD_ID);
+        return $this->getData(OrderInterface::RELATION_CHILD_ID);
     }
 
     /**
@@ -2882,7 +2882,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getRelationChildRealId()
     {
-        return $this->getData(ApiOrderInterface::RELATION_CHILD_REAL_ID);
+        return $this->getData(OrderInterface::RELATION_CHILD_REAL_ID);
     }
 
     /**
@@ -2892,7 +2892,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getRelationParentId()
     {
-        return $this->getData(ApiOrderInterface::RELATION_PARENT_ID);
+        return $this->getData(OrderInterface::RELATION_PARENT_ID);
     }
 
     /**
@@ -2902,7 +2902,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getRelationParentRealId()
     {
-        return $this->getData(ApiOrderInterface::RELATION_PARENT_REAL_ID);
+        return $this->getData(OrderInterface::RELATION_PARENT_REAL_ID);
     }
 
     /**
@@ -2912,7 +2912,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getRemoteIp()
     {
-        return $this->getData(ApiOrderInterface::REMOTE_IP);
+        return $this->getData(OrderInterface::REMOTE_IP);
     }
 
     /**
@@ -2922,7 +2922,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingAddressId()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_ADDRESS_ID);
+        return $this->getData(OrderInterface::SHIPPING_ADDRESS_ID);
     }
 
     /**
@@ -2932,7 +2932,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingAmount()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_AMOUNT);
+        return $this->getData(OrderInterface::SHIPPING_AMOUNT);
     }
 
     /**
@@ -2942,7 +2942,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingCanceled()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_CANCELED);
+        return $this->getData(OrderInterface::SHIPPING_CANCELED);
     }
 
     /**
@@ -2952,7 +2952,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingDescription()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_DESCRIPTION);
+        return $this->getData(OrderInterface::SHIPPING_DESCRIPTION);
     }
 
     /**
@@ -2962,7 +2962,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingDiscountAmount()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_DISCOUNT_AMOUNT);
+        return $this->getData(OrderInterface::SHIPPING_DISCOUNT_AMOUNT);
     }
 
     /**
@@ -2972,7 +2972,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingHiddenTaxAmount()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_HIDDEN_TAX_AMOUNT);
+        return $this->getData(OrderInterface::SHIPPING_HIDDEN_TAX_AMOUNT);
     }
 
     /**
@@ -2982,7 +2982,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingInclTax()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_INCL_TAX);
+        return $this->getData(OrderInterface::SHIPPING_INCL_TAX);
     }
 
     /**
@@ -2992,7 +2992,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingInvoiced()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_INVOICED);
+        return $this->getData(OrderInterface::SHIPPING_INVOICED);
     }
 
     /**
@@ -3002,7 +3002,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingRefunded()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_REFUNDED);
+        return $this->getData(OrderInterface::SHIPPING_REFUNDED);
     }
 
     /**
@@ -3012,7 +3012,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingTaxAmount()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_TAX_AMOUNT);
+        return $this->getData(OrderInterface::SHIPPING_TAX_AMOUNT);
     }
 
     /**
@@ -3022,7 +3022,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getShippingTaxRefunded()
     {
-        return $this->getData(ApiOrderInterface::SHIPPING_TAX_REFUNDED);
+        return $this->getData(OrderInterface::SHIPPING_TAX_REFUNDED);
     }
 
     /**
@@ -3032,7 +3032,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getState()
     {
-        return $this->getData(ApiOrderInterface::STATE);
+        return $this->getData(OrderInterface::STATE);
     }
 
     /**
@@ -3042,7 +3042,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getStatus()
     {
-        return $this->getData(ApiOrderInterface::STATUS);
+        return $this->getData(OrderInterface::STATUS);
     }
 
     /**
@@ -3052,7 +3052,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getStoreCurrencyCode()
     {
-        return $this->getData(ApiOrderInterface::STORE_CURRENCY_CODE);
+        return $this->getData(OrderInterface::STORE_CURRENCY_CODE);
     }
 
     /**
@@ -3062,7 +3062,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getStoreId()
     {
-        return $this->getData(ApiOrderInterface::STORE_ID);
+        return $this->getData(OrderInterface::STORE_ID);
     }
 
     /**
@@ -3072,7 +3072,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getStoreName()
     {
-        return $this->getData(ApiOrderInterface::STORE_NAME);
+        return $this->getData(OrderInterface::STORE_NAME);
     }
 
     /**
@@ -3082,7 +3082,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getStoreToBaseRate()
     {
-        return $this->getData(ApiOrderInterface::STORE_TO_BASE_RATE);
+        return $this->getData(OrderInterface::STORE_TO_BASE_RATE);
     }
 
     /**
@@ -3092,7 +3092,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getStoreToOrderRate()
     {
-        return $this->getData(ApiOrderInterface::STORE_TO_ORDER_RATE);
+        return $this->getData(OrderInterface::STORE_TO_ORDER_RATE);
     }
 
     /**
@@ -3102,7 +3102,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getSubtotal()
     {
-        return $this->getData(ApiOrderInterface::SUBTOTAL);
+        return $this->getData(OrderInterface::SUBTOTAL);
     }
 
     /**
@@ -3112,7 +3112,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getSubtotalCanceled()
     {
-        return $this->getData(ApiOrderInterface::SUBTOTAL_CANCELED);
+        return $this->getData(OrderInterface::SUBTOTAL_CANCELED);
     }
 
     /**
@@ -3122,7 +3122,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getSubtotalInclTax()
     {
-        return $this->getData(ApiOrderInterface::SUBTOTAL_INCL_TAX);
+        return $this->getData(OrderInterface::SUBTOTAL_INCL_TAX);
     }
 
     /**
@@ -3132,7 +3132,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getSubtotalInvoiced()
     {
-        return $this->getData(ApiOrderInterface::SUBTOTAL_INVOICED);
+        return $this->getData(OrderInterface::SUBTOTAL_INVOICED);
     }
 
     /**
@@ -3142,7 +3142,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getSubtotalRefunded()
     {
-        return $this->getData(ApiOrderInterface::SUBTOTAL_REFUNDED);
+        return $this->getData(OrderInterface::SUBTOTAL_REFUNDED);
     }
 
     /**
@@ -3152,7 +3152,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTaxAmount()
     {
-        return $this->getData(ApiOrderInterface::TAX_AMOUNT);
+        return $this->getData(OrderInterface::TAX_AMOUNT);
     }
 
     /**
@@ -3162,7 +3162,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTaxCanceled()
     {
-        return $this->getData(ApiOrderInterface::TAX_CANCELED);
+        return $this->getData(OrderInterface::TAX_CANCELED);
     }
 
     /**
@@ -3172,7 +3172,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTaxInvoiced()
     {
-        return $this->getData(ApiOrderInterface::TAX_INVOICED);
+        return $this->getData(OrderInterface::TAX_INVOICED);
     }
 
     /**
@@ -3182,7 +3182,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTaxRefunded()
     {
-        return $this->getData(ApiOrderInterface::TAX_REFUNDED);
+        return $this->getData(OrderInterface::TAX_REFUNDED);
     }
 
     /**
@@ -3192,7 +3192,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTotalCanceled()
     {
-        return $this->getData(ApiOrderInterface::TOTAL_CANCELED);
+        return $this->getData(OrderInterface::TOTAL_CANCELED);
     }
 
     /**
@@ -3202,7 +3202,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTotalInvoiced()
     {
-        return $this->getData(ApiOrderInterface::TOTAL_INVOICED);
+        return $this->getData(OrderInterface::TOTAL_INVOICED);
     }
 
     /**
@@ -3212,7 +3212,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTotalItemCount()
     {
-        return $this->getData(ApiOrderInterface::TOTAL_ITEM_COUNT);
+        return $this->getData(OrderInterface::TOTAL_ITEM_COUNT);
     }
 
     /**
@@ -3222,7 +3222,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTotalOfflineRefunded()
     {
-        return $this->getData(ApiOrderInterface::TOTAL_OFFLINE_REFUNDED);
+        return $this->getData(OrderInterface::TOTAL_OFFLINE_REFUNDED);
     }
 
     /**
@@ -3232,7 +3232,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTotalOnlineRefunded()
     {
-        return $this->getData(ApiOrderInterface::TOTAL_ONLINE_REFUNDED);
+        return $this->getData(OrderInterface::TOTAL_ONLINE_REFUNDED);
     }
 
     /**
@@ -3242,7 +3242,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTotalPaid()
     {
-        return $this->getData(ApiOrderInterface::TOTAL_PAID);
+        return $this->getData(OrderInterface::TOTAL_PAID);
     }
 
     /**
@@ -3252,7 +3252,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTotalQtyOrdered()
     {
-        return $this->getData(ApiOrderInterface::TOTAL_QTY_ORDERED);
+        return $this->getData(OrderInterface::TOTAL_QTY_ORDERED);
     }
 
     /**
@@ -3262,7 +3262,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getTotalRefunded()
     {
-        return $this->getData(ApiOrderInterface::TOTAL_REFUNDED);
+        return $this->getData(OrderInterface::TOTAL_REFUNDED);
     }
 
     /**
@@ -3272,7 +3272,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getUpdatedAt()
     {
-        return $this->getData(ApiOrderInterface::UPDATED_AT);
+        return $this->getData(OrderInterface::UPDATED_AT);
     }
 
     /**
@@ -3282,7 +3282,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getWeight()
     {
-        return $this->getData(ApiOrderInterface::WEIGHT);
+        return $this->getData(OrderInterface::WEIGHT);
     }
 
     /**
@@ -3292,7 +3292,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getXForwardedFor()
     {
-        return $this->getData(ApiOrderInterface::X_FORWARDED_FOR);
+        return $this->getData(OrderInterface::X_FORWARDED_FOR);
     }
 
     /**
@@ -3300,13 +3300,34 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function getStatusHistories()
     {
-        if ($this->getData(ApiOrderInterface::STATUS_HISTORIES) == null) {
+        if ($this->getData(OrderInterface::STATUS_HISTORIES) == null) {
             $this->setData(
-                ApiOrderInterface::STATUS_HISTORIES,
+                OrderInterface::STATUS_HISTORIES,
                 $this->getStatusHistoryCollection()->getItems()
             );
         }
-        return $this->getData(ApiOrderInterface::STATUS_HISTORIES);
+        return $this->getData(OrderInterface::STATUS_HISTORIES);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\OrderExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\OrderExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\OrderExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
     }
 
     /**
@@ -3314,7 +3335,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setStatusHistories(array $statusHistories = null)
     {
-        return $this->setData(ApiOrderInterface::STATUS_HISTORIES, $statusHistories);
+        return $this->setData(OrderInterface::STATUS_HISTORIES, $statusHistories);
     }
 
     //@codeCoverageIgnoreStart
@@ -3323,7 +3344,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setStatus($status)
     {
-        return $this->setData(ApiOrderInterface::STATUS, $status);
+        return $this->setData(OrderInterface::STATUS, $status);
     }
 
     /**
@@ -3331,7 +3352,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCouponCode($code)
     {
-        return $this->setData(ApiOrderInterface::COUPON_CODE, $code);
+        return $this->setData(OrderInterface::COUPON_CODE, $code);
     }
 
     /**
@@ -3339,7 +3360,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setProtectCode($code)
     {
-        return $this->setData(ApiOrderInterface::PROTECT_CODE, $code);
+        return $this->setData(OrderInterface::PROTECT_CODE, $code);
     }
 
     /**
@@ -3347,7 +3368,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingDescription($description)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_DESCRIPTION, $description);
+        return $this->setData(OrderInterface::SHIPPING_DESCRIPTION, $description);
     }
 
     /**
@@ -3355,7 +3376,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setIsVirtual($isVirtual)
     {
-        return $this->setData(ApiOrderInterface::IS_VIRTUAL, $isVirtual);
+        return $this->setData(OrderInterface::IS_VIRTUAL, $isVirtual);
     }
 
     /**
@@ -3363,7 +3384,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setStoreId($id)
     {
-        return $this->setData(ApiOrderInterface::STORE_ID, $id);
+        return $this->setData(OrderInterface::STORE_ID, $id);
     }
 
     /**
@@ -3371,7 +3392,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerId($id)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_ID, $id);
+        return $this->setData(OrderInterface::CUSTOMER_ID, $id);
     }
 
     /**
@@ -3379,7 +3400,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseDiscountAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_DISCOUNT_AMOUNT, $amount);
+        return $this->setData(OrderInterface::BASE_DISCOUNT_AMOUNT, $amount);
     }
 
     /**
@@ -3387,7 +3408,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseDiscountCanceled($baseDiscountCanceled)
     {
-        return $this->setData(ApiOrderInterface::BASE_DISCOUNT_CANCELED, $baseDiscountCanceled);
+        return $this->setData(OrderInterface::BASE_DISCOUNT_CANCELED, $baseDiscountCanceled);
     }
 
     /**
@@ -3395,7 +3416,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseDiscountInvoiced($baseDiscountInvoiced)
     {
-        return $this->setData(ApiOrderInterface::BASE_DISCOUNT_INVOICED, $baseDiscountInvoiced);
+        return $this->setData(OrderInterface::BASE_DISCOUNT_INVOICED, $baseDiscountInvoiced);
     }
 
     /**
@@ -3403,7 +3424,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseDiscountRefunded($baseDiscountRefunded)
     {
-        return $this->setData(ApiOrderInterface::BASE_DISCOUNT_REFUNDED, $baseDiscountRefunded);
+        return $this->setData(OrderInterface::BASE_DISCOUNT_REFUNDED, $baseDiscountRefunded);
     }
 
     /**
@@ -3411,7 +3432,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseGrandTotal($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_GRAND_TOTAL, $amount);
+        return $this->setData(OrderInterface::BASE_GRAND_TOTAL, $amount);
     }
 
     /**
@@ -3419,7 +3440,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseShippingAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_SHIPPING_AMOUNT, $amount);
+        return $this->setData(OrderInterface::BASE_SHIPPING_AMOUNT, $amount);
     }
 
     /**
@@ -3427,7 +3448,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseShippingCanceled($baseShippingCanceled)
     {
-        return $this->setData(ApiOrderInterface::BASE_SHIPPING_CANCELED, $baseShippingCanceled);
+        return $this->setData(OrderInterface::BASE_SHIPPING_CANCELED, $baseShippingCanceled);
     }
 
     /**
@@ -3435,7 +3456,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseShippingInvoiced($baseShippingInvoiced)
     {
-        return $this->setData(ApiOrderInterface::BASE_SHIPPING_INVOICED, $baseShippingInvoiced);
+        return $this->setData(OrderInterface::BASE_SHIPPING_INVOICED, $baseShippingInvoiced);
     }
 
     /**
@@ -3443,7 +3464,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseShippingRefunded($baseShippingRefunded)
     {
-        return $this->setData(ApiOrderInterface::BASE_SHIPPING_REFUNDED, $baseShippingRefunded);
+        return $this->setData(OrderInterface::BASE_SHIPPING_REFUNDED, $baseShippingRefunded);
     }
 
     /**
@@ -3451,7 +3472,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseShippingTaxAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_SHIPPING_TAX_AMOUNT, $amount);
+        return $this->setData(OrderInterface::BASE_SHIPPING_TAX_AMOUNT, $amount);
     }
 
     /**
@@ -3459,7 +3480,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseShippingTaxRefunded($baseShippingTaxRefunded)
     {
-        return $this->setData(ApiOrderInterface::BASE_SHIPPING_TAX_REFUNDED, $baseShippingTaxRefunded);
+        return $this->setData(OrderInterface::BASE_SHIPPING_TAX_REFUNDED, $baseShippingTaxRefunded);
     }
 
     /**
@@ -3467,7 +3488,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseSubtotal($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_SUBTOTAL, $amount);
+        return $this->setData(OrderInterface::BASE_SUBTOTAL, $amount);
     }
 
     /**
@@ -3475,7 +3496,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseSubtotalCanceled($baseSubtotalCanceled)
     {
-        return $this->setData(ApiOrderInterface::BASE_SUBTOTAL_CANCELED, $baseSubtotalCanceled);
+        return $this->setData(OrderInterface::BASE_SUBTOTAL_CANCELED, $baseSubtotalCanceled);
     }
 
     /**
@@ -3483,7 +3504,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseSubtotalInvoiced($baseSubtotalInvoiced)
     {
-        return $this->setData(ApiOrderInterface::BASE_SUBTOTAL_INVOICED, $baseSubtotalInvoiced);
+        return $this->setData(OrderInterface::BASE_SUBTOTAL_INVOICED, $baseSubtotalInvoiced);
     }
 
     /**
@@ -3491,7 +3512,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseSubtotalRefunded($baseSubtotalRefunded)
     {
-        return $this->setData(ApiOrderInterface::BASE_SUBTOTAL_REFUNDED, $baseSubtotalRefunded);
+        return $this->setData(OrderInterface::BASE_SUBTOTAL_REFUNDED, $baseSubtotalRefunded);
     }
 
     /**
@@ -3499,7 +3520,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTaxAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_TAX_AMOUNT, $amount);
+        return $this->setData(OrderInterface::BASE_TAX_AMOUNT, $amount);
     }
 
     /**
@@ -3507,7 +3528,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTaxCanceled($baseTaxCanceled)
     {
-        return $this->setData(ApiOrderInterface::BASE_TAX_CANCELED, $baseTaxCanceled);
+        return $this->setData(OrderInterface::BASE_TAX_CANCELED, $baseTaxCanceled);
     }
 
     /**
@@ -3515,7 +3536,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTaxInvoiced($baseTaxInvoiced)
     {
-        return $this->setData(ApiOrderInterface::BASE_TAX_INVOICED, $baseTaxInvoiced);
+        return $this->setData(OrderInterface::BASE_TAX_INVOICED, $baseTaxInvoiced);
     }
 
     /**
@@ -3523,7 +3544,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTaxRefunded($baseTaxRefunded)
     {
-        return $this->setData(ApiOrderInterface::BASE_TAX_REFUNDED, $baseTaxRefunded);
+        return $this->setData(OrderInterface::BASE_TAX_REFUNDED, $baseTaxRefunded);
     }
 
     /**
@@ -3531,7 +3552,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseToGlobalRate($rate)
     {
-        return $this->setData(ApiOrderInterface::BASE_TO_GLOBAL_RATE, $rate);
+        return $this->setData(OrderInterface::BASE_TO_GLOBAL_RATE, $rate);
     }
 
     /**
@@ -3539,7 +3560,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseToOrderRate($rate)
     {
-        return $this->setData(ApiOrderInterface::BASE_TO_ORDER_RATE, $rate);
+        return $this->setData(OrderInterface::BASE_TO_ORDER_RATE, $rate);
     }
 
     /**
@@ -3547,7 +3568,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTotalCanceled($baseTotalCanceled)
     {
-        return $this->setData(ApiOrderInterface::BASE_TOTAL_CANCELED, $baseTotalCanceled);
+        return $this->setData(OrderInterface::BASE_TOTAL_CANCELED, $baseTotalCanceled);
     }
 
     /**
@@ -3555,7 +3576,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTotalInvoiced($baseTotalInvoiced)
     {
-        return $this->setData(ApiOrderInterface::BASE_TOTAL_INVOICED, $baseTotalInvoiced);
+        return $this->setData(OrderInterface::BASE_TOTAL_INVOICED, $baseTotalInvoiced);
     }
 
     /**
@@ -3563,7 +3584,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTotalInvoicedCost($baseTotalInvoicedCost)
     {
-        return $this->setData(ApiOrderInterface::BASE_TOTAL_INVOICED_COST, $baseTotalInvoicedCost);
+        return $this->setData(OrderInterface::BASE_TOTAL_INVOICED_COST, $baseTotalInvoicedCost);
     }
 
     /**
@@ -3571,7 +3592,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTotalOfflineRefunded($baseTotalOfflineRefunded)
     {
-        return $this->setData(ApiOrderInterface::BASE_TOTAL_OFFLINE_REFUNDED, $baseTotalOfflineRefunded);
+        return $this->setData(OrderInterface::BASE_TOTAL_OFFLINE_REFUNDED, $baseTotalOfflineRefunded);
     }
 
     /**
@@ -3579,7 +3600,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTotalOnlineRefunded($baseTotalOnlineRefunded)
     {
-        return $this->setData(ApiOrderInterface::BASE_TOTAL_ONLINE_REFUNDED, $baseTotalOnlineRefunded);
+        return $this->setData(OrderInterface::BASE_TOTAL_ONLINE_REFUNDED, $baseTotalOnlineRefunded);
     }
 
     /**
@@ -3587,7 +3608,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTotalPaid($baseTotalPaid)
     {
-        return $this->setData(ApiOrderInterface::BASE_TOTAL_PAID, $baseTotalPaid);
+        return $this->setData(OrderInterface::BASE_TOTAL_PAID, $baseTotalPaid);
     }
 
     /**
@@ -3595,7 +3616,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTotalQtyOrdered($baseTotalQtyOrdered)
     {
-        return $this->setData(ApiOrderInterface::BASE_TOTAL_QTY_ORDERED, $baseTotalQtyOrdered);
+        return $this->setData(OrderInterface::BASE_TOTAL_QTY_ORDERED, $baseTotalQtyOrdered);
     }
 
     /**
@@ -3603,7 +3624,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTotalRefunded($baseTotalRefunded)
     {
-        return $this->setData(ApiOrderInterface::BASE_TOTAL_REFUNDED, $baseTotalRefunded);
+        return $this->setData(OrderInterface::BASE_TOTAL_REFUNDED, $baseTotalRefunded);
     }
 
     /**
@@ -3611,7 +3632,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setDiscountAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::DISCOUNT_AMOUNT, $amount);
+        return $this->setData(OrderInterface::DISCOUNT_AMOUNT, $amount);
     }
 
     /**
@@ -3619,7 +3640,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setDiscountCanceled($discountCanceled)
     {
-        return $this->setData(ApiOrderInterface::DISCOUNT_CANCELED, $discountCanceled);
+        return $this->setData(OrderInterface::DISCOUNT_CANCELED, $discountCanceled);
     }
 
     /**
@@ -3627,7 +3648,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setDiscountInvoiced($discountInvoiced)
     {
-        return $this->setData(ApiOrderInterface::DISCOUNT_INVOICED, $discountInvoiced);
+        return $this->setData(OrderInterface::DISCOUNT_INVOICED, $discountInvoiced);
     }
 
     /**
@@ -3635,7 +3656,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setDiscountRefunded($discountRefunded)
     {
-        return $this->setData(ApiOrderInterface::DISCOUNT_REFUNDED, $discountRefunded);
+        return $this->setData(OrderInterface::DISCOUNT_REFUNDED, $discountRefunded);
     }
 
     /**
@@ -3643,7 +3664,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setGrandTotal($amount)
     {
-        return $this->setData(ApiOrderInterface::GRAND_TOTAL, $amount);
+        return $this->setData(OrderInterface::GRAND_TOTAL, $amount);
     }
 
     /**
@@ -3651,7 +3672,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_AMOUNT, $amount);
+        return $this->setData(OrderInterface::SHIPPING_AMOUNT, $amount);
     }
 
     /**
@@ -3659,7 +3680,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingCanceled($shippingCanceled)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_CANCELED, $shippingCanceled);
+        return $this->setData(OrderInterface::SHIPPING_CANCELED, $shippingCanceled);
     }
 
     /**
@@ -3667,7 +3688,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingInvoiced($shippingInvoiced)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_INVOICED, $shippingInvoiced);
+        return $this->setData(OrderInterface::SHIPPING_INVOICED, $shippingInvoiced);
     }
 
     /**
@@ -3675,7 +3696,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingRefunded($shippingRefunded)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_REFUNDED, $shippingRefunded);
+        return $this->setData(OrderInterface::SHIPPING_REFUNDED, $shippingRefunded);
     }
 
     /**
@@ -3683,7 +3704,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingTaxAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_TAX_AMOUNT, $amount);
+        return $this->setData(OrderInterface::SHIPPING_TAX_AMOUNT, $amount);
     }
 
     /**
@@ -3691,7 +3712,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingTaxRefunded($shippingTaxRefunded)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_TAX_REFUNDED, $shippingTaxRefunded);
+        return $this->setData(OrderInterface::SHIPPING_TAX_REFUNDED, $shippingTaxRefunded);
     }
 
     /**
@@ -3699,7 +3720,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setStoreToBaseRate($rate)
     {
-        return $this->setData(ApiOrderInterface::STORE_TO_BASE_RATE, $rate);
+        return $this->setData(OrderInterface::STORE_TO_BASE_RATE, $rate);
     }
 
     /**
@@ -3707,7 +3728,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setStoreToOrderRate($rate)
     {
-        return $this->setData(ApiOrderInterface::STORE_TO_ORDER_RATE, $rate);
+        return $this->setData(OrderInterface::STORE_TO_ORDER_RATE, $rate);
     }
 
     /**
@@ -3715,7 +3736,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setSubtotal($amount)
     {
-        return $this->setData(ApiOrderInterface::SUBTOTAL, $amount);
+        return $this->setData(OrderInterface::SUBTOTAL, $amount);
     }
 
     /**
@@ -3723,7 +3744,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setSubtotalCanceled($subtotalCanceled)
     {
-        return $this->setData(ApiOrderInterface::SUBTOTAL_CANCELED, $subtotalCanceled);
+        return $this->setData(OrderInterface::SUBTOTAL_CANCELED, $subtotalCanceled);
     }
 
     /**
@@ -3731,7 +3752,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setSubtotalInvoiced($subtotalInvoiced)
     {
-        return $this->setData(ApiOrderInterface::SUBTOTAL_INVOICED, $subtotalInvoiced);
+        return $this->setData(OrderInterface::SUBTOTAL_INVOICED, $subtotalInvoiced);
     }
 
     /**
@@ -3739,7 +3760,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setSubtotalRefunded($subtotalRefunded)
     {
-        return $this->setData(ApiOrderInterface::SUBTOTAL_REFUNDED, $subtotalRefunded);
+        return $this->setData(OrderInterface::SUBTOTAL_REFUNDED, $subtotalRefunded);
     }
 
     /**
@@ -3747,7 +3768,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTaxAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::TAX_AMOUNT, $amount);
+        return $this->setData(OrderInterface::TAX_AMOUNT, $amount);
     }
 
     /**
@@ -3755,7 +3776,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTaxCanceled($taxCanceled)
     {
-        return $this->setData(ApiOrderInterface::TAX_CANCELED, $taxCanceled);
+        return $this->setData(OrderInterface::TAX_CANCELED, $taxCanceled);
     }
 
     /**
@@ -3763,7 +3784,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTaxInvoiced($taxInvoiced)
     {
-        return $this->setData(ApiOrderInterface::TAX_INVOICED, $taxInvoiced);
+        return $this->setData(OrderInterface::TAX_INVOICED, $taxInvoiced);
     }
 
     /**
@@ -3771,7 +3792,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTaxRefunded($taxRefunded)
     {
-        return $this->setData(ApiOrderInterface::TAX_REFUNDED, $taxRefunded);
+        return $this->setData(OrderInterface::TAX_REFUNDED, $taxRefunded);
     }
 
     /**
@@ -3779,7 +3800,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTotalCanceled($totalCanceled)
     {
-        return $this->setData(ApiOrderInterface::TOTAL_CANCELED, $totalCanceled);
+        return $this->setData(OrderInterface::TOTAL_CANCELED, $totalCanceled);
     }
 
     /**
@@ -3787,7 +3808,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTotalInvoiced($totalInvoiced)
     {
-        return $this->setData(ApiOrderInterface::TOTAL_INVOICED, $totalInvoiced);
+        return $this->setData(OrderInterface::TOTAL_INVOICED, $totalInvoiced);
     }
 
     /**
@@ -3795,7 +3816,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTotalOfflineRefunded($totalOfflineRefunded)
     {
-        return $this->setData(ApiOrderInterface::TOTAL_OFFLINE_REFUNDED, $totalOfflineRefunded);
+        return $this->setData(OrderInterface::TOTAL_OFFLINE_REFUNDED, $totalOfflineRefunded);
     }
 
     /**
@@ -3803,7 +3824,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTotalOnlineRefunded($totalOnlineRefunded)
     {
-        return $this->setData(ApiOrderInterface::TOTAL_ONLINE_REFUNDED, $totalOnlineRefunded);
+        return $this->setData(OrderInterface::TOTAL_ONLINE_REFUNDED, $totalOnlineRefunded);
     }
 
     /**
@@ -3811,7 +3832,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTotalPaid($totalPaid)
     {
-        return $this->setData(ApiOrderInterface::TOTAL_PAID, $totalPaid);
+        return $this->setData(OrderInterface::TOTAL_PAID, $totalPaid);
     }
 
     /**
@@ -3819,7 +3840,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTotalQtyOrdered($totalQtyOrdered)
     {
-        return $this->setData(ApiOrderInterface::TOTAL_QTY_ORDERED, $totalQtyOrdered);
+        return $this->setData(OrderInterface::TOTAL_QTY_ORDERED, $totalQtyOrdered);
     }
 
     /**
@@ -3827,7 +3848,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTotalRefunded($totalRefunded)
     {
-        return $this->setData(ApiOrderInterface::TOTAL_REFUNDED, $totalRefunded);
+        return $this->setData(OrderInterface::TOTAL_REFUNDED, $totalRefunded);
     }
 
     /**
@@ -3835,7 +3856,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCanShipPartially($flag)
     {
-        return $this->setData(ApiOrderInterface::CAN_SHIP_PARTIALLY, $flag);
+        return $this->setData(OrderInterface::CAN_SHIP_PARTIALLY, $flag);
     }
 
     /**
@@ -3843,7 +3864,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCanShipPartiallyItem($flag)
     {
-        return $this->setData(ApiOrderInterface::CAN_SHIP_PARTIALLY_ITEM, $flag);
+        return $this->setData(OrderInterface::CAN_SHIP_PARTIALLY_ITEM, $flag);
     }
 
     /**
@@ -3851,7 +3872,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerIsGuest($customerIsGuest)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_IS_GUEST, $customerIsGuest);
+        return $this->setData(OrderInterface::CUSTOMER_IS_GUEST, $customerIsGuest);
     }
 
     /**
@@ -3859,7 +3880,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerNoteNotify($customerNoteNotify)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_NOTE_NOTIFY, $customerNoteNotify);
+        return $this->setData(OrderInterface::CUSTOMER_NOTE_NOTIFY, $customerNoteNotify);
     }
 
     /**
@@ -3867,7 +3888,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBillingAddressId($id)
     {
-        return $this->setData(ApiOrderInterface::BILLING_ADDRESS_ID, $id);
+        return $this->setData(OrderInterface::BILLING_ADDRESS_ID, $id);
     }
 
     /**
@@ -3875,7 +3896,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerGroupId($id)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_GROUP_ID, $id);
+        return $this->setData(OrderInterface::CUSTOMER_GROUP_ID, $id);
     }
 
     /**
@@ -3883,7 +3904,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setEditIncrement($editIncrement)
     {
-        return $this->setData(ApiOrderInterface::EDIT_INCREMENT, $editIncrement);
+        return $this->setData(OrderInterface::EDIT_INCREMENT, $editIncrement);
     }
 
     /**
@@ -3891,7 +3912,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setEmailSent($emailSent)
     {
-        return $this->setData(ApiOrderInterface::EMAIL_SENT, $emailSent);
+        return $this->setData(OrderInterface::EMAIL_SENT, $emailSent);
     }
 
     /**
@@ -3899,7 +3920,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setForcedShipmentWithInvoice($forcedShipmentWithInvoice)
     {
-        return $this->setData(ApiOrderInterface::FORCED_SHIPMENT_WITH_INVOICE, $forcedShipmentWithInvoice);
+        return $this->setData(OrderInterface::FORCED_SHIPMENT_WITH_INVOICE, $forcedShipmentWithInvoice);
     }
 
     /**
@@ -3907,7 +3928,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setPaymentAuthExpiration($paymentAuthExpiration)
     {
-        return $this->setData(ApiOrderInterface::PAYMENT_AUTH_EXPIRATION, $paymentAuthExpiration);
+        return $this->setData(OrderInterface::PAYMENT_AUTH_EXPIRATION, $paymentAuthExpiration);
     }
 
     /**
@@ -3915,7 +3936,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setQuoteAddressId($id)
     {
-        return $this->setData(ApiOrderInterface::QUOTE_ADDRESS_ID, $id);
+        return $this->setData(OrderInterface::QUOTE_ADDRESS_ID, $id);
     }
 
     /**
@@ -3923,7 +3944,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setQuoteId($id)
     {
-        return $this->setData(ApiOrderInterface::QUOTE_ID, $id);
+        return $this->setData(OrderInterface::QUOTE_ID, $id);
     }
 
     /**
@@ -3931,7 +3952,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingAddressId($id)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_ADDRESS_ID, $id);
+        return $this->setData(OrderInterface::SHIPPING_ADDRESS_ID, $id);
     }
 
     /**
@@ -3939,7 +3960,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setAdjustmentNegative($adjustmentNegative)
     {
-        return $this->setData(ApiOrderInterface::ADJUSTMENT_NEGATIVE, $adjustmentNegative);
+        return $this->setData(OrderInterface::ADJUSTMENT_NEGATIVE, $adjustmentNegative);
     }
 
     /**
@@ -3947,7 +3968,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setAdjustmentPositive($adjustmentPositive)
     {
-        return $this->setData(ApiOrderInterface::ADJUSTMENT_POSITIVE, $adjustmentPositive);
+        return $this->setData(OrderInterface::ADJUSTMENT_POSITIVE, $adjustmentPositive);
     }
 
     /**
@@ -3955,7 +3976,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseAdjustmentNegative($baseAdjustmentNegative)
     {
-        return $this->setData(ApiOrderInterface::BASE_ADJUSTMENT_NEGATIVE, $baseAdjustmentNegative);
+        return $this->setData(OrderInterface::BASE_ADJUSTMENT_NEGATIVE, $baseAdjustmentNegative);
     }
 
     /**
@@ -3963,7 +3984,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseAdjustmentPositive($baseAdjustmentPositive)
     {
-        return $this->setData(ApiOrderInterface::BASE_ADJUSTMENT_POSITIVE, $baseAdjustmentPositive);
+        return $this->setData(OrderInterface::BASE_ADJUSTMENT_POSITIVE, $baseAdjustmentPositive);
     }
 
     /**
@@ -3971,7 +3992,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseShippingDiscountAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_SHIPPING_DISCOUNT_AMOUNT, $amount);
+        return $this->setData(OrderInterface::BASE_SHIPPING_DISCOUNT_AMOUNT, $amount);
     }
 
     /**
@@ -3979,7 +4000,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseSubtotalInclTax($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_SUBTOTAL_INCL_TAX, $amount);
+        return $this->setData(OrderInterface::BASE_SUBTOTAL_INCL_TAX, $amount);
     }
 
     /**
@@ -3987,7 +4008,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseTotalDue($baseTotalDue)
     {
-        return $this->setData(ApiOrderInterface::BASE_TOTAL_DUE, $baseTotalDue);
+        return $this->setData(OrderInterface::BASE_TOTAL_DUE, $baseTotalDue);
     }
 
     /**
@@ -3995,7 +4016,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setPaymentAuthorizationAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::PAYMENT_AUTHORIZATION_AMOUNT, $amount);
+        return $this->setData(OrderInterface::PAYMENT_AUTHORIZATION_AMOUNT, $amount);
     }
 
     /**
@@ -4003,7 +4024,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingDiscountAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_DISCOUNT_AMOUNT, $amount);
+        return $this->setData(OrderInterface::SHIPPING_DISCOUNT_AMOUNT, $amount);
     }
 
     /**
@@ -4011,7 +4032,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setSubtotalInclTax($amount)
     {
-        return $this->setData(ApiOrderInterface::SUBTOTAL_INCL_TAX, $amount);
+        return $this->setData(OrderInterface::SUBTOTAL_INCL_TAX, $amount);
     }
 
     /**
@@ -4019,7 +4040,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTotalDue($totalDue)
     {
-        return $this->setData(ApiOrderInterface::TOTAL_DUE, $totalDue);
+        return $this->setData(OrderInterface::TOTAL_DUE, $totalDue);
     }
 
     /**
@@ -4027,7 +4048,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setWeight($weight)
     {
-        return $this->setData(ApiOrderInterface::WEIGHT, $weight);
+        return $this->setData(OrderInterface::WEIGHT, $weight);
     }
 
     /**
@@ -4035,7 +4056,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerDob($customerDob)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_DOB, $customerDob);
+        return $this->setData(OrderInterface::CUSTOMER_DOB, $customerDob);
     }
 
     /**
@@ -4043,7 +4064,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setIncrementId($id)
     {
-        return $this->setData(ApiOrderInterface::INCREMENT_ID, $id);
+        return $this->setData(OrderInterface::INCREMENT_ID, $id);
     }
 
     /**
@@ -4051,7 +4072,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setAppliedRuleIds($appliedRuleIds)
     {
-        return $this->setData(ApiOrderInterface::APPLIED_RULE_IDS, $appliedRuleIds);
+        return $this->setData(OrderInterface::APPLIED_RULE_IDS, $appliedRuleIds);
     }
 
     /**
@@ -4059,7 +4080,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseCurrencyCode($code)
     {
-        return $this->setData(ApiOrderInterface::BASE_CURRENCY_CODE, $code);
+        return $this->setData(OrderInterface::BASE_CURRENCY_CODE, $code);
     }
 
     /**
@@ -4067,7 +4088,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerEmail($customerEmail)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_EMAIL, $customerEmail);
+        return $this->setData(OrderInterface::CUSTOMER_EMAIL, $customerEmail);
     }
 
     /**
@@ -4075,7 +4096,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerFirstname($customerFirstname)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_FIRSTNAME, $customerFirstname);
+        return $this->setData(OrderInterface::CUSTOMER_FIRSTNAME, $customerFirstname);
     }
 
     /**
@@ -4083,7 +4104,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerLastname($customerLastname)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_LASTNAME, $customerLastname);
+        return $this->setData(OrderInterface::CUSTOMER_LASTNAME, $customerLastname);
     }
 
     /**
@@ -4091,7 +4112,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerMiddlename($customerMiddlename)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_MIDDLENAME, $customerMiddlename);
+        return $this->setData(OrderInterface::CUSTOMER_MIDDLENAME, $customerMiddlename);
     }
 
     /**
@@ -4099,7 +4120,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerPrefix($customerPrefix)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_PREFIX, $customerPrefix);
+        return $this->setData(OrderInterface::CUSTOMER_PREFIX, $customerPrefix);
     }
 
     /**
@@ -4107,7 +4128,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerSuffix($customerSuffix)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_SUFFIX, $customerSuffix);
+        return $this->setData(OrderInterface::CUSTOMER_SUFFIX, $customerSuffix);
     }
 
     /**
@@ -4115,7 +4136,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerTaxvat($customerTaxvat)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_TAXVAT, $customerTaxvat);
+        return $this->setData(OrderInterface::CUSTOMER_TAXVAT, $customerTaxvat);
     }
 
     /**
@@ -4123,7 +4144,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setDiscountDescription($description)
     {
-        return $this->setData(ApiOrderInterface::DISCOUNT_DESCRIPTION, $description);
+        return $this->setData(OrderInterface::DISCOUNT_DESCRIPTION, $description);
     }
 
     /**
@@ -4131,7 +4152,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setExtCustomerId($id)
     {
-        return $this->setData(ApiOrderInterface::EXT_CUSTOMER_ID, $id);
+        return $this->setData(OrderInterface::EXT_CUSTOMER_ID, $id);
     }
 
     /**
@@ -4139,7 +4160,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setExtOrderId($id)
     {
-        return $this->setData(ApiOrderInterface::EXT_ORDER_ID, $id);
+        return $this->setData(OrderInterface::EXT_ORDER_ID, $id);
     }
 
     /**
@@ -4147,7 +4168,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setGlobalCurrencyCode($code)
     {
-        return $this->setData(ApiOrderInterface::GLOBAL_CURRENCY_CODE, $code);
+        return $this->setData(OrderInterface::GLOBAL_CURRENCY_CODE, $code);
     }
 
     /**
@@ -4155,7 +4176,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setHoldBeforeState($holdBeforeState)
     {
-        return $this->setData(ApiOrderInterface::HOLD_BEFORE_STATE, $holdBeforeState);
+        return $this->setData(OrderInterface::HOLD_BEFORE_STATE, $holdBeforeState);
     }
 
     /**
@@ -4163,7 +4184,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setHoldBeforeStatus($holdBeforeStatus)
     {
-        return $this->setData(ApiOrderInterface::HOLD_BEFORE_STATUS, $holdBeforeStatus);
+        return $this->setData(OrderInterface::HOLD_BEFORE_STATUS, $holdBeforeStatus);
     }
 
     /**
@@ -4171,7 +4192,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setOrderCurrencyCode($code)
     {
-        return $this->setData(ApiOrderInterface::ORDER_CURRENCY_CODE, $code);
+        return $this->setData(OrderInterface::ORDER_CURRENCY_CODE, $code);
     }
 
     /**
@@ -4179,7 +4200,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setOriginalIncrementId($id)
     {
-        return $this->setData(ApiOrderInterface::ORIGINAL_INCREMENT_ID, $id);
+        return $this->setData(OrderInterface::ORIGINAL_INCREMENT_ID, $id);
     }
 
     /**
@@ -4187,7 +4208,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setRelationChildId($id)
     {
-        return $this->setData(ApiOrderInterface::RELATION_CHILD_ID, $id);
+        return $this->setData(OrderInterface::RELATION_CHILD_ID, $id);
     }
 
     /**
@@ -4195,7 +4216,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setRelationChildRealId($realId)
     {
-        return $this->setData(ApiOrderInterface::RELATION_CHILD_REAL_ID, $realId);
+        return $this->setData(OrderInterface::RELATION_CHILD_REAL_ID, $realId);
     }
 
     /**
@@ -4203,7 +4224,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setRelationParentId($id)
     {
-        return $this->setData(ApiOrderInterface::RELATION_PARENT_ID, $id);
+        return $this->setData(OrderInterface::RELATION_PARENT_ID, $id);
     }
 
     /**
@@ -4211,7 +4232,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setRelationParentRealId($realId)
     {
-        return $this->setData(ApiOrderInterface::RELATION_PARENT_REAL_ID, $realId);
+        return $this->setData(OrderInterface::RELATION_PARENT_REAL_ID, $realId);
     }
 
     /**
@@ -4219,7 +4240,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setRemoteIp($remoteIp)
     {
-        return $this->setData(ApiOrderInterface::REMOTE_IP, $remoteIp);
+        return $this->setData(OrderInterface::REMOTE_IP, $remoteIp);
     }
 
     /**
@@ -4227,7 +4248,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingMethod($shippingMethod)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_METHOD, $shippingMethod);
+        return $this->setData(OrderInterface::SHIPPING_METHOD, $shippingMethod);
     }
 
     /**
@@ -4235,7 +4256,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setStoreCurrencyCode($code)
     {
-        return $this->setData(ApiOrderInterface::STORE_CURRENCY_CODE, $code);
+        return $this->setData(OrderInterface::STORE_CURRENCY_CODE, $code);
     }
 
     /**
@@ -4243,7 +4264,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setStoreName($storeName)
     {
-        return $this->setData(ApiOrderInterface::STORE_NAME, $storeName);
+        return $this->setData(OrderInterface::STORE_NAME, $storeName);
     }
 
     /**
@@ -4251,7 +4272,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setXForwardedFor($xForwardedFor)
     {
-        return $this->setData(ApiOrderInterface::X_FORWARDED_FOR, $xForwardedFor);
+        return $this->setData(OrderInterface::X_FORWARDED_FOR, $xForwardedFor);
     }
 
     /**
@@ -4259,7 +4280,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerNote($customerNote)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_NOTE, $customerNote);
+        return $this->setData(OrderInterface::CUSTOMER_NOTE, $customerNote);
     }
 
     /**
@@ -4267,7 +4288,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setUpdatedAt($timestamp)
     {
-        return $this->setData(ApiOrderInterface::UPDATED_AT, $timestamp);
+        return $this->setData(OrderInterface::UPDATED_AT, $timestamp);
     }
 
     /**
@@ -4275,7 +4296,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setTotalItemCount($totalItemCount)
     {
-        return $this->setData(ApiOrderInterface::TOTAL_ITEM_COUNT, $totalItemCount);
+        return $this->setData(OrderInterface::TOTAL_ITEM_COUNT, $totalItemCount);
     }
 
     /**
@@ -4283,7 +4304,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setCustomerGender($customerGender)
     {
-        return $this->setData(ApiOrderInterface::CUSTOMER_GENDER, $customerGender);
+        return $this->setData(OrderInterface::CUSTOMER_GENDER, $customerGender);
     }
 
     /**
@@ -4291,7 +4312,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setHiddenTaxAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::HIDDEN_TAX_AMOUNT, $amount);
+        return $this->setData(OrderInterface::HIDDEN_TAX_AMOUNT, $amount);
     }
 
     /**
@@ -4299,7 +4320,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseHiddenTaxAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_HIDDEN_TAX_AMOUNT, $amount);
+        return $this->setData(OrderInterface::BASE_HIDDEN_TAX_AMOUNT, $amount);
     }
 
     /**
@@ -4307,7 +4328,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingHiddenTaxAmount($amount)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_HIDDEN_TAX_AMOUNT, $amount);
+        return $this->setData(OrderInterface::SHIPPING_HIDDEN_TAX_AMOUNT, $amount);
     }
 
     /**
@@ -4315,7 +4336,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseShippingHiddenTaxAmnt($amnt)
     {
-        return $this->setData(ApiOrderInterface::BASE_SHIPPING_HIDDEN_TAX_AMNT, $amnt);
+        return $this->setData(OrderInterface::BASE_SHIPPING_HIDDEN_TAX_AMNT, $amnt);
     }
 
     /**
@@ -4323,7 +4344,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setHiddenTaxInvoiced($hiddenTaxInvoiced)
     {
-        return $this->setData(ApiOrderInterface::HIDDEN_TAX_INVOICED, $hiddenTaxInvoiced);
+        return $this->setData(OrderInterface::HIDDEN_TAX_INVOICED, $hiddenTaxInvoiced);
     }
 
     /**
@@ -4331,7 +4352,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseHiddenTaxInvoiced($baseHiddenTaxInvoiced)
     {
-        return $this->setData(ApiOrderInterface::BASE_HIDDEN_TAX_INVOICED, $baseHiddenTaxInvoiced);
+        return $this->setData(OrderInterface::BASE_HIDDEN_TAX_INVOICED, $baseHiddenTaxInvoiced);
     }
 
     /**
@@ -4339,7 +4360,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setHiddenTaxRefunded($hiddenTaxRefunded)
     {
-        return $this->setData(ApiOrderInterface::HIDDEN_TAX_REFUNDED, $hiddenTaxRefunded);
+        return $this->setData(OrderInterface::HIDDEN_TAX_REFUNDED, $hiddenTaxRefunded);
     }
 
     /**
@@ -4347,7 +4368,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseHiddenTaxRefunded($baseHiddenTaxRefunded)
     {
-        return $this->setData(ApiOrderInterface::BASE_HIDDEN_TAX_REFUNDED, $baseHiddenTaxRefunded);
+        return $this->setData(OrderInterface::BASE_HIDDEN_TAX_REFUNDED, $baseHiddenTaxRefunded);
     }
 
     /**
@@ -4355,7 +4376,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setShippingInclTax($amount)
     {
-        return $this->setData(ApiOrderInterface::SHIPPING_INCL_TAX, $amount);
+        return $this->setData(OrderInterface::SHIPPING_INCL_TAX, $amount);
     }
 
     /**
@@ -4363,7 +4384,7 @@ class Order extends AbstractModel implements EntityInterface, ApiOrderInterface
      */
     public function setBaseShippingInclTax($amount)
     {
-        return $this->setData(ApiOrderInterface::BASE_SHIPPING_INCL_TAX, $amount);
+        return $this->setData(OrderInterface::BASE_SHIPPING_INCL_TAX, $amount);
     }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Address.php b/app/code/Magento/Sales/Model/Order/Address.php
index a5e853f9f3ba7c0b7f0a5a59272ca90c7876eb5f..e0bc6ef9445d7e9cf32fd01860013a3b49fc1d90 100644
--- a/app/code/Magento/Sales/Model/Order/Address.php
+++ b/app/code/Magento/Sales/Model/Order/Address.php
@@ -9,7 +9,6 @@ use Magento\Customer\Api\AddressMetadataInterface;
 use Magento\Customer\Api\Data\AddressInterfaceFactory;
 use Magento\Customer\Api\Data\RegionInterfaceFactory;
 use Magento\Customer\Model\Address\AbstractAddress;
-use Magento\Framework\Api\AttributeValueFactory;
 use Magento\Sales\Api\Data\OrderAddressInterface;
 
 /**
@@ -47,14 +46,14 @@ class Address extends AbstractAddress implements OrderAddressInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
+     * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Directory\Helper\Data $directoryData
      * @param \Magento\Eav\Model\Config $eavConfig
      * @param \Magento\Customer\Model\Address\Config $addressConfig
      * @param \Magento\Directory\Model\RegionFactory $regionFactory
      * @param \Magento\Directory\Model\CountryFactory $countryFactory
-     * @param AddressMetadataInterface $addressMetadataService
+     * @param AddressMetadataInterface $metadataService
      * @param AddressInterfaceFactory $addressDataFactory
      * @param RegionInterfaceFactory $regionDataFactory
      * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
@@ -67,14 +66,14 @@ class Address extends AbstractAddress implements OrderAddressInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
+        \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Directory\Helper\Data $directoryData,
         \Magento\Eav\Model\Config $eavConfig,
         \Magento\Customer\Model\Address\Config $addressConfig,
         \Magento\Directory\Model\RegionFactory $regionFactory,
         \Magento\Directory\Model\CountryFactory $countryFactory,
-        AddressMetadataInterface $addressMetadataService,
+        AddressMetadataInterface $metadataService,
         AddressInterfaceFactory $addressDataFactory,
         RegionInterfaceFactory $regionDataFactory,
         \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
@@ -86,14 +85,14 @@ class Address extends AbstractAddress implements OrderAddressInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $directoryData,
             $eavConfig,
             $addressConfig,
             $regionFactory,
             $countryFactory,
-            $addressMetadataService,
+            $metadataService,
             $addressDataFactory,
             $regionDataFactory,
             $dataObjectHelper,
@@ -602,5 +601,26 @@ class Address extends AbstractAddress implements OrderAddressInterface
     {
         return $this->setData(OrderAddressInterface::VAT_REQUEST_SUCCESS, $vatRequestSuccess);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\OrderAddressExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\OrderAddressExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\OrderAddressExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo.php b/app/code/Magento/Sales/Model/Order/Creditmemo.php
index 0b75b3c314eebc86694846fef6d0362ab273e911..852d09607d019b58e30e627ca8e497e4c7390cd0 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo.php
@@ -114,7 +114,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -134,7 +134,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -161,7 +161,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
@@ -1630,5 +1630,26 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
     {
         return $this->setData(CreditmemoInterface::DISCOUNT_DESCRIPTION, $description);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\CreditmemoExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\CreditmemoExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\CreditmemoExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo/Comment.php b/app/code/Magento/Sales/Model/Order/Creditmemo/Comment.php
index 065c772b311e9da882c70a308f176ccce83c54c5..02317f4af9c974829dc5b97f77630ad19bb62322 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo/Comment.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo/Comment.php
@@ -31,7 +31,7 @@ class Comment extends AbstractModel implements CreditmemoCommentInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -44,7 +44,7 @@ class Comment extends AbstractModel implements CreditmemoCommentInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -56,7 +56,7 @@ class Comment extends AbstractModel implements CreditmemoCommentInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
@@ -194,5 +194,27 @@ class Comment extends AbstractModel implements CreditmemoCommentInterface
     {
         return $this->setData(CreditmemoCommentInterface::COMMENT, $comment);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\CreditmemoCommentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\CreditmemoCommentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\CreditmemoCommentExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo/Item.php b/app/code/Magento/Sales/Model/Order/Creditmemo/Item.php
index ccf9b3ccba989fed845300a50c71709f395868a5..d432435aee29d49dc3ee4c36119ce5c9f30ece4a 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo/Item.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo/Item.php
@@ -45,7 +45,7 @@ class Item extends AbstractExtensibleModel implements CreditmemoItemInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Sales\Model\Order\ItemFactory $orderItemFactory
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
@@ -55,7 +55,7 @@ class Item extends AbstractExtensibleModel implements CreditmemoItemInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Sales\Model\Order\ItemFactory $orderItemFactory,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
@@ -65,7 +65,7 @@ class Item extends AbstractExtensibleModel implements CreditmemoItemInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -821,5 +821,27 @@ class Item extends AbstractExtensibleModel implements CreditmemoItemInterface
     {
         return $this->setData(CreditmemoItemInterface::WEEE_TAX_APPLIED_ROW_AMOUNT, $amount);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\CreditmemoItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\CreditmemoItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\CreditmemoItemExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Invoice.php b/app/code/Magento/Sales/Model/Order/Invoice.php
index ab6e124d48c21d0e3d89fe96b6430d365f4afc48..106aaf473b446e5718c6e28e4c2983424bb7fd04 100644
--- a/app/code/Magento/Sales/Model/Order/Invoice.php
+++ b/app/code/Magento/Sales/Model/Order/Invoice.php
@@ -116,7 +116,7 @@ class Invoice extends AbstractModel implements EntityInterface, InvoiceInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -134,7 +134,7 @@ class Invoice extends AbstractModel implements EntityInterface, InvoiceInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -157,7 +157,7 @@ class Invoice extends AbstractModel implements EntityInterface, InvoiceInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
@@ -1574,5 +1574,26 @@ class Invoice extends AbstractModel implements EntityInterface, InvoiceInterface
     {
         return $this->setData(InvoiceInterface::DISCOUNT_DESCRIPTION, $description);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\InvoiceExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\InvoiceExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\InvoiceExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Invoice/Comment.php b/app/code/Magento/Sales/Model/Order/Invoice/Comment.php
index 73b1007e543759b14c97f36fca337ffe3ceed9af..e1f31fa4c025719b4a95caac311b1f42fedfbe1b 100644
--- a/app/code/Magento/Sales/Model/Order/Invoice/Comment.php
+++ b/app/code/Magento/Sales/Model/Order/Invoice/Comment.php
@@ -31,7 +31,7 @@ class Comment extends AbstractModel implements InvoiceCommentInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -44,7 +44,7 @@ class Comment extends AbstractModel implements InvoiceCommentInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -56,7 +56,7 @@ class Comment extends AbstractModel implements InvoiceCommentInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
@@ -194,5 +194,27 @@ class Comment extends AbstractModel implements InvoiceCommentInterface
     {
         return $this->setData(InvoiceCommentInterface::COMMENT, $comment);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\InvoiceCommentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\InvoiceCommentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\InvoiceCommentExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Invoice/Item.php b/app/code/Magento/Sales/Model/Order/Invoice/Item.php
index ddd89354cd33790e53b037bc50a0411c6d840f7b..60c92a7f68b0f68d61697171246020ed2d103688 100644
--- a/app/code/Magento/Sales/Model/Order/Invoice/Item.php
+++ b/app/code/Magento/Sales/Model/Order/Invoice/Item.php
@@ -62,7 +62,7 @@ class Item extends AbstractExtensibleModel implements InvoiceItemInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Sales\Model\Order\ItemFactory $orderItemFactory
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
@@ -72,7 +72,7 @@ class Item extends AbstractExtensibleModel implements InvoiceItemInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Sales\Model\Order\ItemFactory $orderItemFactory,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
@@ -82,7 +82,7 @@ class Item extends AbstractExtensibleModel implements InvoiceItemInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -684,5 +684,26 @@ class Item extends AbstractExtensibleModel implements InvoiceItemInterface
     {
         return $this->setData(InvoiceItemInterface::BASE_HIDDEN_TAX_AMOUNT, $amount);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\InvoiceItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\InvoiceItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\InvoiceItemExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Item.php b/app/code/Magento/Sales/Model/Order/Item.php
index e91edff1ccc35b863ca87918d18715001648ee21..7fd4dc4ec38fa1681b592e496ef303e38acb8e4e 100644
--- a/app/code/Magento/Sales/Model/Order/Item.php
+++ b/app/code/Magento/Sales/Model/Order/Item.php
@@ -101,20 +101,20 @@ class Item extends AbstractExtensibleModel implements OrderItemInterface
      *
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Sales\Model\OrderFactory $orderFactory
+     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
-     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param array $data
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Sales\Model\OrderFactory $orderFactory,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
@@ -126,7 +126,7 @@ class Item extends AbstractExtensibleModel implements OrderItemInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -2327,5 +2327,26 @@ class Item extends AbstractExtensibleModel implements OrderItemInterface
     {
         return $this->setData(OrderItemInterface::BASE_WEEE_TAX_ROW_DISPOSITION, $baseWeeeTaxRowDisposition);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\OrderItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\OrderItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\OrderItemExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Payment.php b/app/code/Magento/Sales/Model/Order/Payment.php
index 9ef9ec4fcefda8a0d88d15a9794fdd3c80536967..f308b43487ffc6e238e31f87b45185d123431bf4 100644
--- a/app/code/Magento/Sales/Model/Order/Payment.php
+++ b/app/code/Magento/Sales/Model/Order/Payment.php
@@ -8,7 +8,6 @@
 
 namespace Magento\Sales\Model\Order;
 
-use Magento\Framework\Api\AttributeValueFactory;
 use Magento\Framework\Pricing\PriceCurrencyInterface;
 use Magento\Payment\Model\Info;
 use Magento\Sales\Api\Data\OrderPaymentInterface;
@@ -101,8 +100,8 @@ class Payment extends Info implements OrderPaymentInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $customAttributeFactory
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
+     * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
      * @param \Magento\Payment\Helper\Data $paymentData
      * @param \Magento\Framework\Encryption\EncryptorInterface $encryptor
      * @param \Magento\Sales\Model\Service\OrderFactory $serviceOrderFactory
@@ -118,8 +117,8 @@ class Payment extends Info implements OrderPaymentInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
-        AttributeValueFactory $customAttributeFactory,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
+        \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
         \Magento\Payment\Helper\Data $paymentData,
         \Magento\Framework\Encryption\EncryptorInterface $encryptor,
         \Magento\Sales\Model\Service\OrderFactory $serviceOrderFactory,
@@ -139,7 +138,7 @@ class Payment extends Info implements OrderPaymentInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $paymentData,
             $encryptor,
@@ -2571,5 +2570,26 @@ class Payment extends Info implements OrderPaymentInterface
     {
         return $this->setData(OrderPaymentInterface::ADDRESS_STATUS, $addressStatus);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\OrderPaymentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\OrderPaymentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\OrderPaymentExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Payment/Transaction.php b/app/code/Magento/Sales/Model/Order/Payment/Transaction.php
index fde468255771fee880d6a931e79696c8a6da925e..942cf9475983eb24457bfd676c6cf216dc8f2294 100644
--- a/app/code/Magento/Sales/Model/Order/Payment/Transaction.php
+++ b/app/code/Magento/Sales/Model/Order/Payment/Transaction.php
@@ -20,7 +20,7 @@ use Magento\Sales\Api\Data\TransactionInterface;
  * @method \Magento\Sales\Model\Resource\Order\Payment\Transaction _getResource()
  * @method \Magento\Sales\Model\Resource\Order\Payment\Transaction getResource()
  * @method \Magento\Sales\Model\Order\Payment\Transaction setCreatedAt(string $value)
- *
+
  * @author      Magento Core Team <core@magentocommerce.com>
  * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -111,7 +111,7 @@ class Transaction extends AbstractExtensibleModel implements TransactionInterfac
      * Event object prefix
      *
      * @var string
-     * @see \Magento\Core\Model\Absctract::$_eventPrefix
+     * @see \Magento\Framework\Model\AbstractModel::$_eventPrefix
      */
     protected $_eventPrefix = 'sales_order_payment_transaction';
 
@@ -119,7 +119,7 @@ class Transaction extends AbstractExtensibleModel implements TransactionInterfac
      * Event object prefix
      *
      * @var string
-     * @see \Magento\Core\Model\Absctract::$_eventObject
+     * @see \Magento\Framework\Model\AbstractModel::$_eventObject
      */
     protected $_eventObject = 'order_payment_transaction';
 
@@ -153,7 +153,7 @@ class Transaction extends AbstractExtensibleModel implements TransactionInterfac
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Sales\Model\Order\PaymentFactory $paymentFactory
      * @param \Magento\Sales\Model\OrderFactory $orderFactory
@@ -167,7 +167,7 @@ class Transaction extends AbstractExtensibleModel implements TransactionInterfac
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Sales\Model\Order\PaymentFactory $paymentFactory,
         \Magento\Sales\Model\OrderFactory $orderFactory,
@@ -184,7 +184,7 @@ class Transaction extends AbstractExtensibleModel implements TransactionInterfac
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -1044,5 +1044,26 @@ class Transaction extends AbstractExtensibleModel implements TransactionInterfac
     {
         return $this->setData(TransactionInterface::IS_CLOSED, $isClosed);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\TransactionExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\TransactionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\TransactionExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Shipment.php b/app/code/Magento/Sales/Model/Order/Shipment.php
index 0e5a3c5cf9249f742dd1fbb51bed1d05d951c589..51b24d4fb8946a28f8d21585e789ee561f611bb2 100644
--- a/app/code/Magento/Sales/Model/Order/Shipment.php
+++ b/app/code/Magento/Sales/Model/Order/Shipment.php
@@ -92,7 +92,7 @@ class Shipment extends AbstractModel implements EntityInterface, ShipmentInterfa
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -109,7 +109,7 @@ class Shipment extends AbstractModel implements EntityInterface, ShipmentInterfa
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -130,7 +130,7 @@ class Shipment extends AbstractModel implements EntityInterface, ShipmentInterfa
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
@@ -826,5 +826,26 @@ class Shipment extends AbstractModel implements EntityInterface, ShipmentInterfa
     {
         return $this->setData(ShipmentInterface::UPDATED_AT, $timestamp);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\ShipmentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\ShipmentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\ShipmentExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Shipment/Comment.php b/app/code/Magento/Sales/Model/Order/Shipment/Comment.php
index cd39cbf1818f3889f8df0ae6f6198e980e2a5dc8..871d04fa49f472f06913b2ceb950557d7912f9db 100644
--- a/app/code/Magento/Sales/Model/Order/Shipment/Comment.php
+++ b/app/code/Magento/Sales/Model/Order/Shipment/Comment.php
@@ -31,7 +31,7 @@ class Comment extends AbstractModel implements ShipmentCommentInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -44,7 +44,7 @@ class Comment extends AbstractModel implements ShipmentCommentInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -56,7 +56,7 @@ class Comment extends AbstractModel implements ShipmentCommentInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
@@ -194,5 +194,27 @@ class Comment extends AbstractModel implements ShipmentCommentInterface
     {
         return $this->setData(ShipmentCommentInterface::COMMENT, $comment);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\ShipmentCommentExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\ShipmentCommentExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\ShipmentCommentExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Shipment/Item.php b/app/code/Magento/Sales/Model/Order/Shipment/Item.php
index f37be4de2aab78c61c1670769f64531d575e4daf..a68279e3602411268faa2494359e1686ae8a1b4f 100644
--- a/app/code/Magento/Sales/Model/Order/Shipment/Item.php
+++ b/app/code/Magento/Sales/Model/Order/Shipment/Item.php
@@ -46,7 +46,7 @@ class Item extends AbstractExtensibleModel implements ShipmentItemInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Sales\Model\Order\ItemFactory $orderItemFactory
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
@@ -56,7 +56,7 @@ class Item extends AbstractExtensibleModel implements ShipmentItemInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Sales\Model\Order\ItemFactory $orderItemFactory,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
@@ -66,7 +66,7 @@ class Item extends AbstractExtensibleModel implements ShipmentItemInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -366,5 +366,26 @@ class Item extends AbstractExtensibleModel implements ShipmentItemInterface
     {
         return $this->setData(ShipmentItemInterface::SKU, $sku);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\ShipmentItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\ShipmentItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\ShipmentItemExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Shipment/Track.php b/app/code/Magento/Sales/Model/Order/Shipment/Track.php
index f8e47cd53ee210a6d297c6ac13df86edfb06dfd1..85b0e3419eca06e7e7564a9a9b57d72317fbf37a 100644
--- a/app/code/Magento/Sales/Model/Order/Shipment/Track.php
+++ b/app/code/Magento/Sales/Model/Order/Shipment/Track.php
@@ -52,7 +52,7 @@ class Track extends AbstractModel implements ShipmentTrackInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -66,7 +66,7 @@ class Track extends AbstractModel implements ShipmentTrackInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -79,7 +79,7 @@ class Track extends AbstractModel implements ShipmentTrackInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
@@ -380,5 +380,26 @@ class Track extends AbstractModel implements ShipmentTrackInterface
     {
         return $this->setData(ShipmentTrackInterface::CARRIER_CODE, $code);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\ShipmentTrackExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\ShipmentTrackExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Sales\Api\Data\ShipmentTrackExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Model/Order/Status/History.php b/app/code/Magento/Sales/Model/Order/Status/History.php
index 59d6c02054eb1b3b1d829969ae0dc48ff070e559..5ce6a1aa42ba7fa0a405d3174b9e06a469d276db 100644
--- a/app/code/Magento/Sales/Model/Order/Status/History.php
+++ b/app/code/Magento/Sales/Model/Order/Status/History.php
@@ -45,7 +45,7 @@ class History extends AbstractModel implements OrderStatusHistoryInterface
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -58,7 +58,7 @@ class History extends AbstractModel implements OrderStatusHistoryInterface
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -70,7 +70,7 @@ class History extends AbstractModel implements OrderStatusHistoryInterface
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
@@ -301,5 +301,27 @@ class History extends AbstractModel implements OrderStatusHistoryInterface
     {
         return $this->setData(OrderStatusHistoryInterface::ENTITY_NAME, $entityName);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Sales\Api\Data\OrderStatusHistoryExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Sales\Api\Data\OrderStatusHistoryExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Sales\Api\Data\OrderStatusHistoryExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
     //@codeCoverageIgnoreEnd
 }
diff --git a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/View/Tab/Stub/OnlineMethod.php b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/View/Tab/Stub/OnlineMethod.php
index f6145240f582a67e371f5debc9dcafa745e13135..3052b410765c572f7d308017bd8a26c46d6ad8af 100644
--- a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/View/Tab/Stub/OnlineMethod.php
+++ b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/View/Tab/Stub/OnlineMethod.php
@@ -7,6 +7,7 @@ namespace Magento\Sales\Test\Unit\Block\Adminhtml\Order\View\Tab\Stub;
 
 /**
  * Stub for an online payment method
+ * @method \Magento\Quote\Api\Data\PaymentMethodExtensionInterface getExtensionAttributes()
  */
 class OnlineMethod extends \Magento\Payment\Model\Method\AbstractMethod
 {
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php b/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php
index f9a38143e5023767f7936761260e61d6301e31e7..c8c3632bb160226bbf95918724fe1423fdad2755 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php
@@ -4,6 +4,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 /**
  * Test class for \Magento\Sales\Model\Email\Template
  */
@@ -46,6 +48,14 @@ class TemplateTest extends \PHPUnit_Framework_TestCase
         );
     }
 
+    protected function tearDown()
+    {
+        parent::tearDown();
+        $magentoObjectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER);
+        $objectManager = $magentoObjectManagerFactory->create($_SERVER);
+        \Magento\Framework\App\ObjectManager::setInstance($objectManager);
+    }
+
     public function testIncludeTemplate()
     {
         $this->mockViewFilesystem->expects($this->once())
diff --git a/app/code/Magento/Sales/etc/config.xml b/app/code/Magento/Sales/etc/config.xml
index db812559be52ef52b237a231aa37fc1c4ceea0e1..2d42f963e6965decc5159ed82becc3fec22d25d2 100644
--- a/app/code/Magento/Sales/etc/config.xml
+++ b/app/code/Magento/Sales/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <sales>
             <totals_sort>
diff --git a/app/code/Magento/Sales/etc/frontend/page_types.xml b/app/code/Magento/Sales/etc/frontend/page_types.xml
index 693807b457a00edcd950c702fbdc506cf1f84623..701945902468273674ca3f9b0b4a271794232380 100644
--- a/app/code/Magento/Sales/etc/frontend/page_types.xml
+++ b/app/code/Magento/Sales/etc/frontend/page_types.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="sales_guest_creditmemo" label="Guest Order Creditmemo View"/>
     <type id="sales_guest_form" label="Returns"/>
     <type id="sales_guest_invoice" label="Guest Order Invoice View"/>
diff --git a/app/code/Magento/Sales/etc/webapi.xml b/app/code/Magento/Sales/etc/webapi.xml
index bfa2d724e25a4a2fb23670f4771372ede93364b0..3acea225b21ec3373d305834fc84f60332f8d39e 100644
--- a/app/code/Magento/Sales/etc/webapi.xml
+++ b/app/code/Magento/Sales/etc/webapi.xml
@@ -7,7 +7,7 @@
 -->
 <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
-    <route url="/V1/order/:id" method="GET">
+    <route url="/V1/orders/:id" method="GET">
         <service class="Magento\Sales\Api\OrderRepositoryInterface" method="get"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
@@ -19,61 +19,61 @@
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/:id/status" method="GET">
+    <route url="/V1/orders/:id/statuses" method="GET">
         <service class="Magento\Sales\Api\OrderManagementInterface" method="getStatus"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/:id/cancel" method="POST">
+    <route url="/V1/orders/:id/cancel" method="POST">
         <service class="Magento\Sales\Api\OrderManagementInterface" method="cancel"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/:id/email" method="POST">
+    <route url="/V1/orders/:id/emails" method="POST">
         <service class="Magento\Sales\Api\OrderManagementInterface" method="notify"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/:id/hold" method="POST">
+    <route url="/V1/orders/:id/hold" method="POST">
         <service class="Magento\Sales\Api\OrderManagementInterface" method="hold"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/:id/unhold" method="POST">
+    <route url="/V1/orders/:id/unhold" method="POST">
         <service class="Magento\Sales\Api\OrderManagementInterface" method="unHold"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/:id/comment" method="POST">
+    <route url="/V1/orders/:id/comments" method="POST">
         <service class="Magento\Sales\Api\OrderManagementInterface" method="addComment"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/:id/comments" method="GET">
+    <route url="/V1/orders/:id/comments" method="GET">
         <service class="Magento\Sales\Api\OrderManagementInterface" method="getCommentsList"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/create" method="PUT">
+    <route url="/V1/orders/create" method="PUT">
         <service class="Magento\Sales\Api\OrderRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/:parent_id" method="PUT">
+    <route url="/V1/orders/:parent_id" method="PUT">
         <service class="Magento\Sales\Api\OrderAddressRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/invoice/:id" method="GET">
+    <route url="/V1/invoices/:id" method="GET">
         <service class="Magento\Sales\Api\InvoiceRepositoryInterface" method="get"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
@@ -85,37 +85,37 @@
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/invoice/:id/comments" method="GET">
+    <route url="/V1/invoices/:id/comments" method="GET">
         <service class="Magento\Sales\Api\InvoiceManagementInterface" method="getCommentsList"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/invoice/:id/email" method="POST">
+    <route url="/V1/invoices/:id/emails" method="POST">
         <service class="Magento\Sales\Api\InvoiceManagementInterface" method="notify"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/invoice/:id/void" method="POST">
+    <route url="/V1/invoices/:id/void" method="POST">
         <service class="Magento\Sales\Api\InvoiceManagementInterface" method="setVoid"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/invoice/:id/capture" method="POST">
+    <route url="/V1/invoices/:id/capture" method="POST">
         <service class="Magento\Sales\Api\InvoiceManagementInterface" method="setCapture"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/invoice/comment" method="POST">
+    <route url="/V1/invoices/comments" method="POST">
         <service class="Magento\Sales\Api\InvoiceCommentRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/invoice/" method="POST">
+    <route url="/V1/invoices/" method="POST">
         <service class="Magento\Sales\Api\InvoiceRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
@@ -145,13 +145,13 @@
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/creditmemo/:id/email" method="POST">
+    <route url="/V1/creditmemo/:id/emails" method="POST">
         <service class="Magento\Sales\Api\CreditmemoManagementInterface" method="notify"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/creditmemo/comment" method="POST">
+    <route url="/V1/creditmemo/:id/comments" method="POST">
         <service class="Magento\Sales\Api\CreditmemoCommentRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
@@ -181,13 +181,13 @@
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/shipment/comment" method="POST">
+    <route url="/V1/shipment/:id/comments" method="POST">
         <service class="Magento\Sales\Api\ShipmentCommentRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/shipment/:id/email" method="POST">
+    <route url="/V1/shipment/:id/emails" method="POST">
         <service class="Magento\Sales\Api\ShipmentManagementInterface" method="notify"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
@@ -217,7 +217,7 @@
             <resource ref="Magento_Sales::sales" />
         </resources>
     </route>
-    <route url="/V1/order/" method="POST">
+    <route url="/V1/orders/" method="POST">
         <service class="Magento\Sales\Api\OrderRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Sales::sales" />
diff --git a/app/code/Magento/SalesRule/etc/config.xml b/app/code/Magento/SalesRule/etc/config.xml
index 7d3da07bc36457b55840e017735b28cdc6ce1308..486f8e4073ce85fef4a2b482b0a3e09e27a618c4 100644
--- a/app/code/Magento/SalesRule/etc/config.xml
+++ b/app/code/Magento/SalesRule/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <promo>
             <auto_generated_coupon_codes>
diff --git a/app/code/Magento/Search/etc/frontend/page_types.xml b/app/code/Magento/Search/etc/frontend/page_types.xml
index 0f5a1440de0ce62e107bf30c144a876c6187cb27..2c563ca5c0d1b97fcf9960c34a3656b70bbb13df 100644
--- a/app/code/Magento/Search/etc/frontend/page_types.xml
+++ b/app/code/Magento/Search/etc/frontend/page_types.xml
@@ -5,6 +5,6 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="search_term_popular" label="Popular Search Terms"/>
 </page_types>
diff --git a/app/code/Magento/Sendfriend/etc/config.xml b/app/code/Magento/Sendfriend/etc/config.xml
index 52d949a1036a31b5279e79a0400823a76a0356d7..6a63fb0eb3be102a68ca6cd2f40ef898c2db8f0e 100644
--- a/app/code/Magento/Sendfriend/etc/config.xml
+++ b/app/code/Magento/Sendfriend/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <sendfriend>
             <email>
diff --git a/app/code/Magento/Sendfriend/etc/frontend/page_types.xml b/app/code/Magento/Sendfriend/etc/frontend/page_types.xml
index cc46efb01ddc13708d15ee4c3eca5b9d0c9de633..c4396bfb90b7c9b1338f9a7ba38e9f2093afb414 100644
--- a/app/code/Magento/Sendfriend/etc/frontend/page_types.xml
+++ b/app/code/Magento/Sendfriend/etc/frontend/page_types.xml
@@ -5,6 +5,6 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="sendfriend_product_send" label="Catalog Product Email to a Friend"/>
 </page_types>
diff --git a/app/code/Magento/Shipping/Model/Order/Track.php b/app/code/Magento/Shipping/Model/Order/Track.php
index ff7167e94ab78f5bdfffbaa8ee302621cff0bf7a..3eadf958b8902664592bab8b7e67be6664e3adea 100644
--- a/app/code/Magento/Shipping/Model/Order/Track.php
+++ b/app/code/Magento/Shipping/Model/Order/Track.php
@@ -21,7 +21,7 @@ use Magento\Framework\Api\AttributeValueFactory;
  * @method string getCreatedAt()
  * @method \Magento\Sales\Model\Order\Shipment\Track setCreatedAt(string $value)
  * @method string getUpdatedAt()
- *
+ * @method \Magento\Sales\Api\Data\ShipmentTrackExtensionInterface getExtensionAttributes()
  */
 class Track extends \Magento\Sales\Model\Order\Shipment\Track
 {
@@ -33,7 +33,7 @@ class Track extends \Magento\Sales\Model\Order\Shipment\Track
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -49,7 +49,7 @@ class Track extends \Magento\Sales\Model\Order\Shipment\Track
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -63,7 +63,7 @@ class Track extends \Magento\Sales\Model\Order\Shipment\Track
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $localeDate,
             $dateTime,
diff --git a/app/code/Magento/Shipping/etc/config.xml b/app/code/Magento/Shipping/etc/config.xml
index 6f66c2a3146755431b73eb5c20689165bb17726b..181805b665d283099c954844413036032d8e50fd 100644
--- a/app/code/Magento/Shipping/etc/config.xml
+++ b/app/code/Magento/Shipping/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <shipping>
             <origin>
diff --git a/app/code/Magento/Shipping/etc/frontend/page_types.xml b/app/code/Magento/Shipping/etc/frontend/page_types.xml
index 452cfdded68cf59f1f7a25813cf69a261c0f9f8b..2b2d3f2c617a3dd0b22785a5b57ac7128180e2f5 100644
--- a/app/code/Magento/Shipping/etc/frontend/page_types.xml
+++ b/app/code/Magento/Shipping/etc/frontend/page_types.xml
@@ -5,6 +5,6 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="shipping_tracking_popup" label="Shipment Tracking Popup"/>
 </page_types>
diff --git a/app/code/Magento/Shipping/etc/module.xml b/app/code/Magento/Shipping/etc/module.xml
index 999d4fa4882a9b50c971d0e22f4cca09075049c9..ff4283ad84048134a416309725404e203af77c33 100644
--- a/app/code/Magento/Shipping/etc/module.xml
+++ b/app/code/Magento/Shipping/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Shipping" setup_version="2.0.0">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
             <module name="Magento_Catalog"/>
         </sequence>
diff --git a/app/code/Magento/Sitemap/etc/config.xml b/app/code/Magento/Sitemap/etc/config.xml
index ff84e8eec23892526961e5ea3d0d1e11e2978af7..03e72e315546683a613d9212ecf1032f46d3c3a2 100644
--- a/app/code/Magento/Sitemap/etc/config.xml
+++ b/app/code/Magento/Sitemap/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <sitemap>
             <limit>
diff --git a/app/code/Magento/Store/composer.json b/app/code/Magento/Store/composer.json
index aa9c2858d0b9d68e6243ec931d9593187061dca7..c991778c00e9d67dbc1dd0ae36810f0a49009e7a 100644
--- a/app/code/Magento/Store/composer.json
+++ b/app/code/Magento/Store/composer.json
@@ -3,7 +3,6 @@
     "description": "N/A",
     "require": {
         "php": "~5.5.0|~5.6.0",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-directory": "0.42.0-beta11",
         "magento/module-ui": "0.42.0-beta11",
         "magento/module-config": "0.42.0-beta11",
diff --git a/app/code/Magento/Core/etc/cache.xml b/app/code/Magento/Store/etc/cache.xml
similarity index 100%
rename from app/code/Magento/Core/etc/cache.xml
rename to app/code/Magento/Store/etc/cache.xml
diff --git a/app/code/Magento/Core/etc/config.xml b/app/code/Magento/Store/etc/config.xml
similarity index 98%
rename from app/code/Magento/Core/etc/config.xml
rename to app/code/Magento/Store/etc/config.xml
index ddfb237c0eeee1ad680280538feedeaf54542eca..0bf0f4cdb889d4590773e402854cdeb4c1ee015c 100644
--- a/app/code/Magento/Core/etc/config.xml
+++ b/app/code/Magento/Store/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="config.xsd">
     <default>
         <design>
             <pagination>
diff --git a/app/code/Magento/Core/etc/config.xsd b/app/code/Magento/Store/etc/config.xsd
similarity index 100%
rename from app/code/Magento/Core/etc/config.xsd
rename to app/code/Magento/Store/etc/config.xsd
diff --git a/app/code/Magento/Store/etc/di.xml b/app/code/Magento/Store/etc/di.xml
index fdbce3aa2a3ea1180edeaa749e39eb55bfc34b7a..ebbc61f6036c8723c1fe943e07795097b63f1f6d 100644
--- a/app/code/Magento/Store/etc/di.xml
+++ b/app/code/Magento/Store/etc/di.xml
@@ -219,6 +219,11 @@
             </argument>
         </arguments>
     </type>
+    <type name="Magento\Framework\Module\Setup\Migration">
+        <arguments>
+            <argument name="confPathToMapFile" xsi:type="string">app/etc/aliases_to_classes_map.json</argument>
+        </arguments>
+    </type>
     <type name="Magento\Framework\Module\Setup\MigrationData">
         <arguments>
             <argument name="data" xsi:type="array">
@@ -243,4 +248,52 @@
             <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument>
         </arguments>
     </type>
+    <type name="Magento\Framework\App\Router\Base">
+        <arguments>
+            <argument name="routerId" xsi:type="string">standard</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\Stdlib\DateTime\Timezone">
+        <arguments>
+            <argument name="defaultTimezonePath" xsi:type="const">Magento\Directory\Helper\Data::XML_PATH_DEFAULT_TIMEZONE</argument>
+            <argument name="scopeType" xsi:type="const">Magento\Store\Model\ScopeInterface::SCOPE_STORE</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\Locale\Resolver">
+        <arguments>
+            <argument name="defaultLocalePath" xsi:type="const">Magento\Directory\Helper\Data::XML_PATH_DEFAULT_LOCALE</argument>
+            <argument name="scopeType" xsi:type="const">Magento\Store\Model\ScopeInterface::SCOPE_STORE</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\App\Config\Initial\SchemaLocator">
+        <arguments>
+            <argument name="moduleName" xsi:type="string">Magento_Store</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\DB\Helper">
+        <arguments>
+            <argument name="modulePrefix" xsi:type="string">store</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\View\Asset\PreProcessor\Pool">
+        <arguments>
+            <argument name="preProcessors" xsi:type="array">
+                <item name="less" xsi:type="array">
+                    <item name="css" xsi:type="array">
+                        <item name="less_css" xsi:type="string">Magento\Framework\Css\PreProcessor\Less</item>
+                        <item name="module_notation" xsi:type="string">Magento\Framework\View\Asset\PreProcessor\ModuleNotation</item>
+                    </item>
+                    <item name="less" xsi:type="array">
+                        <item name="magento_import" xsi:type="string">Magento\Framework\Less\PreProcessor\Instruction\MagentoImport</item>
+                        <item name="import" xsi:type="string">Magento\Framework\Less\PreProcessor\Instruction\Import</item>
+                    </item>
+                </item>
+                <item name="css" xsi:type="array">
+                    <item name="css" xsi:type="array">
+                        <item name="module_notation" xsi:type="string">Magento\Framework\View\Asset\PreProcessor\ModuleNotation</item>
+                    </item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Store/etc/module.xml b/app/code/Magento/Store/etc/module.xml
index e01760c2873fb23499154afca8c78babafef2a70..b01976513381612bc4bafddd9463531ee54ea72e 100644
--- a/app/code/Magento/Store/etc/module.xml
+++ b/app/code/Magento/Store/etc/module.xml
@@ -7,8 +7,5 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Store" setup_version="2.0.0">
-        <sequence>
-            <module name="Magento_Core"/>
-        </sequence>
     </module>
 </config>
diff --git a/app/code/Magento/Store/i18n/de_DE.csv b/app/code/Magento/Store/i18n/de_DE.csv
index 144b5864e3cd87176710da0bcddbc570eb9622d4..f376d05a2c634af120f2e31c26caa9af4e97949d 100644
--- a/app/code/Magento/Store/i18n/de_DE.csv
+++ b/app/code/Magento/Store/i18n/de_DE.csv
@@ -10,3 +10,16 @@ Admin,Admin
 "Your Language","Your Language"
 Language,Language
 "Select Store","Select Store"
+"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
+"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
+"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
+Layouts,Layouts
+"Layout building instructions.","Layout building instructions."
+"Blocks HTML output","Blocks HTML output"
+"Page blocks HTML.","Page blocks HTML."
+"View files fallback","View files fallback"
+"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
+"View files pre-processing","View files pre-processing"
+"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
+"Collections Data","Collections Data"
+"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Store/i18n/en_US.csv b/app/code/Magento/Store/i18n/en_US.csv
index 144b5864e3cd87176710da0bcddbc570eb9622d4..f376d05a2c634af120f2e31c26caa9af4e97949d 100644
--- a/app/code/Magento/Store/i18n/en_US.csv
+++ b/app/code/Magento/Store/i18n/en_US.csv
@@ -10,3 +10,16 @@ Admin,Admin
 "Your Language","Your Language"
 Language,Language
 "Select Store","Select Store"
+"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
+"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
+"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
+Layouts,Layouts
+"Layout building instructions.","Layout building instructions."
+"Blocks HTML output","Blocks HTML output"
+"Page blocks HTML.","Page blocks HTML."
+"View files fallback","View files fallback"
+"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
+"View files pre-processing","View files pre-processing"
+"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
+"Collections Data","Collections Data"
+"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Store/i18n/es_ES.csv b/app/code/Magento/Store/i18n/es_ES.csv
index 144b5864e3cd87176710da0bcddbc570eb9622d4..f376d05a2c634af120f2e31c26caa9af4e97949d 100644
--- a/app/code/Magento/Store/i18n/es_ES.csv
+++ b/app/code/Magento/Store/i18n/es_ES.csv
@@ -10,3 +10,16 @@ Admin,Admin
 "Your Language","Your Language"
 Language,Language
 "Select Store","Select Store"
+"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
+"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
+"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
+Layouts,Layouts
+"Layout building instructions.","Layout building instructions."
+"Blocks HTML output","Blocks HTML output"
+"Page blocks HTML.","Page blocks HTML."
+"View files fallback","View files fallback"
+"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
+"View files pre-processing","View files pre-processing"
+"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
+"Collections Data","Collections Data"
+"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Store/i18n/fr_FR.csv b/app/code/Magento/Store/i18n/fr_FR.csv
index 144b5864e3cd87176710da0bcddbc570eb9622d4..f376d05a2c634af120f2e31c26caa9af4e97949d 100644
--- a/app/code/Magento/Store/i18n/fr_FR.csv
+++ b/app/code/Magento/Store/i18n/fr_FR.csv
@@ -10,3 +10,16 @@ Admin,Admin
 "Your Language","Your Language"
 Language,Language
 "Select Store","Select Store"
+"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
+"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
+"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
+Layouts,Layouts
+"Layout building instructions.","Layout building instructions."
+"Blocks HTML output","Blocks HTML output"
+"Page blocks HTML.","Page blocks HTML."
+"View files fallback","View files fallback"
+"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
+"View files pre-processing","View files pre-processing"
+"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
+"Collections Data","Collections Data"
+"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Store/i18n/nl_NL.csv b/app/code/Magento/Store/i18n/nl_NL.csv
index 144b5864e3cd87176710da0bcddbc570eb9622d4..f376d05a2c634af120f2e31c26caa9af4e97949d 100644
--- a/app/code/Magento/Store/i18n/nl_NL.csv
+++ b/app/code/Magento/Store/i18n/nl_NL.csv
@@ -10,3 +10,16 @@ Admin,Admin
 "Your Language","Your Language"
 Language,Language
 "Select Store","Select Store"
+"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
+"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
+"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
+Layouts,Layouts
+"Layout building instructions.","Layout building instructions."
+"Blocks HTML output","Blocks HTML output"
+"Page blocks HTML.","Page blocks HTML."
+"View files fallback","View files fallback"
+"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
+"View files pre-processing","View files pre-processing"
+"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
+"Collections Data","Collections Data"
+"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Store/i18n/pt_BR.csv b/app/code/Magento/Store/i18n/pt_BR.csv
index 144b5864e3cd87176710da0bcddbc570eb9622d4..f376d05a2c634af120f2e31c26caa9af4e97949d 100644
--- a/app/code/Magento/Store/i18n/pt_BR.csv
+++ b/app/code/Magento/Store/i18n/pt_BR.csv
@@ -10,3 +10,16 @@ Admin,Admin
 "Your Language","Your Language"
 Language,Language
 "Select Store","Select Store"
+"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
+"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
+"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
+Layouts,Layouts
+"Layout building instructions.","Layout building instructions."
+"Blocks HTML output","Blocks HTML output"
+"Page blocks HTML.","Page blocks HTML."
+"View files fallback","View files fallback"
+"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
+"View files pre-processing","View files pre-processing"
+"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
+"Collections Data","Collections Data"
+"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Store/i18n/zh_CN.csv b/app/code/Magento/Store/i18n/zh_CN.csv
index 144b5864e3cd87176710da0bcddbc570eb9622d4..f376d05a2c634af120f2e31c26caa9af4e97949d 100644
--- a/app/code/Magento/Store/i18n/zh_CN.csv
+++ b/app/code/Magento/Store/i18n/zh_CN.csv
@@ -10,3 +10,16 @@ Admin,Admin
 "Your Language","Your Language"
 Language,Language
 "Select Store","Select Store"
+"Helper arguments should not be used in custom layout updates.","Helper arguments should not be used in custom layout updates."
+"Updater model should not be used in custom layout updates.","Updater model should not be used in custom layout updates."
+"Please correct the XML data and try again. %value%","Please correct the XML data and try again. %value%"
+Layouts,Layouts
+"Layout building instructions.","Layout building instructions."
+"Blocks HTML output","Blocks HTML output"
+"Page blocks HTML.","Page blocks HTML."
+"View files fallback","View files fallback"
+"Paths to view files (e.g., PHTML templates, images, CSS, JS files).","Paths to view files (e.g., PHTML templates, images, CSS, JS files)."
+"View files pre-processing","View files pre-processing"
+"Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)."
+"Collections Data","Collections Data"
+"Collection data files.","Collection data files."
diff --git a/app/code/Magento/Tax/Api/Data/AppliedTaxInterface.php b/app/code/Magento/Tax/Api/Data/AppliedTaxInterface.php
index a447c3944a03eea781b35d21d93afa35c29665ad..356d39d0bc106519315c3fa76da8321931c116fd 100644
--- a/app/code/Magento/Tax/Api/Data/AppliedTaxInterface.php
+++ b/app/code/Magento/Tax/Api/Data/AppliedTaxInterface.php
@@ -78,4 +78,19 @@ interface AppliedTaxInterface extends \Magento\Framework\Api\ExtensibleDataInter
      * @return $this
      */
     public function setRates(array $rates = null);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\AppliedTaxExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\AppliedTaxExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\AppliedTaxExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Api/Data/AppliedTaxRateInterface.php b/app/code/Magento/Tax/Api/Data/AppliedTaxRateInterface.php
index f0c83cbe8d469c20b964d19e17ea6b9bbec5a929..cee4ab16fd1f0acdde90bd353b3d264e4ba52b11 100644
--- a/app/code/Magento/Tax/Api/Data/AppliedTaxRateInterface.php
+++ b/app/code/Magento/Tax/Api/Data/AppliedTaxRateInterface.php
@@ -62,4 +62,19 @@ interface AppliedTaxRateInterface extends \Magento\Framework\Api\ExtensibleDataI
      * @return $this
      */
     public function setPercent($percent);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\AppliedTaxRateExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\AppliedTaxRateExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\AppliedTaxRateExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Api/Data/OrderTaxDetailsAppliedTaxInterface.php b/app/code/Magento/Tax/Api/Data/OrderTaxDetailsAppliedTaxInterface.php
index bf8fed9966b07dce82fd5a751a98982423cb1fca..7123087eacf565f0341178e6f9643c9a98bf7036 100644
--- a/app/code/Magento/Tax/Api/Data/OrderTaxDetailsAppliedTaxInterface.php
+++ b/app/code/Magento/Tax/Api/Data/OrderTaxDetailsAppliedTaxInterface.php
@@ -97,4 +97,21 @@ interface OrderTaxDetailsAppliedTaxInterface extends \Magento\Framework\Api\Exte
      * @return $this
      */
     public function setBaseAmount($baseAmount);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\OrderTaxDetailsAppliedTaxExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\OrderTaxDetailsAppliedTaxExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Tax\Api\Data\OrderTaxDetailsAppliedTaxExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Tax/Api/Data/OrderTaxDetailsInterface.php b/app/code/Magento/Tax/Api/Data/OrderTaxDetailsInterface.php
index cee19ce16af5d69f9ef3ae96a057f8f9f96a5c11..d68de6f5858aab5c3362c60d62a1d006bc22c42d 100644
--- a/app/code/Magento/Tax/Api/Data/OrderTaxDetailsInterface.php
+++ b/app/code/Magento/Tax/Api/Data/OrderTaxDetailsInterface.php
@@ -42,4 +42,21 @@ interface OrderTaxDetailsInterface extends \Magento\Framework\Api\ExtensibleData
      * @return $this
      */
     public function setItems(array $items = null);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\OrderTaxDetailsExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\OrderTaxDetailsExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Tax\Api\Data\OrderTaxDetailsExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Tax/Api/Data/OrderTaxDetailsItemInterface.php b/app/code/Magento/Tax/Api/Data/OrderTaxDetailsItemInterface.php
index 601371a4259c11b12e8bd7b383d87c6fec9aec1e..905a0aa203594097e5377130679dfb4e5bb18a92 100644
--- a/app/code/Magento/Tax/Api/Data/OrderTaxDetailsItemInterface.php
+++ b/app/code/Magento/Tax/Api/Data/OrderTaxDetailsItemInterface.php
@@ -80,4 +80,21 @@ interface OrderTaxDetailsItemInterface extends \Magento\Framework\Api\Extensible
      * @return $this
      */
     public function setAppliedTaxes(array $appliedTaxes = null);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\OrderTaxDetailsItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\OrderTaxDetailsItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Tax\Api\Data\OrderTaxDetailsItemExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Tax/Api/Data/QuoteDetailsInterface.php b/app/code/Magento/Tax/Api/Data/QuoteDetailsInterface.php
index f8e60a4cfd08e2bf84115321daa7d6ce22575e5b..f7d69e1572f86eaecfad263eeeb026ebe8f280bc 100644
--- a/app/code/Magento/Tax/Api/Data/QuoteDetailsInterface.php
+++ b/app/code/Magento/Tax/Api/Data/QuoteDetailsInterface.php
@@ -114,4 +114,19 @@ interface QuoteDetailsInterface extends \Magento\Framework\Api\ExtensibleDataInt
      * @return $this
      */
     public function setCustomerTaxClassId($customerTaxClassId);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\QuoteDetailsExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\QuoteDetailsExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\QuoteDetailsExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Api/Data/QuoteDetailsItemInterface.php b/app/code/Magento/Tax/Api/Data/QuoteDetailsItemInterface.php
index 212236f8d599a62de5a00475091fd3ac94a63c84..ea3e57327f3115581853572e3159628b600c31cd 100644
--- a/app/code/Magento/Tax/Api/Data/QuoteDetailsItemInterface.php
+++ b/app/code/Magento/Tax/Api/Data/QuoteDetailsItemInterface.php
@@ -198,4 +198,21 @@ interface QuoteDetailsItemInterface extends \Magento\Framework\Api\ExtensibleDat
      * @return $this
      */
     public function setTaxClassId($taxClassId);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\QuoteDetailsItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\QuoteDetailsItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Tax\Api\Data\QuoteDetailsItemExtensionInterface $extensionAttributes
+    );
 }
diff --git a/app/code/Magento/Tax/Api/Data/TaxClassInterface.php b/app/code/Magento/Tax/Api/Data/TaxClassInterface.php
index 1539ea9e5c5acd739675390bc73cba9912600ab7..80774ef47c646bed3cb54e3813b7968c37536adc 100644
--- a/app/code/Magento/Tax/Api/Data/TaxClassInterface.php
+++ b/app/code/Magento/Tax/Api/Data/TaxClassInterface.php
@@ -62,4 +62,19 @@ interface TaxClassInterface extends \Magento\Framework\Api\ExtensibleDataInterfa
      * @return $this
      */
     public function setClassType($classType);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\TaxClassExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\TaxClassExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxClassExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Api/Data/TaxClassKeyInterface.php b/app/code/Magento/Tax/Api/Data/TaxClassKeyInterface.php
index 709291ff35ce434f58e55ff83ae3cd8247074617..9f0a25a170cbadbd71ad8e1c1e7d7cd6de7d0c27 100644
--- a/app/code/Magento/Tax/Api/Data/TaxClassKeyInterface.php
+++ b/app/code/Magento/Tax/Api/Data/TaxClassKeyInterface.php
@@ -55,4 +55,19 @@ interface TaxClassKeyInterface extends ExtensibleDataInterface
      * @return $this
      */
     public function setValue($value);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\TaxClassKeyExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\TaxClassKeyExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxClassKeyExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Api/Data/TaxDetailsInterface.php b/app/code/Magento/Tax/Api/Data/TaxDetailsInterface.php
index 0c6f80296474a2211b8048fef57d5c561f6d64b3..f06ba96bc54ca28a6ed4e167d48bbc4e553dcd15 100644
--- a/app/code/Magento/Tax/Api/Data/TaxDetailsInterface.php
+++ b/app/code/Magento/Tax/Api/Data/TaxDetailsInterface.php
@@ -97,4 +97,19 @@ interface TaxDetailsInterface extends \Magento\Framework\Api\ExtensibleDataInter
      * @return $this
      */
     public function setItems(array $items = null);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\TaxDetailsExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\TaxDetailsExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxDetailsExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Api/Data/TaxDetailsItemInterface.php b/app/code/Magento/Tax/Api/Data/TaxDetailsItemInterface.php
index 8c2f50111b313df4b0c00c66c4b48f68c199bc92..fad3229d7076a589363cbabf9f5bcb064984e04f 100644
--- a/app/code/Magento/Tax/Api/Data/TaxDetailsItemInterface.php
+++ b/app/code/Magento/Tax/Api/Data/TaxDetailsItemInterface.php
@@ -232,4 +232,19 @@ interface TaxDetailsItemInterface extends \Magento\Framework\Api\ExtensibleDataI
      * @return $this
      */
     public function setAssociatedItemCode($associatedItemCode);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\TaxDetailsItemExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\TaxDetailsItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxDetailsItemExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Api/Data/TaxRateInterface.php b/app/code/Magento/Tax/Api/Data/TaxRateInterface.php
index 7e878cb77564be1ae4c687df027e8be3b77a9567..881bb7fa7e013838c558f5514af373dcbe6fceaa 100644
--- a/app/code/Magento/Tax/Api/Data/TaxRateInterface.php
+++ b/app/code/Magento/Tax/Api/Data/TaxRateInterface.php
@@ -189,4 +189,19 @@ interface TaxRateInterface extends \Magento\Framework\Api\ExtensibleDataInterfac
      * @return $this
      */
     public function setTitles(array $titles = null);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\TaxRateExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\TaxRateExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxRateExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Api/Data/TaxRateTitleInterface.php b/app/code/Magento/Tax/Api/Data/TaxRateTitleInterface.php
index 2d9ff88958b105ef78e95630fb31eed4d88d5893..8d3991070b9565d9527c7c036aca9e45864d15f4 100644
--- a/app/code/Magento/Tax/Api/Data/TaxRateTitleInterface.php
+++ b/app/code/Magento/Tax/Api/Data/TaxRateTitleInterface.php
@@ -47,4 +47,19 @@ interface TaxRateTitleInterface extends \Magento\Framework\Api\ExtensibleDataInt
      * @return string
      */
     public function setValue($value);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\TaxRateTitleExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\TaxRateTitleExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxRateTitleExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Api/Data/TaxRuleInterface.php b/app/code/Magento/Tax/Api/Data/TaxRuleInterface.php
index e746fd0c9f2630d266dad79383c2790fb9154b4d..67c9b6a80c65e9ad7388e9c43be71144e5ba8690 100644
--- a/app/code/Magento/Tax/Api/Data/TaxRuleInterface.php
+++ b/app/code/Magento/Tax/Api/Data/TaxRuleInterface.php
@@ -129,4 +129,19 @@ interface TaxRuleInterface extends ExtensibleDataInterface
      * @return $this
      */
     public function setCalculateSubtotal($calculateSubtotal);
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Tax\Api\Data\TaxRuleExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Tax\Api\Data\TaxRuleExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxRuleExtensionInterface $extensionAttributes);
 }
diff --git a/app/code/Magento/Tax/Model/Calculation/Rate.php b/app/code/Magento/Tax/Model/Calculation/Rate.php
index a60a6247b7cd482fcd7977620e2b378e0e59da1f..18dde7c54f14d54945d1625e034e07ce7833f502 100644
--- a/app/code/Magento/Tax/Model/Calculation/Rate.php
+++ b/app/code/Magento/Tax/Model/Calculation/Rate.php
@@ -51,7 +51,7 @@ class Rate extends \Magento\Framework\Model\AbstractExtensibleModel implements \
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Directory\Model\RegionFactory $regionFactory
      * @param Rate\TitleFactory $taxTitleFactory
@@ -64,7 +64,7 @@ class Rate extends \Magento\Framework\Model\AbstractExtensibleModel implements \
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Directory\Model\RegionFactory $regionFactory,
         \Magento\Tax\Model\Calculation\Rate\TitleFactory $taxTitleFactory,
@@ -79,7 +79,7 @@ class Rate extends \Magento\Framework\Model\AbstractExtensibleModel implements \
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -494,4 +494,25 @@ class Rate extends \Magento\Framework\Model\AbstractExtensibleModel implements \
         return $this->setData(self::KEY_TITLES, $titles);
     }
     // @codeCoverageIgnoreEnd
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\TaxRateExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\TaxRateExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxRateExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/Calculation/Rate/Title.php b/app/code/Magento/Tax/Model/Calculation/Rate/Title.php
index 674c59e0eff8151627db9a8a1155557692702caa..a98b220548940e240774250f868c8b1abb8c4f1d 100644
--- a/app/code/Magento/Tax/Model/Calculation/Rate/Title.php
+++ b/app/code/Magento/Tax/Model/Calculation/Rate/Title.php
@@ -76,4 +76,25 @@ class Title extends \Magento\Framework\Model\AbstractExtensibleModel implements
         return $this->setData(self::KEY_VALUE_ID, $value);
     }
     // @codeCoverageIgnoreEnd
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\TaxRateTitleExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\TaxRateTitleExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxRateTitleExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/Calculation/Rule.php b/app/code/Magento/Tax/Model/Calculation/Rule.php
index ddf7acb1e7afeb119dfbf3821679d99520f18966..13d287ce5da36b67ece5d16a634a1ba3a743ca44 100644
--- a/app/code/Magento/Tax/Model/Calculation/Rule.php
+++ b/app/code/Magento/Tax/Model/Calculation/Rule.php
@@ -6,7 +6,7 @@
 namespace Magento\Tax\Model\Calculation;
 
 use Magento\Framework\Api\AttributeValueFactory;
-use Magento\Framework\Api\MetadataServiceInterface;
+use Magento\Framework\Api\ExtensionAttributesFactory;
 use Magento\Tax\Api\Data\TaxRuleInterface;
 
 /**
@@ -72,7 +72,7 @@ class Rule extends \Magento\Framework\Model\AbstractExtensibleModel implements T
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param MetadataServiceInterface $metadataService
+     * @param ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Tax\Model\ClassModel $taxClass
      * @param \Magento\Tax\Model\Calculation $calculation
@@ -85,7 +85,7 @@ class Rule extends \Magento\Framework\Model\AbstractExtensibleModel implements T
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        MetadataServiceInterface $metadataService,
+        ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Tax\Model\ClassModel $taxClass,
         \Magento\Tax\Model\Calculation $calculation,
@@ -99,7 +99,7 @@ class Rule extends \Magento\Framework\Model\AbstractExtensibleModel implements T
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -377,4 +377,25 @@ class Rule extends \Magento\Framework\Model\AbstractExtensibleModel implements T
     {
         return $this->setData(self::KEY_CALCULATE_SUBTOTAL, $calculateSubtotal);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\TaxRuleExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\TaxRuleExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxRuleExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/ClassModel.php b/app/code/Magento/Tax/Model/ClassModel.php
index 801335c94b2002c3942cbfea735dbb36f626ccfc..603fc708d47286e0dffdd25f8724756445f6cac1 100644
--- a/app/code/Magento/Tax/Model/ClassModel.php
+++ b/app/code/Magento/Tax/Model/ClassModel.php
@@ -37,7 +37,7 @@ class ClassModel extends \Magento\Framework\Model\AbstractExtensibleModel implem
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param TaxClass\Factory $classFactory
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
@@ -47,7 +47,7 @@ class ClassModel extends \Magento\Framework\Model\AbstractExtensibleModel implem
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\Framework\Api\MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Tax\Model\TaxClass\Factory $classFactory,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
@@ -57,7 +57,7 @@ class ClassModel extends \Magento\Framework\Model\AbstractExtensibleModel implem
         parent::__construct(
             $context,
             $registry,
-            $metadataService,
+            $extensionFactory,
             $customAttributeFactory,
             $resource,
             $resourceCollection,
@@ -178,4 +178,25 @@ class ClassModel extends \Magento\Framework\Model\AbstractExtensibleModel implem
         return $this->setData(self::KEY_TYPE, $classType);
     }
     //@codeCoverageIgnoreEnd
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\TaxClassExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\TaxClassExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxClassExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/Sales/Order/Details.php b/app/code/Magento/Tax/Model/Sales/Order/Details.php
index 14fce1cbbb59f4880e143b3bb22c7d435cf4666c..5161ab9fe6f7397f08cb88972033a8a6be6f6ef4 100644
--- a/app/code/Magento/Tax/Model/Sales/Order/Details.php
+++ b/app/code/Magento/Tax/Model/Sales/Order/Details.php
@@ -50,4 +50,25 @@ class Details extends \Magento\Framework\Model\AbstractExtensibleModel implement
     {
         return $this->setData(self::KEY_ITEMS, $items);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\OrderTaxDetailsExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\OrderTaxDetailsExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\OrderTaxDetailsExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/Sales/Order/Tax.php b/app/code/Magento/Tax/Model/Sales/Order/Tax.php
index d361064b51b734abd849e9fa85666789a595b120..29ce7e404f5696bcff549d3b276f6b14f6aea1d2 100644
--- a/app/code/Magento/Tax/Model/Sales/Order/Tax.php
+++ b/app/code/Magento/Tax/Model/Sales/Order/Tax.php
@@ -127,4 +127,26 @@ class Tax extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::KEY_BASE_AMOUNT, $baseAmount);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\OrderTaxDetailsAppliedTaxExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\OrderTaxDetailsAppliedTaxExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Tax\Api\Data\OrderTaxDetailsAppliedTaxExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/Sales/Order/Tax/Item.php b/app/code/Magento/Tax/Model/Sales/Order/Tax/Item.php
index a57234e0ece611f01f39a313705f9d67613d18b5..a6b6148ed0c9eaca83d07b74c4d32f53ce3a1e74 100644
--- a/app/code/Magento/Tax/Model/Sales/Order/Tax/Item.php
+++ b/app/code/Magento/Tax/Model/Sales/Order/Tax/Item.php
@@ -94,4 +94,26 @@ class Item extends \Magento\Framework\Model\AbstractExtensibleModel implements
     {
         return $this->setData(self::KEY_APPLIED_TAXES, $appliedTaxes);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\OrderTaxDetailsItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\OrderTaxDetailsItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Tax\Api\Data\OrderTaxDetailsItemExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/Sales/Quote/ItemDetails.php b/app/code/Magento/Tax/Model/Sales/Quote/ItemDetails.php
index ca74f9f940315bd0d61dca0dda68714e530b4d2b..71d18024ea5f1a199b99ff3811fa4d82d7009ed7 100644
--- a/app/code/Magento/Tax/Model/Sales/Quote/ItemDetails.php
+++ b/app/code/Magento/Tax/Model/Sales/Quote/ItemDetails.php
@@ -221,4 +221,26 @@ class ItemDetails extends AbstractExtensibleModel implements QuoteDetailsItemInt
     {
         return $this->setData(QuoteDetailsItemInterface::KEY_TAX_CLASS_ID, $taxClassId);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\QuoteDetailsItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\QuoteDetailsItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Tax\Api\Data\QuoteDetailsItemExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/Sales/Quote/QuoteDetails.php b/app/code/Magento/Tax/Model/Sales/Quote/QuoteDetails.php
index 0ebdffd3ba107668c3a02a0b1da232a27bd161df..1ef369ba40d82dfb3655926be7970e003892a152 100644
--- a/app/code/Magento/Tax/Model/Sales/Quote/QuoteDetails.php
+++ b/app/code/Magento/Tax/Model/Sales/Quote/QuoteDetails.php
@@ -126,4 +126,25 @@ class QuoteDetails extends AbstractExtensibleModel implements QuoteDetailsInterf
     {
         return $this->setData(QuoteDetailsInterface::CUSTOMER_TAX_CLASS_ID, $customerTaxClassId);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\QuoteDetailsExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\QuoteDetailsExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\QuoteDetailsExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/TaxClass/Key.php b/app/code/Magento/Tax/Model/TaxClass/Key.php
index 11ccf63e872d3fc5b0fd3264cae7610d7a24a438..085b018aa88f7ad8ba4ef5a36fea99c31f6ded54 100644
--- a/app/code/Magento/Tax/Model/TaxClass/Key.php
+++ b/app/code/Magento/Tax/Model/TaxClass/Key.php
@@ -50,4 +50,25 @@ class Key extends AbstractExtensibleModel implements TaxClassKeyInterface
     {
         return $this->setData(TaxClassKeyInterface::KEY_VALUE, $value);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\TaxClassKeyExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\TaxClassKeyExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxClassKeyExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/TaxDetails/AppliedTax.php b/app/code/Magento/Tax/Model/TaxDetails/AppliedTax.php
index 135fada6e8e39ff474e4ddb7267d98572824f0f4..79265cacbc0c8615b0989d9deae57cb4ab6ee405 100644
--- a/app/code/Magento/Tax/Model/TaxDetails/AppliedTax.php
+++ b/app/code/Magento/Tax/Model/TaxDetails/AppliedTax.php
@@ -88,4 +88,25 @@ class AppliedTax extends AbstractExtensibleModel implements AppliedTaxInterface
     {
         return $this->setData(AppliedTaxInterface::KEY_RATES, $rates);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\AppliedTaxExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\AppliedTaxExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\AppliedTaxExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/TaxDetails/AppliedTaxRate.php b/app/code/Magento/Tax/Model/TaxDetails/AppliedTaxRate.php
index c1dddb0a87dcc834e68ff02745f6ee360dffbbbd..8cd44cb70e0e36de4ebe281b05e439e18be8312d 100644
--- a/app/code/Magento/Tax/Model/TaxDetails/AppliedTaxRate.php
+++ b/app/code/Magento/Tax/Model/TaxDetails/AppliedTaxRate.php
@@ -69,4 +69,25 @@ class AppliedTaxRate extends AbstractExtensibleModel implements AppliedTaxRateIn
     {
         return $this->setData(AppliedTaxRateInterface::KEY_PERCENT, $percent);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\AppliedTaxRateExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\AppliedTaxRateExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\AppliedTaxRateExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/TaxDetails/ItemDetails.php b/app/code/Magento/Tax/Model/TaxDetails/ItemDetails.php
index 711a228705ddd70c274f507d438f059f3283f6ee..9ba71b43dedf1c2bf676436e6a3754e4f168d69f 100644
--- a/app/code/Magento/Tax/Model/TaxDetails/ItemDetails.php
+++ b/app/code/Magento/Tax/Model/TaxDetails/ItemDetails.php
@@ -262,4 +262,25 @@ class ItemDetails extends AbstractExtensibleModel implements TaxDetailsItemInter
     {
         return $this->setData(TaxDetailsItemInterface::KEY_ASSOCIATED_ITEM_CODE, $associatedItemCode);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\TaxDetailsItemExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\TaxDetailsItemExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxDetailsItemExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/Model/TaxDetails/TaxDetails.php b/app/code/Magento/Tax/Model/TaxDetails/TaxDetails.php
index bc7c87b48209900aec99200760f3c82d37c73f7b..91f1587c8b575ce08e5f52a0196c724f40917a36 100644
--- a/app/code/Magento/Tax/Model/TaxDetails/TaxDetails.php
+++ b/app/code/Magento/Tax/Model/TaxDetails/TaxDetails.php
@@ -110,4 +110,25 @@ class TaxDetails extends AbstractExtensibleModel implements TaxDetailsInterface
     {
         return $this->setData(TaxDetailsInterface::KEY_ITEMS, $items);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Tax\Api\Data\TaxDetailsExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Tax\Api\Data\TaxDetailsExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxDetailsExtensionInterface $extensionAttributes)
+    {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/app/code/Magento/Tax/etc/config.xml b/app/code/Magento/Tax/etc/config.xml
index 6bd4ac34c517bc580a1c919950cb54a5b0c6e30f..7e44459eda420838364a8c5a5b263fb61c527f04 100644
--- a/app/code/Magento/Tax/etc/config.xml
+++ b/app/code/Magento/Tax/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <tax>
             <classes>
diff --git a/app/code/Magento/Tax/etc/webapi.xml b/app/code/Magento/Tax/etc/webapi.xml
index 554f6729785b7e75612a7ffdba1c5da36410555f..760734bc02b8245010faca0f050c1fb06d52deaf 100644
--- a/app/code/Magento/Tax/etc/webapi.xml
+++ b/app/code/Magento/Tax/etc/webapi.xml
@@ -7,31 +7,31 @@
 -->
 <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
-    <route url="/V1/taxRate" method="POST">
+    <route url="/V1/taxRates" method="POST">
         <service class="Magento\Tax\Api\TaxRateRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
         </resources>
     </route>
-    <route url="/V1/taxRate/:rateId" method="GET">
+    <route url="/V1/taxRates/:rateId" method="GET">
         <service class="Magento\Tax\Api\TaxRateRepositoryInterface" method="get"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
         </resources>
     </route>
-    <route url="/V1/taxRate" method="PUT">
+    <route url="/V1/taxRates" method="PUT">
         <service class="Magento\Tax\Api\TaxRateRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
         </resources>
     </route>
-    <route url="/V1/taxRate/:rateId" method="DELETE">
+    <route url="/V1/taxRates/:rateId" method="DELETE">
         <service class="Magento\Tax\Api\TaxRateRepositoryInterface" method="deleteById"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
         </resources>
     </route>
-    <route url="/V1/taxRate/search" method="GET">
+    <route url="/V1/taxRates/search" method="GET">
         <service class="Magento\Tax\Api\TaxRateRepositoryInterface" method="getList"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
@@ -67,31 +67,31 @@
             <resource ref="Magento_Tax::manage_tax"/>
         </resources>
     </route>
-    <route url="/V1/taxClass" method="POST">
+    <route url="/V1/taxClasses" method="POST">
         <service class="Magento\Tax\Api\TaxClassRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
         </resources>
     </route>
-    <route url="/V1/taxClass/:taxClassId" method="GET">
+    <route url="/V1/taxClasses/:taxClassId" method="GET">
         <service class="Magento\Tax\Api\TaxClassRepositoryInterface" method="get"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
         </resources>
     </route>
-    <route url="/V1/taxClass/:classId" method="PUT">
+    <route url="/V1/taxClasses/:classId" method="PUT">
         <service class="Magento\Tax\Api\TaxClassRepositoryInterface" method="save"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
         </resources>
     </route>
-    <route url="/V1/taxClass/:taxClassId" method="DELETE">
+    <route url="/V1/taxClasses/:taxClassId" method="DELETE">
         <service class="Magento\Tax\Api\TaxClassRepositoryInterface" method="deleteById"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
         </resources>
     </route>
-    <route url="/V1/taxClass/search" method="GET">
+    <route url="/V1/taxClasses/search" method="GET">
         <service class="Magento\Tax\Api\TaxClassRepositoryInterface" method="getList"/>
         <resources>
             <resource ref="Magento_Tax::manage_tax"/>
diff --git a/app/code/Magento/Theme/Setup/InstallSchema.php b/app/code/Magento/Theme/Setup/InstallSchema.php
index 30d5d299c21b929bafe0684d11a61cf903e558e5..f2135e0c1e4df8f03743be922c9e3aafe05026d5 100644
--- a/app/code/Magento/Theme/Setup/InstallSchema.php
+++ b/app/code/Magento/Theme/Setup/InstallSchema.php
@@ -157,6 +157,56 @@ class InstallSchema implements InstallSchemaInterface
         );
         $connection->createTable($table);
 
+        /**
+         * Create table 'design_change'
+         */
+        $table = $connection->newTable(
+            $installer->getTable('design_change')
+        )->addColumn(
+            'design_change_id',
+            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+            null,
+            ['identity' => true, 'nullable' => false, 'primary' => true],
+            'Design Change Id'
+        )->addColumn(
+            'store_id',
+            \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+            null,
+            ['unsigned' => true, 'nullable' => false, 'default' => '0'],
+            'Store Id'
+        )->addColumn(
+            'design',
+            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+            255,
+            [],
+            'Design'
+        )->addColumn(
+            'date_from',
+            \Magento\Framework\DB\Ddl\Table::TYPE_DATE,
+            null,
+            [],
+            'First Date of Design Activity'
+        )->addColumn(
+            'date_to',
+            \Magento\Framework\DB\Ddl\Table::TYPE_DATE,
+            null,
+            [],
+            'Last Date of Design Activity'
+        )->addIndex(
+            $installer->getIdxName('design_change', ['store_id']),
+            ['store_id']
+        )->addForeignKey(
+            $installer->getFkName('design_change', 'store_id', 'store', 'store_id'),
+            'store_id',
+            $installer->getTable('store'),
+            'store_id',
+            \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE,
+            \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
+        )->setComment(
+            'Design Changes'
+        );
+        $connection->createTable($table);
+
         $installer->endSetup();
 
     }
diff --git a/app/code/Magento/Theme/Test/Unit/Helper/ThemeTest.php b/app/code/Magento/Theme/Test/Unit/Helper/ThemeTest.php
index 94702db1b8e8f816fdbf68a7206ca3d954663bf7..a8a5e56bc49d4502110dfae453ebf42088abee17 100644
--- a/app/code/Magento/Theme/Test/Unit/Helper/ThemeTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Helper/ThemeTest.php
@@ -54,11 +54,11 @@ class ThemeTest extends \PHPUnit_Framework_TestCase
                 '<block class="Magento\Theme\Block\Html\Head" name="head">
                     <block class="Magento\Theme\Block\Html\Head\Css" name="magento-loader-js">
                         <arguments>
-                            <argument name="file" xsi:type="string">Magento_Core::test3.css</argument>
+                            <argument name="file" xsi:type="string">Magento_Theme::test3.css</argument>
                         </arguments>
                     </block>
                 </block>',
-                ['Magento_Core::test3.css' => 'Magento_Core::test3.css'],
+                ['Magento_Theme::test3.css' => 'Magento_Theme::test3.css'],
             ],
             [
                 '<block class="Magento\Theme\Block\Html\Head" name="head">
@@ -67,7 +67,7 @@ class ThemeTest extends \PHPUnit_Framework_TestCase
                     </block>
                     <block class="Magento\Theme\Block\Html\Head\Css" name="magento-loader-js">
                         <arguments>
-                            <argument name="file" xsi:type="string">Magento_Core::test.css</argument>
+                            <argument name="file" xsi:type="string">Magento_Theme::test.css</argument>
                         </arguments>
                     </block>
                 </block>
@@ -76,7 +76,7 @@ class ThemeTest extends \PHPUnit_Framework_TestCase
                         <arguments><argument name="file" xsi:type="string">testh.css</argument></arguments>
                     </block>
                     <block class="Magento\Theme\Block\Html\Head\Css" name="magento-loader-js">
-                        <arguments><argument name="file" xsi:type="string">Magento_Core::test.css</argument></arguments>
+                        <arguments><argument name="file" xsi:type="string">Magento_Theme::test.css</argument></arguments>
                     </block>
                 </referenceBlock>
                 <block type="Some_Block_Class">
@@ -85,7 +85,7 @@ class ThemeTest extends \PHPUnit_Framework_TestCase
                     </block>
                     <block class="Magento\Theme\Block\Html\Head\Css" name="magento-loader-js">
                         <arguments>
-                            <argument name="file" xsi:type="string">Magento_Core::testa.css</argument>
+                            <argument name="file" xsi:type="string">Magento_Theme::testa.css</argument>
                         </arguments>
                     </block>
                 </block>
@@ -95,12 +95,12 @@ class ThemeTest extends \PHPUnit_Framework_TestCase
                     </block>
                     <block class="Magento\Theme\Block\Html\Head\Css" name="magento-loader-js">
                         <arguments>
-                            <argument name="file" xsi:type="string">Magento_Core::testb.css</argument>
+                            <argument name="file" xsi:type="string">Magento_Theme::testb.css</argument>
                         </arguments>
                     </block>
                 </referenceBlock>',
                 [
-                    'Magento_Core::test.css' => 'Magento_Core::test.css',
+                    'Magento_Theme::test.css' => 'Magento_Theme::test.css',
                     'test.css' => 'test.css',
                     'testh.css' => 'testh.css',
                 ],
diff --git a/app/code/Magento/Theme/Test/Unit/Model/CopyServiceTest.php b/app/code/Magento/Theme/Test/Unit/Model/CopyServiceTest.php
index 345dce2e805096d552f37a6a1d20d0ba1b40a3b2..ac449f10946e47e1112a59ebf9d8e2ea08bd2876 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/CopyServiceTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/CopyServiceTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Theme\Test\Unit\Model;
 
 use Magento\Framework\App\Filesystem\DirectoryList;
@@ -171,7 +174,7 @@ class CopyServiceTest extends \PHPUnit_Framework_TestCase
             $this->returnValue($this->dirWriteMock)
         );
 
-        /* Init \Magento\Core\Model\Resource\Layout\Collection model  */
+        /* Init \Magento\Widget\Model\Resource\Layout\Update\Collection model  */
         $this->updateFactory = $this->getMock(
             'Magento\Widget\Model\Layout\UpdateFactory',
             ['create'],
@@ -460,6 +463,8 @@ class CopyServiceTest extends \PHPUnit_Framework_TestCase
 
     /**
      * cover \Magento\Theme\Model\CopyService::_copyFilesystemCustomization
+     *
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
     public function testCopyFilesystemCustomization()
     {
diff --git a/app/code/Magento/Core/Test/Unit/Model/_files/frontend/magento_iphone/theme.xml b/app/code/Magento/Theme/Test/Unit/Model/_files/frontend/magento_iphone/theme.xml
similarity index 100%
rename from app/code/Magento/Core/Test/Unit/Model/_files/frontend/magento_iphone/theme.xml
rename to app/code/Magento/Theme/Test/Unit/Model/_files/frontend/magento_iphone/theme.xml
diff --git a/app/code/Magento/Core/Test/Unit/Model/_files/frontend/magento_iphone/theme_invalid.xml b/app/code/Magento/Theme/Test/Unit/Model/_files/frontend/magento_iphone/theme_invalid.xml
similarity index 100%
rename from app/code/Magento/Core/Test/Unit/Model/_files/frontend/magento_iphone/theme_invalid.xml
rename to app/code/Magento/Theme/Test/Unit/Model/_files/frontend/magento_iphone/theme_invalid.xml
diff --git a/app/code/Magento/Theme/composer.json b/app/code/Magento/Theme/composer.json
index f6aaacab3492dca03a1a3b2aea9bd125a7e21437..55d1d0974c5e76385343b32781bfc3a5bf2e2784 100644
--- a/app/code/Magento/Theme/composer.json
+++ b/app/code/Magento/Theme/composer.json
@@ -4,7 +4,6 @@
     "require": {
         "php": "~5.5.0|~5.6.0",
         "magento/module-store": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-customer": "0.42.0-beta11",
         "magento/module-backend": "0.42.0-beta11",
         "magento/module-cms": "0.42.0-beta11",
diff --git a/app/code/Magento/Theme/etc/config.xml b/app/code/Magento/Theme/etc/config.xml
index e6f790127c4714ac4299fcfb08eecc31f3732b9e..643a69777e24aadbb2e9c79ba4e157795b0c8811 100644
--- a/app/code/Magento/Theme/etc/config.xml
+++ b/app/code/Magento/Theme/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <design>
             <head translate="default_description">
diff --git a/app/code/Magento/Theme/etc/module.xml b/app/code/Magento/Theme/etc/module.xml
index 30b3857eac7e968aa5d74f380132d0bac84934bf..e6744b59cb8c2f7c3e27117b3e1bac698c035985 100644
--- a/app/code/Magento/Theme/etc/module.xml
+++ b/app/code/Magento/Theme/etc/module.xml
@@ -8,7 +8,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Theme" setup_version="2.0.1">
         <sequence>
-            <module name="Magento_Core"/>
             <module name="Magento_Store"/>
         </sequence>
     </module>
diff --git a/app/code/Magento/Theme/i18n/de_DE.csv b/app/code/Magento/Theme/i18n/de_DE.csv
index f94c143a9686ab7fe2a78f66b3bbb42def67285a..9ddaaa6a018d2d00c8c04113bd7028bef6f579c6 100644
--- a/app/code/Magento/Theme/i18n/de_DE.csv
+++ b/app/code/Magento/Theme/i18n/de_DE.csv
@@ -135,3 +135,8 @@ Copyright,Copyright
 "2 columns with right bar","2 Spalten mit rechter Leiste"
 "3 columns","3 Spalten"
 "Skip to content","Skip to content"
+"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
+"Start date cannot be greater than end date.","Das Anfangsdatum darf nicht nach dem Enddatum liegen."
+"Your design change for the specified store intersects with another one, please specify another date range.","Ihre Design-Änderung für den ausgewählten Store überschneidet sich mit einer anderen, bitte wählen Sie einen anderen Zeitraum."
+Copy,Copy
+"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
diff --git a/app/code/Magento/Theme/i18n/en_US.csv b/app/code/Magento/Theme/i18n/en_US.csv
index 4c98001e69bfe1572a7976f2ebe48d582ee71105..f95ee406e76baa20811c5c1907af603b1be44df9 100644
--- a/app/code/Magento/Theme/i18n/en_US.csv
+++ b/app/code/Magento/Theme/i18n/en_US.csv
@@ -135,3 +135,8 @@ Copyright,Copyright
 "2 columns with right bar","2 columns with right bar"
 "3 columns","3 columns"
 "Skip to content","Skip to content"
+"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
+"Start date cannot be greater than end date.","Start date cannot be greater than end date."
+"Your design change for the specified store intersects with another one, please specify another date range.","Your design change for the specified store intersects with another one, please specify another date range."
+Copy,Copy
+"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
diff --git a/app/code/Magento/Theme/i18n/es_ES.csv b/app/code/Magento/Theme/i18n/es_ES.csv
index 1a4040a9d1cb87410018cf9ce43491ebbf0322c6..7a46dedc66d9d59affa3a794493f078a16c87e6d 100644
--- a/app/code/Magento/Theme/i18n/es_ES.csv
+++ b/app/code/Magento/Theme/i18n/es_ES.csv
@@ -135,3 +135,8 @@ Copyright,Copyright
 "2 columns with right bar","2 columnas con barra a la derecha"
 "3 columns","3 columnas"
 "Skip to content","Skip to content"
+"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
+"Start date cannot be greater than end date.","La fecha de inicio no puede ser mayor que la de fin."
+"Your design change for the specified store intersects with another one, please specify another date range.","Su cambio de diseño para la tienda especificada se superpone con otro. Especifique otro rango de fecha."
+Copy,Copy
+"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
diff --git a/app/code/Magento/Theme/i18n/fr_FR.csv b/app/code/Magento/Theme/i18n/fr_FR.csv
index 62ff62757e9afd534ca8ac33d31dfb84a3e59a0a..3747f950596d312e4e1f0a11d2c5d8849a88b4d7 100644
--- a/app/code/Magento/Theme/i18n/fr_FR.csv
+++ b/app/code/Magento/Theme/i18n/fr_FR.csv
@@ -135,3 +135,8 @@ Copyright,Copyright
 "2 columns with right bar","2 colonnes avec barre droite"
 "3 columns","3 colonnes"
 "Skip to content","Skip to content"
+"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
+"Start date cannot be greater than end date.","La date de début ne peut pas être après la date de fin."
+"Your design change for the specified store intersects with another one, please specify another date range.","Votre changement de dessin pour la boutique spécifiée se mélange à une autre, veuillez spécifier une autre fourchette de dates."
+Copy,Copy
+"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
diff --git a/app/code/Magento/Theme/i18n/nl_NL.csv b/app/code/Magento/Theme/i18n/nl_NL.csv
index ccd1f5f63163a0157c5ec117af651680df90fe9d..d5197adbe59b97f1dc56295548afa765cad56feb 100644
--- a/app/code/Magento/Theme/i18n/nl_NL.csv
+++ b/app/code/Magento/Theme/i18n/nl_NL.csv
@@ -135,3 +135,8 @@ Copyright,Copyright
 "2 columns with right bar","2 kolommen met rechterbalk"
 "3 columns","3 kolommen"
 "Skip to content","Skip to content"
+"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
+"Start date cannot be greater than end date.","Begin datum kan niet later zijn dan eind datum."
+"Your design change for the specified store intersects with another one, please specify another date range.","Uw ontwerp verandering voor de gespecificeerde store komt in conflict met een andere, specificeer a.u.b. een andere datumrange."
+Copy,Copy
+"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
diff --git a/app/code/Magento/Theme/i18n/pt_BR.csv b/app/code/Magento/Theme/i18n/pt_BR.csv
index 0077e120ba4baa381f81b939acf52d96e6fcafb2..94aee8c839430e4a3704054cc9409b18b4f471d5 100644
--- a/app/code/Magento/Theme/i18n/pt_BR.csv
+++ b/app/code/Magento/Theme/i18n/pt_BR.csv
@@ -135,3 +135,8 @@ Copyright,Copyright
 "2 columns with right bar","2 colunas com barra à direita"
 "3 columns","3 colunas"
 "Skip to content","Skip to content"
+"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
+"Start date cannot be greater than end date.","Data de início não pode ser maior que a data do término."
+"Your design change for the specified store intersects with another one, please specify another date range.","Sua mudança de design para a loja especificada cruza com outra, por favor especifique outro intervalo de datas."
+Copy,Copy
+"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
diff --git a/app/code/Magento/Theme/i18n/zh_CN.csv b/app/code/Magento/Theme/i18n/zh_CN.csv
index da8737f17e11a5d9698c184561a38ac90e349abe..603295168ee776fac9e4f7eb8a611971c2e13ef5 100644
--- a/app/code/Magento/Theme/i18n/zh_CN.csv
+++ b/app/code/Magento/Theme/i18n/zh_CN.csv
@@ -135,3 +135,8 @@ Copyright,Copyright
 "2 columns with right bar",2栏带右边栏
 "3 columns",3栏
 "Skip to content","Skip to content"
+"Invalid regular expression: ""%1"".","Invalid regular expression: ""%1""."
+"Start date cannot be greater than end date.",开始日期不能大于结束日期。
+"Your design change for the specified store intersects with another one, please specify another date range.",您对指定商店设计的更改和另一个有交叉,请重新指定日期范围。
+Copy,Copy
+"Circular-reference in theme inheritance detected for ""%1""","Circular-reference in theme inheritance detected for ""%1"""
diff --git a/app/code/Magento/Translation/Block/Js.php b/app/code/Magento/Translation/Block/Js.php
index dcf8f7156231b72655edf18db7832d47e7c02f16..f79360f534bab736536bdadb8a99d31c3809cb96 100644
--- a/app/code/Magento/Translation/Block/Js.php
+++ b/app/code/Magento/Translation/Block/Js.php
@@ -6,50 +6,37 @@
 
 namespace Magento\Translation\Block;
 
-use Magento\Framework\Translate\InlineInterface as InlineTranslator;
-use Magento\Translation\Model\Js as DataProvider;
 use Magento\Framework\View\Element\Template;
+use Magento\Translation\Model\Js\Config;
 
-class Js extends \Magento\Framework\View\Element\Template
+class Js extends Template
 {
     /**
-     * Data provider model
-     *
-     * @var DataProvider
-     */
-    protected $dataProvider;
-
-    /**
-     * Inline translator
-     *
-     * @var InlineTranslator
+     * @var Config
      */
-    protected $translateInline;
+    protected $config;
 
     /**
      * @param Template\Context $context
-     * @param DataProvider $dataProvider
-     * @param InlineTranslator $translateInline
+     * @param Config $config
      * @param array $data
      */
     public function __construct(
         Template\Context $context,
-        DataProvider $dataProvider,
-        InlineTranslator $translateInline,
+        Config $config,
         array $data = []
     ) {
         parent::__construct($context, $data);
-        $this->dataProvider = $dataProvider;
-        $this->translateInline = $translateInline;
+        $this->config = $config;
     }
 
     /**
-     * @return string
+     * Is js translation set to dictionary mode
+     *
+     * @return bool
      */
-    public function getTranslatedJson()
+    public function dictionaryEnabled()
     {
-        $data = $this->dataProvider->getTranslateData();
-        $this->translateInline->processResponseBody($data);
-        return \Zend_Json::encode($data);
+        return $this->config->dictionaryEnabled();
     }
 }
diff --git a/app/code/Magento/Translation/Model/Js.php b/app/code/Magento/Translation/Model/Js.php
deleted file mode 100644
index ca4bc45b96058712719e24c223c78dec3e8dcd38..0000000000000000000000000000000000000000
--- a/app/code/Magento/Translation/Model/Js.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Translation\Model;
-
-class Js
-{
-    /**
-     * Translation data
-     *
-     * @var string[]
-     */
-    protected $translateData;
-
-    /**
-     * @param Js\DataProviderInterface[] $dataProviders
-     */
-    public function __construct(array $dataProviders)
-    {
-        /** @var $dataProvider Js\DataProviderInterface */
-        foreach ($dataProviders as $dataProvider) {
-            foreach ($dataProvider->getData() as $key => $translatedText) {
-                if ($key !== $translatedText) {
-                    $this->translateData[$key] = $translatedText;
-                }
-            }
-        }
-    }
-
-    /**
-     * Get translated data
-     *
-     * @return string[]
-     */
-    public function getTranslateData()
-    {
-        return $this->translateData;
-    }
-}
diff --git a/app/code/Magento/Translation/Model/Js/Config.php b/app/code/Magento/Translation/Model/Js/Config.php
new file mode 100644
index 0000000000000000000000000000000000000000..6dc1abb699d9acdc90d6325fad535150d4b09187
--- /dev/null
+++ b/app/code/Magento/Translation/Model/Js/Config.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Model\Js;
+
+use Magento\Framework\Translate\Js\Config as FrameworkJsConfig;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+
+/**
+ * Js Translation config
+ */
+class Config extends FrameworkJsConfig
+{
+    /**
+     * Both translation strategies are disabled
+     */
+    const NO_TRANSLATION = 'none';
+
+    /**
+     * Strategy when all js files are translated while publishing
+     */
+    const EMBEDDED_STRATEGY = 'embedded';
+
+    /**
+     * Strategy when dictionary is generated for dynamic translation
+     */
+    const DICTIONARY_STRATEGY = 'dictionary';
+
+    /**
+     * Configuration path to translation strategy
+     */
+    const XML_PATH_STRATEGY = 'dev/js/translate_strategy';
+
+    /**
+     * Dictionary file name
+     */
+    const DICTIONARY_FILE_NAME = 'js-translation.json';
+
+    /**
+     * Core store config
+     *
+     * @var ScopeConfigInterface
+     */
+    protected $scopeConfig;
+
+    /**
+     * Patterns to match strings for translation
+     *
+     * @var string[]
+     */
+    protected $patterns;
+
+    /**
+     * @param ScopeConfigInterface $scopeConfig
+     * @param string[] $patterns
+     */
+    public function __construct(ScopeConfigInterface $scopeConfig, array $patterns)
+    {
+        $this->scopeConfig = $scopeConfig;
+        $this->patterns = $patterns;
+        parent::__construct(
+            $this->scopeConfig->getValue(self::XML_PATH_STRATEGY) == self::DICTIONARY_STRATEGY,
+            self::DICTIONARY_FILE_NAME
+        );
+    }
+
+    /**
+     * Is Embedded Strategy selected
+     *
+     * @return bool
+     */
+    public function isEmbeddedStrategy()
+    {
+        return ($this->scopeConfig->getValue(self::XML_PATH_STRATEGY) == self::EMBEDDED_STRATEGY);
+    }
+
+    /**
+     * Is Dictionary Strategy selected
+     *
+     * @return bool
+     */
+    public function dictionaryEnabled()
+    {
+        return ($this->scopeConfig->getValue(self::XML_PATH_STRATEGY) == self::DICTIONARY_STRATEGY);
+    }
+
+    /**
+     * Retrieve translation patterns
+     *
+     * @return string[]
+     */
+    public function getPatterns()
+    {
+        return $this->patterns;
+    }
+}
diff --git a/app/code/Magento/Translation/Model/Js/Config/Source/Strategy.php b/app/code/Magento/Translation/Model/Js/Config/Source/Strategy.php
new file mode 100644
index 0000000000000000000000000000000000000000..30f1b0fe8e9a01fb9838002561820e11986c43cc
--- /dev/null
+++ b/app/code/Magento/Translation/Model/Js/Config/Source/Strategy.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Model\Js\Config\Source;
+
+use Magento\Translation\Model\Js\Config;
+
+class Strategy implements \Magento\Framework\Option\ArrayInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function toOptionArray()
+    {
+        return [
+            ['label' => __('None (Translation is disabled)'), 'value' => Config::NO_TRANSLATION],
+            ['label' => __('Dictionary (Translation on frontend side)'), 'value' => Config::DICTIONARY_STRATEGY],
+            ['label' => __('Embedded (Translation on backend side)'), 'value' => Config::EMBEDDED_STRATEGY]
+        ];
+    }
+}
diff --git a/app/code/Magento/Translation/Model/Js/DataProvider.php b/app/code/Magento/Translation/Model/Js/DataProvider.php
index 317dc602a3c7abc55998972f72d9b9f4b8450027..a9a83fcf8d6b35d942c43313f9d6204f2c087577 100644
--- a/app/code/Magento/Translation/Model/Js/DataProvider.php
+++ b/app/code/Magento/Translation/Model/Js/DataProvider.php
@@ -4,164 +4,109 @@
  * See COPYING.txt for license details.
  */
 
-// @codingStandardsIgnoreFile
-
 namespace Magento\Translation\Model\Js;
 
+use Magento\Framework\App\Utility\Files;
+use Magento\Framework\App\State;
+use Magento\Framework\Filesystem;
+use Magento\Framework\Filesystem\Directory\ReadInterface;
+use Magento\Framework\App\Filesystem\DirectoryList;
+
+/**
+ * DataProvider for js translation
+ */
 class DataProvider implements DataProviderInterface
 {
+    /**
+     * Application state
+     *
+     * @var State
+     */
+    protected $appState;
+
+    /**
+     * Js translation configuration
+     *
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * Files utility
+     *
+     * @var Files
+     */
+    protected $filesUtility;
+
+    /**
+     * Filesystem
+     *
+     * @var ReadInterface
+     */
+    protected $rootDirectory;
+
+    /**
+     * @param State $appState
+     * @param Config $config
+     * @param Filesystem $filesystem
+     * @param Files $filesUtility
+     */
+    public function __construct(State $appState, Config $config, Filesystem $filesystem, Files $filesUtility = null)
+    {
+        $this->appState = $appState;
+        $this->config = $config;
+        $this->rootDirectory = $filesystem->getDirectoryRead(DirectoryList::ROOT);
+        $this->filesUtility = (null !== $filesUtility) ? $filesUtility : new Files(BP);
+    }
+
     /**
      * Get translation data
      *
+     * @param string $themePath
      * @return string[]
-     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     * @throws \Exception
+     * @throws \Magento\Framework\Exception
      */
-    public function getData()
+    public function getData($themePath)
     {
-        return [
-            'Complete' => __('Complete'),
-            'Upload Security Error' => __('Upload Security Error'),
-            'Upload HTTP Error' => __('Upload HTTP Error'),
-            'Upload I/O Error' => __('Upload I/O Error'),
-            'SSL Error: Invalid or self-signed certificate' => __('SSL Error: Invalid or self-signed certificate'),
-            'TB' => __('TB'),
-            'GB' => __('GB'),
-            'MB' => __('MB'),
-            'kB' => __('kB'),
-            'B' => __('B'),
-            'Add Products' => __('Add Products'),
-            'Add Products By SKU' => __('Add Products By SKU'),
-            'Insert Widget...' => __('Insert Widget...'),
-            'Please wait, loading...' => __('Please wait, loading...'),
-            'HTML tags are not allowed' => __('HTML tags are not allowed'),
-            'Please select an option.' => __('Please select an option.'),
-            'This is a required field.' => __('This is a required field.'),
-            'Please enter a valid number in this field.' => __('Please enter a valid number in this field.'),
-            'The value is not within the specified range.' => __('The value is not within the specified range.'),
-            'Please use numbers only in this field. Please avoid spaces or other characters such as dots or commas.' => __('Please use numbers only in this field. Please avoid spaces or other characters such as dots or commas.'),
-            'Please use letters only (a-z or A-Z) in this field.' => __('Please use letters only (a-z or A-Z) in this field.'),
-            'Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.' => __('Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.'),
-            'Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.' => __('Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.'),
-            'Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.' => __('Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.'),
-            'Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.' => __('Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.'),
-            'Please enter a valid date.' => __('Please enter a valid date.'),
-            'The From Date value should be less than or equal to the To Date value.' => __('The From Date value should be less than or equal to the To Date value.'),
-            'Please enter a valid email address. For example johndoe@domain.com.' => __('Please enter a valid email address. For example johndoe@domain.com.'),
-            'Please use only visible characters and spaces.' => __('Please use only visible characters and spaces.'),
-            'Please enter 6 or more characters. Leading or trailing spaces will be ignored.' => __('Please enter 6 or more characters. Leading or trailing spaces will be ignored.'),
-            'Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.' => __('Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.'),
-            'Please make sure your passwords match.' => __('Please make sure your passwords match.'),
-            'Please enter a valid URL. Protocol is required (http://, https:// or ftp://)' => __('Please enter a valid URL. Protocol is required (http://, https:// or ftp://)'),
-            'Please enter a valid URL Key. For example "example-page", "example-page.html" or "anotherlevel/example-page".' => __('Please enter a valid URL Key. For example "example-page", "example-page.html" or "anotherlevel/example-page".'),
-            'Please enter a valid XML-identifier. For example something_1, block5, id-4.' => __('Please enter a valid XML-identifier. For example something_1, block5, id-4.'),
-            'Please enter a valid social security number. For example 123-45-6789.' => __('Please enter a valid social security number. For example 123-45-6789.'),
-            'Please enter a valid zip code. For example 90602 or 90602-1234.' => __('Please enter a valid zip code. For example 90602 or 90602-1234.'),
-            'Please enter a valid zip code.' => __('Please enter a valid zip code.'),
-            'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.' => __('Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.'),
-            'Please select one of the above options.' => __('Please select one of the above options.'),
-            'Please select one of the options.' => __('Please select one of the options.'),
-            'Please select State/Province.' => __('Please select State/Province.'),
-            'Please enter a number greater than 0 in this field.' => __('Please enter a number greater than 0 in this field.'),
-            'Please enter a number 0 or greater in this field.' => __('Please enter a number 0 or greater in this field.'),
-            'Please enter a valid credit card number.' => __('Please enter a valid credit card number.'),
-            'Credit card number does not match credit card type.' => __('Credit card number does not match credit card type.'),
-            'Card type does not match credit card number.' => __('Card type does not match credit card number.'),
-            'Incorrect credit card expiration date.' => __('Incorrect credit card expiration date.'),
-            'Please enter a valid credit card verification number.' => __('Please enter a valid credit card verification number.'),
-            'Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.' => __('Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.'),
-            'Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%.' => __('Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%.'),
-            'Text length does not satisfy specified text range.' => __('Text length does not satisfy specified text range.'),
-            'Please enter a number lower than 100.' => __('Please enter a number lower than 100.'),
-            'Please select a file' => __('Please select a file'),
-            'Please enter issue number or start date for switch/solo card type.' => __('Please enter issue number or start date for switch/solo card type.'),
-            'This date is a required value.' => __('This date is a required value.'),
-            'Please enter a valid day (1-%1).' => __('Please enter a valid day (1-%1).'),
-            'Please enter a valid month (1-12).' => __('Please enter a valid month (1-12).'),
-            'Please enter a valid year (1900-%1).' => __('Please enter a valid year (1900-%1).'),
-            'Please enter a valid full date' => __('Please enter a valid full date'),
-            'Allow' => __('Allow'),
-            'Activate' => __('Activate'),
-            'Reauthorize' => __('Reauthorize'),
-            'Cancel' => __('Cancel'),
-            'Done' => __('Done'),
-            'Save' => __('Save'),
-            'File extension not known or unsupported type.' => __('File extension not known or unsupported type.'),
-            'Configure Product' => __('Configure Product'),
-            'OK' => __('OK'),
-            'Gift Options for ' => __('Gift Options for '),
-            'New Option' => __('New Option'),
-            'Add Products to New Option' => __('Add Products to New Option'),
-            'Add Products to Option "%1"' => __('Add Products to Option "%1"'),
-            'Add Selected Products' => __('Add Selected Products'),
-            'Select type of option.' => __('Select type of option.'),
-            'Please add rows to option.' => __('Please add rows to option.'),
-            'Select Product' => __('Select Product'),
-            'Import' => __('Import'),
-            'Please select items.' => __('Please select items.'),
-            'Add Products to Group' => __('Add Products to Group'),
-            'start typing to search category' => __('start typing to search category'),
-            'Choose existing category.' => __('Choose existing category.'),
-            'Create Category' => __('Create Category'),
-            'Sorry, there was an unknown error.' => __('Sorry, there was an unknown error.'),
-            'Something went wrong while loading the theme.' => __('Something went wrong while loading the theme.'),
-            'We don\'t recognize or support this file extension type.' => __('We don\'t recognize or support this file extension type.'),
-            'Error' => __('Error'),
-            'No stores were reassigned.' => __('No stores were reassigned.'),
-            'Assign theme to your live store-view:' => __('Assign theme to your live store-view:'),
-            'Default title' => __('Default title'),
-            'The URL to assign stores is not defined.' => __('The URL to assign stores is not defined.'),
-            'No' => __('No'),
-            'Yes' => __('Yes'),
-            'Some problem with revert action' => __('Some problem with revert action'),
-            'Error: unknown error.' => __('Error: unknown error.'),
-            'Some problem with save action' => __('Some problem with save action'),
-            'Delete' => __('Delete'),
-            'Folder' => __('Folder'),
-            'Delete Folder' => __('Delete Folder'),
-            'Are you sure you want to delete the folder named' => __('Are you sure you want to delete the folder named'),
-            'Delete File' => __('Delete File'),
-            'Method ' => __('Method '),
-            'Please wait...' => __('Please wait...'),
-            'Loading...' => __('Loading...'),
-            'Translate' => __('Translate'),
-            'Submit' => __('Submit'),
-            'Close' => __('Close'),
-            'Please enter a value less than or equal to %s.' => __('Please enter a value less than or equal to %s.'),
-            'Please enter a value greater than or equal to %s.' => __('Please enter a value greater than or equal to %s.'),
-            'Maximum length of this field must be equal or less than %1 symbols.' => __('Maximum length of this field must be equal or less than %1 symbols.'),
-            'No records found.' => __('No records found.'),
-            'Recent items' => __('Recent items'),
-            'Show all...' => __('Show all...'),
-            'Please enter a date in the past.' => __('Please enter a date in the past.'),
-            'Please enter a date between %min and %max.' => __('Please enter a date between %min and %max.'),
-            'Please choose to register or to checkout as a guest.' => __('Please choose to register or to checkout as a guest.'),
-            'We are not able to ship to the selected shipping address. Please choose another address or edit the current address.' => __('We are not able to ship to the selected shipping address. Please choose another address or edit the current address.'),
-            'Please specify a shipping method.' => __('Please specify a shipping method.'),
-            'We can\'t complete your order because you don\'t have a payment method available.' => __('We can\'t complete your order because you don\'t have a payment method available.'),
-            'Error happened while creating wishlist. Please try again later' => __('Error happened while creating wishlist. Please try again later'),
-            'You must select items to move' => __('You must select items to move'),
-            'You must select items to copy' => __('You must select items to copy'),
-            'You are about to delete your wish list. This action cannot be undone. Are you sure you want to continue?' => __('You are about to delete your wish list. This action cannot be undone. Are you sure you want to continue?'),
-            'Please specify payment method.' => __('Please specify payment method.'),
-            'Are you sure you want to delete this address?' => __('Are you sure you want to delete this address?'),
-            'Use gift registry shipping address' => __('Use gift registry shipping address'),
-            'You can change the number of gift registry items on the Gift Registry Info page or directly in your cart, but not while in checkout.' => __('You can change the number of gift registry items on the Gift Registry Info page or directly in your cart, but not while in checkout.'),
-            'No confirmation' => __('No confirmation'),
-            'Sorry, something went wrong.' => __('Sorry, something went wrong.'),
-            'Sorry, something went wrong. Please try again later.' => __('Sorry, something went wrong. Please try again later.'),
-            'select all' => __('select all'),
-            'unselect all' => __('unselect all'),
-            'Please agree to all Terms and Conditions before placing the orders.' => __('Please agree to all Terms and Conditions before placing the orders.'),
-            'Please choose to register or to checkout as a guest' => __('Please choose to register or to checkout as a guest'),
-            'Your order cannot be completed at this time as there is no shipping methods available for it. Please make necessary changes in your shipping address.' => __('Your order cannot be completed at this time as there is no shipping methods available for it. Please make necessary changes in your shipping address.'),
-            'Please specify shipping method.' => __('Please specify shipping method.'),
-            'Your order cannot be completed at this time as there is no payment methods available for it.' => __('Your order cannot be completed at this time as there is no payment methods available for it.'),
-            'Edit Order' => __('Edit Order'),
-            'Ok' => __('Ok'),
-            'Please specify at least one search term.' => __('Please specify at least one search term.'),
-            'Create New Wish List' => __('Create New Wish List'),
-            'Click Details for more required fields.' => __('Click Details for more required fields.'),
-            'Incl. Tax' => __('Incl. Tax'),
-        ];
+        $dictionary = [];
+
+        $files = $this->filesUtility->getJsFiles($this->appState->getAreaCode(), $themePath);
+        foreach ($files as $filePath) {
+            $content = $this->rootDirectory->readFile($this->rootDirectory->getRelativePath($filePath[0]));
+            foreach ($this->getPhrases($content) as $phrase) {
+                $translatedPhrase = (string) __($phrase);
+                if ($phrase != $translatedPhrase) {
+                    $dictionary[$phrase] = $translatedPhrase;
+                }
+            }
+        }
+
+        return $dictionary;
+    }
+
+    /**
+     * Parse content for entries to be translated
+     *
+     * @param string $content
+     * @return string[]
+     * @throws \Exception
+     */
+    protected function getPhrases($content)
+    {
+        $phrases = [];
+        foreach ($this->config->getPatterns() as $pattern) {
+            $result = preg_match_all($pattern, $content, $matches);
+
+            if ($result) {
+                $phrases = array_merge($phrases, $matches[1]);
+            }
+            if (false === $result) {
+                throw new \Exception(
+                    sprintf('Error while generating js translation dictionary: "%s"', error_get_last())
+                );
+            }
+        }
+        return $phrases;
     }
 }
diff --git a/app/code/Magento/Translation/Model/Js/DataProviderInterface.php b/app/code/Magento/Translation/Model/Js/DataProviderInterface.php
index 74231b2ccdd959b4d50454d381121c80c7cb82bd..d9eea098e56b1e4102ba5f49b8882e9b325138f6 100644
--- a/app/code/Magento/Translation/Model/Js/DataProviderInterface.php
+++ b/app/code/Magento/Translation/Model/Js/DataProviderInterface.php
@@ -10,8 +10,8 @@ interface DataProviderInterface
 {
     /**
      * Get translation data
-     *
+     * @param string $themePath
      * @return string[]
      */
-    public function getData();
+    public function getData($themePath);
 }
diff --git a/app/code/Magento/Translation/Model/Js/PreProcessor.php b/app/code/Magento/Translation/Model/Js/PreProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..d7da55fbd50ef2d263c1b29a682d1460774da2c3
--- /dev/null
+++ b/app/code/Magento/Translation/Model/Js/PreProcessor.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Model\Js;
+
+use Magento\Framework\View\Asset\PreProcessorInterface;
+use Magento\Framework\View\Asset\PreProcessor\Chain;
+use Magento\Framework\Filesystem;
+
+/**
+ * PreProcessor responsible for replacing translation calls in js files to translated strings
+ */
+class PreProcessor implements PreProcessorInterface
+{
+    /**
+     * Javascript translation configuration
+     *
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * @param Config $config
+     */
+    public function __construct(Config $config)
+    {
+        $this->config = $config;
+    }
+
+    /**
+     * Transform content and/or content type for the specified preprocessing chain object
+     *
+     * @param Chain $chain
+     * @return void
+     */
+    public function process(Chain $chain)
+    {
+        if ($this->config->isEmbeddedStrategy()) {
+            $chain->setContent($this->translate($chain->getContent()));
+        }
+    }
+
+    /**
+     * Replace translation calls with translation result and return content
+     *
+     * @param string $content
+     * @return string
+     */
+    public function translate($content)
+    {
+        foreach ($this->config->getPatterns() as $pattern) {
+            $content = preg_replace_callback($pattern, [$this, 'replaceCallback'], $content);
+        }
+        return $content;
+    }
+
+    /**
+     * Replace callback for preg_replace_callback function
+     *
+     * @param array $matches
+     * @return string
+     */
+    protected function replaceCallback($matches)
+    {
+        return '"' . __($matches[1]) . '"';
+    }
+}
diff --git a/app/code/Magento/Translation/Model/Json/PreProcessor.php b/app/code/Magento/Translation/Model/Json/PreProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..79c4ad0ccef842037f191f7f7f41e59f17c7ba8e
--- /dev/null
+++ b/app/code/Magento/Translation/Model/Json/PreProcessor.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Model\Json;
+
+use Magento\Framework\View\Asset\PreProcessorInterface;
+use Magento\Translation\Model\Js\Config;
+use Magento\Translation\Model\Js\DataProviderInterface;
+use Magento\Framework\View\Asset\PreProcessor\Chain;
+use Magento\Framework\View\Asset\File\FallbackContext;
+
+/**
+ * PreProcessor responsible for providing js translation dictionary
+ */
+class PreProcessor implements PreProcessorInterface
+{
+    /**
+     * Js translation configuration
+     *
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * Translation data provider
+     *
+     * @var DataProviderInterface
+     */
+    protected $dataProvider;
+
+    /**
+     * @param Config $config
+     * @param DataProviderInterface $dataProvider
+     */
+    public function __construct(
+        Config $config,
+        DataProviderInterface $dataProvider
+    ) {
+        $this->config = $config;
+        $this->dataProvider = $dataProvider;
+    }
+
+    /**
+     * Transform content and/or content type for the specified preprocessing chain object
+     *
+     * @param Chain $chain
+     * @return void
+     */
+    public function process(Chain $chain)
+    {
+        if ($this->isDictionaryPath($chain->getTargetAssetPath())) {
+            $context = $chain->getAsset()->getContext();
+            $themePath = ($context instanceof FallbackContext) ? $context->getThemePath() : '*/*';
+            $chain->setContent(json_encode($this->dataProvider->getData($themePath)));
+            $chain->setContentType('json');
+        }
+    }
+
+    /**
+     * Is provided path the path to translation dictionary
+     *
+     * @param string $path
+     * @return bool
+     */
+    protected function isDictionaryPath($path)
+    {
+        return (strpos($path, $this->config->getDictionaryFileName()) !== false);
+    }
+}
diff --git a/app/code/Magento/Translation/Test/Unit/Block/JsTest.php b/app/code/Magento/Translation/Test/Unit/Block/JsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b929b7304568653dc1fe484408b1c5acae29896e
--- /dev/null
+++ b/app/code/Magento/Translation/Test/Unit/Block/JsTest.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Test\Unit\Block;
+
+use Magento\Translation\Block\Js;
+
+class JsTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Js
+     */
+    protected $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $configMock;
+
+    protected function setUp()
+    {
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->configMock = $this->getMockBuilder('Magento\Translation\Model\Js\Config')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->model = $objectManager->getObject('Magento\Translation\Block\Js', ['config' => $this->configMock]);
+    }
+
+    public function testIsDictionaryStrategy()
+    {
+        $this->configMock->expects($this->once())
+            ->method('dictionaryEnabled')
+            ->willReturn(true);
+        $this->assertTrue($this->model->dictionaryEnabled());
+    }
+}
diff --git a/app/code/Magento/Translation/Test/Unit/Model/Js/Config/Source/StrategyTest.php b/app/code/Magento/Translation/Test/Unit/Model/Js/Config/Source/StrategyTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..819d41663235c2739692804db7a98c97b363e207
--- /dev/null
+++ b/app/code/Magento/Translation/Test/Unit/Model/Js/Config/Source/StrategyTest.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Test\Unit\Model\Js\Config\Source;
+
+use Magento\Translation\Model\Js\Config;
+use Magento\Translation\Model\Js\Config\Source\Strategy;
+
+/**
+ * Class StrategyTest
+ */
+class StrategyTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Strategy
+     */
+    protected $model;
+
+    /**
+     * Set up
+     * @return void
+     */
+    protected function setUp()
+    {
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->model = $objectManager->getObject('Magento\Translation\Model\Js\Config\Source\Strategy');
+    }
+
+    /**
+     * Test for toOptionArray method
+     * @return void
+     */
+    public function testToOptionArray()
+    {
+        $expected = [
+            ['label' => __('None (Translation is disabled)'), 'value' => Config::NO_TRANSLATION],
+            ['label' => 'Dictionary (Translation on frontend side)', 'value' => Config::DICTIONARY_STRATEGY],
+            ['label' => 'Embedded (Translation on backend side)', 'value' => Config::EMBEDDED_STRATEGY]
+        ];
+        $this->assertEquals($expected, $this->model->toOptionArray());
+    }
+}
diff --git a/app/code/Magento/Translation/Test/Unit/Model/Js/ConfigTest.php b/app/code/Magento/Translation/Test/Unit/Model/Js/ConfigTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a0c1e59c1d3e7ca8dd2eb94a94d8dfacb75ab04f
--- /dev/null
+++ b/app/code/Magento/Translation/Test/Unit/Model/Js/ConfigTest.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Test\Unit\Model\Js;
+
+use Magento\Translation\Model\Js\Config;
+
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    protected $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeMock;
+
+    /**
+     * @var string
+     */
+    protected $patterns = ['test_pattern'];
+
+    protected function setUp()
+    {
+        $this->scopeMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->model = $objectManager->getObject(
+            'Magento\Translation\Model\Js\Config',
+            [
+                'scopeConfig' => $this->scopeMock,
+                'patterns' => $this->patterns
+            ]
+        );
+    }
+
+    public function testIsEmbeddedStrategy()
+    {
+        $this->scopeMock->expects($this->once())
+            ->method('getValue')
+            ->with(Config::XML_PATH_STRATEGY)
+            ->willReturn(Config::EMBEDDED_STRATEGY);
+        $this->assertTrue($this->model->isEmbeddedStrategy());
+    }
+
+    public function testDictionaryEnabled()
+    {
+        $this->scopeMock->expects($this->once())
+            ->method('getValue')
+            ->with(Config::XML_PATH_STRATEGY)
+            ->willReturn(Config::DICTIONARY_STRATEGY);
+        $this->assertTrue($this->model->dictionaryEnabled());
+    }
+
+    public function testgetPatterns()
+    {
+        $this->assertEquals($this->patterns, $this->model->getPatterns());
+    }
+}
diff --git a/app/code/Magento/Translation/Test/Unit/Model/Js/DataProviderTest.php b/app/code/Magento/Translation/Test/Unit/Model/Js/DataProviderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6067c28723fb4eb764f5e2b26167a984ad9b173e
--- /dev/null
+++ b/app/code/Magento/Translation/Test/Unit/Model/Js/DataProviderTest.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Test\Unit\Model\Js;
+
+use Magento\Framework\App\State;
+use Magento\Framework\App\Utility\Files;
+use Magento\Framework\Filesystem;
+use Magento\Framework\Filesystem\Directory\ReadInterface;
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Translation\Model\Js\DataProvider;
+use Magento\Translation\Model\Js\Config;
+
+/**
+ * Class DataProviderTest
+ */
+class DataProviderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var DataProvider
+     */
+    protected $model;
+
+    /**
+     * @var State|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $appStateMock;
+
+    /**
+     * @var Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $configMock;
+
+    /**
+     * @var Files|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $filesUtilityMock;
+
+    /**
+     * @var ReadInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $rootDirectoryMock;
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $this->appStateMock = $this->getMock('Magento\Framework\App\State', [], [], '', false);
+        $this->configMock = $this->getMock('Magento\Translation\Model\Js\Config', [], [], '', false);
+        $this->filesUtilityMock = $this->getMock('Magento\Framework\App\Utility\Files', [], [], '', false);
+        $filesystem = $this->getMock('Magento\Framework\Filesystem', [], [], '', false);
+        $this->rootDirectoryMock = $this->getMock('Magento\Framework\Filesystem\Directory\Read', [], [], '', false);
+        $filesystem->expects($this->once())
+            ->method('getDirectoryRead')
+            ->with(DirectoryList::ROOT)
+            ->willReturn($this->rootDirectoryMock);
+        $this->model = new DataProvider(
+            $this->appStateMock,
+            $this->configMock,
+            $filesystem,
+            $this->filesUtilityMock
+        );
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetData()
+    {
+        $themePath = 'blank';
+        $areaCode = 'adminhtml';
+        $files = [['path1'], ['path2']];
+
+        $relativePathMap = [
+            ['path1' => 'relativePath1'],
+            ['path2' => 'relativePath2']
+        ];
+        $contentsMap = [
+            ['relativePath1' => 'content1$.mage.__("hello1")content1'],
+            ['relativePath2' => 'content2$.mage.__("hello2")content2']
+        ];
+
+        $patterns = ['~\$\.mage\.__\([\'|\"](.+?)[\'|\"]\)~'];
+
+        $this->appStateMock->expects($this->once())
+            ->method('getAreaCode')
+            ->willReturn($areaCode);
+        $this->filesUtilityMock->expects($this->once())
+            ->method('getJsFiles')
+            ->with($areaCode, $themePath)
+            ->willReturn($files);
+
+        $this->rootDirectoryMock->expects($this->any())
+            ->method('getRelativePath')
+            ->willReturnMap($relativePathMap);
+        $this->rootDirectoryMock->expects($this->any())
+            ->method('readFile')
+            ->willReturnMap($contentsMap);
+        $this->configMock->expects($this->any())
+            ->method('getPatterns')
+            ->willReturn($patterns);
+
+        $this->assertEquals([], $this->model->getData($themePath));
+    }
+}
diff --git a/app/code/Magento/Translation/Test/Unit/Model/Js/PreProcessorTest.php b/app/code/Magento/Translation/Test/Unit/Model/Js/PreProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ccfbdafeb7c32842e9460fadc44a7aa61c80389
--- /dev/null
+++ b/app/code/Magento/Translation/Test/Unit/Model/Js/PreProcessorTest.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Test\Unit\Model\Js;
+
+use Magento\Translation\Model\Js\PreProcessor;
+use Magento\Translation\Model\Js\Config;
+
+class PreProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var PreProcessor
+     */
+    protected $model;
+
+    /**
+     * @var Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $configMock;
+
+    protected function setUp()
+    {
+        $this->configMock = $this->getMock('Magento\Translation\Model\Js\Config', [], [], '', false);
+        $this->model = new PreProcessor($this->configMock);
+    }
+
+    public function testGetData()
+    {
+        $chain = $this->getMock('Magento\Framework\View\Asset\PreProcessor\Chain', [], [], '', false);
+        $originalContent = 'content$.mage.__("hello1")content';
+        $translatedContent = 'content"hello1"content';
+        $patterns = ['~\$\.mage\.__\([\'|\"](.+?)[\'|\"]\)~'];
+
+        $this->configMock->expects($this->once())
+            ->method('isEmbeddedStrategy')
+            ->willReturn(true);
+        $chain->expects($this->once())
+            ->method('getContent')
+            ->willReturn($originalContent);
+        $this->configMock->expects($this->once())
+            ->method('getPatterns')
+            ->willReturn($patterns);
+
+        $chain->expects($this->once())
+            ->method('setContent')
+            ->with($translatedContent);
+
+        $this->model->process($chain);
+    }
+}
diff --git a/app/code/Magento/Translation/Test/Unit/Model/Json/PreProcessorTest.php b/app/code/Magento/Translation/Test/Unit/Model/Json/PreProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b5e0fb2299b09aeb984eec7b80f43116f22f961
--- /dev/null
+++ b/app/code/Magento/Translation/Test/Unit/Model/Json/PreProcessorTest.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Translation\Test\Unit\Model\Json;
+
+use Magento\Translation\Model\Js\Config;
+use Magento\Translation\Model\Js\DataProvider;
+use Magento\Translation\Model\Json\PreProcessor;
+
+class PreProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var PreProcessor
+     */
+    protected $model;
+
+    /**
+     * @var Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $configMock;
+
+    /**
+     * @var DataProvider|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dataProviderMock;
+
+    protected function setUp()
+    {
+        $this->configMock = $this->getMock('Magento\Translation\Model\Js\Config', [], [], '', false);
+        $this->dataProviderMock = $this->getMock('Magento\Translation\Model\Js\DataProvider', [], [], '', false);
+        $this->model = new PreProcessor($this->configMock, $this->dataProviderMock);
+    }
+
+    public function testGetData()
+    {
+        $chain = $this->getMock('Magento\Framework\View\Asset\PreProcessor\Chain', [], [], '', false);
+        $asset = $this->getMock('Magento\Framework\View\Asset\File', [], [], '', false);
+        $context = $this->getMock('Magento\Framework\View\Asset\File\FallbackContext', [], [], '', false);
+        $fileName = 'js-translation.json';
+        $targetPath = 'path/js-translation.json';
+        $themePath = '*/*';
+        $dictionary = ['hello' => 'bonjour'];
+
+        $chain->expects($this->once())
+            ->method('getTargetAssetPath')
+            ->willReturn($targetPath);
+        $this->configMock->expects($this->once())
+            ->method('getDictionaryFileName')
+            ->willReturn($fileName);
+        $chain->expects($this->once())
+            ->method('getAsset')
+            ->willReturn($asset);
+        $asset->expects($this->once())
+            ->method('getContext')
+            ->willReturn($context);
+        $context->expects($this->once())
+            ->method('getThemePath')
+            ->willReturn($themePath);
+        $this->dataProviderMock->expects($this->once())
+            ->method('getData')
+            ->with($themePath)
+            ->willReturn($dictionary);
+        $chain->expects($this->once())
+            ->method('setContent')
+            ->with(json_encode($dictionary));
+        $chain->expects($this->once())
+            ->method('setContentType')
+            ->with('json');
+
+        $this->model->process($chain);
+    }
+}
diff --git a/app/code/Magento/Translation/etc/adminhtml/system.xml b/app/code/Magento/Translation/etc/adminhtml/system.xml
new file mode 100644
index 0000000000000000000000000000000000000000..90d70e824ced6cd42cef19b0d51c39e32e5e08eb
--- /dev/null
+++ b/app/code/Magento/Translation/etc/adminhtml/system.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Config/etc/system_file.xsd">
+    <system>
+        <section id="dev">
+            <group id="js">
+                <field id="translate_strategy" translate="label" type="select" sortOrder="30" showInDefault="1" showInWebsite="0" showInStore="0">
+                    <label>Translation Strategy</label>
+                    <source_model>Magento\Translation\Model\Js\Config\Source\Strategy</source_model>
+                    <comment>Please put your store into maintenance mode and redeploy static files after changing strategy</comment>
+                </field>
+            </group>
+        </section>
+    </system>
+</config>
diff --git a/app/code/Magento/Translation/etc/config.xml b/app/code/Magento/Translation/etc/config.xml
index ae18303a6bc7320f54be043c77d802324d4d6d48..391f9c3fba00bb6e418872b533c82e13c6eaddb0 100644
--- a/app/code/Magento/Translation/etc/config.xml
+++ b/app/code/Magento/Translation/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <dev>
             <translate_inline>
@@ -15,6 +15,9 @@
                     <block_html />
                 </invalid_caches>
             </translate_inline>
+            <js>
+                <translate_strategy>none</translate_strategy>
+            </js>
         </dev>
     </default>
 </config>
diff --git a/app/code/Magento/Translation/etc/di.xml b/app/code/Magento/Translation/etc/di.xml
index 3507d99af6eec6b55fb3c2b7681e76f7510bdf34..c411e653425d197cc7fc4096d6426113ccd94aa1 100644
--- a/app/code/Magento/Translation/etc/di.xml
+++ b/app/code/Magento/Translation/etc/di.xml
@@ -13,6 +13,8 @@
     <preference for="Magento\Framework\Translate\ResourceInterface" type="Magento\Translation\Model\Resource\Translate" />
     <preference for="Magento\Framework\Translate\Inline\StateInterface" type="Magento\Framework\Translate\Inline\State" />
     <preference for="Magento\Framework\Phrase\RendererInterface" type="Magento\Framework\Phrase\Renderer\Composite" />
+    <preference for="Magento\Translation\Model\Js\DataProviderInterface" type="Magento\Translation\Model\Js\DataProvider"/>
+    <preference for="Magento\Framework\Translate\Js\Config" type="Magento\Translation\Model\Js\Config"/>
     <type name="Magento\Framework\Translate\Inline">
         <arguments>
             <argument name="templateFileName" xsi:type="string">Magento_Translation::translate_inline.phtml</argument>
@@ -52,4 +54,27 @@
             </argument>
         </arguments>
     </type>
+    <type name="Magento\Translation\Model\Js\Config">
+        <arguments>
+            <argument name="patterns" xsi:type="array">
+                <item name="mage_translation_widget" xsi:type="string">~\$\.mage\.__\([\'|\"](.+?)[\'|\"]\)~</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\View\Asset\PreProcessor\Pool">
+        <arguments>
+            <argument name="preProcessors" xsi:type="array">
+                <item name="js" xsi:type="array">
+                    <item name="js" xsi:type="array">
+                        <item name="js_translation" xsi:type="string">Magento\Translation\Model\Js\PreProcessor</item>
+                    </item>
+                </item>
+                <item name="json" xsi:type="array">
+                    <item name="json" xsi:type="array">
+                        <item name="json_generation" xsi:type="string">Magento\Translation\Model\Json\PreProcessor</item>
+                    </item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Translation/etc/module.xml b/app/code/Magento/Translation/etc/module.xml
index 0b973ed3ef7beaa4cb84e83e07e9debccd8bffba..669f8ae935645323723a5ea9e3732458e497f8dc 100644
--- a/app/code/Magento/Translation/etc/module.xml
+++ b/app/code/Magento/Translation/etc/module.xml
@@ -7,8 +7,5 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
     <module name="Magento_Translation" setup_version="2.0.0">
-        <sequence>
-            <module name="Magento_Core"/>
-        </sequence>
     </module>
 </config>
diff --git a/app/code/Magento/Translation/view/base/templates/translate.phtml b/app/code/Magento/Translation/view/base/templates/translate.phtml
index be33473e166c7bb81300b8209fe7f11cda7654e3..d6c010e876528c017458f6af3c9734b10e47bce7 100644
--- a/app/code/Magento/Translation/view/base/templates/translate.phtml
+++ b/app/code/Magento/Translation/view/base/templates/translate.phtml
@@ -3,12 +3,17 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+// @codingStandardsIgnoreFile
 ?>
 <?php /** @var $block \Magento\Translation\Block\Js */ ?>
+<?php if ($block->dictionaryEnabled()): ?>
 <script>
-//<![CDATA[
-    require(
-        ["jquery", "mage/translate"], function($){ $.mage.translate.add( <?php echo $block->getTranslatedJson() ?> ); }
-    )
-// ]]>
+require([
+    "jquery",
+    "mage/translate",
+    "text!<?php echo Magento\Translation\Model\Js\Config::DICTIONARY_FILE_NAME?>"
+], function($, translate, data) {
+    $.mage.translate.add(JSON.parse(data));
+});
 </script>
+<?php endif; ?>
diff --git a/app/code/Magento/Ups/etc/config.xml b/app/code/Magento/Ups/etc/config.xml
index 0ff0850998865dce77c0dad749fac8982e896b39..b3df7eabdde155e4811c5ae26695b7afdd28e2b5 100644
--- a/app/code/Magento/Ups/etc/config.xml
+++ b/app/code/Magento/Ups/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <carriers>
             <ups>
diff --git a/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php b/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php
index 517babf6cde83e102b292977fef0d25339a1e59d..6bd75f0bcdff14bf119a145beb1443d42260fb29 100644
--- a/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php
+++ b/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php
@@ -5,14 +5,12 @@
  */
 namespace Magento\UrlRewrite\Service\V1\Data;
 
-use Magento\Framework\Api\AbstractExtensibleObject;
-use \Magento\Framework\Api\AttributeValueFactory;
-use \Magento\Framework\Api\MetadataServiceInterface;
+use Magento\Framework\Api\AbstractSimpleObject;
 
 /**
  * Data abstract class for url storage
  */
-class UrlRewrite extends AbstractExtensibleObject
+class UrlRewrite extends AbstractSimpleObject
 {
     /**#@+
      * Value object attribute names
@@ -39,22 +37,6 @@ class UrlRewrite extends AbstractExtensibleObject
         self::DESCRIPTION => null,
     ];
 
-    /**
-     * Initialize internal storage
-     *
-     * @param MetadataServiceInterface $metadataService
-     * @param AttributeValueFactory $attributeValueFactory
-     * @param array $data
-     */
-    public function __construct(
-        MetadataServiceInterface $metadataService,
-        AttributeValueFactory $attributeValueFactory,
-        $data = []
-    ) {
-        $data = array_merge($this->defaultValues, $data);
-        parent::__construct($metadataService, $attributeValueFactory, $data);
-    }
-
     /**
      * Get data by key
      *
@@ -124,7 +106,8 @@ class UrlRewrite extends AbstractExtensibleObject
      */
     public function getIsAutogenerated()
     {
-        return $this->_get(self::IS_AUTOGENERATED);
+        return $this->_get(self::IS_AUTOGENERATED) === null ?
+            $this->defaultValues[self::IS_AUTOGENERATED] : $this->_get(self::IS_AUTOGENERATED);
     }
 
     /**
@@ -256,6 +239,6 @@ class UrlRewrite extends AbstractExtensibleObject
      */
     public function toArray()
     {
-        return $this->_data;
+        return array_merge($this->defaultValues, $this->_data);
     }
 }
diff --git a/app/code/Magento/UrlRewrite/etc/config.xml b/app/code/Magento/UrlRewrite/etc/config.xml
index a174ec7abdd2bcf9bd418008f92a48ab6b3374f0..0179be80676ffaf771c3945882115a947e4bf62e 100644
--- a/app/code/Magento/UrlRewrite/etc/config.xml
+++ b/app/code/Magento/UrlRewrite/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <url_rewrite>
             <entity_types>
diff --git a/app/code/Magento/User/etc/config.xml b/app/code/Magento/User/etc/config.xml
index 1496ade1d2170a7d9f73927ceded5ac24ab19265..6ef863af41a76d4c51389704d015394304001585 100644
--- a/app/code/Magento/User/etc/config.xml
+++ b/app/code/Magento/User/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <admin>
             <emails>
diff --git a/app/code/Magento/Usps/composer.json b/app/code/Magento/Usps/composer.json
index be86d099ce9c69870617f49046995e24886cb319..41c06f2dbd0461bc65cb25993b566acbf0530d30 100644
--- a/app/code/Magento/Usps/composer.json
+++ b/app/code/Magento/Usps/composer.json
@@ -6,11 +6,11 @@
         "magento/module-store": "0.42.0-beta11",
         "magento/module-shipping": "0.42.0-beta11",
         "magento/module-directory": "0.42.0-beta11",
-        "magento/module-core": "0.42.0-beta11",
         "magento/module-catalog": "0.42.0-beta11",
         "magento/module-sales": "0.42.0-beta11",
         "magento/module-catalog-inventory": "0.42.0-beta11",
         "magento/module-quote": "0.42.0-beta11",
+        "magento/module-config": "0.42.0-beta11",
         "magento/framework": "0.42.0-beta11",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
diff --git a/app/code/Magento/Usps/etc/config.xml b/app/code/Magento/Usps/etc/config.xml
index db37b2e8aafd7705a6b2b72fde6e006ea37231cb..972c58188197743a4a1791eed981dafaea4b953c 100644
--- a/app/code/Magento/Usps/etc/config.xml
+++ b/app/code/Magento/Usps/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <carriers>
             <usps>
diff --git a/app/code/Magento/Variable/i18n/de_DE.csv b/app/code/Magento/Variable/i18n/de_DE.csv
new file mode 100644
index 0000000000000000000000000000000000000000..5b82c65d44622a54d7d365b4458e96df3f0ad5d4
--- /dev/null
+++ b/app/code/Magento/Variable/i18n/de_DE.csv
@@ -0,0 +1,4 @@
+"Custom Variables","Angepasste Variablen"
+"Variable Code must be unique.","Variabler Code muß eindeutig sein."
+"Validation has failed.","Prüfung fehlgeschlagen."
+"Insert Variable...","Insert Variable..."
diff --git a/app/code/Magento/Variable/i18n/en_US.csv b/app/code/Magento/Variable/i18n/en_US.csv
new file mode 100644
index 0000000000000000000000000000000000000000..d68ff06262284b6f05c4f7b5d889d9088673c0f1
--- /dev/null
+++ b/app/code/Magento/Variable/i18n/en_US.csv
@@ -0,0 +1,4 @@
+"Custom Variables","Custom Variables"
+"Variable Code must be unique.","Variable Code must be unique."
+"Validation has failed.","Validation has failed."
+"Insert Variable...","Insert Variable..."
diff --git a/app/code/Magento/Variable/i18n/es_ES.csv b/app/code/Magento/Variable/i18n/es_ES.csv
new file mode 100644
index 0000000000000000000000000000000000000000..a17a926b175fcdd5189d3562f4cf843df86504ad
--- /dev/null
+++ b/app/code/Magento/Variable/i18n/es_ES.csv
@@ -0,0 +1,4 @@
+"Custom Variables","Variables personalizadas"
+"Variable Code must be unique.","El código de variable debe ser único."
+"Validation has failed.","Falló la validación."
+"Insert Variable...","Insert Variable..."
diff --git a/app/code/Magento/Variable/i18n/fr_FR.csv b/app/code/Magento/Variable/i18n/fr_FR.csv
new file mode 100644
index 0000000000000000000000000000000000000000..8f14328226eb363ef5141bedf4e73c999f23e4fd
--- /dev/null
+++ b/app/code/Magento/Variable/i18n/fr_FR.csv
@@ -0,0 +1,4 @@
+"Custom Variables","Variables sur mesure"
+"Variable Code must be unique.","La variable code doit être unique."
+"Validation has failed.","Validation a échouée"
+"Insert Variable...","Insert Variable..."
diff --git a/app/code/Magento/Variable/i18n/nl_NL.csv b/app/code/Magento/Variable/i18n/nl_NL.csv
new file mode 100644
index 0000000000000000000000000000000000000000..e16b8d4192b1b0eed3f01a2d806482d84d94de8a
--- /dev/null
+++ b/app/code/Magento/Variable/i18n/nl_NL.csv
@@ -0,0 +1,4 @@
+"Custom Variables","Aangepaste variabelen"
+"Variable Code must be unique.","Variabele Code moet uniek zijn."
+"Validation has failed.","Validatie is mislukt."
+"Insert Variable...","Insert Variable..."
diff --git a/app/code/Magento/Variable/i18n/pt_BR.csv b/app/code/Magento/Variable/i18n/pt_BR.csv
new file mode 100644
index 0000000000000000000000000000000000000000..e073700f36435e76d055a351da2bba66824895c5
--- /dev/null
+++ b/app/code/Magento/Variable/i18n/pt_BR.csv
@@ -0,0 +1,4 @@
+"Custom Variables","Variáveis de Personalização."
+"Variable Code must be unique.","Código da Variável deve ser único."
+"Validation has failed.","Validação falhou."
+"Insert Variable...","Insert Variable..."
diff --git a/app/code/Magento/Variable/i18n/zh_CN.csv b/app/code/Magento/Variable/i18n/zh_CN.csv
new file mode 100644
index 0000000000000000000000000000000000000000..b690819a8319dfedfd8aa2579201e599fb7c276d
--- /dev/null
+++ b/app/code/Magento/Variable/i18n/zh_CN.csv
@@ -0,0 +1,4 @@
+"Custom Variables",自定义变量
+"Variable Code must be unique.",变量代码必须是唯一的。
+"Validation has failed.",验证失败。
+"Insert Variable...","Insert Variable..."
diff --git a/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php b/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php
index eb4e56cce9589f9662172de73a4dabcfdd081d20..862b8278d9a942ab4c23edc36034ed37c5aaff28 100644
--- a/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php
+++ b/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php
@@ -6,6 +6,7 @@
 namespace Magento\Webapi\Controller\Soap\Request;
 
 use Magento\Framework\Api\ExtensibleDataInterface;
+use Magento\Framework\Api\MetadataObjectInterface;
 use Magento\Framework\Api\SimpleDataObjectConverter;
 use Magento\Framework\AuthorizationInterface;
 use Magento\Framework\Exception\AuthorizationException;
@@ -156,7 +157,7 @@ class Handler
         } elseif (is_array($data)) {
             $dataType = substr($dataType, 0, -2);
             foreach ($data as $key => $value) {
-                if ($value instanceof ExtensibleDataInterface) {
+                if ($value instanceof ExtensibleDataInterface || $value instanceof MetadataObjectInterface) {
                     $result[] = $this->_dataObjectConverter
                         ->convertKeysToCamelCase($this->_dataObjectProcessor->buildOutputDataArray($value, $dataType));
                 } else {
diff --git a/app/code/Magento/Webapi/Model/Config.php b/app/code/Magento/Webapi/Model/Config.php
index af0823e23e7838d21fedcd31515728fc8f0dd91f..1691f95834932b1aa6e26ec2298a0fff0c7c36d9 100644
--- a/app/code/Magento/Webapi/Model/Config.php
+++ b/app/code/Magento/Webapi/Model/Config.php
@@ -70,65 +70,4 @@ class Config
         }
         return $this->services;
     }
-
-    /**
-     * Identify the list of service name parts including sub-services using class name.
-     *
-     * Examples of input/output pairs:
-     * <pre>
-     * - 'Magento\Customer\Service\V1\CustomerAccountInterface', false => ['CustomerCustomerAccount']
-     * - 'Vendor\Customer\Service\V1\Customer\AddressInterface', true  => ['VendorCustomer', 'Address', 'V1']
-     * </pre>
-     *
-     * @param string $className
-     * @param bool $preserveVersion Should version be preserved during class name conversion into service name
-     * @return string[]
-     * @throws \InvalidArgumentException When class is not valid API service.
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     */
-    public function getServiceNameParts($className, $preserveVersion = false)
-    {
-        if (!preg_match(\Magento\Webapi\Model\Config::SERVICE_CLASS_PATTERN, $className, $matches)) {
-            $apiClassPattern = "#^(.+?)\\\\(.+?)\\\\Api\\\\(.+?)(Interface)?$#";
-            preg_match($apiClassPattern, $className, $matches);
-        }
-
-        if (!empty($matches)) {
-            $moduleNamespace = $matches[1];
-            $moduleName = $matches[2];
-            $moduleNamespace = ($moduleNamespace == 'Magento') ? '' : $moduleNamespace;
-            if ($matches[4] === 'Interface') {
-                $matches[4] = $matches[3];
-                $matches[3] = 'V1';
-            }
-            $serviceNameParts = explode('\\', trim($matches[4], '\\'));
-            if ($moduleName == $serviceNameParts[0]) {
-                /** Avoid duplication of words in service name */
-                $moduleName = '';
-            }
-            $parentServiceName = $moduleNamespace . $moduleName . array_shift($serviceNameParts);
-            array_unshift($serviceNameParts, $parentServiceName);
-            if ($preserveVersion) {
-                $serviceVersion = $matches[3];
-                $serviceNameParts[] = $serviceVersion;
-            }
-            return $serviceNameParts;
-        } elseif (preg_match(\Magento\Webapi\Model\Config::API_PATTERN, $className, $matches)) {
-            $moduleNamespace = $matches[1];
-            $moduleName = $matches[2];
-            $moduleNamespace = ($moduleNamespace == 'Magento') ? '' : $moduleNamespace;
-            $serviceNameParts = explode('\\', trim($matches[3], '\\'));
-            if ($moduleName == $serviceNameParts[0]) {
-                /** Avoid duplication of words in service name */
-                $moduleName = '';
-            }
-            $parentServiceName = $moduleNamespace . $moduleName . array_shift($serviceNameParts);
-            array_unshift($serviceNameParts, $parentServiceName);
-            //Add temporary dummy version
-            $serviceNameParts[] = 'V1';
-            return $serviceNameParts;
-        }
-
-        throw new \InvalidArgumentException(sprintf('The service interface name "%s" is invalid.', $className));
-    }
 }
diff --git a/app/code/Magento/Webapi/Model/Config/Converter.php b/app/code/Magento/Webapi/Model/Config/Converter.php
index 44a8b35ee635f05f536f055c6d063dd107643ac0..c9b557f099fa5c12d20498fd8b79155aa65675cc 100644
--- a/app/code/Magento/Webapi/Model/Config/Converter.php
+++ b/app/code/Magento/Webapi/Model/Config/Converter.php
@@ -26,11 +26,11 @@ class Converter implements \Magento\Framework\Config\ConverterInterface
     const KEY_DATA_PARAMETERS = 'parameters';
     const KEY_SOURCE = 'source';
     const KEY_METHOD = 'method';
+    const KEY_METHODS = 'methods';
     /**#@-*/
 
     /**
      * {@inheritdoc}
-     *
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
      */
@@ -48,6 +48,13 @@ class Converter implements \Magento\Framework\Config\ConverterInterface
             $service = $route->getElementsByTagName('service')->item(0);
             $serviceClass = $service->attributes->getNamedItem('class')->nodeValue;
             $serviceMethod = $service->attributes->getNamedItem('method')->nodeValue;
+            $url = trim($route->attributes->getNamedItem('url')->nodeValue);
+            $version = $this->convertVersion($url);
+
+            $serviceClassData = [];
+            if (isset($result[self::KEY_SERVICES][$serviceClass][$version])) {
+                $serviceClassData = $result[self::KEY_SERVICES][$serviceClass][$version];
+            }
 
             $resources = $route->getElementsByTagName('resource');
             $resourceReferences = [];
@@ -62,48 +69,24 @@ class Converter implements \Magento\Framework\Config\ConverterInterface
                 // For SOAP
                 $resourcePermissionSet[] = $ref;
             }
-            if (!isset($result[self::KEY_SERVICES][$serviceClass][$serviceMethod][self::KEY_ACL_RESOURCES])) {
-                $result[self::KEY_SERVICES][$serviceClass][$serviceMethod][self::KEY_ACL_RESOURCES]
-                    = $resourcePermissionSet;
+
+            if (!isset($serviceClassData[self::KEY_METHODS][$serviceMethod])) {
+                $serviceClassData[self::KEY_METHODS][$serviceMethod][self::KEY_ACL_RESOURCES] = $resourcePermissionSet;
             } else {
-                $result[self::KEY_SERVICES][$serviceClass][$serviceMethod][self::KEY_ACL_RESOURCES] =
+                $serviceClassData[self::KEY_METHODS][$serviceMethod][self::KEY_ACL_RESOURCES] =
                     array_unique(
                         array_merge(
-                            $result[self::KEY_SERVICES][$serviceClass][$serviceMethod][self::KEY_ACL_RESOURCES],
+                            $serviceClassData[self::KEY_METHODS][$serviceMethod][self::KEY_ACL_RESOURCES],
                             $resourcePermissionSet
                         )
                     );
             }
 
-            $parameters = $route->getElementsByTagName('parameter');
-            $data = [];
-            /** @var \DOMElement $parameter */
-            foreach ($parameters as $parameter) {
-                if ($parameter->nodeType != XML_ELEMENT_NODE) {
-                    continue;
-                }
-                $name = $parameter->attributes->getNamedItem('name')->nodeValue;
-                $forceNode = $parameter->attributes->getNamedItem('force');
-                $force = $forceNode ? (bool)$forceNode->nodeValue : false;
-                $value = $parameter->nodeValue;
-                $data[$name] = [
-                    self::KEY_FORCE => $force,
-                    self::KEY_VALUE => ($value === 'null') ? null : $value,
-                ];
-                $sourceNode = $parameter->attributes->getNamedItem('source');
-                if ($sourceNode) {
-                    $data[$name][self::KEY_SOURCE] = $sourceNode->nodeValue;
-                }
-                $methodNode = $parameter->attributes->getNamedItem('method');
-                if ($methodNode) {
-                    $data[$name][self::KEY_METHOD] = $methodNode->nodeValue;
-                }
-            }
-
             $method = $route->attributes->getNamedItem('method')->nodeValue;
-            $url = trim($route->attributes->getNamedItem('url')->nodeValue);
             $secureNode = $route->attributes->getNamedItem('secure');
             $secure = $secureNode ? (bool)trim($secureNode->nodeValue) : false;
+            $data = $this->convertMethodParameters($route->getElementsByTagName('parameter'));
+
             // We could handle merging here by checking if the route already exists
             $result[self::KEY_ROUTES][$url][$method] = [
                 self::KEY_SECURE => $secure,
@@ -114,12 +97,62 @@ class Converter implements \Magento\Framework\Config\ConverterInterface
                 self::KEY_ACL_RESOURCES => $resourceReferences,
                 self::KEY_DATA_PARAMETERS => $data,
             ];
+
             $serviceSecure = false;
-            if (isset($result[self::KEY_SERVICES][$serviceClass][$serviceMethod][self::KEY_SECURE])) {
-                $serviceSecure = $result[self::KEY_SERVICES][$serviceClass][$serviceMethod][self::KEY_SECURE];
+            if (isset($serviceClassData[self::KEY_METHODS][$serviceMethod][self::KEY_SECURE])) {
+                $serviceSecure = $serviceClassData[self::KEY_METHODS][$serviceMethod][self::KEY_SECURE];
             }
-            $result[self::KEY_SERVICES][$serviceClass][$serviceMethod][self::KEY_SECURE] = $serviceSecure || $secure;
+            $serviceClassData[self::KEY_METHODS][$serviceMethod][self::KEY_SECURE] = $serviceSecure || $secure;
+
+            $result[self::KEY_SERVICES][$serviceClass][$version] = $serviceClassData;
         }
         return $result;
     }
+
+    /**
+     * Parses the method parameters into a string array.
+     *
+     * @param \DOMNodeList $parameters
+     * @return array
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     */
+    protected function convertMethodParameters($parameters)
+    {
+        $data = [];
+        /** @var \DOMElement $parameter */
+        foreach ($parameters as $parameter) {
+            if ($parameter->nodeType != XML_ELEMENT_NODE) {
+                continue;
+            }
+            $name = $parameter->attributes->getNamedItem('name')->nodeValue;
+            $forceNode = $parameter->attributes->getNamedItem('force');
+            $force = $forceNode ? (bool)$forceNode->nodeValue : false;
+            $value = $parameter->nodeValue;
+            $data[$name] = [
+                self::KEY_FORCE => $force,
+                self::KEY_VALUE => ($value === 'null') ? null : $value,
+            ];
+            $sourceNode = $parameter->attributes->getNamedItem('source');
+            if ($sourceNode) {
+                $data[$name][self::KEY_SOURCE] = $sourceNode->nodeValue;
+            }
+            $methodNode = $parameter->attributes->getNamedItem('method');
+            if ($methodNode) {
+                $data[$name][self::KEY_METHOD] = $methodNode->nodeValue;
+            }
+        }
+        return $data;
+    }
+
+    /**
+     * Derive the version from the provided URL.
+     * Assumes the version is the first portion of the URL. For example, '/V1/customers'
+     *
+     * @param string $url
+     * @return string
+     */
+    protected function convertVersion($url)
+    {
+        return substr($url, 1, strpos($url, '/', 1)-1);
+    }
 }
diff --git a/app/code/Magento/Webapi/Model/Soap/Config.php b/app/code/Magento/Webapi/Model/Soap/Config.php
index 1d686f3f1f06f67083c01a4d7b2183b7a98dee04..70c89d3c12efd0b01707cdca5d2399f1d4d992d2 100644
--- a/app/code/Magento/Webapi/Model/Soap/Config.php
+++ b/app/code/Magento/Webapi/Model/Soap/Config.php
@@ -104,7 +104,7 @@ class Config
     /**
      * Retrieve the list of SOAP operations available in the system
      *
-     * @param array $requestedService The list of requested services with their versions
+     * @param array $requestedServices The list of requested services with their versions
      * @return array <pre>
      * array(
      *     array(
@@ -115,15 +115,15 @@ class Config
      *      ...
      * )</pre>
      */
-    protected function getSoapOperations($requestedService)
+    protected function getSoapOperations($requestedServices)
     {
         if (null == $this->soapOperations) {
             $this->soapOperations = [];
-            foreach ($this->getRequestedSoapServices($requestedService) as $serviceData) {
+            foreach ($this->getRequestedSoapServices($requestedServices) as $serviceName => $serviceData) {
                 foreach ($serviceData[self::KEY_SERVICE_METHODS] as $methodData) {
                     $method = $methodData[self::KEY_METHOD];
                     $class = $serviceData[self::KEY_CLASS];
-                    $operationName = $this->getSoapOperation($class, $method);
+                    $operationName = $serviceName . ucfirst($method);
                     $this->soapOperations[$operationName] = [
                         self::KEY_CLASS => $class,
                         self::KEY_METHOD => $method,
@@ -163,25 +163,27 @@ class Config
     protected function initServicesMetadata()
     {
         $soapServices = [];
-        foreach ($this->config->getServices()[Converter::KEY_SERVICES] as $serviceClass => $serviceData) {
-            $serviceName = $this->getServiceName($serviceClass);
-            foreach ($serviceData as $methodName => $methodMetadata) {
-                $soapServices[$serviceName][self::KEY_SERVICE_METHODS][$methodName] = [
-                    self::KEY_METHOD => $methodName,
-                    self::KEY_IS_REQUIRED => (bool)$methodMetadata[Converter::KEY_SECURE],
-                    self::KEY_IS_SECURE => $methodMetadata[Converter::KEY_SECURE],
-                    self::KEY_ACL_RESOURCES => $methodMetadata[Converter::KEY_ACL_RESOURCES],
-                ];
-                $soapServices[$serviceName][self::KEY_CLASS] = $serviceClass;
+        foreach ($this->config->getServices()[Converter::KEY_SERVICES] as $serviceClass => $serviceVersionData) {
+            foreach ($serviceVersionData as $version => $serviceData) {
+                $serviceName = $this->getServiceName($serviceClass, $version);
+                foreach ($serviceData[Converter::KEY_METHODS] as $methodName => $methodMetadata) {
+                    $soapServices[$serviceName][self::KEY_SERVICE_METHODS][$methodName] = [
+                        self::KEY_METHOD => $methodName,
+                        self::KEY_IS_REQUIRED => (bool)$methodMetadata[Converter::KEY_SECURE],
+                        self::KEY_IS_SECURE => $methodMetadata[Converter::KEY_SECURE],
+                        self::KEY_ACL_RESOURCES => $methodMetadata[Converter::KEY_ACL_RESOURCES],
+                    ];
+                    $soapServices[$serviceName][self::KEY_CLASS] = $serviceClass;
+                }
+                $reflectedMethodsMetadata = $this->classReflector->reflectClassMethods(
+                    $serviceClass,
+                    $soapServices[$serviceName][self::KEY_SERVICE_METHODS]
+                );
+                $soapServices[$serviceName][self::KEY_SERVICE_METHODS] = array_merge_recursive(
+                    $soapServices[$serviceName][self::KEY_SERVICE_METHODS],
+                    $reflectedMethodsMetadata
+                );
             }
-            $reflectedMethodsMetadata = $this->classReflector->reflectClassMethods(
-                $serviceClass,
-                $soapServices[$serviceName][self::KEY_SERVICE_METHODS]
-            );
-            $soapServices[$serviceName][self::KEY_SERVICE_METHODS] = array_merge_recursive(
-                $soapServices[$serviceName][self::KEY_SERVICE_METHODS],
-                $reflectedMethodsMetadata
-            );
         }
 
         return $soapServices;
@@ -225,7 +227,7 @@ class Config
         $soapServicesConfig = $this->getSoapServicesConfig();
         foreach ($requestedServices as $serviceName) {
             if (isset($soapServicesConfig[$serviceName])) {
-                $services[] = $soapServicesConfig[$serviceName];
+                $services[$serviceName] = $soapServicesConfig[$serviceName];
             }
         }
         return $services;
@@ -236,11 +238,12 @@ class Config
      *
      * @param string $interfaceName e.g. \Magento\Catalog\Api\ProductInterfaceV1
      * @param string $methodName e.g. create
+     * @param string $version
      * @return string e.g. catalogProductCreate
      */
-    public function getSoapOperation($interfaceName, $methodName)
+    public function getSoapOperation($interfaceName, $methodName, $version)
     {
-        $serviceName = $this->getServiceName($interfaceName);
+        $serviceName = $this->getServiceName($interfaceName, $version);
         $operationName = $serviceName . ucfirst($methodName);
         return $operationName;
     }
@@ -270,13 +273,53 @@ class Config
      * </pre>
      *
      * @param string $interfaceName
+     * @param string $version
      * @param bool $preserveVersion Should version be preserved during interface name conversion into service name
      * @return string
      * @throws \InvalidArgumentException
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
-    public function getServiceName($interfaceName, $preserveVersion = true)
+    public function getServiceName($interfaceName, $version, $preserveVersion = true)
     {
-        $serviceNameParts = $this->config->getServiceNameParts($interfaceName, $preserveVersion);
+        if (!preg_match(\Magento\Webapi\Model\Config::SERVICE_CLASS_PATTERN, $interfaceName, $matches)) {
+            $apiClassPattern = "#^(.+?)\\\\(.+?)\\\\Api\\\\(.+?)(Interface)?$#";
+            preg_match($apiClassPattern, $interfaceName, $matches);
+        }
+
+        if (!empty($matches)) {
+            $moduleNamespace = $matches[1];
+            $moduleName = $matches[2];
+            $moduleNamespace = ($moduleNamespace == 'Magento') ? '' : $moduleNamespace;
+            if ($matches[4] === 'Interface') {
+                $matches[4] = $matches[3];
+            }
+            $serviceNameParts = explode('\\', trim($matches[4], '\\'));
+            if ($moduleName == $serviceNameParts[0]) {
+                /** Avoid duplication of words in service name */
+                $moduleName = '';
+            }
+            $parentServiceName = $moduleNamespace . $moduleName . array_shift($serviceNameParts);
+            array_unshift($serviceNameParts, $parentServiceName);
+            if ($preserveVersion) {
+                $serviceNameParts[] = $version;
+            }
+        } elseif (preg_match(\Magento\Webapi\Model\Config::API_PATTERN, $interfaceName, $matches)) {
+            $moduleNamespace = $matches[1];
+            $moduleName = $matches[2];
+            $moduleNamespace = ($moduleNamespace == 'Magento') ? '' : $moduleNamespace;
+            $serviceNameParts = explode('\\', trim($matches[3], '\\'));
+            if ($moduleName == $serviceNameParts[0]) {
+                /** Avoid duplication of words in service name */
+                $moduleName = '';
+            }
+            $parentServiceName = $moduleNamespace . $moduleName . array_shift($serviceNameParts);
+            array_unshift($serviceNameParts, $parentServiceName);
+            if ($preserveVersion) {
+                $serviceNameParts[] = $version;
+            }
+        } else {
+            throw new \InvalidArgumentException(sprintf('The service interface name "%s" is invalid.', $interfaceName));
+        }
         return lcfirst(implode('', $serviceNameParts));
     }
 }
diff --git a/app/code/Magento/Webapi/Test/Unit/Controller/RestTest.php b/app/code/Magento/Webapi/Test/Unit/Controller/RestTest.php
index 734a50ea3e2a3b5e0de99fed4c66aea7a41ac936..30a175b6024bfaacf78b4079203ceffb36e2256b 100644
--- a/app/code/Magento/Webapi/Test/Unit/Controller/RestTest.php
+++ b/app/code/Magento/Webapi/Test/Unit/Controller/RestTest.php
@@ -82,7 +82,7 @@ class RestTest extends \PHPUnit_Framework_TestCase
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
     protected $areaMock;
-
+    
     /**
      * @var \Magento\Webapi\Controller\Rest\ParamsOverrider|\PHPUnit_Framework_MockObject_MockObject
      */
diff --git a/app/code/Magento/Webapi/Test/Unit/Model/Config/_files/webapi.php b/app/code/Magento/Webapi/Test/Unit/Model/Config/_files/webapi.php
index 4f48117117fe5802137e04dc002b86c4a472a0f5..aecbdbde2dcecb4ea98897510899513cb08a7528 100644
--- a/app/code/Magento/Webapi/Test/Unit/Model/Config/_files/webapi.php
+++ b/app/code/Magento/Webapi/Test/Unit/Model/Config/_files/webapi.php
@@ -6,26 +6,30 @@
 return [
     'services' => [
         'Magento\Customer\Api\CustomerRepositoryInterface' => [
-            'getById' => [
-                'resources' => [
-                    'Magento_Customer::customer_self',
-                    'Magento_Customer::read',
-                ],
-                'secure' => false,
-            ],
-            'save' => [
-                'resources' => [
-                    'Magento_Customer::customer_self',
-                    'Magento_Customer::manage'
-                ],
-                'secure' => true,
-            ],
-            'deleteById' => [
-                'resources' => [
-                    'Magento_Customer::manage',
-                    'Magento_Customer::delete',
+            'V1' => [
+                'methods' => [
+                    'getById' => [
+                        'resources' => [
+                            'Magento_Customer::customer_self',
+                            'Magento_Customer::read',
+                        ],
+                        'secure' => false,
+                    ],
+                    'save' => [
+                        'resources' => [
+                            'Magento_Customer::customer_self',
+                            'Magento_Customer::manage'
+                        ],
+                        'secure' => true,
+                    ],
+                    'deleteById' => [
+                        'resources' => [
+                            'Magento_Customer::manage',
+                            'Magento_Customer::delete',
+                        ],
+                        'secure' => false,
+                    ],
                 ],
-                'secure' => false,
             ],
         ],
     ],
diff --git a/app/code/Magento/Webapi/Test/Unit/Model/Soap/ConfigTest.php b/app/code/Magento/Webapi/Test/Unit/Model/Soap/ConfigTest.php
index 27a4024682396bc3a020703a55262c1b20e6b17a..6c747b1f54a973c3de6396642b3521c16009e242 100644
--- a/app/code/Magento/Webapi/Test/Unit/Model/Soap/ConfigTest.php
+++ b/app/code/Magento/Webapi/Test/Unit/Model/Soap/ConfigTest.php
@@ -6,6 +6,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 /**
  * Class implements tests for \Magento\Webapi\Model\Soap\Config class.
  */
@@ -39,23 +41,31 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $servicesConfig = [
             'services' => [
                 'Magento\Customer\Api\AccountManagementInterface' => [
-                    'activate' => [
-                        'resources' => [
-                            [
-                                'Magento_Customer::manage',
+                    'V1' => [
+                        'methods' => [
+                            'activate' => [
+                                'resources' => [
+                                    [
+                                        'Magento_Customer::manage',
+                                    ],
+                                ],
+                                'secure' => false,
                             ],
                         ],
-                        'secure' => false,
                     ],
                 ],
                 'Magento\Customer\Api\CustomerRepositoryInterface' => [
-                    'getById' => [
-                        'resources' => [
-                            [
-                                'Magento_Customer::customer',
+                    'V1' => [
+                        'methods' => [
+                            'getById' => [
+                                'resources' => [
+                                    [
+                                        'Magento_Customer::customer',
+                                    ],
+                                ],
+                                'secure' => false,
                             ],
                         ],
-                        'secure' => false,
                     ],
                 ],
             ],
@@ -98,17 +108,18 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
     public function testGetRequestedSoapServices()
     {
         $expectedResult = [
-            [
-                'methods' => [
-                    'activate' => [
-                        'method' => 'activate',
-                        'inputRequired' => '',
-                        'isSecure' => '',
-                        'resources' => [['Magento_Customer::manage']],
+            'customerAccountManagementV1' =>
+                [
+                    'methods' => [
+                        'activate' => [
+                            'method' => 'activate',
+                            'inputRequired' => '',
+                            'isSecure' => '',
+                            'resources' => [['Magento_Customer::manage']],
+                        ],
                     ],
+                    'class' => 'Magento\Customer\Api\AccountManagementInterface',
                 ],
-                'class' => 'Magento\Customer\Api\AccountManagementInterface',
-            ],
         ];
         $result = $this->_soapConfig->getRequestedSoapServices(
             ['customerAccountManagementV1', 'moduleBarV2', 'moduleBazV1']
@@ -135,58 +146,78 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
     {
         $expectedResult = 'customerAccountManagementV1Activate';
         $soapOperation = $this->_soapConfig
-            ->getSoapOperation('Magento\Customer\Api\AccountManagementInterface', 'activate');
+            ->getSoapOperation('Magento\Customer\Api\AccountManagementInterface', 'activate', 'V1');
         $this->assertEquals($expectedResult, $soapOperation);
     }
+
     /**
-     * Test identifying service name parts including subservices using class name.
+     * Test identifying service name including subservices using class name.
      *
-     * @dataProvider serviceNamePartsDataProvider
+     * @dataProvider serviceNameDataProvider
      */
-    public function testGetServiceNameParts($className, $preserveVersion, $expected)
+    public function testGetServiceName($className, $version, $preserveVersion, $expected)
     {
-        $actual = $this->_soapConfig->getServiceName($className, $preserveVersion);
+        $actual = $this->_soapConfig->getServiceName($className, $version, $preserveVersion);
         $this->assertEquals($expected, $actual);
     }
 
     /**
-     * Dataprovider for serviceNameParts
+     * Dataprovider for testGetServiceName
      *
      * @return string
      */
-    public function serviceNamePartsDataProvider()
+    public function serviceNameDataProvider()
     {
         return [
-            ['Magento\Customer\Api\AccountManagementInterface', false, 'customerAccountManagement'],
-            [
-                'Magento\Customer\Api\AddressRepositoryInterface',
-                true,
-                'customerAddressRepositoryV1'
-            ],
+            ['Magento\Customer\Api\AccountManagementInterface', 'V1', false, 'customerAccountManagement'],
+            ['Magento\Customer\Api\AddressRepositoryInterface', 'V1', true, 'customerAddressRepositoryV1'],
         ];
     }
 
     /**
      * @expectedException \InvalidArgumentException
-     * @dataProvider dataProviderForTestGetServiceNamePartsInvalidName
+     * @dataProvider dataProviderForTestGetServiceNameInvalidName
      */
-    public function testGetServiceNamePartsInvalidName($interfaceClassName)
+    public function testGetServiceNameInvalidName($interfaceClassName, $version)
     {
-        $this->_soapConfig->getServiceName($interfaceClassName);
+        $this->_soapConfig->getServiceName($interfaceClassName, $version);
     }
 
-    public function dataProviderForTestGetServiceNamePartsInvalidName()
+    /**
+     * Dataprovider for testGetServiceNameInvalidName
+     *
+     * @return string
+     */
+    public function dataProviderForTestGetServiceNameInvalidName()
     {
         return [
-            ['BarV1Interface'], // Missed vendor, module, 'Service'
-            ['Service\\V1Interface'], // Missed vendor and module
-            ['Magento\\Foo\\Service\\BarVxInterface'], // Version number should be a number
-            ['Magento\\Foo\\Service\\BarInterface'], // Version missed
-            ['Magento\\Foo\\Service\\BarV1'], // 'Interface' missed
-            ['Foo\\Service\\BarV1Interface'], // Module missed
-            ['Foo\\BarV1Interface'] // Module and 'Service' missed
+            ['BarV1Interface', 'V1'], // Missed vendor, module, 'Service'
+            ['Service\\V1Interface', 'V1'], // Missed vendor and module
+            ['Magento\\Foo\\Service\\BarVxInterface', 'V1'], // Version number should be a number
+            ['Magento\\Foo\\Service\\BarInterface', 'V1'], // Version missed
+            ['Magento\\Foo\\Service\\BarV1', 'V1'], // 'Interface' missed
+            ['Foo\\Service\\BarV1Interface', 'V1'], // Module missed
+            ['Foo\\BarV1Interface', 'V1'] // Module and 'Service' missed
         ];
     }
+
+    public function testGetServiceMetadata()
+    {
+        $expectedResult = [
+            'methods' => [
+                'activate' => [
+                    'method' => 'activate',
+                    'inputRequired' => '',
+                    'isSecure' => '',
+                    'resources' => [['Magento_Customer::manage']],
+                ],
+            ],
+            'class' => 'Magento\Customer\Api\AccountManagementInterface',
+        ];
+        $result = $this->_soapConfig->getServiceMetadata('customerAccountManagementV1');
+        $this->assertEquals($expectedResult, $result);
+
+    }
 }
 
 require_once realpath(__DIR__ . '/../../_files/test_interfaces.php');
diff --git a/app/code/Magento/Weee/etc/config.xml b/app/code/Magento/Weee/etc/config.xml
index bf472cca89956ba848db6c37637832615fa0ee93..164097b1280fa003f1c8d62ed9db74efb31ee6cb 100644
--- a/app/code/Magento/Weee/etc/config.xml
+++ b/app/code/Magento/Weee/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <sales>
             <totals_sort>
diff --git a/app/code/Magento/Wishlist/etc/config.xml b/app/code/Magento/Wishlist/etc/config.xml
index cdb6ad259a73c23099cc0e14420d84242e45efab..77c070c2b505b4679a54b7dfbd36e5295955be49 100644
--- a/app/code/Magento/Wishlist/etc/config.xml
+++ b/app/code/Magento/Wishlist/etc/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">
     <default>
         <wishlist>
             <general>
diff --git a/app/code/Magento/Wishlist/etc/frontend/page_types.xml b/app/code/Magento/Wishlist/etc/frontend/page_types.xml
index cd44dd1f773edd2f4e179b0d24f5eb5b888d10c0..9d938ce725b41fca3bbdf872201865c8bca55131 100644
--- a/app/code/Magento/Wishlist/etc/frontend/page_types.xml
+++ b/app/code/Magento/Wishlist/etc/frontend/page_types.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Core/etc/page_types.xsd">
+<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd">
     <type id="wishlist_index_index" label="Customer My Account My Wish List"/>
     <type id="wishlist_index_share" label="Customer My Account Wish List Sharing Form"/>
     <type id="wishlist_shared_index" label="Customer Shared Wish List View"/>
diff --git a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less
index e96d4b1f33cecb1eb25ddb04e38e4a78934f2bae..35ecf5e74e4fca8cdb6d78ad77368808c74a5066 100644
--- a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less
+++ b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less
@@ -210,6 +210,13 @@
     .product-reviews-summary .reviews-actions {
         .font-size(@font-size__base);
     }
+    .product-options-wrapper {
+        .field {
+            .note {
+                display: block;
+            }
+        }
+    }
 }
 
 .product-info-main,
diff --git a/app/design/frontend/Magento/blank/Magento_CatalogSearch/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_CatalogSearch/web/css/source/_module.less
index 2217a6cf6e39b5ea20b35374044fac7fefe94b4a..66009f0069383e2a7f2352c3cc90a784ce45b42b 100644
--- a/app/design/frontend/Magento/blank/Magento_CatalogSearch/web/css/source/_module.less
+++ b/app/design/frontend/Magento/blank/Magento_CatalogSearch/web/css/source/_module.less
@@ -22,6 +22,9 @@
             display: none;
         }
     }
+    .block-content {
+        margin-bottom: 0;
+    }
     .label {
         .icon-font(
             @_icon-font-content: @icon-search,
diff --git a/app/design/frontend/Magento/blank/web/css/source/_forms.less b/app/design/frontend/Magento/blank/web/css/source/_forms.less
index 7d172a1ddaa54005a265cace63d7b958ff6909f7..563084653f5611d0b8877b492d984b77cac69e91 100644
--- a/app/design/frontend/Magento/blank/web/css/source/_forms.less
+++ b/app/design/frontend/Magento/blank/web/css/source/_forms.less
@@ -92,7 +92,9 @@ select:focus ~ .tooltip .tooltip-content {
         margin: 0;
         > .field:not(.choice) >,
         .fields > .field {
-            margin: 0 0 @form-field__vertical-indent;
+            &:not(:last-child) {
+                margin: 0 0 @form-field__vertical-indent;
+            }
             .label {
                 margin: 0 0 4px;
                 padding: 0 0 @indent__xs;
diff --git a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less
index 95aded3d85ad63e0ec74da5035e4ca60e26c54e2..839f0571a4a4d7b56002f25d4fe7b2d5004e4107 100644
--- a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less
+++ b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less
@@ -249,6 +249,14 @@
             margin-top: @form-field__vertical-indent;
         }
     }
+    .product-options-wrapper {
+        .field {
+            .note {
+                display: block;
+                .css(margin-top, @indent__xs);
+            }
+        }
+    }
 }
 
 .product-options-bottom .price-box,
diff --git a/app/design/frontend/Magento/luma/Magento_CatalogSearch/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_CatalogSearch/web/css/source/_module.less
index d2a5755580a566f7dc8fb679dae7bed14df3e8ec..c51347a3b6e9b5ffae159d4604c82511a9d6fbe3 100644
--- a/app/design/frontend/Magento/luma/Magento_CatalogSearch/web/css/source/_module.less
+++ b/app/design/frontend/Magento/luma/Magento_CatalogSearch/web/css/source/_module.less
@@ -22,6 +22,9 @@
             display: none;
         }
     }
+    .block-content {
+        margin-bottom: 0;
+    }
     .label {
         .icon-font(
             @_icon-font-content: @icon-search,
@@ -61,7 +64,6 @@
     .nested {
         display: none;
     }
-
 }
 
 .search-autocomplete {
diff --git a/app/design/frontend/Magento/luma/Magento_Customer/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Customer/web/css/source/_module.less
index 15f34bcbb6588e7be51ec879682f277f9045dee6..a38d28d2443c18e53258eec7ee2343a946cd48c1 100644
--- a/app/design/frontend/Magento/luma/Magento_Customer/web/css/source/_module.less
+++ b/app/design/frontend/Magento/luma/Magento_Customer/web/css/source/_module.less
@@ -137,8 +137,10 @@
 //--------------------------------------
 .block {
     &:extend(.abs-margin-for-blocks-and-widgets all);
-    &:last-child {
-        margin-bottom: 0;
+    .column.main & {
+        &:last-child {
+            margin-bottom: 0;
+        }
     }
     .title {
         strong {
diff --git a/app/design/frontend/Magento/luma/web/css/source/_forms.less b/app/design/frontend/Magento/luma/web/css/source/_forms.less
index 8c882c19f315aff01d8a282acfd310eaf0dabca5..e9a975768c81f2216d0adc5cc5830bd611f595fc 100644
--- a/app/design/frontend/Magento/luma/web/css/source/_forms.less
+++ b/app/design/frontend/Magento/luma/web/css/source/_forms.less
@@ -117,7 +117,9 @@ select:focus ~ .tooltip .tooltip-content {
         margin: 0;
         > .field:not(.choice) >,
         .fields > .field {
-            margin: 0 0 @form-field__vertical-indent;
+            &:not(:last-child) {
+                margin: 0 0 @form-field__vertical-indent;
+            }
             .label {
                 margin: 0 0 4px;
                 padding: 0 0 @indent__xs;
diff --git a/app/etc/di.xml b/app/etc/di.xml
index 48402892228cc368b5457502ed828f9a27e4655d..fe752e71c22539f98bb5247288575f86ee683aad 100755
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -82,7 +82,7 @@
     <preference for="Magento\Framework\Mview\View\SubscriptionInterface" type="Magento\Framework\Mview\View\Subscription" />
     <preference for="Magento\Framework\Mview\View\ChangelogInterface" type="Magento\Framework\Mview\View\Changelog" />
     <preference for="Magento\Framework\View\Design\FileResolution\Fallback\CacheDataInterface" type="Magento\Framework\View\Design\FileResolution\Fallback\CacheData\Flat"/>
-    <preference for="Magento\Framework\Api\MetadataServiceInterface" type="Magento\Framework\Api\Config\MetadataConfig"/>
+    <preference for="Magento\Framework\Api\MetadataServiceInterface" type="Magento\Framework\Api\DefaultMetadataService"/>
     <preference for="Magento\Framework\Api\MetadataObjectInterface" type="Magento\Framework\Api\AttributeMetadata"/>
     <preference for="Magento\Framework\Api\SearchCriteriaInterface" type="Magento\Framework\Api\SearchCriteria"/>
     <preference for="Magento\Framework\App\Rss\UrlBuilderInterface" type="Magento\Framework\App\Rss\UrlBuilder"/>
@@ -671,27 +671,6 @@
             <argument name="raise_php_limits" xsi:type="boolean">false</argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\View\Asset\PreProcessor\Pool">
-        <arguments>
-            <argument name="preProcessors" xsi:type="array">
-                <item name="less" xsi:type="array">
-                    <item name="css" xsi:type="array">
-                        <item name="less_css" xsi:type="string">Magento\Framework\Css\PreProcessor\Less</item>
-                        <item name="module_notation" xsi:type="string">Magento\Framework\View\Asset\PreProcessor\ModuleNotation</item>
-                    </item>
-                    <item name="less" xsi:type="array">
-                        <item name="magento_import" xsi:type="string">Magento\Framework\Less\PreProcessor\Instruction\MagentoImport</item>
-                        <item name="import" xsi:type="string">Magento\Framework\Less\PreProcessor\Instruction\Import</item>
-                    </item>
-                </item>
-                <item name="css" xsi:type="array">
-                    <item name="css" xsi:type="array">
-                        <item name="module_notation" xsi:type="string">Magento\Framework\View\Asset\PreProcessor\ModuleNotation</item>
-                    </item>
-                </item>
-            </argument>
-        </arguments>
-    </type>
     <type name="Magento\Framework\App\DefaultPath\DefaultPath">
         <arguments>
             <argument name="parts" xsi:type="array">
diff --git a/composer.json b/composer.json
index e29f9de8be6ff85c6eeebf84e5da449dedeba559..aad787f6282507de20e66d00875d130a09c659cc 100644
--- a/composer.json
+++ b/composer.json
@@ -79,7 +79,6 @@
         "magento/module-configurable-product": "self.version",
         "magento/module-contact": "self.version",
         "magento/module-cookie": "self.version",
-        "magento/module-core": "self.version",
         "magento/module-cron": "self.version",
         "magento/module-currency-symbol": "self.version",
         "magento/module-customer": "self.version",
diff --git a/composer.lock b/composer.lock
index 5337e32b2c094312a9be6fb56bafbc7632a931d5..097347dd21bfd76087c53e0b2424d5ee3b4a3d2d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "933a1cf749db0c7e6d16e357c12cdaa8",
+    "hash": "8633d753763a17a13717a8380e3cb46b",
     "packages": [
         {
             "name": "composer/composer",
diff --git a/dev/shell/dependency.php b/dev/shell/dependency.php
index 29ee2cd8aa6981e3bd85f128cee1c85139c82611..bd6fd8de21af01a3fd46f45efb75b3d090e1a30a 100644
--- a/dev/shell/dependency.php
+++ b/dev/shell/dependency.php
@@ -19,8 +19,6 @@ const KEY_COMPONENT_NAME = 'name';
 const KEY_COMPONENT_DEPENDENCIES = 'dependencies';
 const KEY_COMPONENT_DEPENDENTS = 'dependents';
 
-const KEY_MAGENTO_CORE_MODULE = 'magento/module-core';
-
 $modules = [];
 $componentsByName = [];
 
@@ -256,8 +254,6 @@ function initialize()
         if (count($component[KEY_COMPONENT_MODULES]) == 1) {
             $component[KEY_COMPONENT_NAME] = $component[KEY_COMPONENT_MODULES][0];
             $modules[$component[KEY_COMPONENT_MODULES][0]][KEY_MODULE_COMPONENT] = $component[KEY_COMPONENT_NAME];
-        } elseif (in_array(KEY_MAGENTO_CORE_MODULE, $component[KEY_COMPONENT_MODULES])) {
-            $component[KEY_COMPONENT_NAME] = KEY_MAGENTO_CORE_MODULE;
         } else {
             $component[KEY_COMPONENT_NAME] = implode(':', $component[KEY_COMPONENT_MODULES]);
         }
diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/AllSoapAndRest.php b/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/AllSoapAndRest.php
index f5f821b4fb2a578ec20c93c4694f417dc0180e55..0c7df325f28d5d13ade1d440364c0f48e4b9e32d 100644
--- a/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/AllSoapAndRest.php
+++ b/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/AllSoapAndRest.php
@@ -5,7 +5,7 @@
  */
 namespace Magento\TestModule1\Service\V1;
 
-use Magento\TestModule1\Service\V1\Entity\CustomAttributeDataObjectFactory;
+use Magento\TestModuleMSC\Model\Data\CustomAttributeDataObjectFactory;
 use Magento\TestModule1\Service\V1\Entity\Item;
 use Magento\TestModule1\Service\V1\Entity\ItemFactory;
 
diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/CustomAttributeDataObject.php b/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/CustomAttributeDataObject.php
deleted file mode 100644
index 05c5581b7d1afb01ad5b3a8e61424c1f39656dc9..0000000000000000000000000000000000000000
--- a/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/CustomAttributeDataObject.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-// @codingStandardsIgnoreFile
-
-namespace Magento\TestModule1\Service\V1\Entity;
-
-class CustomAttributeDataObject extends \Magento\Framework\Api\AbstractExtensibleObject
-{
-    /**
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->_data['name'];
-    }
-    /**
-     * @param string $name
-     * @return $this
-     */
-    public function setName($name)
-    {
-        return $this->setData('name', $name);
-    }
-}
diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/CustomAttributeNestedDataObject.php b/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/CustomAttributeNestedDataObject.php
deleted file mode 100644
index d1ead31be911b0f0895150e7e433cde576ddb8a8..0000000000000000000000000000000000000000
--- a/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/CustomAttributeNestedDataObject.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-// @codingStandardsIgnoreFile
-
-namespace Magento\TestModule1\Service\V1\Entity;
-
-class CustomAttributeNestedDataObject extends \Magento\Framework\Api\AbstractExtensibleObject
-{
-    /**
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->_data['name'];
-    }
-
-    /**
-     * @param string $name
-     * @return $this
-     */
-    public function setName($name)
-    {
-        return $this->setData('name', $name);
-    }
-}
diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/Eav/AttributeMetadata.php b/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/Eav/AttributeMetadata.php
deleted file mode 100644
index b8a87f3d74056569a1fe6a502c8985cd4148d86b..0000000000000000000000000000000000000000
--- a/dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/Eav/AttributeMetadata.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-// @codingStandardsIgnoreFile
-
-namespace Magento\TestModule1\Service\V1\Entity\Eav;
-
-use Magento\Framework\Api\AbstractExtensibleObject;
-use Magento\Framework\Api\MetadataObjectInterface;
-
-/**
- * Class AttributeMetadata
- */
-class AttributeMetadata extends AbstractExtensibleObject implements MetadataObjectInterface
-{
-    /**#@+
-     * Constants used as keys into $_data
-     */
-    const ATTRIBUTE_ID = 'attribute_id';
-
-    const ATTRIBUTE_CODE = 'attribute_code';
-    /**#@-*/
-
-    /**
-     * Retrieve id of the attribute.
-     *
-     * @return string|null
-     */
-    public function getAttributeId()
-    {
-        return $this->_get(self::ATTRIBUTE_ID);
-    }
-
-    /**
-     * Set id of the attribute.
-     *
-     * @param string $attributeId
-     * @return $this
-     */
-    public function setAttributeId($attributeId)
-    {
-        return $this->setData(self::ATTRIBUTE_ID, $attributeId);
-    }
-
-    /**
-     * Retrieve code of the attribute.
-     *
-     * @return string|null
-     */
-    public function getAttributeCode()
-    {
-        return $this->_get(self::ATTRIBUTE_CODE);
-    }
-
-    /**
-     * Set code of the attribute.
-     *
-     * @param string $attributeCode
-     * @return $this
-     */
-    public function setAttributeCode($attributeCode)
-    {
-        return $this->setData(self::ATTRIBUTE_CODE, $attributeCode);
-    }
-}
diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/etc/data_object.xml b/dev/tests/api-functional/_files/Magento/TestModule1/etc/data_object.xml
index 19cdbc3710a713062ae5a42677ebf9d551c75e55..de2236e2195f380aedd5614447065bc9e480f7aa 100644
--- a/dev/tests/api-functional/_files/Magento/TestModule1/etc/data_object.xml
+++ b/dev/tests/api-functional/_files/Magento/TestModule1/etc/data_object.xml
@@ -7,11 +7,11 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/Api/etc/data_object.xsd">
     <custom_attributes for="Magento\TestModule1\Service\V1\Entity\Item">
-        <attribute code="custom_attribute_data_object" type="Magento\TestModule1\Service\V1\Entity\CustomAttributeDataObject" />
+        <attribute code="custom_attribute_data_object" type="Magento\TestModuleMSC\Model\Data\CustomAttributeDataObject" />
         <attribute code="custom_attribute_string" type="string" />
     </custom_attributes>
-    <custom_attributes for="Magento\TestModule1\Service\V1\Entity\CustomAttributeDataObject">
-        <attribute code="custom_attribute_nested" type="Magento\TestModule1\Service\V1\Entity\CustomAttributeNestedDataObject" />
+    <custom_attributes for="Magento\TestModuleMSC\Model\Data\CustomAttributeDataObject">
+        <attribute code="custom_attribute_nested" type="Magento\TestModuleMSC\Model\Data\CustomAttributeNestedDataObject" />
         <attribute code="custom_attribute_int" type="int" />
     </custom_attributes>
 </config>
diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/etc/di.xml b/dev/tests/api-functional/_files/Magento/TestModule1/etc/di.xml
index 7ae28455d3a64a1abe6aa319881f0459e486c76e..61cdfb19a09e0b1b59a27663d261969600e6340e 100644
--- a/dev/tests/api-functional/_files/Magento/TestModule1/etc/di.xml
+++ b/dev/tests/api-functional/_files/Magento/TestModule1/etc/di.xml
@@ -11,7 +11,13 @@
 
     <virtualType name="Magento\TestModule1\Service\Config\TestModule1MetadataConfig" type="Magento\Framework\Api\Config\MetadataConfig">
         <arguments>
+            <argument name="attributeMetadataBuilder" xsi:type="object">Magento\TestModuleMSC\Model\Data\Eav\AttributeMetadataBuilder</argument>
             <argument name="dataObjectClassName" xsi:type="string">Magento\TestModule1\Service\V1\Entity\Item</argument>
         </arguments>
     </virtualType>
+    <type name="Magento\TestModule1\Service\V1\Entity\ItemBuilder">
+        <arguments>
+            <argument name="metadataService" xsi:type="object">Magento\TestModule1\Service\Config\TestModule1MetadataConfig</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/dev/tests/api-functional/_files/Magento/TestModule3/Service/V1/Entity/WrappedErrorParameter.php b/dev/tests/api-functional/_files/Magento/TestModule3/Service/V1/Entity/WrappedErrorParameter.php
index c073b4276be0a3e066287c95761ae2aaa8c5c633..a08ea627cfaa7a4eca4ecd4666f372d030ff65da 100644
--- a/dev/tests/api-functional/_files/Magento/TestModule3/Service/V1/Entity/WrappedErrorParameter.php
+++ b/dev/tests/api-functional/_files/Magento/TestModule3/Service/V1/Entity/WrappedErrorParameter.php
@@ -21,24 +21,24 @@ class WrappedErrorParameter extends \Magento\Framework\Api\AbstractExtensibleObj
     }
 
     /**
-     * Set field name.
+     * Get value.
      *
-     * @param string $fieldName
-     * @return $this
+     * @return string $value
      */
-    public function setFieldName($fieldName)
+    public function getValue()
     {
-        return $this->setData('field_name', $fieldName);
+        return $this->_data['value'];
     }
 
     /**
-     * Get value.
+     * Set field name.
      *
-     * @return string $value
+     * @param string $fieldName
+     * @return $this
      */
-    public function getValue()
+    public function setFieldName($fieldName)
     {
-        return $this->_data['value'];
+        return $this->setData('field_name', $fieldName);
     }
 
     /**
diff --git a/dev/tests/api-functional/_files/Magento/TestModule4/Service/V1/Entity/ExtensibleRequest.php b/dev/tests/api-functional/_files/Magento/TestModule4/Service/V1/Entity/ExtensibleRequest.php
index 515e73f3b4aec9a34d7f79cf4c1dc5cbfb49df0f..114f9a9dc9a07533f3db9e334c965eb65621d7ce 100644
--- a/dev/tests/api-functional/_files/Magento/TestModule4/Service/V1/Entity/ExtensibleRequest.php
+++ b/dev/tests/api-functional/_files/Magento/TestModule4/Service/V1/Entity/ExtensibleRequest.php
@@ -8,6 +8,11 @@
 
 namespace Magento\TestModule4\Service\V1\Entity;
 
+/**
+ * Class ExtensibleRequest
+ *
+ * @method \Magento\TestModule4\Service\V1\Entity\ExtensibleRequestExtensionInterface getExtensionAttributes()
+ */
 class ExtensibleRequest extends \Magento\Framework\Model\AbstractExtensibleModel implements ExtensibleRequestInterface
 {
     public function getName()
diff --git a/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/CustomAttributeDataObject.php b/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/CustomAttributeDataObject.php
index 57b9202beba4aa4c5602ecd65e0a4607bab042ff..02e45da759543fdb8b9d94ae95c6020cf0f64abe 100644
--- a/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/CustomAttributeDataObject.php
+++ b/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/CustomAttributeDataObject.php
@@ -11,6 +11,11 @@ namespace Magento\TestModuleMSC\Model\Data;
 use Magento\TestModuleMSC\Api\Data\CustomAttributeDataObjectInterface;
 use Magento\Framework\Api\AbstractExtensibleObject;
 
+/**
+ * Class CustomAttributeDataObject
+ *
+ * @method \Magento\TestModuleMSC\Api\Data\CustomAttributeDataObjectExtensionInterface getExtensionAttributes()
+ */
 class CustomAttributeDataObject extends AbstractExtensibleObject implements CustomAttributeDataObjectInterface
 {
     /**
diff --git a/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/CustomAttributeNestedDataObject.php b/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/CustomAttributeNestedDataObject.php
index e1e7a49a09e2b40b3f05a23173cd320b5b0ddab0..ee683aa1610b713010c1812adaff87ebc3d9e61f 100644
--- a/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/CustomAttributeNestedDataObject.php
+++ b/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/CustomAttributeNestedDataObject.php
@@ -10,6 +10,11 @@ namespace Magento\TestModuleMSC\Model\Data;
 
 use Magento\TestModuleMSC\Api\Data\CustomAttributeNestedDataObjectInterface;
 
+/**
+ * Class CustomAttributeNestedDataObject
+ *
+ * @method \Magento\TestModuleMSC\Api\Data\CustomAttributeNestedDataObjectExtensionInterface getExtensionAttributes()
+ */
 class CustomAttributeNestedDataObject extends \Magento\Framework\Model\AbstractExtensibleModel implements
     CustomAttributeNestedDataObjectInterface
 {
diff --git a/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/Item.php b/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/Item.php
index ff18bed75ef1fd16fe6139cd4aeb4dd60ed92ef0..1d57017fabd42b6b01749771e25db25ef63aff48 100644
--- a/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/Item.php
+++ b/dev/tests/api-functional/_files/Magento/TestModuleMSC/Model/Data/Item.php
@@ -10,6 +10,11 @@ namespace Magento\TestModuleMSC\Model\Data;
 
 use Magento\TestModuleMSC\Api\Data\ItemInterface;
 
+/**
+ * Class Item
+ *
+ * @method \Magento\TestModuleMSC\Api\Data\ItemExtensionInterface getExtensionAttributes()
+ */
 class Item extends \Magento\Framework\Model\AbstractExtensibleModel implements ItemInterface
 {
     /**
diff --git a/dev/tests/api-functional/_files/Magento/TestModuleMSC/etc/di.xml b/dev/tests/api-functional/_files/Magento/TestModuleMSC/etc/di.xml
index ea1e9ab9bc871215ffbd87448084ba274de9d236..2be26f6ab283284c7b4ffde3c2402473c550201e 100644
--- a/dev/tests/api-functional/_files/Magento/TestModuleMSC/etc/di.xml
+++ b/dev/tests/api-functional/_files/Magento/TestModuleMSC/etc/di.xml
@@ -15,6 +15,7 @@
 
     <virtualType name="Magento\TestModuleMSC\Service\Config\TestModuleMSCMetadataConfig" type="Magento\Framework\Api\Config\MetadataConfig">
         <arguments>
+            <argument name="attributeMetadataBuilder" xsi:type="object">Magento\TestModuleMSC\Model\Data\Eav\AttributeMetadataBuilder</argument>
             <argument name="dataObjectClassName" xsi:type="string">Magento\TestModuleMSC\Model\Data\Item</argument>
         </arguments>
     </virtualType>
diff --git a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductLinkManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductLinkManagementTest.php
index 36cf0e0afaa83e7285e6a1d17f2c74185362ca5e..463f490480ce06c6e3016e5606971eb6ee1fe392 100644
--- a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductLinkManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductLinkManagementTest.php
@@ -91,11 +91,11 @@ class ProductLinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAb
      */
     private function addChild($productSku, $optionId, $linkedProduct)
     {
-        $resourcePath = self::RESOURCE_PATH . '/:productSku/links/:optionId';
+        $resourcePath = self::RESOURCE_PATH . '/:sku/links/:optionId';
         $serviceInfo = [
             'rest' => [
                 'resourcePath' => str_replace(
-                    [':productSku', ':optionId'],
+                    [':sku', ':optionId'],
                     [$productSku, $optionId],
                     $resourcePath
                 ),
@@ -109,7 +109,7 @@ class ProductLinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAb
         ];
         return $this->_webApiCall(
             $serviceInfo,
-            ['productSku' => $productSku, 'optionId' => $optionId, 'linkedProduct' => $linkedProduct]
+            ['sku' => $productSku, 'optionId' => $optionId, 'linkedProduct' => $linkedProduct]
         );
     }
 
@@ -125,7 +125,7 @@ class ProductLinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAb
 
     protected function removeChild($productSku, $optionId, $childSku)
     {
-        $resourcePath = self::RESOURCE_PATH . '/%s/option/%s/child/%s';
+        $resourcePath = self::RESOURCE_PATH . '/%s/options/%s/children/%s';
         $serviceInfo = [
             'rest' => [
                 'resourcePath' => sprintf($resourcePath, $productSku, $optionId, $childSku),
@@ -137,7 +137,7 @@ class ProductLinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAb
                 'operation' => self::SERVICE_NAME . 'removeChild',
             ],
         ];
-        $requestData = ['productSku' => $productSku, 'optionId' => $optionId, 'childSku' => $childSku];
+        $requestData = ['sku' => $productSku, 'optionId' => $optionId, 'childSku' => $childSku];
         return $this->_webApiCall($serviceInfo, $requestData);
     }
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductOptionRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductOptionRepositoryTest.php
index e18965c0753e60490561c6facf4aca2c6d8e615c..325e35ee8291041dd553575d39ed4523f71e5284 100644
--- a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductOptionRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductOptionRepositoryTest.php
@@ -10,7 +10,7 @@ class ProductOptionRepositoryTest extends \Magento\TestFramework\TestCase\Webapi
 {
     const SERVICE_NAME = 'bundleProductOptionRepositoryV1';
     const SERVICE_VERSION = 'V1';
-    const RESOURCE_PATH = '/V1/bundle-products/:productSku/option';
+    const RESOURCE_PATH = '/V1/bundle-products/:sku/options';
 
     /**
      * @magentoApiDataFixture Magento/Bundle/_files/product.php
@@ -166,7 +166,7 @@ class ProductOptionRepositoryTest extends \Magento\TestFramework\TestCase\Webapi
     {
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/bundle-products/option/' . $optionId,
+                'resourcePath' => '/V1/bundle-products/options/' . $optionId,
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
             ],
             'soap' => [
@@ -190,7 +190,7 @@ class ProductOptionRepositoryTest extends \Magento\TestFramework\TestCase\Webapi
     {
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/bundle-products/option/add',
+                'resourcePath' => '/V1/bundle-products/options/add',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
@@ -211,7 +211,7 @@ class ProductOptionRepositoryTest extends \Magento\TestFramework\TestCase\Webapi
     {
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => str_replace(':productSku', $productSku, self::RESOURCE_PATH) . '/' . $optionId,
+                'resourcePath' => str_replace(':sku', $productSku, self::RESOURCE_PATH) . '/' . $optionId,
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
             ],
             'soap' => [
@@ -220,7 +220,7 @@ class ProductOptionRepositoryTest extends \Magento\TestFramework\TestCase\Webapi
                 'operation' => self::SERVICE_NAME . 'DeleteById',
             ],
         ];
-        return $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'optionId' => $optionId]);
+        return $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'optionId' => $optionId]);
     }
 
     /**
@@ -231,7 +231,7 @@ class ProductOptionRepositoryTest extends \Magento\TestFramework\TestCase\Webapi
     {
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => str_replace(':productSku', $productSku, self::RESOURCE_PATH) . '/all',
+                'resourcePath' => str_replace(':sku', $productSku, self::RESOURCE_PATH) . '/all',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
             ],
             'soap' => [
@@ -240,7 +240,7 @@ class ProductOptionRepositoryTest extends \Magento\TestFramework\TestCase\Webapi
                 'operation' => self::SERVICE_NAME . 'GetList',
             ],
         ];
-        return $this->_webApiCall($serviceInfo, ['productSku' => $productSku]);
+        return $this->_webApiCall($serviceInfo, ['sku' => $productSku]);
     }
 
     /**
@@ -252,7 +252,7 @@ class ProductOptionRepositoryTest extends \Magento\TestFramework\TestCase\Webapi
     {
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => str_replace(':productSku', $productSku, self::RESOURCE_PATH) . '/' . $optionId,
+                'resourcePath' => str_replace(':sku', $productSku, self::RESOURCE_PATH) . '/' . $optionId,
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
             ],
             'soap' => [
@@ -261,6 +261,6 @@ class ProductOptionRepositoryTest extends \Magento\TestFramework\TestCase\Webapi
                 'operation' => self::SERVICE_NAME . 'Get',
             ],
         ];
-        return $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'optionId' => $optionId]);
+        return $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'optionId' => $optionId]);
     }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductOptionTypeListTest.php b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductOptionTypeListTest.php
index 9e355b5aae83a17d9c48f5fffa42b3fda302d5e9..7fc41226c9bb09319afd87db1c280484fe0a795f 100644
--- a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductOptionTypeListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductOptionTypeListTest.php
@@ -10,7 +10,7 @@ class ProductOptionTypeListTest extends \Magento\TestFramework\TestCase\WebapiAb
 {
     const SERVICE_READ_NAME = 'bundleProductOptionTypeListV1';
     const SERVICE_VERSION = 'V1';
-    const RESOURCE_PATH = '/V1/bundle-products/option/types';
+    const RESOURCE_PATH = '/V1/bundle-products/options/types';
 
     public function testGetTypes()
     {
diff --git a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductServiceTest.php b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductServiceTest.php
index 6c9d7c92c3cda782f13bbd5f8298d95cbbb26588..1a817b18d3b593df2cbbef8280a42e40f0d5b84c 100644
--- a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductServiceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/ProductServiceTest.php
@@ -7,7 +7,7 @@
 namespace Magento\Bundle\Api;
 
 use Magento\Catalog\Api\Data\ProductInterface;
-use Magento\Framework\Api\AbstractExtensibleObject;
+use Magento\Framework\Api\ExtensibleDataInterface;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\TestCase\WebapiAbstract;
 
@@ -61,18 +61,19 @@ class ProductServiceTest extends WebapiAbstract
      */
     public function testCreateBundle()
     {
+        $this->markTestSkipped('Processing of custom attributes has been changed in MAGETWO-34448.');
         $bundleProductOptions = [
-            "attribute_code" => "bundle_product_options",
-            "value" => [
-                [
-                    "title" => "test option",
-                    "type" => "checkbox",
-                    "required" => 1,
-                    "product_links" => [
-                        [
-                            "sku" => 'simple',
-                            "qty" => 1,
-                        ],
+            [
+                "title" => "test option",
+                "type" => "checkbox",
+                "required" => true,
+                "product_links" => [
+                    [
+                        "sku" => 'simple',
+                        "qty" => 1,
+                        'is_default' => false,
+                        'price' => 1.0,
+                        'price_type' => 1
                     ],
                 ],
             ],
@@ -85,36 +86,25 @@ class ProductServiceTest extends WebapiAbstract
             "type_id" => "bundle",
             "price" => 50,
             'attribute_set_id' => 4,
-            "custom_attributes" => [
-                "price_type" => [
-                    'attribute_code' => 'price_type',
-                    'value' => \Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC
-                ],
+            "extension_attributes" => [
+                "price_type" => \Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC,
                 "bundle_product_options" => $bundleProductOptions,
-                "price_view" => [
-                    "attribute_code" => "price_view",
-                    "value" => "test",
-                ],
+                "price_view" => "test"
             ],
         ];
 
         $response = $this->createProduct($product);
 
         $this->assertEquals($uniqueId, $response[ProductInterface::SKU]);
-        $this->assertEquals(
-            $bundleProductOptions,
-            $response[AbstractExtensibleObject::CUSTOM_ATTRIBUTES_KEY]["bundle_product_options"]
-        );
+        $resultBundleProductOptions
+            = $response[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]["bundle_product_options"];
+        $this->assertEquals($bundleProductOptions, $resultBundleProductOptions);
+        $this->assertEquals('simple', $resultBundleProductOptions[0]["product_links"][0]["sku"]);
 
         $response = $this->getProduct($uniqueId);
-        $foundBundleProductOptions = false;
-        foreach ($response[AbstractExtensibleObject::CUSTOM_ATTRIBUTES_KEY] as $customAttribute) {
-            if ($customAttribute["attribute_code"] === 'bundle_product_options') {
-                $this->assertEquals('simple', $customAttribute["value"][0]["product_links"][0]["sku"]);
-                $foundBundleProductOptions = true;
-            }
-        }
-        $this->assertTrue($foundBundleProductOptions);
+        $resultBundleProductOptions
+            = $response[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]["bundle_product_options"];
+        $this->assertEquals('simple', $resultBundleProductOptions[0]["product_links"][0]["sku"]);
     }
 
     /**
@@ -138,7 +128,7 @@ class ProductServiceTest extends WebapiAbstract
         ];
 
         $response = (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) ?
-            $this->_webApiCall($serviceInfo, ['productSku' => $productSku]) : $this->_webApiCall($serviceInfo);
+            $this->_webApiCall($serviceInfo, ['sku' => $productSku]) : $this->_webApiCall($serviceInfo);
 
         return $response;
     }
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryAttributeOptionManagementInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryAttributeOptionManagementInterfaceTest.php
index 61a54a548800a4e33b8c5710d63de95a4af30b87..345f76e3d923aade74604d952acc321c1e79c446 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryAttributeOptionManagementInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryAttributeOptionManagementInterfaceTest.php
@@ -15,6 +15,7 @@ class CategoryAttributeOptionManagementInterfaceTest extends WebapiAbstract
 
     public function testGetItems()
     {
+        $this->_markTestAsRestOnly('Fix inconsistencies in WSDL and Data interfaces');
         $testAttributeCode = 'include_in_menu';
         $expectedOptions = [
             [
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryLinkRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryLinkRepositoryTest.php
index 0cc379dc881fbf4a064ed18227a34b5deed9e67c..84588ac82171ea29d17ba377b753d9265c5417db 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryLinkRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/CategoryLinkRepositoryTest.php
@@ -121,7 +121,7 @@ class CategoryLinkRepositoryTest extends WebapiAbstract
         ];
         $result = $this->_webApiCall(
             $serviceInfo,
-            ['productSku' => 'simple', 'categoryId' => $this->categoryId]
+            ['sku' => 'simple', 'categoryId' => $this->categoryId]
         );
         $this->assertTrue($result);
         $this->assertFalse($this->isProductInCategory($this->categoryId, 333, 10));
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php
index 2fa1f86b55c5aeac1673d1416df96c856d59e5b5..86a5c051ae44c64a74e5d01b23c84c1ab82e00ea 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php
@@ -40,7 +40,7 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     {
         $this->createServiceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/products/simple/media',
+                'resourcePath' => '/V1/products/media',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
@@ -49,6 +49,7 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
                 'operation' => 'catalogProductAttributeMediaGalleryManagementV1Create',
             ],
         ];
+
         $this->updateServiceInfo = [
             'rest' => [
                 'resourcePath' => '/V1/products/simple/media',
@@ -103,23 +104,27 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     public function testCreate()
     {
         $requestData = [
-            'productSku' => 'simple',
-            'entry' => [
-                'id' => null,
-                'label' => 'Image Text',
-                'position' => 1,
-                'types' => ['image'],
-                'is_disabled' => false,
-            ],
-            'entryContent' => [
-                'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
-                'mime_type' => 'image/jpeg',
-                'name' => 'test_image',
+            "sku" => 'simple',
+            "custom_attributes" => [
+                "media_gallery" => [
+                    'attribute_code' => 'media_gallery',
+                    'value' => [
+                        'id' => null,
+                        'label' => 'Image Text',
+                        'position' => 1,
+                        'types' => ['image'],
+                        'disabled' => false,
+                        'content' => [
+                            'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
+                            'mime_type' => 'image/jpeg',
+                            'name' => 'test_image'
+                        ]
+                    ]
+                ],
             ],
-            // Store ID is not provided so the default one must be used
         ];
 
-        $actualResult = $this->_webApiCall($this->createServiceInfo, $requestData);
+        $actualResult = $this->_webApiCall($this->createServiceInfo, ['product' => $requestData]);
         $targetProduct = $this->getTargetSimpleProduct();
         $mediaGallery = $targetProduct->getData('media_gallery');
 
@@ -129,9 +134,6 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
         $this->assertEquals('Image Text', $updatedImage['label']);
         $this->assertEquals(1, $updatedImage['position']);
         $this->assertEquals(0, $updatedImage['disabled']);
-        $this->assertEquals('Image Text', $updatedImage['label_default']);
-        $this->assertEquals(1, $updatedImage['position_default']);
-        $this->assertEquals(0, $updatedImage['disabled_default']);
         $this->assertStringStartsWith('/t/e/test_image', $updatedImage['file']);
         $this->assertEquals($updatedImage['file'], $targetProduct->getData('image'));
     }
@@ -142,23 +144,28 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     public function testCreateWithNotDefaultStoreId()
     {
         $requestData = [
-            'productSku' => 'simple',
-            'entry' => [
-                'id' => null,
-                'label' => 'Image Text',
-                'position' => 1,
-                'types' => ['image'],
-                'is_disabled' => false,
-            ],
-            'entryContent' => [
-                'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
-                'mime_type' => 'image/jpeg',
-                'name' => 'test_image',
-            ],
-            'storeId' => 1,
+            'sku' => 'simple',
+            'store_id' => 1,
+            "custom_attributes" => [
+                "media_gallery" => [
+                    'attribute_code' => 'media_gallery',
+                    'value' => [
+                        'id' => null,
+                        'label' => 'Image Text',
+                        'position' => 1,
+                        'types' => ['image'],
+                        'disabled' => false,
+                        'content' => [
+                            'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
+                            'mime_type' => 'image/jpeg',
+                            'name' => 'test_image',
+                        ]
+                    ]
+                ],
+            ]
         ];
 
-        $actualResult = $this->_webApiCall($this->createServiceInfo, $requestData);
+        $actualResult = $this->_webApiCall($this->createServiceInfo, ['product' => $requestData]);
         $targetProduct = $this->getTargetSimpleProduct();
         $mediaGallery = $targetProduct->getData('media_gallery');
         $this->assertCount(1, $mediaGallery['images']);
@@ -182,13 +189,13 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     public function testUpdate()
     {
         $requestData = [
-            'productSku' => 'simple',
+            'sku' => 'simple',
             'entry' => [
                 'id' => $this->getTargetGalleryEntryId(),
                 'label' => 'Updated Image Text',
                 'position' => 10,
                 'types' => ['thumbnail'],
-                'is_disabled' => true,
+                'disabled' => true,
             ],
             // Store ID is not provided so the default one must be used
         ];
@@ -220,15 +227,15 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     public function testUpdateWithNotDefaultStoreId()
     {
         $requestData = [
-            'productSku' => 'simple',
+            'sku' => 'simple',
             'entry' => [
                 'id' => $this->getTargetGalleryEntryId(),
                 'label' => 'Updated Image Text',
                 'position' => 10,
                 'types' => ['thumbnail'],
-                'is_disabled' => true,
+                'disabled' => true,
             ],
-            'storeId' => 1,
+            'store_id' => 1,
         ];
 
         $this->updateServiceInfo['rest']['resourcePath'] = $this->updateServiceInfo['rest']['resourcePath']
@@ -262,7 +269,7 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
         $entryId = $this->getTargetGalleryEntryId();
         $this->deleteServiceInfo['rest']['resourcePath'] = "/V1/products/simple/media/{$entryId}";
         $requestData = [
-            'productSku' => 'simple',
+            'sku' => 'simple',
             'entryId' => $this->getTargetGalleryEntryId(),
         ];
 
@@ -280,23 +287,28 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     public function testCreateThrowsExceptionIfThereIsNoStoreWithProvidedStoreId()
     {
         $requestData = [
-            'productSku' => 'simple',
-            'entry' => [
-                'id' => null,
-                'label' => 'Image Text',
-                'position' => 1,
-                'types' => ['image'],
-                'is_disabled' => false,
-            ],
-            'storeId' => 9999, // target store view does not exist
-            'entryContent' => [
-                'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
-                'mime_type' => 'image/jpeg',
-                'name' => 'test_image',
-            ],
+            'sku' => 'simple',
+            'store_id' => 9999, // target store view does not exist
+            "custom_attributes" => [
+                "media_gallery" => [
+                    'attribute_code' => 'media_gallery',
+                    'value' => [
+                        'id' => null,
+                        'label' => 'Image Text',
+                        'position' => 1,
+                        'types' => ['image'],
+                        'disabled' => false,
+                        'content' => [
+                            'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
+                            'mime_type' => 'image/jpeg',
+                            'name' => 'test_image',
+                        ]
+                    ]
+                ],
+            ]
         ];
 
-        $this->_webApiCall($this->createServiceInfo, $requestData);
+        $this->_webApiCall($this->createServiceInfo, ['product' => $requestData]);
     }
 
     /**
@@ -308,23 +320,28 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     {
         $encodedContent = 'not_a_base64_encoded_content';
         $requestData = [
-            'productSku' => 'simple',
-            'entry' => [
-                'id' => null,
-                'label' => 'Image Text',
-                'position' => 1,
-                'is_disabled' => false,
-                'types' => ['image'],
-            ],
-            'entryContent' => [
-                'entry_data' => $encodedContent,
-                'mime_type' => 'image/jpeg',
-                'name' => 'test_image',
-            ],
-            'storeId' => 0,
+            'sku' => 'simple',
+            'store_id' => 0,
+            "custom_attributes" => [
+                "media_gallery" => [
+                    'attribute_code' => 'media_gallery',
+                    'value' => [
+                        'id' => null,
+                        'label' => 'Image Text',
+                        'position' => 1,
+                        'types' => ['image'],
+                        'disabled' => false,
+                        'content' => [
+                            'entry_data' => $encodedContent,
+                            'mime_type' => 'image/jpeg',
+                            'name' => 'test_image',
+                        ]
+                    ]
+                ],
+            ]
         ];
 
-        $this->_webApiCall($this->createServiceInfo, $requestData);
+        $this->_webApiCall($this->createServiceInfo, ['product' => $requestData]);
     }
 
     /**
@@ -336,23 +353,28 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     {
         $encodedContent = base64_encode('not_an_image');
         $requestData = [
-            'productSku' => 'simple',
-            'entry' => [
-                'id' => null,
-                'is_disabled' => false,
-                'label' => 'Image Text',
-                'position' => 1,
-                'types' => ['image'],
-            ],
-            'entryContent' => [
-                'entry_data' => $encodedContent,
-                'mime_type' => 'image/jpeg',
-                'name' => 'test_image',
-            ],
-            'storeId' => 0,
+            'sku' => 'simple',
+            'store_id' => 0,
+            "custom_attributes" => [
+                "media_gallery" => [
+                    'attribute_code' => 'media_gallery',
+                    'value' => [
+                        'id' => null,
+                        'label' => 'Image Text',
+                        'position' => 1,
+                        'types' => ['image'],
+                        'disabled' => false,
+                        'content' => [
+                            'entry_data' => $encodedContent,
+                            'mime_type' => 'image/jpeg',
+                            'name' => 'test_image',
+                        ]
+                    ]
+                ],
+            ]
         ];
 
-        $this->_webApiCall($this->createServiceInfo, $requestData);
+        $this->_webApiCall($this->createServiceInfo, ['product' => $requestData]);
     }
 
     /**
@@ -364,23 +386,28 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     {
         $encodedContent = base64_encode(file_get_contents($this->testImagePath));
         $requestData = [
-            'entry' => [
-                'id' => null,
-                'label' => 'Image Text',
-                'position' => 1,
-                'types' => ['image'],
-                'is_disabled' => false,
-            ],
-            'productSku' => 'simple',
-            'entryContent' => [
-                'entry_data' => $encodedContent,
-                'mime_type' => 'wrong_mime_type',
-                'name' => 'test_image',
-            ],
-            'storeId' => 0,
+            'sku' => 'simple',
+            'store_id' => 0,
+            "custom_attributes" => [
+                "media_gallery" => [
+                    'attribute_code' => 'media_gallery',
+                    'value' => [
+                        'id' => null,
+                        'label' => 'Image Text',
+                        'position' => 1,
+                        'types' => ['image'],
+                        'disabled' => false,
+                        'content' => [
+                            'entry_data' => $encodedContent,
+                            'mime_type' => 'wrong_mime_type',
+                            'name' => 'test_image',
+                        ]
+                    ]
+                ],
+            ]
         ];
 
-        $this->_webApiCall($this->createServiceInfo, $requestData);
+        $this->_webApiCall($this->createServiceInfo, ['product' => $requestData]);
     }
 
     /**
@@ -389,25 +416,31 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
      */
     public function testCreateThrowsExceptionIfTargetProductDoesNotExist()
     {
-        $this->createServiceInfo['rest']['resourcePath'] = '/V1/products/wrong_product_sku/media';
+        $this->createServiceInfo['rest']['resourcePath'] = '/V1/products/media';
+
         $requestData = [
-            'productSku' => 'wrong_product_sku',
-            'entry' => [
-                'id' => null,
-                'position' => 1,
-                'label' => 'Image Text',
-                'types' => ['image'],
-                'is_disabled' => false,
-            ],
-            'entryContent' => [
-                'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
-                'mime_type' => 'image/jpeg',
-                'name' => 'test_image',
-            ],
-            'storeId' => 0,
+            'sku' => 'wrong_product_sku',
+            'store_id' => 0,
+            "custom_attributes" => [
+                "media_gallery" => [
+                    'attribute_code' => 'media_gallery',
+                    'value' => [
+                        'id' => null,
+                        'label' => 'Image Text',
+                        'position' => 1,
+                        'types' => ['image'],
+                        'disabled' => false,
+                        'content' => [
+                            'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
+                            'mime_type' => 'image/jpeg',
+                            'name' => 'test_image',
+                        ]
+                    ]
+                ],
+            ]
         ];
 
-        $this->_webApiCall($this->createServiceInfo, $requestData);
+        $this->_webApiCall($this->createServiceInfo, ['product' => $requestData]);
     }
 
     /**
@@ -418,23 +451,28 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     public function testCreateThrowsExceptionIfProvidedImageNameContainsForbiddenCharacters()
     {
         $requestData = [
-            'productSku' => 'simple',
-            'entry' => [
-                'id' => null,
-                'label' => 'Image Text',
-                'position' => 1,
-                'types' => ['image'],
-                'is_disabled' => false,
-            ],
-            'entryContent' => [
-                'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
-                'mime_type' => 'image/jpeg',
-                'name' => 'test/\\{}|:"<>', // Cannot contain \ / : * ? " < > |
-            ],
-            'storeId' => 0,
+            'sku' => 'wrong_product_sku',
+            'store_id' => 0,
+            "custom_attributes" => [
+                "media_gallery" => [
+                    'attribute_code' => 'media_gallery',
+                    'value' => [
+                        'id' => null,
+                        'label' => 'Image Text',
+                        'position' => 1,
+                        'types' => ['image'],
+                        'disabled' => false,
+                        'content' => [
+                            'entry_data' => base64_encode(file_get_contents($this->testImagePath)),
+                            'mime_type' => 'image/jpeg',
+                            'name' => 'test/\\{}|:"<>', // Cannot contain \ / : * ? " < > |
+                        ]
+                    ]
+                ],
+            ]
         ];
 
-        $this->_webApiCall($this->createServiceInfo, $requestData);
+        $this->_webApiCall($this->createServiceInfo, ['product' => $requestData]);
     }
 
     /**
@@ -445,15 +483,15 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     public function testUpdateIfThereIsNoStoreWithProvidedStoreId()
     {
         $requestData = [
-            'productSku' => 'simple',
+            'sku' => 'simple',
             'entry' => [
                 'id' => $this->getTargetGalleryEntryId(),
                 'label' => 'Updated Image Text',
                 'position' => 10,
                 'types' => ['thumbnail'],
-                'is_disabled' => true,
+                'disabled' => true,
             ],
-            'storeId' => 9999, // target store view does not exist
+            'store_id' => 9999, // target store view does not exist
         ];
 
         $this->updateServiceInfo['rest']['resourcePath'] = $this->updateServiceInfo['rest']['resourcePath']
@@ -471,15 +509,15 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
         $this->updateServiceInfo['rest']['resourcePath'] = '/V1/products/wrong_product_sku/media'
             . '/' . $this->getTargetGalleryEntryId();
         $requestData = [
-            'productSku' => 'wrong_product_sku',
+            'sku' => 'wrong_product_sku',
             'entry' => [
                 'id' => 9999,
                 'label' => 'Updated Image Text',
                 'position' => 1,
                 'types' => ['thumbnail'],
-                'is_disabled' => true,
+                'disabled' => true,
             ],
-            'storeId' => 0,
+            'store_id' => 0,
         ];
 
         $this->_webApiCall($this->updateServiceInfo, $requestData);
@@ -493,15 +531,15 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     public function testUpdateThrowsExceptionIfThereIsNoImageWithGivenId()
     {
         $requestData = [
-            'productSku' => 'simple',
+            'sku' => 'simple',
             'entry' => [
                 'id' => 9999,
                 'label' => 'Updated Image Text',
                 'position' => 1,
                 'types' => ['thumbnail'],
-                'is_disabled' => true,
+                'disabled' => true,
             ],
-            'storeId' => 0,
+            'store_id' => 0,
         ];
 
         $this->updateServiceInfo['rest']['resourcePath'] = $this->updateServiceInfo['rest']['resourcePath']
@@ -518,7 +556,7 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     {
         $this->deleteServiceInfo['rest']['resourcePath'] = '/V1/products/wrong_product_sku/media/9999';
         $requestData = [
-            'productSku' => 'wrong_product_sku',
+            'sku' => 'wrong_product_sku',
             'entryId' => 9999,
         ];
 
@@ -534,7 +572,7 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
     {
         $this->deleteServiceInfo['rest']['resourcePath'] = '/V1/products/simple/media/9999';
         $requestData = [
-            'productSku' => 'simple',
+            'sku' => 'simple',
             'entryId' => 9999,
         ];
 
@@ -558,7 +596,7 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
         $expected = [
             'label' => $image['label'],
             'position' => $image['position'],
-            'is_disabled' => (bool)$image['disabled'],
+            'disabled' => (bool)$image['disabled'],
             'file' => $image['file'],
             'types' => ['image', 'small_image', 'thumbnail'],
         ];
@@ -575,16 +613,16 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
             ],
         ];
         $requestData = [
-            'productSku' => $productSku,
+            'sku' => $productSku,
             'imageId' => $imageId,
         ];
         $data = $this->_webApiCall($serviceInfo, $requestData);
-        $actual = (array) $data;
+        $actual = (array)$data;
         $this->assertEquals($expected['label'], $actual['label']);
         $this->assertEquals($expected['position'], $actual['position']);
         $this->assertEquals($expected['file'], $actual['file']);
         $this->assertEquals($expected['types'], $actual['types']);
-        $this->assertEquals($expected['is_disabled'], (bool)$actual['is_disabled']);
+        $this->assertEquals($expected['disabled'], (bool)$actual['disabled']);
     }
 
     /**
@@ -606,7 +644,7 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
         ];
 
         $requestData = [
-            'productSku' => $productSku,
+            'sku' => $productSku,
         ];
         $imageList = $this->_webApiCall($serviceInfo, $requestData);
 
@@ -635,7 +673,7 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
         ];
 
         $requestData = [
-            'productSku' => $productSku,
+            'sku' => $productSku,
         ];
         if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
             $this->setExpectedException('SoapFault', 'Requested product doesn\'t exist');
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeOptionManagementInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeOptionManagementInterfaceTest.php
index adc93f12c15337ab3a992586e3bae06bcb0b8a3a..2e31bec6182ee8d142cab94e7bc18eb3e49d9354 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeOptionManagementInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeOptionManagementInterfaceTest.php
@@ -17,6 +17,7 @@ class ProductAttributeOptionManagementInterfaceTest extends WebapiAbstract
 
     public function testGetItems()
     {
+        $this->_markTestAsRestOnly('Fix inconsistencies in WSDL and Data interfaces');
         $testAttributeCode = 'quantity_and_stock_status';
         $expectedOptions = [
             [
@@ -52,6 +53,7 @@ class ProductAttributeOptionManagementInterfaceTest extends WebapiAbstract
      */
     public function testAdd()
     {
+        $this->_markTestAsRestOnly('Fix inconsistencies in WSDL and Data interfaces');
         $testAttributeCode = 'select_attribute';
         $serviceInfo = [
             'rest' => [
@@ -100,6 +102,7 @@ class ProductAttributeOptionManagementInterfaceTest extends WebapiAbstract
      */
     public function testDelete()
     {
+        $this->_markTestAsRestOnly('Fix inconsistencies in WSDL and Data interfaces');
         $attributeCode = 'select_attribute';
         //get option Id
         $optionList = $this->getAttributeOptions($attributeCode);
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php
index 39de9b517afe08198142a3807a6d8a12b16c8ae4..1ddf12ceb1bb39315bb2155415d39eaee067aaa4 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php
@@ -55,7 +55,7 @@ class ProductCustomOptionRepositoryTest extends WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'DeleteByIdentifier',
             ],
         ];
-        $this->assertTrue($this->_webApiCall($serviceInfo, ['productSku' => $sku, 'optionId' => $optionId]));
+        $this->assertTrue($this->_webApiCall($serviceInfo, ['sku' => $sku, 'optionId' => $optionId]));
         /** @var  \Magento\Catalog\Model\Product $product */
         $product = $this->objectManager->create('Magento\Catalog\Model\Product');
         $product->load(1);
@@ -87,7 +87,7 @@ class ProductCustomOptionRepositoryTest extends WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'Get',
             ],
         ];
-        $option = $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'optionId' => $optionId]);
+        $option = $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'optionId' => $optionId]);
         unset($option['product_sku']);
         unset($option['option_id']);
         $excepted = include '_files/product_options.php';
@@ -101,6 +101,7 @@ class ProductCustomOptionRepositoryTest extends WebapiAbstract
      */
     public function testGetList()
     {
+        $this->_markTestAsRestOnly('Fix inconsistencies in WSDL and Data interfaces');
         $productSku = 'simple';
         $serviceInfo = [
             'rest' => [
@@ -113,7 +114,7 @@ class ProductCustomOptionRepositoryTest extends WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'GetList',
             ],
         ];
-        $options = $this->_webApiCall($serviceInfo, ['productSku' => $productSku]);
+        $options = $this->_webApiCall($serviceInfo, ['sku' => $productSku]);
 
         /** Unset dynamic data */
         foreach ($options as $key => $value) {
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductGroupPriceManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductGroupPriceManagementTest.php
index 882a95238d0b193d722299425f92d09d53c13d93..716a9ac564048a33fee8391647fc136da8f58d67 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductGroupPriceManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductGroupPriceManagementTest.php
@@ -32,7 +32,7 @@ class ProductGroupPriceManagementTest extends WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'GetList',
             ],
         ];
-        $groupPriceList = $this->_webApiCall($serviceInfo, ['productSku' => $productSku]);
+        $groupPriceList = $this->_webApiCall($serviceInfo, ['sku' => $productSku]);
         $this->assertCount(2, $groupPriceList);
         $this->assertEquals(9, $groupPriceList[0]['value']);
         $this->assertEquals(7, $groupPriceList[1]['value']);
@@ -56,7 +56,7 @@ class ProductGroupPriceManagementTest extends WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'Remove',
             ],
         ];
-        $requestData = ['productSku' => $productSku, 'customerGroupId' => $customerGroupId];
+        $requestData = ['sku' => $productSku, 'customerGroupId' => $customerGroupId];
         $this->assertTrue($this->_webApiCall($serviceInfo, $requestData));
     }
 
@@ -77,7 +77,7 @@ class ProductGroupPriceManagementTest extends WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'Add',
             ],
         ];
-        $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'customerGroupId' => 1, 'price' => 10]);
+        $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'customerGroupId' => 1, 'price' => 10]);
         $objectManager = \Magento\TestFramework\ObjectManager::getInstance();
         /** @var \Magento\Catalog\Api\ProductGroupPriceManagementInterface $service */
         $service = $objectManager->get('Magento\Catalog\Api\ProductGroupPriceManagementInterface');
@@ -106,7 +106,7 @@ class ProductGroupPriceManagementTest extends WebapiAbstract
             ],
 
         ];
-        $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'customerGroupId' => 1, 'price' => 10]);
+        $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'customerGroupId' => 1, 'price' => 10]);
         $objectManager = \Magento\TestFramework\ObjectManager::getInstance();
         /** @var \Magento\Catalog\Api\ProductGroupPriceManagementInterface $service */
         $service = $objectManager->get('Magento\Catalog\Api\ProductGroupPriceManagementInterface');
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductLinkManagementInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductLinkManagementInterfaceTest.php
index 0209428a759950a9e38c7f1339cec95801f2ee7d..5592363a2a8e2d9ed3e1e82b91c6e902c8aab5a2 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductLinkManagementInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductLinkManagementInterfaceTest.php
@@ -76,7 +76,7 @@ class ProductLinkManagementInterfaceTest extends WebapiAbstract
             ],
         ];
 
-        $actual = $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'type' => $linkType]);
+        $actual = $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'type' => $linkType]);
 
         $this->assertEquals('simple', $actual[0]['linked_product_type']);
         $this->assertEquals('simple', $actual[0]['linked_product_sku']);
@@ -112,7 +112,7 @@ class ProductLinkManagementInterfaceTest extends WebapiAbstract
         ];
 
         $arguments = [
-            'productSku' => $productSku,
+            'sku' => $productSku,
             'items' => [$linkData],
             'type' => $linkType,
         ];
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductLinkRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductLinkRepositoryInterfaceTest.php
index 1f89a35c6c26a114b64148c8813869948cc7ea3d..30d9d54a86d48363882113e4ee024ec5e6dff2d9 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductLinkRepositoryInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductLinkRepositoryInterfaceTest.php
@@ -47,7 +47,7 @@ class ProductLinkRepositoryInterfaceTest extends WebapiAbstract
                 ],
             ],
             [
-                'productSku' => $productSku,
+                'sku' => $productSku,
                 'type' => $linkType,
                 'linkedProductSku' => $linkedSku
             ]
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
index 931a8d2886447ed33379d6f21b548ec97cb5d9db..615675efa90a488421e7d4a4674d51b9355527f5 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
@@ -48,7 +48,7 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract
             ],
         ];
 
-        $response = $this->_webApiCall($serviceInfo, ['productSku' => $productData[ProductInterface::SKU]]);
+        $response = $this->_webApiCall($serviceInfo, ['sku' => $productData[ProductInterface::SKU]]);
         foreach ([ProductInterface::SKU, ProductInterface::NAME, ProductInterface::PRICE] as $key) {
             $this->assertEquals($productData[$key], $response[$key]);
         }
@@ -72,7 +72,7 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract
         $expectedMessage = 'Requested product doesn\'t exist';
 
         try {
-            $this->_webApiCall($serviceInfo, ['productSku' => $invalidSku]);
+            $this->_webApiCall($serviceInfo, ['sku' => $invalidSku]);
             $this->fail("Expected throwing exception");
         } catch (\SoapFault $e) {
             $this->assertContains(
@@ -274,6 +274,6 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract
         ];
 
         return (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) ?
-            $this->_webApiCall($serviceInfo, ['productSku' => $sku]) : $this->_webApiCall($serviceInfo);
+            $this->_webApiCall($serviceInfo, ['sku' => $sku]) : $this->_webApiCall($serviceInfo);
     }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryMultiStoreTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryMultiStoreTest.php
index e31a51c9313abaff81f0ec9a2d8400aba77bddcc..b2939d3116b93cde0d5453a1eeb0ece5401a6a67 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryMultiStoreTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryMultiStoreTest.php
@@ -34,7 +34,7 @@ class ProductRepositoryMultiStoreTest extends WebapiAbstract
 
     /**
      * Create another store one time for testSearch
-     * @magentoApiDataFixture Magento/Core/_files/store.php
+     * @magentoApiDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testCreateAnotherStore()
     {
@@ -73,7 +73,7 @@ class ProductRepositoryMultiStoreTest extends WebapiAbstract
             ]
         ];
 
-        $requestData = ['id' => $sku, 'productSku' => $sku];
+        $requestData = ['id' => $sku, 'sku' => $sku];
         $defaultStoreResponse = $this->_webApiCall($serviceInfo, $requestData);
         $nameInDefaultStore = 'Simple Product';
         $this->assertEquals(
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductTierPriceManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductTierPriceManagementTest.php
index 7fca11a150a627ae7f2d52fc09f5c9f0e48be37a..31e686b2e13dbd0edb704c85d4e772c9c7802cac 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductTierPriceManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductTierPriceManagementTest.php
@@ -38,7 +38,7 @@ class ProductTierPriceManagementTest extends WebapiAbstract
 
         $groupPriceList = $this->_webApiCall(
             $serviceInfo,
-            ['productSku' => $productSku, 'customerGroupId' => $customerGroupId]
+            ['sku' => $productSku, 'customerGroupId' => $customerGroupId]
         );
 
         $this->assertCount($count, $groupPriceList);
@@ -78,7 +78,7 @@ class ProductTierPriceManagementTest extends WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'Remove',
             ],
         ];
-        $requestData = ['productSku' => $productSku, 'customerGroupId' => $customerGroupId, 'qty' => $qty];
+        $requestData = ['sku' => $productSku, 'customerGroupId' => $customerGroupId, 'qty' => $qty];
         $this->assertTrue($this->_webApiCall($serviceInfo, $requestData));
     }
 
@@ -114,7 +114,7 @@ class ProductTierPriceManagementTest extends WebapiAbstract
         ];
 
         $requestData = [
-            'productSku' => $productSku,
+            'sku' => $productSku,
             'customerGroupId' => $customerGroupId,
             'qty' => $qty,
             'price' => $price,
@@ -152,7 +152,7 @@ class ProductTierPriceManagementTest extends WebapiAbstract
             ],
         ];
         $requestData = [
-            'productSku' => $productSku,
+            'sku' => $productSku,
             'customerGroupId' => $customerGroupId,
             'qty' => $qty,
             'price' => $price,
@@ -190,7 +190,7 @@ class ProductTierPriceManagementTest extends WebapiAbstract
             ],
         ];
         $requestData = [
-            'productSku' => $productSku,
+            'sku' => $productSku,
             'customerGroupId' => $customerGroupId,
             'qty' => $qty,
             'price' => $price,
diff --git a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/LowStockItemsTest.php b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/LowStockItemsTest.php
index 308fc41b83120d62e4cbc942b7363bebd46b6f2f..27212e5419f214927c1530baea17946f810ee54e 100644
--- a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/LowStockItemsTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/LowStockItemsTest.php
@@ -13,7 +13,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract;
 class LowStockItemsTest extends WebapiAbstract
 {
     const SERVICE_VERSION = 'V1';
-    const RESOURCE_PATH = '/V1/stockItem/lowStock/';
+    const RESOURCE_PATH = '/V1/stockItems/lowStock/';
 
     /**
      * @param float $qty
diff --git a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php
index 99f1f84fae540d5ed828f7e9f1cd5495b319aee8..0513f5e68abfdbe603bb5972604abb8d21453165 100644
--- a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php
@@ -29,7 +29,7 @@ class StockItemTest extends WebapiAbstract
     /**
      * Resource path
      */
-    const RESOURCE_PATH = '/V1/stockItem';
+    const RESOURCE_PATH = '/V1/stockItems';
 
     /** @var \Magento\Catalog\Model\Resource\Product\Collection */
     protected $productCollection;
diff --git a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockStatusTest.php b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockStatusTest.php
index a751be1959c467ca45d503b4ec489d7dcde106bd..19579fe3325b58468582789c7654974c0b01ba3e 100644
--- a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockStatusTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockStatusTest.php
@@ -14,7 +14,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract;
 class StockStatusTest extends WebapiAbstract
 {
     const SERVICE_VERSION = 'V1';
-    const RESOURCE_PATH = '/V1/stockStatus';
+    const RESOURCE_PATH = '/V1/stockStatuses';
 
     /**
      * @magentoApiDataFixture Magento/Catalog/_files/product_simple.php
diff --git a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/LinkManagementTest.php b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/LinkManagementTest.php
index dc65d9ff0833cbaa152805997163794f657bcd54..dcb84bd552027feece69841952457ad583076c67 100644
--- a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/LinkManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/LinkManagementTest.php
@@ -61,7 +61,7 @@ class LinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'AddChild'
             ]
         ];
-        $res = $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'childSku' => $childSku]);
+        $res = $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'childSku' => $childSku]);
         $this->assertTrue($res);
     }
 
@@ -77,7 +77,7 @@ class LinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAbstract
 
     protected function removeChild($productSku, $childSku)
     {
-        $resourcePath = self::RESOURCE_PATH . '/%s/child/%s';
+        $resourcePath = self::RESOURCE_PATH . '/%s/children/%s';
         $serviceInfo = [
             'rest' => [
                 'resourcePath' => sprintf($resourcePath, $productSku, $childSku),
@@ -89,7 +89,7 @@ class LinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'RemoveChild'
             ]
         ];
-        $requestData = ['productSku' => $productSku, 'childSku' => $childSku];
+        $requestData = ['sku' => $productSku, 'childSku' => $childSku];
         return $this->_webApiCall($serviceInfo, $requestData);
     }
 
@@ -110,6 +110,6 @@ class LinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAbstract
                 'operation' => self::SERVICE_NAME . 'GetChildren'
             ]
         ];
-        return $this->_webApiCall($serviceInfo, ['productSku' => $productSku]);
+        return $this->_webApiCall($serviceInfo, ['sku' => $productSku]);
     }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OptionRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OptionRepositoryTest.php
index 6985fe3fe0b02f2b502a995681159f341308e362..4551eaa3e45e2d713487938cf485344c5ff10b5c 100644
--- a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OptionRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OptionRepositoryTest.php
@@ -177,7 +177,7 @@ class OptionRepositoryTest extends \Magento\TestFramework\TestCase\WebapiAbstrac
             ],
         ];
         /** @var int $result */
-        $result = $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'option' => $option]);
+        $result = $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'option' => $option]);
         $this->assertGreaterThan(0, $result);
     }
 
@@ -207,7 +207,7 @@ class OptionRepositoryTest extends \Magento\TestFramework\TestCase\WebapiAbstrac
 
         $requestBody = ['option' => $option];
         if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
-            $requestBody['productSku'] = $productSku;
+            $requestBody['sku'] = $productSku;
             $requestBody['option']['id'] = $optionId;
         }
 
@@ -234,7 +234,7 @@ class OptionRepositoryTest extends \Magento\TestFramework\TestCase\WebapiAbstrac
                 'operation' => self::SERVICE_NAME . 'GetList'
             ]
         ];
-        return $this->_webApiCall($serviceInfo, ['productSku' => $productSku]);
+        return $this->_webApiCall($serviceInfo, ['sku' => $productSku]);
     }
 
     /**
@@ -255,7 +255,7 @@ class OptionRepositoryTest extends \Magento\TestFramework\TestCase\WebapiAbstrac
                 'operation' => self::SERVICE_NAME . 'DeleteById'
             ]
         ];
-        return $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'optionId' => $optionId]);
+        return $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'id' => $optionId]);
     }
 
     /**
@@ -276,7 +276,7 @@ class OptionRepositoryTest extends \Magento\TestFramework\TestCase\WebapiAbstrac
                 'operation'      => self::SERVICE_NAME . 'Get'
             ]
         ];
-        return $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'optionId' => $optionId]);
+        return $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'id' => $optionId]);
     }
 
     /**
@@ -296,6 +296,6 @@ class OptionRepositoryTest extends \Magento\TestFramework\TestCase\WebapiAbstrac
                 'operation'      => self::SERVICE_NAME . 'GetList'
             ]
         ];
-        return $this->_webApiCall($serviceInfo, ['productSku' => $productSku]);
+        return $this->_webApiCall($serviceInfo, ['sku' => $productSku]);
     }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OptionTypesListTest.php b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OptionTypesListTest.php
index 6998a2266e52fec98c4a9971bac45f40f408e237..a96d5ca79a5cb22ccf148210a39a37f0b545ba81 100644
--- a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OptionTypesListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OptionTypesListTest.php
@@ -10,7 +10,7 @@ class OptionTypesListTest extends \Magento\TestFramework\TestCase\WebapiAbstract
 {
     const SERVICE_READ_NAME = 'configurableProductOptionTypesListV1';
     const SERVICE_VERSION = 'V1';
-    const RESOURCE_PATH = '/V1/configurable-products/:productSku/options/';
+    const RESOURCE_PATH = '/V1/configurable-products/:sku/options/';
 
     public function testGetTypes()
     {
@@ -26,7 +26,7 @@ class OptionTypesListTest extends \Magento\TestFramework\TestCase\WebapiAbstract
     {
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => str_replace(':productSku/', '', self::RESOURCE_PATH) . 'types',
+                'resourcePath' => str_replace(':sku/', '', self::RESOURCE_PATH) . 'types',
                 'httpMethod'   => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Downloadable/Api/LinkRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Downloadable/Api/LinkRepositoryTest.php
index 78bb435b7af4d2c3a2ac98e7e7a8fde51a831566..56434acaf7b0135bb0d9bedc154a8b14b67a7a14 100644
--- a/dev/tests/api-functional/testsuite/Magento/Downloadable/Api/LinkRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Downloadable/Api/LinkRepositoryTest.php
@@ -113,7 +113,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => true,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Title',
                 'sort_order' => 1,
@@ -159,7 +159,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Store View Title',
                 'sort_order' => 1,
@@ -197,7 +197,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link with URL resources',
                 'sort_order' => 1,
@@ -234,7 +234,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link with URL resources',
                 'sort_order' => 1,
@@ -256,7 +256,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => 1,
@@ -285,7 +285,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => 1,
@@ -312,7 +312,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Title',
                 'sort_order' => 15,
@@ -339,7 +339,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => 1,
@@ -368,7 +368,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => 1,
@@ -392,7 +392,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => 1,
@@ -419,7 +419,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => 1,
@@ -457,7 +457,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => $sortOrder,
@@ -493,7 +493,7 @@ class LinkRepositoryTest extends WebapiAbstract
     {
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => 0,
@@ -529,7 +529,7 @@ class LinkRepositoryTest extends WebapiAbstract
         $this->createServiceInfo['rest']['resourcePath'] = '/V1/products/simple/downloadable-links';
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'simple',
+            'sku' => 'simple',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => 50,
@@ -554,7 +554,7 @@ class LinkRepositoryTest extends WebapiAbstract
         $this->createServiceInfo['rest']['resourcePath'] = '/V1/products/wrong-sku/downloadable-links';
         $requestData = [
             'isGlobalScopeContent' => false,
-            'productSku' => 'wrong-sku',
+            'sku' => 'wrong-sku',
             'linkContent' => [
                 'title' => 'Link Title',
                 'sort_order' => 15,
@@ -581,7 +581,7 @@ class LinkRepositoryTest extends WebapiAbstract
         $requestData = [
             'isGlobalScopeContent' => false,
             'linkId' => $linkId,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Updated Title',
                 'sort_order' => 2,
@@ -612,7 +612,7 @@ class LinkRepositoryTest extends WebapiAbstract
         $requestData = [
             'isGlobalScopeContent' => true,
             'linkId' => $linkId,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Updated Title',
                 'sort_order' => 2,
@@ -646,7 +646,7 @@ class LinkRepositoryTest extends WebapiAbstract
         $requestData = [
             'isGlobalScopeContent' => true,
             'linkId' => 1,
-            'productSku' => 'wrong-sku',
+            'sku' => 'wrong-sku',
             'linkContent' => [
                 'title' => 'Updated Title',
                 'sort_order' => 2,
@@ -671,7 +671,7 @@ class LinkRepositoryTest extends WebapiAbstract
         $requestData = [
             'isGlobalScopeContent' => true,
             'linkId' => 9999,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Title',
                 'sort_order' => 2,
@@ -698,7 +698,7 @@ class LinkRepositoryTest extends WebapiAbstract
         $requestData = [
             'isGlobalScopeContent' => false,
             'linkId' => $linkId,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Updated Link Title',
                 'sort_order' => 2,
@@ -725,7 +725,7 @@ class LinkRepositoryTest extends WebapiAbstract
         $requestData = [
             'isGlobalScopeContent' => false,
             'linkId' => $linkId,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Updated Link Title',
                 'sort_order' => $sortOrder,
@@ -751,7 +751,7 @@ class LinkRepositoryTest extends WebapiAbstract
         $requestData = [
             'isGlobalScopeContent' => false,
             'linkId' => $linkId,
-            'productSku' => 'downloadable-product',
+            'sku' => 'downloadable-product',
             'linkContent' => [
                 'title' => 'Updated Link Title',
                 'sort_order' => 200,
@@ -813,7 +813,7 @@ class LinkRepositoryTest extends WebapiAbstract
             ],
         ];
 
-        $requestData = ['productSku' => $sku];
+        $requestData = ['sku' => $sku];
 
         $expectedMessage = 'Requested product doesn\'t exist';
         try {
@@ -845,7 +845,7 @@ class LinkRepositoryTest extends WebapiAbstract
             ],
         ];
 
-        $requestData = ['productSku' => $sku];
+        $requestData = ['sku' => $sku];
 
         $list = $this->_webApiCall($serviceInfo, $requestData);
         $this->assertEmpty($list);
@@ -871,7 +871,7 @@ class LinkRepositoryTest extends WebapiAbstract
             ],
         ];
 
-        $requestData = ['productSku' => $sku];
+        $requestData = ['sku' => $sku];
 
         $list = $this->_webApiCall($serviceInfo, $requestData);
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Eav/Api/AttributeSetRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Eav/Api/AttributeSetRepositoryTest.php
index 435333d1b1ff6a6668d12123126bf18119ada6fb..c4876bd7f9f14bb5627fcb6bffb6b2e5edbc6f93 100644
--- a/dev/tests/api-functional/testsuite/Magento/Eav/Api/AttributeSetRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Eav/Api/AttributeSetRepositoryTest.php
@@ -73,7 +73,7 @@ class AttributeSetRepositoryTest extends WebapiAbstract
         $attributeSet = $this->getAttributeSetByName($attributeSetName);
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/eav/attribute-sets',
+                'resourcePath' => '/V1/eav/attribute-sets/' . $attributeSet->getId(),
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/GroupedProduct/Api/ProductLinkManagementTest.php b/dev/tests/api-functional/testsuite/Magento/GroupedProduct/Api/ProductLinkManagementTest.php
index 90cec13232000d8b00de2e09c49bc0e1027a5367..10e6d6f41ed029f84d9aab099da6cf27c462a736 100644
--- a/dev/tests/api-functional/testsuite/Magento/GroupedProduct/Api/ProductLinkManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/GroupedProduct/Api/ProductLinkManagementTest.php
@@ -32,7 +32,7 @@ class ProductLinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAb
             ],
         ];
 
-        $actual = $this->_webApiCall($serviceInfo, ['productSku' => $productSku, 'type' => $linkType]);
+        $actual = $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'type' => $linkType]);
 
         $expected = [
             [
@@ -55,14 +55,14 @@ class ProductLinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAb
             array_walk(
                 $expected,
                 function (&$item) {
-                    $item['custom_attributes'] = [['attribute_code' => 'qty', 'value' => 1.0000]];
+                    $item['extension_attributes'] = ['qty' => 1.0000];
                 }
             );
         } else {
             array_walk(
                 $expected,
                 function (&$item) {
-                    $item['custom_attributes'] = [['attribute_code' => 'qty', 'value' => 1.0000]];
+                    $item['extension_attributes'] = ['qty' => 1.0000];
                 }
             );
         }
diff --git a/dev/tests/api-functional/testsuite/Magento/GroupedProduct/Api/ProductLinkRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GroupedProduct/Api/ProductLinkRepositoryTest.php
index 4d375e84e39e9fadfea209c33cd29a5a9ef54d5b..69b1ef5073b6169102748462104bade23fc22017 100644
--- a/dev/tests/api-functional/testsuite/Magento/GroupedProduct/Api/ProductLinkRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/GroupedProduct/Api/ProductLinkRepositoryTest.php
@@ -37,8 +37,8 @@ class ProductLinkRepositoryTest extends \Magento\TestFramework\TestCase\WebapiAb
             'linked_product_type' => 'simple',
             'linked_product_sku' => 'simple',
             'position' => 3,
-            'custom_attributes' => [
-                'qty' => ['attribute_code' => 'qty', 'value' => (float) 300.0000],
+            'extension_attributes' => [
+                'qty' =>  (float) 300.0000,
             ],
         ];
 
@@ -55,7 +55,7 @@ class ProductLinkRepositoryTest extends \Magento\TestFramework\TestCase\WebapiAb
         ];
         $this->_webApiCall($serviceInfo, ['entity' => $productData]);
 
-        /** @var \Magento\Catalog\Model\ProductLink\Management $linkManagement */
+        /** @var \Magento\Catalog\Api\ProductLinkManagementInterface $linkManagement */
         $linkManagement = $this->objectManager->get('Magento\Catalog\Api\ProductLinkManagementInterface');
         $actual = $linkManagement->getLinkedItemsByType($productSku, $linkType);
         array_walk($actual, function (&$item) {
diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartRepositoryTest.php
index e411cc7903156b779ef651636eeebb0ca60f5b80..add493db96a143faf32a0d26e183122067aaa9e6 100644
--- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartRepositoryTest.php
@@ -153,18 +153,6 @@ class CartRepositoryTest extends WebapiAbstract
     {
         $cart = $this->getCart('test01');
 
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => '/V1/carts',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
-            ],
-            'soap' => [
-                'service' => 'quoteCartRepositoryV1',
-                'serviceVersion' => 'V1',
-                'operation' => 'quoteCartRepositoryV1GetList',
-            ],
-        ];
-
         // The following two filters are used as alternatives. The target cart does not match the first one.
         $grandTotalFilter = $this->filterBuilder->setField('grand_total')
             ->setConditionType('gteq')
@@ -195,6 +183,18 @@ class CartRepositoryTest extends WebapiAbstract
         $searchCriteria = $this->searchBuilder->create()->__toArray();
 
         $requestData = ['searchCriteria' => $searchCriteria];
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => '/V1/carts' . '?' . http_build_query($requestData),
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
+            ],
+            'soap' => [
+                'service' => 'quoteCartRepositoryV1',
+                'serviceVersion' => 'V1',
+                'operation' => 'quoteCartRepositoryV1GetList',
+            ],
+        ];
+
         $searchResult = $this->_webApiCall($serviceInfo, $requestData);
         $this->assertArrayHasKey('total_count', $searchResult);
         $this->assertEquals(1, $searchResult['total_count']);
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoAddCommentTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoAddCommentTest.php
index 86e5df82c426fb8954f32551900c45aed58f6b8e..909d1bf694e8fa61e9c4bf0b04b6108de30fffb0 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoAddCommentTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoAddCommentTest.php
@@ -66,7 +66,7 @@ class CreditmemoAddCommentTest extends WebapiAbstract
         $requestData = ['entity' => $commentData];
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/creditmemo/comment',
+                'resourcePath' => '/V1/creditmemo/' . $creditmemo->getId() . '/comments',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceAddCommentTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceAddCommentTest.php
index a6ad6436a54d3dd00bb3bfb3c2d16464716a85cc..fb69f3e2bf944ae199ce963c484f6638b87457be 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceAddCommentTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceAddCommentTest.php
@@ -47,7 +47,7 @@ class InvoiceAddCommentTest extends WebapiAbstract
         $requestData = ['entity' => $commentData];
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/invoice/comment',
+                'resourcePath' => '/V1/invoices/comments',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceCommentsListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceCommentsListTest.php
index 22f4c333de797034bf809714300a744abfaca2c2..d03981ed76af47d0c93b36984e1bd44acae0a1a4 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceCommentsListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceCommentsListTest.php
@@ -34,7 +34,7 @@ class InvoiceCommentsListTest extends WebapiAbstract
 
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/invoice/' . $invoice->getId() . '/comments',
+                'resourcePath' => '/V1/invoices/' . $invoice->getId() . '/comments',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceCreateTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceCreateTest.php
index 10c54d043e878d1ccbdddd0d877579266c6deb32..3237b600d6194811759404a099936f0d4b9e1f87 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceCreateTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceCreateTest.php
@@ -12,7 +12,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract;
  */
 class InvoiceCreateTest extends WebapiAbstract
 {
-    const RESOURCE_PATH = '/V1/invoice';
+    const RESOURCE_PATH = '/V1/invoices';
 
     const SERVICE_READ_NAME = 'salesInvoiceRepositoryV1';
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceEmailTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceEmailTest.php
index 572becdd7c535fd6215a29faa109bf871a74fe8e..66ae7db9a299d598a630f249f377cce6d4d00472 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceEmailTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceEmailTest.php
@@ -26,7 +26,7 @@ class InvoiceEmailTest extends WebapiAbstract
         $invoice = $invoiceCollection->getFirstItem();
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/invoice/' . $invoice->getId() . '/email',
+                'resourcePath' => '/V1/invoices/' . $invoice->getId() . '/emails',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceGetTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceGetTest.php
index da6c9291912d6c5fc839f27386551d32243ecb99..9e7758a570e5c6098ff156809b6341d6e58ce7d5 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceGetTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceGetTest.php
@@ -12,7 +12,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract;
  */
 class InvoiceGetTest extends WebapiAbstract
 {
-    const RESOURCE_PATH = '/V1/invoice';
+    const RESOURCE_PATH = '/V1/invoices';
 
     const SERVICE_READ_NAME = 'salesInvoiceRepositoryV1';
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderAddressUpdateTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderAddressUpdateTest.php
index 40a5fb8975ed64dd2df16026dc7cc4ed8c483ce2..337a532d256f520afa592be6a0b56df861f37e08 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderAddressUpdateTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderAddressUpdateTest.php
@@ -59,7 +59,7 @@ class OrderAddressUpdateTest extends WebapiAbstract
 
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/order/' . $order->getId(),
+                'resourcePath' => '/V1/orders/' . $order->getId(),
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCancelTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCancelTest.php
index e9b2afe36752e38637cab12fe107f39866b5c739..cd7cce323670340ab67a36af31dc722f5a1f4df9 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCancelTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCancelTest.php
@@ -23,7 +23,7 @@ class OrderCancelTest extends WebapiAbstract
         $order = $objectManager->get('Magento\Sales\Model\Order')->loadByIncrementId('100000001');
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/order/' . $order->getId() . '/cancel',
+                'resourcePath' => '/V1/orders/' . $order->getId() . '/cancel',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCommentsListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCommentsListTest.php
index 4117b042e1fa72177eb1b1a6d3f8632785039260..50f697f2039bf680fd8150d2d8764ceb1b7a9a57 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCommentsListTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCommentsListTest.php
@@ -28,7 +28,7 @@ class OrderCommentsListTest extends WebapiAbstract
 
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/order/' . $order->getId() . '/comments',
+                'resourcePath' => '/V1/orders/' . $order->getId() . '/comments',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCreateTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCreateTest.php
index f5b38cf18ae14725f0946c4e44856845f9c535d3..9671029364b2c5fcfb594ddd02cf74d9aaf20e1b 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCreateTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCreateTest.php
@@ -10,7 +10,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract;
 
 class OrderCreateTest extends WebapiAbstract
 {
-    const RESOURCE_PATH = '/V1/order';
+    const RESOURCE_PATH = '/V1/orders';
 
     const SERVICE_READ_NAME = 'salesOrderRepositoryV1';
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderEmailTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderEmailTest.php
index ed9722292bd9d10c6fb41f26ccec571cbaf1a8bb..6044e173013285687a27546625d9b1878a667fea 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderEmailTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderEmailTest.php
@@ -24,7 +24,7 @@ class OrderEmailTest extends WebapiAbstract
         $order->loadByIncrementId('100000001');
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/order/' . $order->getId() . '/email',
+                'resourcePath' => '/V1/orders/' . $order->getId() . '/emails',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetStatusTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetStatusTest.php
index 94f18257d8e443d4030dd2c6887c47cb088f1bd3..a45e17ccc48585457cf6b3e47748bd52f45c2794 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetStatusTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetStatusTest.php
@@ -13,7 +13,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract;
  */
 class OrderGetStatusTest extends WebapiAbstract
 {
-    const RESOURCE_PATH = '/V1/order/%d/status';
+    const RESOURCE_PATH = '/V1/orders/%d/statuses';
 
     const SERVICE_READ_NAME = 'salesOrderManagementV1';
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetTest.php
index d590af9442b7f1f78fc5c2f617b6ffe2330f9a7d..46c3c7ca1b96392611dc62081e43bfb385eb478a 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderGetTest.php
@@ -9,7 +9,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract;
 
 class OrderGetTest extends WebapiAbstract
 {
-    const RESOURCE_PATH = '/V1/order';
+    const RESOURCE_PATH = '/V1/orders';
 
     const SERVICE_READ_NAME = 'salesOrderRepositoryV1';
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderHoldTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderHoldTest.php
index 72d05d8f6c79106b0ba33c48b99fb8bf0658646c..bd693a814ad3cc5e747972def80ef2722a1f8f57 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderHoldTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderHoldTest.php
@@ -23,7 +23,7 @@ class OrderHoldTest extends WebapiAbstract
         $order = $objectManager->get('Magento\Sales\Model\Order')->loadByIncrementId('100000001');
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/order/' . $order->getId() . '/hold',
+                'resourcePath' => '/V1/orders/' . $order->getId() . '/hold',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderStatusHistoryAddTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderStatusHistoryAddTest.php
index bb779d74cc0fd70f3eef788647fddc588e5ce141..95858cce508621c7d1bf7aa4d3dee5df379fd9d9 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderStatusHistoryAddTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderStatusHistoryAddTest.php
@@ -57,7 +57,7 @@ class OrderStatusHistoryAddTest extends WebapiAbstract
         $requestData = ['id' => $order->getId(), 'statusHistory' => $commentData];
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/order/' . $order->getId() . '/comment',
+                'resourcePath' => '/V1/orders/' . $order->getId() . '/comments',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderUnHoldTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderUnHoldTest.php
index a8e2a81d6bda64ca1142cdddbd3c4bb8acefa80b..572ba2409e070865e0f9ef9b316c24e93b35c558 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderUnHoldTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderUnHoldTest.php
@@ -27,7 +27,7 @@ class OrderUnHoldTest extends WebapiAbstract
         }
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/order/' . $order->getId() . '/unhold',
+                'resourcePath' => '/V1/orders/' . $order->getId() . '/unhold',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentAddCommentTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentAddCommentTest.php
index 3e76bd29340a90430ba96116673f82249d4049ea..330fd56c430b6dd682fa9f6d50e530fac74884a2 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentAddCommentTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentAddCommentTest.php
@@ -61,7 +61,7 @@ class ShipmentAddCommentTest extends WebapiAbstract
         $requestData = ['entity' => $commentData];
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/shipment/comment',
+                'resourcePath' => '/V1/shipment/' . $shipment->getId() . '/comments',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentEmailTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentEmailTest.php
index 947d51f70f4b15c1ac3fe0a3141116723614e4f9..d6b59d22475398ce532469035661fba7a51edd64 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentEmailTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentEmailTest.php
@@ -27,7 +27,7 @@ class ShipmentEmailTest extends WebapiAbstract
         $shipment = $shipmentCollection->getFirstItem();
         $serviceInfo = [
             'rest' => [
-                'resourcePath' => '/V1/shipment/' . $shipment->getId() . '/email',
+                'resourcePath' => '/V1/shipment/' . $shipment->getId() . '/emails',
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
             ],
             'soap' => [
diff --git a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxClassRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxClassRepositoryTest.php
index 4827823190d200e3f3cfa0fcfea198a871cb31dc..1557278ce1bb31a76ac96d90a90c57b6bada4d21 100644
--- a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxClassRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxClassRepositoryTest.php
@@ -23,7 +23,7 @@ class TaxClassRepositoryTest extends WebapiAbstract
 {
     const SERVICE_NAME = 'taxTaxClassRepositoryV1';
     const SERVICE_VERSION = 'V1';
-    const RESOURCE_PATH = '/V1/taxClass';
+    const RESOURCE_PATH = '/V1/taxClasses';
 
     /** @var SearchCriteriaBuilder */
     private $searchCriteriaBuilder;
diff --git a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRateRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRateRepositoryTest.php
index 618ee4f5c3fb8563b82ce95ee3ef3f58568dbb4c..df2cf377a532c3e4c79a9c1ec59ac58663e8c4f8 100644
--- a/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRateRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRateRepositoryTest.php
@@ -21,7 +21,7 @@ class TaxRateRepositoryTest extends WebapiAbstract
 {
     const SERVICE_NAME = "taxTaxRateRepositoryV1";
     const SERVICE_VERSION = "V1";
-    const RESOURCE_PATH = "/V1/taxRate";
+    const RESOURCE_PATH = "/V1/taxRates";
 
     /** @var \Magento\Tax\Model\Calculation\Rate[] */
     private $fixtureTaxRates;
diff --git a/dev/tests/api-functional/testsuite/Magento/Webapi/DataObjectSerialization/CustomAttributeSerializationMSCTest.php b/dev/tests/api-functional/testsuite/Magento/Webapi/DataObjectSerialization/CustomAttributeSerializationMSCTest.php
deleted file mode 100644
index f8ec083d6e1f3aeb0155475ae83ce034f7ecad61..0000000000000000000000000000000000000000
--- a/dev/tests/api-functional/testsuite/Magento/Webapi/DataObjectSerialization/CustomAttributeSerializationMSCTest.php
+++ /dev/null
@@ -1,230 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Webapi\DataObjectSerialization;
-
-use Magento\Framework\Reflection\DataObjectProcessor;
-use Magento\Framework\Webapi\ServiceOutputProcessor;
-use Magento\TestFramework\Helper\Bootstrap;
-use Magento\TestModuleMSC\Api\Data\ItemInterfaceFactory;
-
-/**
- * api-functional/testsuite/Magento/Webapi/DataObjectSerialization/CustomAttributeSerializationMSCTest.php
- * Class to test if custom attributes are serialized correctly for the new Module Service Contract approach
- */
-class CustomAttributeSerializationMSCTest extends \Magento\Webapi\Routing\BaseService
-{
-    /**
-     * @var string
-     */
-    protected $_version;
-    /**
-     * @var string
-     */
-    protected $_restResourcePath;
-    /**
-     * @var string
-     */
-    protected $_soapService = 'testModuleMSCAllSoapAndRest';
-
-    /**
-     * @var ItemInterfaceFactory
-     */
-    protected $itemDataFactory;
-
-    /**
-     * @var \Magento\TestModuleMSC\Api\Data\CustomAttributeNestedDataObjectInterfaceFactory
-     */
-    protected $customAttributeNestedDataObjectDataFactory;
-
-    /**
-     * @var \Magento\TestModuleMSC\Api\Data\CustomAttributeDataObjectInterfaceFactory
-     */
-    protected $customAttributeDataObjectDataFactory;
-
-    /**
-     * @var DataObjectProcessor $dataObjectProcessor
-     */
-    protected $dataObjectProcessor;
-
-    /**
-     * @var ServiceOutputProcessor $serviceOutputProcessor
-     */
-    protected $serviceOutputProcessor;
-
-    /**
-     * Set up custom attribute related data objects
-     */
-    protected function setUp()
-    {
-        $this->_version = 'V1';
-        $this->_soapService = 'testModuleMSCAllSoapAndRestV1';
-        $this->_restResourcePath = "/{$this->_version}/testmoduleMSC/";
-
-        $this->itemDataFactory = Bootstrap::getObjectManager()->create(
-            'Magento\TestModuleMSC\Api\Data\ItemInterfaceFactory'
-        );
-
-        $this->customAttributeNestedDataObjectDataFactory = Bootstrap::getObjectManager()->create(
-            'Magento\TestModuleMSC\Api\Data\CustomAttributeNestedDataObjectInterfaceFactory'
-        );
-
-        $this->customAttributeDataObjectDataFactory = Bootstrap::getObjectManager()->create(
-            'Magento\TestModuleMSC\Api\Data\CustomAttributeDataObjectInterfaceFactory'
-        );
-
-        $this->dataObjectProcessor = Bootstrap::getObjectManager()->create(
-            'Magento\Framework\Reflection\DataObjectProcessor'
-        );
-
-        $this->serviceOutputProcessor = Bootstrap::getObjectManager()->create(
-            'Magento\Framework\Webapi\ServiceOutputProcessor'
-        );
-    }
-
-    public function testSimpleAndNonExistentCustomAttributes()
-    {
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => $this->_restResourcePath . 'itemAnyType',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
-            ],
-            'soap' => ['service' => $this->_soapService, 'operation' => $this->_soapService . 'ItemAnyType'],
-        ];
-        $requestData = [
-            'item_id' => 1,
-            'name' => 'testProductAnyType',
-            'custom_attributes' => [
-                    'non_existent' => [
-                            'attribute_code' => 'non_existent',
-                            'value' => 'test',
-                        ],
-                    'custom_attribute_string' => [
-                            'attribute_code' => 'custom_attribute_string',
-                            'value' => 'someStringValue',
-                        ],
-                ],
-        ];
-        $result = $this->_webApiCall($serviceInfo, ['entityItem' => $requestData]);
-
-        //The non_existent custom attribute should be dropped since its not a defined custom attribute
-        $expectedResponse = [
-            'item_id' => 1,
-            'name' => 'testProductAnyType',
-            'custom_attributes' => [
-                    [
-                        'attribute_code' => 'custom_attribute_string',
-                        'value' => 'someStringValue',
-                    ],
-                ],
-        ];
-
-        //\Magento\TestModuleMSC\Api\AllSoapAndRest::itemAnyType just return the input data back as response
-        $this->assertEquals($expectedResponse, $result);
-    }
-
-    public function testDataObjectCustomAttributes()
-    {
-        $customAttributeDataObject = $this->customAttributeDataObjectDataFactory->create()
-            ->setName('nameValue')
-            ->setCustomAttribute('custom_attribute_int', 1);
-
-        $item = $this->itemDataFactory->create()
-            ->setItemId(1)
-            ->setName('testProductAnyType')
-            ->setCustomAttribute('custom_attribute_data_object', $customAttributeDataObject)
-            ->setCustomAttribute('custom_attribute_string', 'someStringValue');
-
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => $this->_restResourcePath . 'itemAnyType',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
-            ],
-            'soap' => ['service' => $this->_soapService, 'operation' => $this->_soapService . 'ItemAnyType'],
-        ];
-        $requestData = $this->dataObjectProcessor->buildOutputDataArray(
-            $item,
-            '\Magento\TestModuleMSC\Api\Data\ItemInterface'
-        );
-        $result = $this->_webApiCall($serviceInfo, ['entityItem' => $requestData]);
-
-        $expectedResponse = $this->serviceOutputProcessor->process(
-            $item,
-            '\Magento\TestModuleMSC\Api\AllSoapAndRestInterface',
-            'itemAnyType'
-        );
-        //\Magento\TestModuleMSC\Api\AllSoapAndRest::itemAnyType just return the input data back as response
-        $this->assertEquals($expectedResponse, $result);
-    }
-
-    public function testDataObjectCustomAttributesPreconfiguredItem()
-    {
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => $this->_restResourcePath . 'itemPreconfigured',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
-            ],
-            'soap' => ['service' => $this->_soapService, 'operation' => $this->_soapService . 'GetPreconfiguredItem'],
-        ];
-
-        $result = $this->_webApiCall($serviceInfo, []);
-
-        $customAttributeDataObject = $this->customAttributeDataObjectDataFactory->create()
-            ->setName('nameValue')
-            ->setCustomAttribute('custom_attribute_int', 1);
-
-        $item = $this->itemDataFactory->create()
-            ->setItemId(1)
-            ->setName('testProductAnyType')
-            ->setCustomAttribute('custom_attribute_data_object', $customAttributeDataObject)
-            ->setCustomAttribute('custom_attribute_string', 'someStringValue');
-
-        $expectedResponse = $this->serviceOutputProcessor->process(
-            $item,
-            '\Magento\TestModuleMSC\Api\AllSoapAndRestInterface',
-            'getPreconfiguredItem'
-        );
-        $this->assertEquals($expectedResponse, $result);
-    }
-
-    public function testNestedDataObjectCustomAttributes()
-    {
-        $customAttributeNestedDataObject = $this->customAttributeNestedDataObjectDataFactory->create()
-            ->setName('nestedNameValue');
-
-        $customAttributeDataObject = $this->customAttributeDataObjectDataFactory->create()
-            ->setName('nameValue')
-            ->setCustomAttribute('custom_attribute_nested', $customAttributeNestedDataObject)
-            ->setCustomAttribute('custom_attribute_int', 1);
-
-        $item = $this->itemDataFactory->create()
-            ->setItemId(1)
-            ->setName('testProductAnyType')
-            ->setCustomAttribute('custom_attribute_data_object', $customAttributeDataObject)
-            ->setCustomAttribute('custom_attribute_string', 'someStringValue');
-
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => $this->_restResourcePath . 'itemAnyType',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
-            ],
-            'soap' => ['service' => $this->_soapService, 'operation' => $this->_soapService . 'ItemAnyType'],
-        ];
-        $requestData = $this->dataObjectProcessor->buildOutputDataArray(
-            $item,
-            '\Magento\TestModuleMSC\Api\Data\ItemInterface'
-        );
-        $result = $this->_webApiCall($serviceInfo, ['entityItem' => $requestData]);
-
-        $expectedResponse = $this->serviceOutputProcessor->process(
-            $item,
-            '\Magento\TestModuleMSC\Api\AllSoapAndRestInterface',
-            'itemAnyType'
-        );
-        //\Magento\TestModuleMSC\Api\AllSoapAndRest::itemAnyType just return the input data back as response
-        $this->assertEquals($expectedResponse, $result);
-    }
-}
diff --git a/dev/tests/api-functional/testsuite/Magento/Webapi/DataObjectSerialization/CustomAttributeSerializationTest.php b/dev/tests/api-functional/testsuite/Magento/Webapi/DataObjectSerialization/CustomAttributeSerializationTest.php
deleted file mode 100644
index 0a1c4b7905d38c9517c452a587276c6c9581890a..0000000000000000000000000000000000000000
--- a/dev/tests/api-functional/testsuite/Magento/Webapi/DataObjectSerialization/CustomAttributeSerializationTest.php
+++ /dev/null
@@ -1,212 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-/**
- * Class to test if custom attributes are serialized correctly
- */
-namespace Magento\Webapi\DataObjectSerialization;
-
-use Magento\Framework\Webapi\ServiceOutputProcessor;
-use Magento\TestFramework\Helper\Bootstrap;
-use Magento\TestModule1\Service\V1\Entity\ItemFactory;
-
-class CustomAttributeSerializationTest extends \Magento\Webapi\Routing\BaseService
-{
-    /**
-     * @var string
-     */
-    protected $_version;
-    /**
-     * @var string
-     */
-    protected $_restResourcePath;
-    /**
-     * @var string
-     */
-    protected $_soapService = 'testModule1AllSoapAndRest';
-
-    /**
-     * @var ItemFactory
-     */
-    protected $itemFactory;
-
-    /**
-     * @var \Magento\TestModule1\Service\V1\Entity\CustomAttributeNestedDataObjectFactory
-     */
-    protected $customAttributeNestedDataObjectFactory;
-
-    /**
-     * @var \Magento\TestModule1\Service\V1\Entity\CustomAttributeDataObjectFactory
-     */
-    protected $customAttributeDataObjectFactory;
-
-    /**
-     * @var ServiceOutputProcessor $serviceOutputProcessor
-     */
-    protected $serviceOutputProcessor;
-
-    /**
-     * Set up custom attribute related data objects
-     */
-    protected function setUp()
-    {
-        $this->_version = 'V1';
-        $this->_soapService = 'testModule1AllSoapAndRestV1';
-        $this->_restResourcePath = "/{$this->_version}/testmodule1/";
-
-        $this->itemFactory = Bootstrap::getObjectManager()->create(
-            'Magento\TestModule1\Service\V1\Entity\ItemFactory'
-        );
-
-        $this->customAttributeNestedDataObjectFactory = Bootstrap::getObjectManager()->create(
-            'Magento\TestModule1\Service\V1\Entity\CustomAttributeNestedDataObjectFactory'
-        );
-
-        $this->customAttributeDataObjectFactory = Bootstrap::getObjectManager()->create(
-            'Magento\TestModule1\Service\V1\Entity\CustomAttributeDataObjectFactory'
-        );
-
-        $this->serviceOutputProcessor = Bootstrap::getObjectManager()->create(
-            'Magento\Framework\Webapi\ServiceOutputProcessor'
-        );
-    }
-
-    public function testSimpleAndNonExistentCustomAttributes()
-    {
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => $this->_restResourcePath . 'itemAnyType',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
-            ],
-            'soap' => ['service' => $this->_soapService, 'operation' => $this->_soapService . 'ItemAnyType'],
-        ];
-        $requestData = [
-            'item_id' => 1,
-            'name' => 'testProductAnyType',
-            'custom_attributes' => [
-                    'non_existent' => [
-                            'attribute_code' => 'non_existent',
-                            'value' => 'test',
-                        ],
-                    'custom_attribute_string' => [
-                            'attribute_code' => 'custom_attribute_string',
-                            'value' => 'someStringValue',
-                        ],
-                ],
-        ];
-        $result = $this->_webApiCall($serviceInfo, ['entityItem' => $requestData]);
-
-        //The non_existent custom attribute should be dropped since its not a defined custom attribute
-        $expectedResponse = [
-            'item_id' => 1,
-            'name' => 'testProductAnyType',
-            'custom_attributes' => [
-                    [
-                        'attribute_code' => 'custom_attribute_string',
-                        'value' => 'someStringValue',
-                    ],
-                ],
-        ];
-
-        //\Magento\TestModule1\Service\V1\AllSoapAndRest::itemAnyType just return the input data back as response
-        $this->assertEquals($expectedResponse, $result);
-    }
-
-    public function testDataObjectCustomAttributes()
-    {
-        $customAttributeDataObject = $this->customAttributeDataObjectFactory->create()
-            ->setName('nameValue')
-            ->setCustomAttribute('custom_attribute_int', 1);
-
-        $item = $this->itemFactory->create()
-            ->setItemId(1)
-            ->setName('testProductAnyType')
-            ->setCustomAttribute('custom_attribute_data_object', $customAttributeDataObject)
-            ->setCustomAttribute('custom_attribute_string', 'someStringValue');
-
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => $this->_restResourcePath . 'itemAnyType',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
-            ],
-            'soap' => ['service' => $this->_soapService, 'operation' => $this->_soapService . 'ItemAnyType'],
-        ];
-        $requestData = $item->__toArray();
-        $result = $this->_webApiCall($serviceInfo, ['entityItem' => $requestData]);
-
-        $expectedResponse = $this->serviceOutputProcessor->process(
-            $item,
-            '\Magento\TestModule1\Service\V1\AllSoapAndRestInterface',
-            'itemAnyType'
-        );
-        //\Magento\TestModule1\Service\V1\AllSoapAndRest::itemAnyType just return the input data back as response
-        $this->assertEquals($expectedResponse, $result);
-    }
-
-    public function testDataObjectCustomAttributesPreconfiguredItem()
-    {
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => $this->_restResourcePath . 'itemPreconfigured',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
-            ],
-            'soap' => ['service' => $this->_soapService, 'operation' => $this->_soapService . 'GetPreconfiguredItem'],
-        ];
-
-        $result = $this->_webApiCall($serviceInfo, []);
-
-        $customAttributeDataObject = $this->customAttributeDataObjectFactory->create()
-            ->setName('nameValue')
-            ->setCustomAttribute('custom_attribute_int', 1);
-
-        $item = $this->itemFactory->create()
-            ->setItemId(1)
-            ->setName('testProductAnyType')
-            ->setCustomAttribute('custom_attribute_data_object', $customAttributeDataObject)
-            ->setCustomAttribute('custom_attribute_string', 'someStringValue');
-        $expectedResponse = $this->serviceOutputProcessor->process(
-            $item,
-            '\Magento\TestModule1\Service\V1\AllSoapAndRestInterface',
-            'getPreconfiguredItem'
-        );
-        $this->assertEquals($expectedResponse, $result);
-    }
-
-    public function testNestedDataObjectCustomAttributes()
-    {
-        $customAttributeNestedDataObject = $this->customAttributeNestedDataObjectFactory->create()
-            ->setName('nestedNameValue');
-
-        $customAttributeDataObject = $this->customAttributeDataObjectFactory->create()
-            ->setName('nameValue')
-            ->setCustomAttribute('custom_attribute_nested', $customAttributeNestedDataObject)
-            ->setCustomAttribute('custom_attribute_int', 1);
-
-        $item = $this->itemFactory->create()
-            ->setItemId(1)
-            ->setName('testProductAnyType')
-            ->setCustomAttribute('custom_attribute_data_object', $customAttributeDataObject)
-            ->setCustomAttribute('custom_attribute_string', 'someStringValue');
-
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => $this->_restResourcePath . 'itemAnyType',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
-            ],
-            'soap' => ['service' => $this->_soapService, 'operation' => $this->_soapService . 'ItemAnyType'],
-        ];
-        $requestData = $item->__toArray();
-        $result = $this->_webApiCall($serviceInfo, ['entityItem' => $requestData]);
-
-        $expectedResponse = $this->serviceOutputProcessor->process(
-            $item,
-            '\Magento\TestModule1\Service\V1\AllSoapAndRestInterface',
-            'itemAnyType'
-        );
-        //\Magento\TestModule1\Service\V1\AllSoapAndRest::itemAnyType just return the input data back as response
-        $this->assertEquals($expectedResponse, $result);
-    }
-}
diff --git a/dev/tests/api-functional/testsuite/Magento/Webapi/WsdlGenerationFromDataObjectTest.php b/dev/tests/api-functional/testsuite/Magento/Webapi/WsdlGenerationFromDataObjectTest.php
index aedba2b6b94486a63a736b240d3f5036a1a1c839..c093b3dcf0ad2e9de6510e1f165a9fbec30ceddb 100644
--- a/dev/tests/api-functional/testsuite/Magento/Webapi/WsdlGenerationFromDataObjectTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Webapi/WsdlGenerationFromDataObjectTest.php
@@ -24,19 +24,38 @@ class WsdlGenerationFromDataObjectTest extends \Magento\TestFramework\TestCase\W
     /** @var string */
     protected $_soapUrl;
 
+    /** @var bool */
+    protected $isSingleService;
+
     protected function setUp()
     {
         $this->_markTestAsSoapOnly("WSDL generation tests are intended to be executed for SOAP adapter only.");
         $this->_storeCode = Bootstrap::getObjectManager()->get('Magento\Store\Model\StoreManagerInterface')
             ->getStore()->getCode();
-        $this->_soapUrl = "{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV1%2CtestModule5AllSoapAndRestV2";
         parent::setUp();
     }
 
     public function testMultiServiceWsdl()
     {
+        $this->_soapUrl = "{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV1%2CtestModule5AllSoapAndRestV2";
         $wsdlUrl = $this->_getBaseWsdlUrl() . 'testModule5AllSoapAndRestV1,testModule5AllSoapAndRestV2';
         $wsdlContent = $this->_convertXmlToString($this->_getWsdlContent($wsdlUrl));
+        $this->isSingleService = false;
+
+        $this->_checkTypesDeclaration($wsdlContent);
+        $this->_checkPortTypeDeclaration($wsdlContent);
+        $this->_checkBindingDeclaration($wsdlContent);
+        $this->_checkServiceDeclaration($wsdlContent);
+        $this->_checkMessagesDeclaration($wsdlContent);
+        $this->_checkFaultsDeclaration($wsdlContent);
+    }
+
+    public function testSingleServiceWsdl()
+    {
+        $this->_soapUrl = "{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV2";
+        $wsdlUrl = $this->_getBaseWsdlUrl() . 'testModule5AllSoapAndRestV2';
+        $wsdlContent = $this->_convertXmlToString($this->_getWsdlContent($wsdlUrl));
+        $this->isSingleService = true;
 
         $this->_checkTypesDeclaration($wsdlContent);
         $this->_checkPortTypeDeclaration($wsdlContent);
@@ -129,17 +148,30 @@ TYPES_SECTION_DECLARATION;
      */
     protected function _checkElementsDeclaration($wsdlContent)
     {
-        $requestElement = <<< REQUEST_ELEMENT
+        if ($this->isSingleService) {
+            $requestElement = <<< REQUEST_ELEMENT
+<xsd:element name="testModule5AllSoapAndRestV2ItemRequest" type="tns:TestModule5AllSoapAndRestV2ItemRequest"/>
+REQUEST_ELEMENT;
+        } else {
+            $requestElement = <<< REQUEST_ELEMENT
 <xsd:element name="testModule5AllSoapAndRestV1ItemRequest" type="tns:TestModule5AllSoapAndRestV1ItemRequest"/>
 REQUEST_ELEMENT;
+        }
         $this->assertContains(
             $this->_convertXmlToString($requestElement),
             $wsdlContent,
             'Request element declaration in types section is invalid'
         );
-        $responseElement = <<< RESPONSE_ELEMENT
+
+        if ($this->isSingleService) {
+            $responseElement = <<< RESPONSE_ELEMENT
+<xsd:element name="testModule5AllSoapAndRestV2ItemResponse" type="tns:TestModule5AllSoapAndRestV2ItemResponse"/>
+RESPONSE_ELEMENT;
+        } else {
+            $responseElement = <<< RESPONSE_ELEMENT
 <xsd:element name="testModule5AllSoapAndRestV1ItemResponse" type="tns:TestModule5AllSoapAndRestV1ItemResponse"/>
 RESPONSE_ELEMENT;
+        }
         $this->assertContains(
             $this->_convertXmlToString($responseElement),
             $wsdlContent,
@@ -149,11 +181,37 @@ RESPONSE_ELEMENT;
 
     /**
      * @param string $wsdlContent
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
     protected function _checkComplexTypesDeclaration($wsdlContent)
     {
         // @codingStandardsIgnoreStart
-        $requestType = <<< REQUEST_TYPE
+        if ($this->isSingleService) {
+            $requestType = <<< REQUEST_TYPE
+<xsd:complexType name="TestModule5AllSoapAndRestV2ItemRequest">
+    <xsd:annotation>
+        <xsd:documentation>Retrieve existing item.</xsd:documentation>
+        <xsd:appinfo xmlns:inf="{$this->_soapUrl}"/>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="id" minOccurs="1" maxOccurs="1" type="xsd:int">
+            <xsd:annotation>
+                <xsd:documentation></xsd:documentation>
+                <xsd:appinfo xmlns:inf="{$this->_soapUrl}">
+                    <inf:min/>
+                    <inf:max/>
+                    <inf:callInfo>
+                        <inf:callName>testModule5AllSoapAndRestV2Item</inf:callName>
+                        <inf:requiredInput>Yes</inf:requiredInput>
+                    </inf:callInfo>
+                </xsd:appinfo>
+            </xsd:annotation>
+        </xsd:element>
+    </xsd:sequence>
+</xsd:complexType>
+REQUEST_TYPE;
+        } else {
+            $requestType = <<< REQUEST_TYPE
 <xsd:complexType name="TestModule5AllSoapAndRestV1ItemRequest">
     <xsd:annotation>
         <xsd:documentation>Retrieve an item.</xsd:documentation>
@@ -176,14 +234,41 @@ RESPONSE_ELEMENT;
     </xsd:sequence>
 </xsd:complexType>
 REQUEST_TYPE;
+        }
         // @codingStandardsIgnoreEnd
         $this->assertContains(
             $this->_convertXmlToString($requestType),
             $wsdlContent,
             'Request type declaration in types section is invalid'
         );
+
         // @codingStandardsIgnoreStart
-        $responseType = <<< RESPONSE_TYPE
+        if ($this->isSingleService) {
+            $responseType = <<< RESPONSE_TYPE
+<xsd:complexType name="TestModule5AllSoapAndRestV2ItemResponse">
+    <xsd:annotation>
+        <xsd:documentation>
+            Response container for the testModule5AllSoapAndRestV2Item call.
+        </xsd:documentation>
+        <xsd:appinfo xmlns:inf="{$this->_soapUrl}"/>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="result" minOccurs="1" maxOccurs="1" type="tns:TestModule5V2EntityAllSoapAndRest">
+            <xsd:annotation>
+                <xsd:documentation></xsd:documentation>
+                <xsd:appinfo xmlns:inf="{$this->_soapUrl}">
+                    <inf:callInfo>
+                        <inf:callName>testModule5AllSoapAndRestV2Item</inf:callName>
+                        <inf:returned>Always</inf:returned>
+                    </inf:callInfo>
+                </xsd:appinfo>
+            </xsd:annotation>
+        </xsd:element>
+    </xsd:sequence>
+</xsd:complexType>
+RESPONSE_TYPE;
+        } else {
+            $responseType = <<< RESPONSE_TYPE
 <xsd:complexType name="TestModule5AllSoapAndRestV1ItemResponse">
     <xsd:annotation>
         <xsd:documentation>
@@ -206,6 +291,7 @@ REQUEST_TYPE;
     </xsd:sequence>
 </xsd:complexType>
 RESPONSE_TYPE;
+        }
         // @codingStandardsIgnoreEnd
         $this->assertContains(
             $this->_convertXmlToString($responseType),
@@ -224,7 +310,40 @@ RESPONSE_TYPE;
     protected function _checkReferencedTypeDeclaration($wsdlContent)
     {
         // @codingStandardsIgnoreStart
-        $referencedType = <<< RESPONSE_TYPE
+        if ($this->isSingleService) {
+            $referencedType = <<< RESPONSE_TYPE
+<xsd:complexType name="TestModule5V2EntityAllSoapAndRest">
+    <xsd:annotation>
+        <xsd:documentation></xsd:documentation>
+        <xsd:appinfo xmlns:inf="{$this->_soapUrl}"/>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="price" minOccurs="1" maxOccurs="1" type="xsd:int">
+            <xsd:annotation>
+                <xsd:documentation></xsd:documentation>
+                <xsd:appinfo xmlns:inf="{$this->_soapUrl}">
+                    <inf:min/>
+                    <inf:max/>
+                    <inf:callInfo>
+                        <inf:callName>testModule5AllSoapAndRestV2Item</inf:callName>
+                        <inf:callName>testModule5AllSoapAndRestV2Create</inf:callName>
+                        <inf:callName>testModule5AllSoapAndRestV2Update</inf:callName>
+                        <inf:callName>testModule5AllSoapAndRestV2Delete</inf:callName>
+                        <inf:returned>Always</inf:returned>
+                    </inf:callInfo>
+                    <inf:callInfo>
+                        <inf:callName>testModule5AllSoapAndRestV2Create</inf:callName>
+                        <inf:callName>testModule5AllSoapAndRestV2Update</inf:callName>
+                        <inf:requiredInput>Yes</inf:requiredInput>
+                    </inf:callInfo>
+                </xsd:appinfo>
+            </xsd:annotation>
+        </xsd:element>
+    </xsd:sequence>
+</xsd:complexType>
+RESPONSE_TYPE;
+        } else {
+            $referencedType = <<< RESPONSE_TYPE
 <xsd:complexType name="TestModule5V1EntityAllSoapAndRest">
     <xsd:annotation>
         <xsd:documentation>Some Data Object short description. Data Object long multi line description.</xsd:documentation>
@@ -340,6 +459,7 @@ RESPONSE_TYPE;
     </xsd:sequence>
 </xsd:complexType>
 RESPONSE_TYPE;
+        }
         // @codingStandardsIgnoreEnd
         $this->assertContains(
             $this->_convertXmlToString($referencedType),
@@ -355,15 +475,23 @@ RESPONSE_TYPE;
      */
     protected function _checkPortTypeDeclaration($wsdlContent)
     {
-        $firstPortType = <<< FIRST_PORT_TYPE
+        if ($this->isSingleService) {
+            $firstPortType = <<< FIRST_PORT_TYPE
+<portType name="testModule5AllSoapAndRestV2PortType">
+FIRST_PORT_TYPE;
+        } else {
+            $firstPortType = <<< FIRST_PORT_TYPE
 <portType name="testModule5AllSoapAndRestV1PortType">
 FIRST_PORT_TYPE;
+        }
         $this->assertContains(
             $this->_convertXmlToString($firstPortType),
             $wsdlContent,
             'Port type declaration is missing or invalid'
         );
-        $secondPortType = <<< SECOND_PORT_TYPE
+
+        if (!$this->isSingleService) {
+            $secondPortType = <<< SECOND_PORT_TYPE
 <portType name="testModule5AllSoapAndRestV2PortType">
 SECOND_PORT_TYPE;
         $this->assertContains(
@@ -371,7 +499,10 @@ SECOND_PORT_TYPE;
             $wsdlContent,
             'Port type declaration is missing or invalid'
         );
-        $operationDeclaration = <<< OPERATION_DECLARATION
+        }
+
+        if ($this->isSingleService) {
+            $operationDeclaration = <<< OPERATION_DECLARATION
 <operation name="testModule5AllSoapAndRestV2Item">
     <input message="tns:testModule5AllSoapAndRestV2ItemRequest"/>
     <output message="tns:testModule5AllSoapAndRestV2ItemResponse"/>
@@ -383,6 +514,20 @@ SECOND_PORT_TYPE;
     <fault name="GenericFault" message="tns:GenericFault"/>
 </operation>
 OPERATION_DECLARATION;
+        } else {
+            $operationDeclaration = <<< OPERATION_DECLARATION
+<operation name="testModule5AllSoapAndRestV2Item">
+    <input message="tns:testModule5AllSoapAndRestV2ItemRequest"/>
+    <output message="tns:testModule5AllSoapAndRestV2ItemResponse"/>
+    <fault name="GenericFault" message="tns:GenericFault"/>
+</operation>
+<operation name="testModule5AllSoapAndRestV2Items">
+    <input message="tns:testModule5AllSoapAndRestV2ItemsRequest"/>
+    <output message="tns:testModule5AllSoapAndRestV2ItemsResponse"/>
+    <fault name="GenericFault" message="tns:GenericFault"/>
+</operation>
+OPERATION_DECLARATION;
+        }
         $this->assertContains(
             $this->_convertXmlToString($operationDeclaration),
             $wsdlContent,
@@ -397,25 +542,60 @@ OPERATION_DECLARATION;
      */
     protected function _checkBindingDeclaration($wsdlContent)
     {
-        $firstBinding = <<< FIRST_BINDING
+        if ($this->isSingleService) {
+            $firstBinding = <<< FIRST_BINDING
+<binding name="testModule5AllSoapAndRestV2Binding" type="tns:testModule5AllSoapAndRestV2PortType">
+    <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+FIRST_BINDING;
+        } else {
+            $firstBinding = <<< FIRST_BINDING
 <binding name="testModule5AllSoapAndRestV1Binding" type="tns:testModule5AllSoapAndRestV1PortType">
     <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
 FIRST_BINDING;
+        }
         $this->assertContains(
             $this->_convertXmlToString($firstBinding),
             $wsdlContent,
             'Binding declaration is missing or invalid'
         );
-        $secondBinding = <<< SECOND_BINDING
+
+        if (!$this->isSingleService) {
+            $secondBinding = <<< SECOND_BINDING
 <binding name="testModule5AllSoapAndRestV2Binding" type="tns:testModule5AllSoapAndRestV2PortType">
     <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
 SECOND_BINDING;
-        $this->assertContains(
-            $this->_convertXmlToString($secondBinding),
-            $wsdlContent,
-            'Binding declaration is missing or invalid'
-        );
-        $operationDeclaration = <<< OPERATION_DECLARATION
+            $this->assertContains(
+                $this->_convertXmlToString($secondBinding),
+                $wsdlContent,
+                'Binding declaration is missing or invalid'
+            );
+        }
+
+        if ($this->isSingleService) {
+            $operationDeclaration = <<< OPERATION_DECLARATION
+<operation name="testModule5AllSoapAndRestV2Item">
+    <soap12:operation soapAction="testModule5AllSoapAndRestV2Item"/>
+    <input>
+        <soap12:body use="literal"/>
+    </input>
+    <output>
+        <soap12:body use="literal"/>
+    </output>
+    <fault name="GenericFault"/>
+</operation>
+<operation name="testModule5AllSoapAndRestV2Items">
+    <soap12:operation soapAction="testModule5AllSoapAndRestV2Items"/>
+    <input>
+        <soap12:body use="literal"/>
+    </input>
+    <output>
+        <soap12:body use="literal"/>
+    </output>
+    <fault name="GenericFault"/>
+</operation>
+OPERATION_DECLARATION;
+        } else {
+            $operationDeclaration = <<< OPERATION_DECLARATION
 <operation name="testModule5AllSoapAndRestV1Item">
     <soap12:operation soapAction="testModule5AllSoapAndRestV1Item"/>
     <input>
@@ -437,6 +617,7 @@ SECOND_BINDING;
     <fault name="GenericFault"/>
 </operation>
 OPERATION_DECLARATION;
+        }
         $this->assertContains(
             $this->_convertXmlToString($operationDeclaration),
             $wsdlContent,
@@ -452,13 +633,23 @@ OPERATION_DECLARATION;
     protected function _checkServiceDeclaration($wsdlContent)
     {
         // @codingStandardsIgnoreStart
-        $firstServiceDeclaration = <<< FIRST_SERVICE_DECLARATION
+        if ($this->isSingleService) {
+            $firstServiceDeclaration = <<< FIRST_SERVICE_DECLARATION
+<service name="testModule5AllSoapAndRestV2Service">
+    <port name="testModule5AllSoapAndRestV2Port" binding="tns:testModule5AllSoapAndRestV2Binding">
+        <soap12:address location="{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV2"/>
+    </port>
+</service>
+FIRST_SERVICE_DECLARATION;
+        } else {
+            $firstServiceDeclaration = <<< FIRST_SERVICE_DECLARATION
 <service name="testModule5AllSoapAndRestV1Service">
     <port name="testModule5AllSoapAndRestV1Port" binding="tns:testModule5AllSoapAndRestV1Binding">
         <soap12:address location="{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV1%2CtestModule5AllSoapAndRestV2"/>
     </port>
 </service>
 FIRST_SERVICE_DECLARATION;
+        }
         // @codingStandardsIgnoreEnd
         $this->assertContains(
             $this->_convertXmlToString($firstServiceDeclaration),
@@ -467,19 +658,21 @@ FIRST_SERVICE_DECLARATION;
         );
 
         // @codingStandardsIgnoreStart
-        $secondServiceDeclaration = <<< SECOND_SERVICE_DECLARATION
+        if (!$this->isSingleService) {
+            $secondServiceDeclaration = <<< SECOND_SERVICE_DECLARATION
 <service name="testModule5AllSoapAndRestV2Service">
     <port name="testModule5AllSoapAndRestV2Port" binding="tns:testModule5AllSoapAndRestV2Binding">
         <soap12:address location="{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV1%2CtestModule5AllSoapAndRestV2"/>
     </port>
 </service>
 SECOND_SERVICE_DECLARATION;
-        // @codingStandardsIgnoreEnd
-        $this->assertContains(
-            $this->_convertXmlToString($secondServiceDeclaration),
-            $wsdlContent,
-            'Second service section is invalid'
-        );
+            // @codingStandardsIgnoreEnd
+            $this->assertContains(
+                $this->_convertXmlToString($secondServiceDeclaration),
+                $wsdlContent,
+                'Second service section is invalid'
+            );
+        }
     }
 
     /**
@@ -654,7 +847,31 @@ PARAM_COMPLEX_TYPE;
             'Details parameter complex types declaration is invalid.'
         );
 
-        $detailsWrappedErrorType = <<< WRAPPED_ERROR_COMPLEX_TYPE
+        if ($this->isSingleService) {
+            $detailsWrappedErrorType = <<< WRAPPED_ERROR_COMPLEX_TYPE
+<xsd:complexType name="WrappedError">
+    <xsd:sequence>
+        <xsd:element name="message" minOccurs="1" maxOccurs="1" type="xsd:string">
+            <xsd:annotation>
+                <xsd:documentation></xsd:documentation>
+                <xsd:appinfo xmlns:inf="{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV2">
+                    <inf:maxLength/>
+                </xsd:appinfo>
+            </xsd:annotation>
+        </xsd:element>
+        <xsd:element name="parameters" type="tns:ArrayOfGenericFaultParameter" minOccurs="0">
+            <xsd:annotation>
+                <xsd:documentation>Message parameters.</xsd:documentation>
+                <xsd:appinfo xmlns:inf="{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV2">
+                    <inf:natureOfType>array</inf:natureOfType>
+                </xsd:appinfo>
+            </xsd:annotation>
+        </xsd:element>
+    </xsd:sequence>
+</xsd:complexType>
+WRAPPED_ERROR_COMPLEX_TYPE;
+        } else {
+            $detailsWrappedErrorType = <<< WRAPPED_ERROR_COMPLEX_TYPE
 <xsd:complexType name="WrappedError">
     <xsd:sequence>
         <xsd:element name="message" minOccurs="1" maxOccurs="1" type="xsd:string">
@@ -676,6 +893,7 @@ PARAM_COMPLEX_TYPE;
     </xsd:sequence>
 </xsd:complexType>
 WRAPPED_ERROR_COMPLEX_TYPE;
+        }
         $this->assertContains(
             $this->_convertXmlToString($detailsWrappedErrorType),
             $wsdlContent,
@@ -705,7 +923,25 @@ PARAMETERS_COMPLEX_TYPE;
             'Details parameters (array of parameters) complex types declaration is invalid.'
         );
 
-        $detailsWrappedErrorsType = <<< WRAPPED_ERRORS_COMPLEX_TYPE
+        if ($this->isSingleService) {
+            $detailsWrappedErrorsType = <<< WRAPPED_ERRORS_COMPLEX_TYPE
+<xsd:complexType name="ArrayOfWrappedError">
+    <xsd:annotation>
+        <xsd:documentation>An array of WrappedError items.</xsd:documentation>
+        <xsd:appinfo xmlns:inf="{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV2"/>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="item" minOccurs="0" maxOccurs="unbounded" type="tns:WrappedError">
+            <xsd:annotation>
+                <xsd:documentation>An item of ArrayOfWrappedError.</xsd:documentation>
+                <xsd:appinfo xmlns:inf="{$this->_baseUrl}/soap/{$this->_storeCode}?services=testModule5AllSoapAndRestV2"/>
+            </xsd:annotation>
+        </xsd:element>
+    </xsd:sequence>
+</xsd:complexType>
+WRAPPED_ERRORS_COMPLEX_TYPE;
+        } else {
+            $detailsWrappedErrorsType = <<< WRAPPED_ERRORS_COMPLEX_TYPE
 <xsd:complexType name="ArrayOfWrappedError">
     <xsd:annotation>
         <xsd:documentation>An array of WrappedError items.</xsd:documentation>
@@ -721,6 +957,8 @@ PARAMETERS_COMPLEX_TYPE;
     </xsd:sequence>
 </xsd:complexType>
 WRAPPED_ERRORS_COMPLEX_TYPE;
+
+        }
         // @codingStandardsIgnoreEnd
         $this->assertContains(
             $this->_convertXmlToString($detailsWrappedErrorsType),
diff --git a/dev/tests/functional/phpunit.xml.dist b/dev/tests/functional/phpunit.xml.dist
index 255d3cf4057d4fdae9965848d64225317e2ba0fc..06b2ee9b0603d8fd6e602011e34ddbf2b131c00f 100755
--- a/dev/tests/functional/phpunit.xml.dist
+++ b/dev/tests/functional/phpunit.xml.dist
@@ -36,7 +36,7 @@
         <env name="testsuite_rule_path" value="Magento/Mtf/TestSuite/InjectableTests" />
         <env name="log_directory" value="var/log" />
         <env name="events_preset" value="base" />
-        <env name="module_whitelist" value="Magento_Install" />
+        <env name="module_whitelist" value="Magento_Install,Magento_Core" />
         <env name="report_file_name" value="test-cases-report.xml"/>
         <env name="basedir" value="var/log" />
         <env name="credentials_file_path" value="./credentials.xml.dist" />
diff --git a/dev/tests/functional/tests/app/Magento/Core/Test/Fixture/ConfigData.xml b/dev/tests/functional/tests/app/Magento/Core/Test/Fixture/ConfigData.xml
index a2b7c380a102f302f5d93688fcb98662b03a345e..8bed37c9f9ba9a008e35327b901217acf596e00a 100644
--- a/dev/tests/functional/tests/app/Magento/Core/Test/Fixture/ConfigData.xml
+++ b/dev/tests/functional/tests/app/Magento/Core/Test/Fixture/ConfigData.xml
@@ -10,7 +10,7 @@
            module="Magento_Core" 
            type="flat" 
            entity_type="core_config_data" 
-           collection="Magento\Core\Model\Resource\Config\Data\Collection" 
+           collection="Magento\Config\Model\Resource\Config\Data\Collection"
            repository_class="Magento\Core\Test\Repository\ConfigData" 
            handler_interface="Magento\Core\Test\Handler\ConfigData\ConfigDataInterface" 
            class="Magento\Core\Test\Fixture\ConfigData">
diff --git a/dev/tests/functional/tests/app/Magento/Core/Test/Fixture/SystemVariable.xml b/dev/tests/functional/tests/app/Magento/Core/Test/Fixture/SystemVariable.xml
index c313b15a2c676409f660a274ce83234824579979..01f5710dc7a3d13d105d0dfbfadf6c06406d55f2 100644
--- a/dev/tests/functional/tests/app/Magento/Core/Test/Fixture/SystemVariable.xml
+++ b/dev/tests/functional/tests/app/Magento/Core/Test/Fixture/SystemVariable.xml
@@ -9,7 +9,7 @@
   <fixture name="systemVariable" 
            module="Magento_Core" 
            type="composite" 
-           collection="Magento\Core\Model\Resource\Variable\Collection" 
+           collection="Magento\Variable\Model\Resource\Variable\Collection"
            handler_interface="Magento\Core\Test\Handler\SystemVariable\SystemVariableInterface" 
            class="Magento\Core\Test\Fixture\SystemVariable">
     <dataset name="default">
diff --git a/dev/tests/integration/etc/install-config-mysql.php.dist b/dev/tests/integration/etc/install-config-mysql.php.dist
index 391e1a7679b00c152b165b379be8bd5d9ea508bb..0f5adb4727c5fecff8c195f6c70d25fb7b0cee0a 100644
--- a/dev/tests/integration/etc/install-config-mysql.php.dist
+++ b/dev/tests/integration/etc/install-config-mysql.php.dist
@@ -7,7 +7,7 @@
 return [
     'db_host' => 'localhost',
     'db_user' => 'root',
-    'db_pass' => '',
+    'db_pass' => 'root',
     'db_name' => 'magento_integration_tests',
     'db_prefix' => '',
     'backend_frontname' => 'backend',
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Entity.php b/dev/tests/integration/framework/Magento/TestFramework/Entity.php
index ea6ecef137d5e621039966b1b279eeb6c7fdf497..dc9793f6a05c61e6070f815f06abc31734ca66da 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Entity.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Entity.php
@@ -7,7 +7,7 @@
 namespace Magento\TestFramework;
 
 /**
- * Class that implements CRUD tests for \Magento\Core\Model\AbstractModel based objects
+ * Class that implements CRUD tests for \Magento\Framework\Model\AbstractModel based objects
  */
 class Entity
 {
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Event/Magento.php b/dev/tests/integration/framework/Magento/TestFramework/Event/Magento.php
index 9c1e8f43d68f94dd150f7861383a864c5f97772a..08812d8caf3b5f758a1f447e02dbf602d8a339ad 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Event/Magento.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Event/Magento.php
@@ -4,11 +4,11 @@
  * See COPYING.txt for license details.
  */
 
-/**
- * Observer of Magento events triggered using Magento_Core_Model_\Magento\TestFramework\EventManager::dispatch()
- */
 namespace Magento\TestFramework\Event;
 
+/**
+ * Observer of Magento events triggered using \Magento\TestFramework\EventManager::dispatch()
+ */
 class Magento
 {
     /**
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php
index 2d221e570a8ed1f34e7076f87ea95ea5ec637d33..75f5172727328e6cdc75008889dc68730568331e 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php
@@ -11,7 +11,7 @@ namespace Magento\Catalog\Controller\Adminhtml;
 class CategoryTest extends \Magento\Backend\Utility\Controller
 {
     /**
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      * @magentoDbIsolation enabled
      * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1
      * @dataProvider saveActionDataProvider
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/AbstractModel/Stub.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/AbstractModel/Stub.php
new file mode 100644
index 0000000000000000000000000000000000000000..ced9dd4c1ea77bb044f74242c28323cec1643212
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/AbstractModel/Stub.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Model\AbstractModel;
+
+abstract class Stub extends \Magento\Catalog\Model\AbstractModel implements \Magento\Catalog\Api\Data\ProductInterface
+{
+    /**
+     * Retrieve Store Id
+     *
+     * @return int
+     */
+    public function getStoreId()
+    {
+        return $this->getData(self::STORE_ID);
+    }
+
+    /**
+     * Set product store id
+     *
+     * @param int $storeId
+     * @return $this
+     */
+    public function setStoreId($storeId)
+    {
+        return $this->setData(self::STORE_ID, $storeId);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/AbstractTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/AbstractTest.php
index b45e05df43559ce9e92d08809fc1995cda7397cf..026e4f09722cc31c062dca66bef7e01c1a063a23 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/AbstractTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/AbstractTest.php
@@ -27,7 +27,7 @@ class AbstractTest extends \PHPUnit_Framework_TestCase
     protected function setUp()
     {
         if (!self::$_isStubClass) {
-            $this->getMockForAbstractClass('Magento\Catalog\Model\AbstractModel', [], self::STUB_CLASS, false);
+            $this->getMockForAbstractClass('Magento\Catalog\Model\AbstractModel\Stub', [], self::STUB_CLASS, false);
             self::$_isStubClass = true;
         }
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTest.php
index 72a723413d214a205e9004f35185f0861dbc488d..2eb662d331ffc0a1e6717690ed3a55dc1a5f152b 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTest.php
@@ -115,7 +115,7 @@ class CategoryTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      * @magentoAppIsolation enabled
      * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1
      */
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php
index 16bc2ff9e719257d271223d7e1f825057ac3fe71..2eb856f8f8236f39b824ec3f329afc62101c2b62 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php
@@ -88,7 +88,7 @@ class ProcessorTest extends \Magento\TestFramework\Indexer\TestCase
      * @magentoDbIsolation enabled
      * @magentoAppIsolation enabled
      * @magentoAppArea adminhtml
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1
      */
     public function testAddNewStore()
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multistore.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multistore.php
index 4f9c3e4c3fecf059e19661ee158d1e36a8da5979..133bc16660b5d139f225a735d1503bc3a9318ce0 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multistore.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multistore.php
@@ -3,7 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-require __DIR__ . '/../../Core/_files/store.php';
+require __DIR__ . '/../../Store/_files/core_fixturestore.php';
 $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 
 /** @var Magento\Store\Model\Store $store */
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 eb7f1a37ba216ffaa43d603e87ae475e6b3accc6..d3e665a753e5b1e401de8675209dbd64650b49d8 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
@@ -779,7 +779,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @magentoDataFixture Magento/Catalog/_files/categories.php
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      * @magentoDataFixture Magento/Catalog/Model/Layer/Filter/_files/attribute_with_option.php
      * @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
      * @magentoAppIsolation enabled
diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php
index 9b3387532ab4dc6a1d31a59c03aa62fe4b1413b0..c3f988bad63fce6660fa13c90fbfc605e73911df 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php
@@ -25,9 +25,17 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
     }
 
+    public function tearDown()
+    {
+        $category = $this->objectManager->create('Magento\Catalog\Model\Category');
+        $category->load(3);
+        $category->delete();
+    }
+
     /**
      * @magentoDataFixture Magento/CatalogUrlRewrite/_files/categories.php
      * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
      */
     public function testGenerateUrlRewritesWithoutSaveHistory()
     {
@@ -53,9 +61,9 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @magentoDataFixture Magento/CatalogUrlRewrite/_files/categories.php
      * @magentoDbIsolation enabled
-     *
+     * @magentoDataFixture Magento/CatalogUrlRewrite/_files/categories.php
+     * @magentoAppIsolation enabled
      */
     public function testGenerateUrlRewritesWithSaveHistory()
     {
@@ -101,7 +109,7 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
             $actualResults[] = [
                 $url->getRequestPath(),
                 $url->getTargetPath(),
-                $url->getIsAutogenerated(),
+                (int)$url->getIsAutogenerated(),
                 $url->getRedirectType()
             ];
         }
@@ -114,8 +122,12 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
      */
     protected function assertResults($expected, $actual)
     {
-        foreach ($actual as $row) {
-            $this->assertContains($row, $expected, implode(', ', $row));
+        foreach ($expected as $row) {
+            $this->assertContains(
+                $row,
+                $actual,
+                'Expected: ' . var_export($row, true) . "\nIn Actual: " . var_export($actual, true)
+            );
         }
 
     }
diff --git a/dev/tests/integration/testsuite/Magento/Core/Controller/IndexTest.php b/dev/tests/integration/testsuite/Magento/Core/Controller/IndexTest.php
deleted file mode 100644
index 0332a70a8d6024f88bf5cd55fdb735ad5ee8b07e..0000000000000000000000000000000000000000
--- a/dev/tests/integration/testsuite/Magento/Core/Controller/IndexTest.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Core\Controller;
-
-class IndexTest extends \Magento\TestFramework\TestCase\AbstractController
-{
-    public function testNotFoundAction()
-    {
-        $this->dispatch('core/index/notFound');
-        $this->assertEquals('404', $this->getResponse()->getHttpResponseCode());
-        $this->assertEquals('Requested resource not found', $this->getResponse()->getBody());
-    }
-}
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/Theme/Source/_files/design/frontend/a_d/file b/dev/tests/integration/testsuite/Magento/Core/Model/Theme/Source/_files/design/frontend/a_d/file
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/Theme/Source/_files/design/frontend/b_e/file b/dev/tests/integration/testsuite/Magento/Core/Model/Theme/Source/_files/design/frontend/b_e/file
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/Theme/Source/_files/design/frontend/magento_default/file b/dev/tests/integration/testsuite/Magento/Core/Model/Theme/Source/_files/design/frontend/magento_default/file
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/Theme/Source/_files/design/frontend/magento_g/file b/dev/tests/integration/testsuite/Magento/Core/Model/Theme/Source/_files/design/frontend/magento_g/file
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Core/i18n/en_AU.csv b/dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Core/i18n/en_AU.csv
deleted file mode 100644
index 0d502c76477f11d34f4b2bfb33c1ca0989fee185..0000000000000000000000000000000000000000
--- a/dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Core/i18n/en_AU.csv
+++ /dev/null
@@ -1 +0,0 @@
-"Original value for Magento_Core module","Translated value for Magento_Core module in en_AU"
diff --git a/dev/tests/integration/testsuite/Magento/Core/_files/config_cache.php b/dev/tests/integration/testsuite/Magento/Core/_files/config_cache.php
deleted file mode 100644
index 6a4289fe4ea26e07297dd3a64abf32215d1f0c50..0000000000000000000000000000000000000000
--- a/dev/tests/integration/testsuite/Magento/Core/_files/config_cache.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-/** @var \Magento\Framework\App\Cache\Type\Config $layoutCache */
-$layoutCache = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-    ->get('Magento\Framework\App\Cache\Type\Config');
-$layoutCache->save('fixture config cache data', 'CONFIG_CACHE_FIXTURE');
diff --git a/dev/tests/integration/testsuite/Magento/Core/_files/etc/config.xml b/dev/tests/integration/testsuite/Magento/Core/_files/etc/config.xml
deleted file mode 100644
index ef1e23d46c54ee613613a0ce4a2f42f19d79280a..0000000000000000000000000000000000000000
--- a/dev/tests/integration/testsuite/Magento/Core/_files/etc/config.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../app/code/Magento/Core/etc/config.xsd">
-    <default>
-        <areas>
-            <test_area1>
-                <areaNode>value</areaNode>
-            </test_area1>
-            <test_area2>
-            </test_area2>
-            <test_area3>
-            </test_area3>
-        </areas>
-    </default>
-</config>
diff --git a/dev/tests/integration/testsuite/Magento/Core/_files/etc/module.xml b/dev/tests/integration/testsuite/Magento/Core/_files/etc/module.xml
deleted file mode 100644
index 746181c42b2bae0f4888a87fad1eabcce954bc33..0000000000000000000000000000000000000000
--- a/dev/tests/integration/testsuite/Magento/Core/_files/etc/module.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
-    <module name="Magento_Core" setup_version="1.6.0.2" />
-</config>
diff --git a/dev/tests/integration/testsuite/Magento/Core/_files/fixture.csv b/dev/tests/integration/testsuite/Magento/Core/_files/fixture.csv
deleted file mode 100644
index 297c90f5e6ec9735cd6c518b6e65ba61cf38f11e..0000000000000000000000000000000000000000
--- a/dev/tests/integration/testsuite/Magento/Core/_files/fixture.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-"Search:","Fixture search:"
-"Search entire store here...","Fixture search entire store here..."
-"Fixture string","Fixture translation"
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/AddressMetadataTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/AddressMetadataTest.php
index 9f77693988cab1d85a44186e2c696778e759951c..1b9ad064466529226a1751f4a7c359931f6a1abd 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Model/AddressMetadataTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Model/AddressMetadataTest.php
@@ -31,18 +31,7 @@ class AddressMetadataTest extends \PHPUnit_Framework_TestCase
     public function testGetCustomAttributesMetadata()
     {
         $customAttributesMetadata = $this->_service->getCustomAttributesMetadata();
-        $this->assertCount(2, $customAttributesMetadata, "Invalid number of attributes returned.");
-        $configAttributeCode = 'address_attribute_1';
-        $configAttributeFound = false;
-        foreach ($customAttributesMetadata as $attribute) {
-            if ($attribute->getAttributeCode() == $configAttributeCode) {
-                $configAttributeFound = true;
-                break;
-            }
-        }
-        if (!$configAttributeFound) {
-            $this->fail("Custom attribute declared in the config not found.");
-        }
+        $this->assertCount(0, $customAttributesMetadata, "Invalid number of attributes returned.");
     }
 
     /**
@@ -69,7 +58,7 @@ class AddressMetadataTest extends \PHPUnit_Framework_TestCase
         if (!$customAttributesFound) {
             $this->fail("Custom attributes declared in the config not found.");
         }
-        $this->assertCount(4, $customAttributesMetadata, "Invalid number of attributes returned.");
+        $this->assertCount(2, $customAttributesMetadata, "Invalid number of attributes returned.");
     }
 
     public function testGetAddressAttributeMetadata()
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/Config/ShareTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/Config/ShareTest.php
index 67243448374f24d8e3348638fd95eee4c1ccc724..7ec75e92d513795c73eaa286704bf3da208b707d 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Model/Config/ShareTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Model/Config/ShareTest.php
@@ -23,7 +23,7 @@ class ShareTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @magentoDataFixture Magento/Core/_files/second_third_store.php
+     * @magentoDataFixture Magento/Store/_files/core_second_third_fixturestore.php
      * @magentoConfigFixture current_store customer/account_share/scope 0
      */
     public function testGetSharedWebsiteIdsMultipleSites()
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/CustomerMetadataTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/CustomerMetadataTest.php
index b18d1c2b598e8dce4af38fdbbe87ece1a0a9517b..672e0e17c6cc424819ec36046829e9e193e58fa7 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Model/CustomerMetadataTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Model/CustomerMetadataTest.php
@@ -47,18 +47,7 @@ class CustomerMetadataTest extends \PHPUnit_Framework_TestCase
     public function testGetCustomAttributesMetadata()
     {
         $customAttributesMetadata = $this->_service->getCustomAttributesMetadata();
-        $this->assertCount(3, $customAttributesMetadata, "Invalid number of attributes returned.");
-        $configAttributeCode = 'customer_attribute_1';
-        $configAttributeFound = false;
-        foreach ($customAttributesMetadata as $attribute) {
-            if ($attribute->getAttributeCode() == $configAttributeCode) {
-                $configAttributeFound = true;
-                break;
-            }
-        }
-        if (!$configAttributeFound) {
-            $this->fail("Custom attribute declared in the config not found.");
-        }
+        $this->assertCount(1, $customAttributesMetadata, "Invalid number of attributes returned.");
     }
 
     public function testGetNestedOptionsCustomAttributesMetadata()
@@ -104,7 +93,7 @@ class CustomerMetadataTest extends \PHPUnit_Framework_TestCase
         if (!$customAttributesFound) {
             $this->fail("Custom attributes declared in the config not found.");
         }
-        $this->assertCount(5, $customAttributesMetadata, "Invalid number of attributes returned.");
+        $this->assertCount(3, $customAttributesMetadata, "Invalid number of attributes returned.");
     }
 
     /**
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/GroupManagementTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/GroupManagementTest.php
index e08486410020a74ff23d708edb92749e552a36e7..59c904036a712bf1d360c58a82ebb929fe5498d4 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Model/GroupManagementTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Model/GroupManagementTest.php
@@ -42,10 +42,10 @@ class GroupManagementTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @magentoDataFixture Magento/Core/_files/second_third_store.php
+     * @magentoDataFixture Magento/Store/_files/core_second_third_fixturestore.php
      */
     public function testGetDefaultGroupWithNonDefaultStoreId()
-    {   
+    {
         /** @var \Magento\Store\Model\StoreManagerInterface  $storeManager */
         $storeManager = Bootstrap::getObjectManager()->get('Magento\Store\Model\StoreManagerInterface');
         $nonDefaultStore = $storeManager->getStore('secondstore');
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/VisitorTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/VisitorTest.php
index e8bb754254ebeb39ae1329af1c612e69228d99c2..59747a3c427887b59895b20f16e07ce4f9fedc80 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Model/VisitorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Model/VisitorTest.php
@@ -63,18 +63,22 @@ class VisitorTest extends \PHPUnit_Framework_TestCase
      */
     public function testClean()
     {
+        $customerIdNow = 1;
         $lastVisitNow = date('Y-m-d H:i:s', time());
         $sessionIdNow = 'asaswljxvgklasdflkjasieasd';
+        $customerIdPast = null;
         $lastVisitPast = date('Y-m-d H:i:s', time() - 172800);
         $sessionIdPast = 'kui0aa57nqddl8vk7k6ohgi352';
 
         /** @var \Magento\Customer\Model\Visitor $visitor */
         $visitor = Bootstrap::getObjectManager()->get('Magento\Customer\Model\Visitor');
+        $visitor->setCustomerId($customerIdPast);
         $visitor->setSessionId($sessionIdPast);
         $visitor->setLastVisitAt($lastVisitPast);
         $visitor->save();
         $visitorIdPast = $visitor->getId();
         $visitor->unsetData();
+        $visitor->setCustomerId($customerIdNow);
         $visitor->setSessionId($sessionIdNow);
         $visitor->setLastVisitAt($lastVisitNow);
         $visitor->save();
@@ -87,7 +91,12 @@ class VisitorTest extends \PHPUnit_Framework_TestCase
         $visitor->unsetData();
         $visitor->load($visitorIdNow);
         $this->assertEquals(
-            ['visitor_id' => $visitorIdNow, 'session_id' => $sessionIdNow, 'last_visit_at' => $lastVisitNow],
+            [
+                'visitor_id' => $visitorIdNow,
+                'customer_id' => $customerIdNow,
+                'session_id' => $sessionIdNow,
+                'last_visit_at' => $lastVisitNow
+            ],
             $visitor->getData()
         );
     }
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 eeea37be4c2828f7c2aacda436d1697a9751faa3..06746a974e5b04da732eedcb072fd66dc8b0adbc 100644
--- a/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php
+++ b/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php
@@ -176,7 +176,7 @@ class FilterTest extends \PHPUnit_Framework_TestCase
             ],
             'custom parameter' => [
                 'frontend',
-                'handle="email_template_test_handle" template="Magento_Core::sample_email_content_custom.phtml"',
+                'handle="email_template_test_handle" template="Magento_Email::sample_email_content_custom.phtml"',
                 'Custom E-mail content for frontend/test_default theme',
             ],
         ];
diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php
index 5ffaed0005fadfe797d43b1753b32e13c1c35903..72cbb8f071d6f7b0a8cdd2574bc3ccb6005eabe1 100644
--- a/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php
+++ b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php
@@ -89,7 +89,7 @@ class TemplateTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testGetProcessedTemplate()
     {
@@ -137,7 +137,7 @@ class TemplateTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testGetProcessedTemplateSubject()
     {
@@ -185,7 +185,7 @@ class TemplateTest extends \PHPUnit_Framework_TestCase
      */
     public function testSetDesignConfigException($config)
     {
-        // \Magento\Core\Model\Template is an abstract class
+        // \Magento\Email\Model\Template is an abstract class
         $model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
             ->create('Magento\Email\Model\Template');
         $model->setDesignConfig($config);
diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Core/layout/email_template_test_handle.xml b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Email/layout/email_template_test_handle.xml
similarity index 79%
rename from dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Core/layout/email_template_test_handle.xml
rename to dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Email/layout/email_template_test_handle.xml
index 0fb1b826f9e7e6f6369fba3fd85313338ba42448..43ce29cbfa0a414e784d2c2d87f5188578038443 100644
--- a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Core/layout/email_template_test_handle.xml
+++ b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Email/layout/email_template_test_handle.xml
@@ -6,5 +6,5 @@
  */
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
-    <block class="Magento\Backend\Block\Template" name="sample_email_content" template="Magento_Core::sample_email_content.phtml"/>
+    <block class="Magento\Backend\Block\Template" name="sample_email_content" template="Magento_Email::sample_email_content.phtml"/>
 </layout>
diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Core/templates/sample_email_content.phtml b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Email/templates/sample_email_content.phtml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Core/templates/sample_email_content.phtml
rename to dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Email/templates/sample_email_content.phtml
diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Core/layout/email_template_test_handle.xml b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/layout/email_template_test_handle.xml
similarity index 87%
rename from dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Core/layout/email_template_test_handle.xml
rename to dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/layout/email_template_test_handle.xml
index 359f9c07e07ccfb6ac794116afa1fe4aee781c90..767644707ff84fe0b5c19561a8bc28e2f0e02aaa 100644
--- a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Core/layout/email_template_test_handle.xml
+++ b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/layout/email_template_test_handle.xml
@@ -6,7 +6,7 @@
  */
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
-    <block class="Magento\Framework\View\Element\Template" name="sample_email_content" template="Magento_Core::sample_email_content.phtml"/>
+    <block class="Magento\Framework\View\Element\Template" name="sample_email_content" template="Magento_Email::sample_email_content.phtml"/>
     <block class="Magento\Framework\View\Element\Text" name="ignored_email_content">
         <action method="setText">
             <argument name="text" xsi:type="string">Ignored e-mail content, only the first block is used</argument>
diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Core/templates/sample_email_content.phtml b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content.phtml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Core/templates/sample_email_content.phtml
rename to dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content.phtml
diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Core/templates/sample_email_content_custom.phtml b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content_custom.phtml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Core/templates/sample_email_content_custom.phtml
rename to dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content_custom.phtml
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/AbstractExtensibleObjectTest.php b/dev/tests/integration/testsuite/Magento/Framework/Api/AbstractExtensibleObjectTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..dd5fba5c4d60d9740bd931dffe0d5e208a883fa2
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/AbstractExtensibleObjectTest.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api;
+
+/**
+ * Test for \Magento\Framework\Api\AbstractExtensibleObject
+ */
+class AbstractExtensibleObjectTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Framework\ObjectManagerInterface */
+    private $_objectManager;
+
+    protected function setUp()
+    {
+        $autoloadWrapper = \Magento\Framework\Autoload\AutoloaderRegistry::getAutoloader();
+        $autoloadWrapper->addPsr4('Magento\\Wonderland\\', realpath(__DIR__ . '/_files/Magento/Wonderland'));
+        $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->_objectManager->configure(
+            [
+                'preferences' => [
+                    'Magento\Wonderland\Api\Data\FakeAddressInterface' => 'Magento\Wonderland\Model\FakeAddress',
+                    'Magento\Wonderland\Api\Data\FakeRegionInterface' => 'Magento\Wonderland\Model\FakeRegion',
+                ],
+            ]
+        );
+    }
+
+    /**
+     * Test setExtensionAttributes and getExtensionAttributes for \Magento\Framework\Api\AbstractExtensibleObject
+     *
+     * @param array $expectedDataBefore
+     * @param array $expectedDataAfter
+     * @dataProvider extensionAttributesDataProvider
+     */
+    public function testExtensionAttributes($expectedDataBefore, $expectedDataAfter)
+    {
+        /** @var \Magento\Framework\Api\ExtensionAttributesFactory $regionExtensionFactory */
+        $regionExtensionFactory = $this->_objectManager->get('Magento\Framework\Api\ExtensionAttributesFactory');
+        /** @var \Magento\Wonderland\Model\Data\FakeRegionFactory $regionFactory */
+        $regionFactory = $this->_objectManager->get('Magento\Wonderland\Model\Data\FakeRegionFactory');
+
+        /** @var \Magento\Wonderland\Model\Data\FakeRegion $region */
+        $region = $regionFactory->create();
+
+        $regionCode = 'test_code';
+        /** @var \Magento\Wonderland\Model\Data\FakeRegionExtensionInterface $regionExtension */
+        $regionExtension = $regionExtensionFactory->create(
+            'Magento\Wonderland\Model\Data\FakeRegion',
+            ['data' => $expectedDataBefore]
+        );
+        $region->setRegionCode($regionCode)->setExtensionAttributes($regionExtension);
+        $this->assertInstanceOf('Magento\Wonderland\Model\Data\FakeRegion', $region);
+
+        $extensionAttributes = $region->getExtensionAttributes();
+        $this->assertInstanceOf('Magento\Wonderland\Api\Data\FakeRegionExtension', $extensionAttributes);
+        $this->assertEquals($expectedDataBefore, $extensionAttributes->__toArray());
+        $this->assertEquals($regionCode, $region->getRegionCode());
+
+        $regionCode = 'changed_test_code';
+        $region->setExtensionAttributes(
+            $regionExtensionFactory->create('Magento\Wonderland\Model\Data\FakeRegion', ['data' => $expectedDataAfter])
+        )->setRegionCode($regionCode); // change $regionCode to test AbstractExtensibleObject::setData
+        $extensionAttributes = $region->getExtensionAttributes();
+        $this->assertEquals($expectedDataAfter, $extensionAttributes->__toArray());
+        $this->assertEquals($regionCode, $region->getRegionCode());
+    }
+
+    public function extensionAttributesDataProvider()
+    {
+        return [
+            'boolean' => [
+                [true],
+                [false]
+            ],
+            'integer' => [
+                [1],
+                [2]
+            ],
+            'string' => [
+                ['test'],
+                ['test test']
+            ],
+            'array' => [
+                [[1]],
+                [[1, 2]]
+            ]
+        ];
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttributesFactoryTest.php b/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttributesFactoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c6ddf42f67cbbfc9edb55330c4ae09f387807ae
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/ExtensionAttributesFactoryTest.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Api;
+
+class ExtensionAttributesFactoryTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Framework\Api\ExtensionAttributesFactory */
+    private $factory;
+
+    protected function setUp()
+    {
+        $autoloadWrapper = \Magento\Framework\Autoload\AutoloaderRegistry::getAutoloader();
+        $autoloadWrapper->addPsr4('Magento\\Wonderland\\', realpath(__DIR__ . '/_files/Magento/Wonderland'));
+        /** @var \Magento\Framework\ObjectManagerInterface */
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->factory = new ExtensionAttributesFactory($objectManager);
+    }
+
+    /**
+     * @expectedException \LogicException
+     */
+    public function testCreateThrowExceptionIfInterfaceNotImplemented()
+    {
+        $this->factory->create('Magento\Framework\Api\ExtensionAttributesFactoryTest');
+    }
+
+    /**
+     * @expectedException \LogicException
+     */
+    public function testCreateThrowExceptionIfInterfaceNotOverridden()
+    {
+        $this->factory->create('\Magento\Wonderland\Model\Data\FakeExtensibleOne');
+    }
+
+    /**
+     * @expectedException \LogicException
+     */
+    public function testCreateThrowExceptionIfReturnIsIncorrect()
+    {
+        $this->factory->create('\Magento\Wonderland\Model\Data\FakeExtensibleTwo');
+    }
+
+    public function testCreate()
+    {
+        $this->assertInstanceOf(
+            'Magento\Wonderland\Api\Data\FakeRegionExtension',
+            $this->factory->create('Magento\Wonderland\Model\Data\FakeRegion')
+        );
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeAddressInterface.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeAddressInterface.php
index 597a30cc1de907d7eeb1f193ef97716b0568bdfd..8377ec40155785df4aeb482bc867d43cf2763224 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeAddressInterface.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeAddressInterface.php
@@ -170,4 +170,21 @@ interface FakeAddressInterface extends ExtensibleDataInterface
      * @return bool|null
      */
     public function isDefaultBilling();
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Wonderland\Api\Data\FakeAddressExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Wonderland\Api\Data\FakeAddressExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Wonderland\Api\Data\FakeAddressExtensionInterface $extensionAttributes
+    );
 }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleOneInterface.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleOneInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdf9d49a67c3fe67503ec23dda9fa8742c0d291f
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleOneInterface.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ *
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Wonderland\Api\Data;
+
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+/**
+ * Fake interface
+ * to test exception if the method 'getExtensionAttributes' is not overridden
+ */
+interface FakeExtensibleOneInterface extends ExtensibleDataInterface
+{
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleTwoInterface.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleTwoInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..42f212c861474c3e66595458473d7227470fad7e
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleTwoInterface.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ *
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Wonderland\Api\Data;
+
+use Magento\Framework\Api\ExtensibleDataInterface;
+
+/**
+ * Fake interface
+ * to test exception if the method 'getExtensionAttributes' does not return concrete type
+ */
+interface FakeExtensibleTwoInterface extends ExtensibleDataInterface
+{
+    /**
+     * test incorrect return type
+     *
+     * @return int
+     */
+    public function getExtensionAttributes();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeRegionInterface.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeRegionInterface.php
index ce54b0484b530f1fdbd47753002b556fe2d841a0..76cb08b2395f8a5d5d8848ccce74302de8822dee 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeRegionInterface.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeRegionInterface.php
@@ -41,4 +41,21 @@ interface FakeRegionInterface extends ExtensibleDataInterface
      * @return int
      */
     public function getRegionId();
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Wonderland\Api\Data\FakeRegionExtensionInterface|null
+     */
+    public function getExtensionAttributes();
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Wonderland\Api\Data\FakeRegionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Wonderland\Api\Data\FakeRegionExtensionInterface $extensionAttributes
+    );
 }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeAddress.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeAddress.php
index 0070597fa58bd402876514caf99ffbe6d933d91d..98407fcebb8f2a30cfb3c3f5a1de9c1f6710dc98 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeAddress.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeAddress.php
@@ -7,31 +7,10 @@
 namespace Magento\Wonderland\Model\Data;
 
 use Magento\Framework\Api\AbstractExtensibleObject;
+use Magento\Wonderland\Api\Data\FakeAddressInterface;
 
-class FakeAddress extends AbstractExtensibleObject
+class FakeAddress extends AbstractExtensibleObject implements FakeAddressInterface
 {
-    /**#@+
-     * Constants for keys of data array
-     */
-    const ID = 'id';
-    const CUSTOMER_ID = 'customer_id';
-    const REGION = 'region';
-    const REGIONS = 'regions';
-    const COUNTRY_ID = 'country_id';
-    const STREET = 'street';
-    const COMPANY = 'company';
-    const TELEPHONE = 'telephone';
-    const FAX = 'fax';
-    const POSTCODE = 'postcode';
-    const CITY = 'city';
-    const FIRSTNAME = 'firstname';
-    const LASTNAME = 'lastname';
-    const MIDDLENAME = 'middlename';
-    const PREFIX = 'prefix';
-    const SUFFIX = 'suffix';
-    const VAT_ID = 'vat_id';
-    /**#@-*/
-
     /**
      * Get ID
      *
@@ -201,4 +180,46 @@ class FakeAddress extends AbstractExtensibleObject
     {
         return $this->_get(self::VAT_ID);
     }
+
+    /**
+     * Get if this address is default shipping address.
+     *
+     * @return bool|null
+     */
+    public function isDefaultShipping()
+    {
+        return $this->_get(self::DEFAULT_SHIPPING);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Wonderland\Api\Data\FakeAddressExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * Get if this address is default billing address
+     *
+     * @return bool|null
+     */
+    public function isDefaultBilling()
+    {
+        return $this->_get(self::DEFAULT_BILLING);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Wonderland\Api\Data\FakeAddressExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Wonderland\Api\Data\FakeAddressExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeExtensibleOne.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeExtensibleOne.php
new file mode 100644
index 0000000000000000000000000000000000000000..536aeb9343dce89989d2662b2bbe4ca85a2292a7
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeExtensibleOne.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ *
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Wonderland\Model\Data;
+
+use Magento\Wonderland\Api\Data\FakeExtensibleOneInterface;
+
+class FakeExtensibleOne implements FakeExtensibleOneInterface
+{
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeExtensibleTwo.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeExtensibleTwo.php
new file mode 100644
index 0000000000000000000000000000000000000000..47c95a12b83c510ed50c72e99ef0738b0700a1e6
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeExtensibleTwo.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ *
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Wonderland\Model\Data;
+
+use Magento\Framework\Api\AbstractExtensibleObject;
+use Magento\Wonderland\Api\Data\FakeExtensibleTwoInterface;
+
+class FakeExtensibleTwo extends AbstractExtensibleObject implements FakeExtensibleTwoInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeRegion.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeRegion.php
index e6dad7fd79fc310c8298feb90420d8967e6aef88..cef747dcbdd1ceed0f357b680352921136420074 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeRegion.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeRegion.php
@@ -8,16 +8,8 @@ namespace Magento\Wonderland\Model\Data;
 
 use Magento\Framework\Api\AbstractExtensibleObject;
 
-class FakeRegion extends AbstractExtensibleObject
+class FakeRegion extends AbstractExtensibleObject implements \Magento\Wonderland\Api\Data\FakeRegionInterface
 {
-    /**#@+
-     * Constants for keys of data array
-     */
-    const REGION_CODE = 'region_code';
-    const REGION = 'region';
-    const REGION_ID = 'region_id';
-    /**#@-*/
-
     /**
      * Get region
      *
@@ -47,4 +39,37 @@ class FakeRegion extends AbstractExtensibleObject
     {
         return $this->_get(self::REGION_ID);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Wonderland\Api\Data\FakeRegionExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Wonderland\Api\Data\FakeRegionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Wonderland\Api\Data\FakeRegionExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
+
+    /**
+     * Set region code
+     *
+     * @param string $regionCode
+     * @return $this
+     */
+    public function setRegionCode($regionCode)
+    {
+        return $this->setData(self::REGION_CODE, $regionCode);
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeAddress.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeAddress.php
index 67db23b4f055b8fe778b480aa281aba05b789281..f98e3f5051c31b4c47b1dcdf07fcc4718a0022f4 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeAddress.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeAddress.php
@@ -200,4 +200,26 @@ class FakeAddress extends AbstractExtensibleModel implements FakeAddressInterfac
     {
         return $this->getData(self::DEFAULT_BILLING);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Wonderland\Api\Data\FakeAddressExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Wonderland\Api\Data\FakeAddressExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Wonderland\Api\Data\FakeAddressExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeRegion.php b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeRegion.php
index 9074d3fcf36feeeacb19e65302378424cc6e342a..7527cde11534a301cfb6ae6e0e7ccd306c96ceb1 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeRegion.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeRegion.php
@@ -40,4 +40,26 @@ class FakeRegion extends AbstractExtensibleModel implements FakeRegionInterface
     {
         return $this->getData(self::REGION_ID);
     }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Magento\Wonderland\Api\Data\FakeRegionExtensionInterface|null
+     */
+    public function getExtensionAttributes()
+    {
+        return $this->_getExtensionAttributes();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param \Magento\Wonderland\Api\Data\FakeRegionExtensionInterface $extensionAttributes
+     * @return $this
+     */
+    public function setExtensionAttributes(
+        \Magento\Wonderland\Api\Data\FakeRegionExtensionInterface $extensionAttributes
+    ) {
+        return $this->_setExtensionAttributes($extensionAttributes);
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/Router/BaseTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/Router/BaseTest.php
index c4fa6c52bcbf54d81dc14e42b08b101be27924bd..f2519497eeba1427d9c2005b3c0215020c32b6f3 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/App/Router/BaseTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/App/Router/BaseTest.php
@@ -36,7 +36,7 @@ class BaseTest extends \PHPUnit_Framework_TestCase
         $request = $objectManager->get('Magento\TestFramework\Request');
 
         $this->assertInstanceOf('Magento\Framework\App\ActionInterface', $this->_model->match($request));
-        $request->setRequestUri('core/index/index');
+        $request->setRequestUri('framework/index/index');
         $this->assertInstanceOf('Magento\Framework\App\ActionInterface', $this->_model->match($request));
 
         $request->setPathInfo(
@@ -54,8 +54,8 @@ class BaseTest extends \PHPUnit_Framework_TestCase
     public function testGetControllerClassName()
     {
         $this->assertEquals(
-            'Magento\Core\Controller\Index',
-            $this->_model->getActionClassName('Magento_Core', 'index')
+            'Magento\Framework\Controller\Index',
+            $this->_model->getActionClassName('Magento_Framework', 'index')
         );
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php b/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php
index 943cc88e8f697eb55bec4754f01742945853dfd2..e31201caf943440ce75a00725b65c79cde471c29 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php
@@ -39,7 +39,8 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->varDirectory = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->varDirectory = $objectManager->get(
             'Magento\Framework\Filesystem'
         )->getDirectoryWrite(
             DirectoryList::VAR_DIR
@@ -49,7 +50,7 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase
             new \Magento\Framework\Filesystem\Driver\File(),
             $generationDirectory
         );
-        $this->_generator = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+        $this->_generator = $objectManager->create(
             'Magento\Framework\Code\Generator',
             [
                 'ioObject' => $this->_ioObject,
@@ -61,6 +62,7 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase
                 ]
             ]
         );
+        $this->_generator->setObjectManager($objectManager);
     }
 
     protected function tearDown()
diff --git a/dev/tests/integration/testsuite/Magento/Framework/DB/Adapter/InterfaceTest.php b/dev/tests/integration/testsuite/Magento/Framework/DB/Adapter/InterfaceTest.php
index 5e0219f68f0e24e94bc092ddbbd2952743131bf8..ff713ae85f28f53df39201f3708adb5146b5a67b 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/DB/Adapter/InterfaceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/DB/Adapter/InterfaceTest.php
@@ -38,7 +38,7 @@ class InterfaceTest extends \PHPUnit_Framework_TestCase
             '\Magento\Framework\Setup\ModuleDataSetupInterface',
             [
                 'resourceName' => 'core_setup',
-                'moduleName' => 'Magento_Core'
+                'moduleName' => 'Magento_Test'
             ]
         );
         $this->_connection = $installer->getConnection();
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/Resource/HelperTest.php b/dev/tests/integration/testsuite/Magento/Framework/DB/HelperTest.php
similarity index 97%
rename from dev/tests/integration/testsuite/Magento/Core/Model/Resource/HelperTest.php
rename to dev/tests/integration/testsuite/Magento/Framework/DB/HelperTest.php
index 4cdb588557727e2f3dbcbbb04cab0d11346f117e..ee8a44e4644de8816b8e8ea63d6d612489866300 100644
--- a/dev/tests/integration/testsuite/Magento/Core/Model/Resource/HelperTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/DB/HelperTest.php
@@ -3,7 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Core\Model\Resource;
+namespace Magento\Framework\DB;
 
 class HelperTest extends \PHPUnit_Framework_TestCase
 {
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Session/SaveHandler/DbTableTest.php b/dev/tests/integration/testsuite/Magento/Framework/Session/SaveHandler/DbTableTest.php
index d1edb2e3599d44b28e9984b7b1ee0265dd978ef4..12dbfcb466dd269a9cff5b572ad706d21704a9b8 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Session/SaveHandler/DbTableTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Session/SaveHandler/DbTableTest.php
@@ -83,7 +83,7 @@ class DbTableTest extends \PHPUnit_Framework_TestCase
         /** @var $resource \Magento\Framework\App\Resource */
         $resource = $this->_objectManager->get('Magento\Framework\App\Resource');
         $this->_connection = $resource->getConnection('core_write');
-        $this->_sessionTable = $resource->getTableName('core_session');
+        $this->_sessionTable = $resource->getTableName('session');
 
         // session stores serialized objects with protected properties
         // we need to test this case to ensure that DB adapter successfully processes "\0" symbols in serialized data
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Translate/_files/_translation_data.php b/dev/tests/integration/testsuite/Magento/Framework/Translate/_files/_translation_data.php
index 002e59c5aa2e3a96abf8d250df92ec30ce5b5f8f..2fc1a5ff1eddb8863e2c2b3039bc40721710219f 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Translate/_files/_translation_data.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Translate/_files/_translation_data.php
@@ -5,8 +5,8 @@
  */
 ?>
 <?php return [
-    'Original value for Magento_Core module' => 'Translated value for Magento_Core module',
-    'Magento_Core::Text with different translation on different modules' => 'Text translation by Magento_Core module',
+    'Original value for Magento_Store module' => 'Translated value for Magento_Store module',
+    'Magento_Store::Text with different translation on different modules' => 'Text translation by Magento_Store module',
     'Some non-translated value for Magento_Catalog' => 'Translation for some value for Magento_Catalog',
     'Another non-translated value for Magento_Catalog' => 'Translation for another value for Magento_Catalog',
     'Magento_Catalog::Text with different translation on different modules' =>
diff --git a/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php b/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php
index 87cb1cfd2155b7a2a7c0a43bca3ba51b727e6d3c..4be86c6a992e4f5e48542d9741618411c8bf925d 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php
@@ -40,11 +40,15 @@ class TranslateTest extends \PHPUnit_Framework_TestCase
 
         /** @var $moduleReader \Magento\Framework\Module\Dir\Reader */
         $moduleReader = $objectManager->get('Magento\Framework\Module\Dir\Reader');
-        $moduleReader->setModuleDir('Magento_Core', 'i18n', dirname(__DIR__) . '/Core/Model/_files/Magento/Core/i18n');
+        $moduleReader->setModuleDir(
+            'Magento_Store',
+            'i18n',
+            dirname(__DIR__) . '/Translation/Model/_files/Magento/Store/i18n'
+        );
         $moduleReader->setModuleDir(
             'Magento_Catalog',
             'i18n',
-            dirname(__DIR__) . '/Core/Model/_files/Magento/Catalog/i18n'
+            dirname(__DIR__) . '/Translation/Model/_files/Magento/Catalog/i18n'
         );
 
         /** @var \Magento\Theme\Model\View\Design $designModel */
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/Element/AbstractBlockTest.php b/dev/tests/integration/testsuite/Magento/Framework/View/Element/AbstractBlockTest.php
index ce2a0b9e11a9608aa2b9d68e14a1add946251f48..ead4f55b11bab71d455fc6000f9158d7f8bc2ddb 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/View/Element/AbstractBlockTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/Element/AbstractBlockTest.php
@@ -35,7 +35,7 @@ class AbstractBlockTest extends \PHPUnit_Framework_TestCase
                 \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
                     'Magento\Framework\View\Element\Context'
                 ),
-                ['module_name' => 'Magento_Core']
+                ['module_name' => 'Magento_Theme']
             ]
         );
     }
@@ -483,8 +483,8 @@ class AbstractBlockTest extends \PHPUnit_Framework_TestCase
 
     public function testGetModuleName()
     {
-        $this->assertEquals('Magento_Core', $this->_block->getModuleName());
-        $this->assertEquals('Magento_Core', $this->_block->getData('module_name'));
+        $this->assertEquals('Magento_Theme', $this->_block->getModuleName());
+        $this->assertEquals('Magento_Theme', $this->_block->getData('module_name'));
     }
 
     /**
@@ -619,7 +619,7 @@ class AbstractBlockTest extends \PHPUnit_Framework_TestCase
                     \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
                         'Magento\Framework\View\Element\Context'
                     ),
-                    ['module_name' => 'Magento_Core']
+                    ['module_name' => 'Magento_Theme']
                 ],
                 $mockClass
             );
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/layout_directives_test/arguments_object_type_updaters.xml b/dev/tests/integration/testsuite/Magento/Framework/View/_files/layout_directives_test/arguments_object_type_updaters.xml
index b98084ad88f5ff7b1ba15141e58e7cb75efbd25e..f713bfb8bbfada6a5ead86f955e09bd99196eafb 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/View/_files/layout_directives_test/arguments_object_type_updaters.xml
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/layout_directives_test/arguments_object_type_updaters.xml
@@ -8,7 +8,7 @@
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_layout.xsd">
     <block class="Magento\Framework\View\Element\Text" name="block_with_object_updater_args">
         <arguments>
-            <argument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="one" xsi:type="object">Magento\Core\Model\DataSource</argument>
+            <argument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="one" xsi:type="object">Magento\Store\Model\DataSource</argument>
             <argument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="two" xsi:type="number">0</argument>
         </arguments>
     </block>
diff --git a/dev/tests/integration/testsuite/Magento/Newsletter/Model/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Newsletter/Model/TemplateTest.php
index 8eadd1a288a00ca7b217547c55c3fd42b0c9006c..d501af84c4c26266dff6331a627d6ab1aad6dd30 100644
--- a/dev/tests/integration/testsuite/Magento/Newsletter/Model/TemplateTest.php
+++ b/dev/tests/integration/testsuite/Magento/Newsletter/Model/TemplateTest.php
@@ -6,7 +6,7 @@
 namespace Magento\Newsletter\Model;
 
 /**
- * @magentoDataFixture Magento/Core/_files/store.php
+ * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
  */
 class TemplateTest extends \PHPUnit_Framework_TestCase
 {
diff --git a/dev/tests/integration/testsuite/Magento/Newsletter/_files/subscribers.php b/dev/tests/integration/testsuite/Magento/Newsletter/_files/subscribers.php
index fe3cc067ec3e18690865de39ee50aaf7c9e90988..470db3b9ad92d926c1f1f75b72446c3bc63cc1f3 100644
--- a/dev/tests/integration/testsuite/Magento/Newsletter/_files/subscribers.php
+++ b/dev/tests/integration/testsuite/Magento/Newsletter/_files/subscribers.php
@@ -4,7 +4,7 @@
  * See COPYING.txt for license details.
  */
 
-require __DIR__ . '/../../../Magento/Core/_files/store.php';
+require __DIR__ . '/../../../Magento/Store/_files/core_fixturestore.php';
 require __DIR__ . '/../../../Magento/Customer/_files/customer.php';
 
 $currentStore = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_fixture_store.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_fixture_store.php
index 6bbd0430c0bfc3f3a637465ea1aa9d5b30ea0d55..4d4c2d92a90b08fd8d132090fde771ca1d8a5261 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/_files/order_fixture_store.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_fixture_store.php
@@ -6,7 +6,7 @@
 
 // @codingStandardsIgnoreFile
 
-require __DIR__ . '/../../../Magento/Core/_files/store.php';
+require __DIR__ . '/../../../Magento/Store/_files/core_fixturestore.php';
 
 require __DIR__ . '/../../../Magento/Catalog/_files/product_simple_duplicated.php';
 /** @var \Magento\Catalog\Model\Product $product */
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/DataSource.php b/dev/tests/integration/testsuite/Magento/Store/Model/DataSource.php
similarity index 89%
rename from dev/tests/integration/testsuite/Magento/Core/Model/DataSource.php
rename to dev/tests/integration/testsuite/Magento/Store/Model/DataSource.php
index 8daa1aa1cdc27b0c33d1e0ea30182300f63a5cc1..4b9dcd8c763a8e2fea99630e4e31ca9b85861e9d 100644
--- a/dev/tests/integration/testsuite/Magento/Core/Model/DataSource.php
+++ b/dev/tests/integration/testsuite/Magento/Store/Model/DataSource.php
@@ -3,7 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Core\Model;
+namespace Magento\Store\Model;
 
 /**
  * Dummy layout argument data source object
@@ -31,7 +31,7 @@ class DataSource extends \Magento\Framework\Data\Collection
      * Set updater calls
      *
      * @param array $calls
-     * @return \Magento\Core\Model\DataSource
+     * @return \Magento\Store\Model\DataSource
      */
     public function setUpdaterCall(array $calls)
     {
diff --git a/dev/tests/integration/testsuite/Magento/Core/_files/store.php b/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/_files/store.php
rename to dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php
diff --git a/dev/tests/integration/testsuite/Magento/Core/_files/second_third_store.php b/dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore.php
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/_files/second_third_store.php
rename to dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore.php
diff --git a/dev/tests/integration/testsuite/Magento/Tax/Model/TaxCalculationTest.php b/dev/tests/integration/testsuite/Magento/Tax/Model/TaxCalculationTest.php
index 76d788a77dd462d2f5b735671de16eedc46a3b0a..0c3af306bdeaa8f70d4a0b9e3e0d4bda252693e1 100644
--- a/dev/tests/integration/testsuite/Magento/Tax/Model/TaxCalculationTest.php
+++ b/dev/tests/integration/testsuite/Magento/Tax/Model/TaxCalculationTest.php
@@ -1951,12 +1951,18 @@ class TaxCalculationTest extends \PHPUnit_Framework_TestCase
      *
      * This utility function is used to simplify expected result verification.
      *
-     * @param AbstractExtensibleModel $object
+     * @param \Magento\Framework\Object $object
      * @return array
      */
-    private function convertObjectToArray(AbstractExtensibleModel $object)
+    private function convertObjectToArray($object)
     {
-        $data = $object->getData();
+        if ($object instanceof \Magento\Framework\Object) {
+            $data = $object->getData();
+        } else if (is_object($object)) {
+            $data = (array)$object;
+        } else {
+            throw new \InvalidArgumentException("Provided argument is not an object.");
+        }
         foreach ($data as $key => $value) {
             if (is_object($value)) {
                 $data[$key] = $this->convertObjectToArray($value);
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Parser/Composer/JsonTest.php b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Parser/Composer/JsonTest.php
index 9a5cfc24ba9a3af8ee7be4996398de7291ed8b85..684c24f7b933bf7999ce97c835b851d8140e98a4 100644
--- a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Parser/Composer/JsonTest.php
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Parser/Composer/JsonTest.php
@@ -32,7 +32,6 @@ class JsonTest extends \PHPUnit_Framework_TestCase
             [
                 'name' => 'magento/module-module1',
                 'dependencies' => [
-                    ['module' => 'magento/module-core', 'type' => 'hard'],
                     ['module' => 'magento/module-module2', 'type' => 'hard'],
                     ['module' => 'magento/module-backend', 'type' => 'soft'],
                 ],
@@ -40,7 +39,6 @@ class JsonTest extends \PHPUnit_Framework_TestCase
             [
                 'name' => 'magento/module-module2',
                 'dependencies' => [
-                    ['module' => 'magento/module-core', 'type' => 'hard'],
                     ['module' => 'magento/module-module3', 'type' => 'hard'],
                 ]
             ],
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer1.json b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer1.json
index aa86499218364dd7e01ff62d8f33c9951ad10deb..14b92acc4f7ac59ba502c7da3d92c7d2c98b4997 100644
--- a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer1.json
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer1.json
@@ -3,7 +3,6 @@
     "description": "N/A",
     "require": {
         "php": "~5.5.0|~5.6.0",
-        "magento/module-core": "0.1.0-alpha103",
         "magento/module-module2": "0.1.0-alpha103"
     },
     "suggest": {
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer2.json b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer2.json
index ee1f92ce06fdb65ceadaba97380a02370970ac80..ba14f37abc9f2fc85fd3bac276745c96c9ef4cef 100644
--- a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer2.json
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer2.json
@@ -3,7 +3,6 @@
     "description": "N/A",
     "require": {
         "php": "~5.5.0|~5.6.0",
-        "magento/module-core": "0.1.0-alpha103",
         "magento/module-module3": "0.1.0-alpha103"
     },
     "type": "magento2-module",
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer4.json b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer4.json
index 7d6f1156608810b2570475de76a28ad49cdecf97..3f6b5173c8b4ea7fdd131bfa634f408b1d47b9fb 100644
--- a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer4.json
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer4.json
@@ -3,7 +3,6 @@
     "description": "N/A",
     "require": {
         "php": "~5.5.0|~5.6.0",
-        "magento/module-core": "0.1.0-alpha103",
         "magento/module-module2": "0.1.0-alpha103"
     },
     "type": "magento2-module",
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer5.json b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer5.json
index 39685bcd994940866add3ad1d420483683a5a769..cb9d044436befb0593a3f8e2c98e9d8c3c5dace4 100644
--- a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer5.json
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/composer5.json
@@ -3,7 +3,6 @@
     "description": "N/A",
     "require": {
         "php": "~5.5.0|~5.6.0",
-        "magento/module-core": "0.1.0-alpha103",
         "magento/module-module1": "0.1.0-alpha103"
     },
     "type": "magento2-module",
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/dependencies.csv b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/dependencies.csv
index afdc023ce7ecb1e3f47ae390846aa1f7df678a9d..bce8d9c13d29ac3ac3e983a635069e2170a3d6bf 100644
--- a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/dependencies.csv
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/dependencies.csv
@@ -1,12 +1,10 @@
 "";"All";"Hard";"Soft"
-"Total number of dependencies";"5";"4";"1"
+"Total number of dependencies";"3";"2";"1"
 
 "Dependencies for each module:";"All";"Hard";"Soft"
-"magento/module-module1";"3";"2";"1"
-" -- magento/module-core";"";"1";"0"
+"magento/module-module1";"2";"1";"1"
 " -- magento/module-module2";"";"1";"0"
 " -- magento/module-backend";"";"0";"1"
 
-"magento/module-module2";"2";"2";"0"
-" -- magento/module-core";"";"1";"0"
+"magento/module-module2";"1";"1";"0"
 " -- magento/module-module3";"";"1";"0"
diff --git a/dev/tests/integration/testsuite/Magento/Theme/Model/View/DesignTest.php b/dev/tests/integration/testsuite/Magento/Theme/Model/View/DesignTest.php
index 2fe398ded09e7e0de078b09ffbb481f0f927fd22..4eec44f4a23449fd83b217e2dcd5f3b8470895de 100644
--- a/dev/tests/integration/testsuite/Magento/Theme/Model/View/DesignTest.php
+++ b/dev/tests/integration/testsuite/Magento/Theme/Model/View/DesignTest.php
@@ -126,7 +126,7 @@ class DesignTest extends \PHPUnit_Framework_TestCase
     /**
      * @magentoConfigFixture current_store design/theme/theme_id one
      * @magentoConfigFixture fixturestore_store design/theme/theme_id two
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testGetConfigurationDesignThemeStore()
     {
diff --git a/dev/tests/integration/testsuite/Magento/Theme/Model/_files/design/frontend/Test/default/etc/view.xml b/dev/tests/integration/testsuite/Magento/Theme/Model/_files/design/frontend/Test/default/etc/view.xml
index bbc87835a04fd3ce6965ee5f3ce05ba0b006375c..61d0514d8ae95c2aecbffd5df1445d98ab869c70 100644
--- a/dev/tests/integration/testsuite/Magento/Theme/Model/_files/design/frontend/Test/default/etc/view.xml
+++ b/dev/tests/integration/testsuite/Magento/Theme/Model/_files/design/frontend/Test/default/etc/view.xml
@@ -6,8 +6,8 @@
  */
 -->
 <view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../../lib/internal/Magento/Framework/Config/etc/view.xsd">
-    <vars module="Magento_Core">
-        <var name="var1">Core Value1</var>
+    <vars module="Magento_Store">
+        <var name="var1">Store Value1</var>
     </vars>
     <vars module="Namespace_Module">
         <var name="var1">value1</var>
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Catalog/i18n/en_US.csv b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Catalog/i18n/en_US.csv
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Catalog/i18n/en_US.csv
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Catalog/i18n/en_US.csv
diff --git a/dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Store/i18n/en_AU.csv b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Store/i18n/en_AU.csv
new file mode 100644
index 0000000000000000000000000000000000000000..6a8d6d9f0ef953317d8b2a0cd6527e0a995fb97f
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Store/i18n/en_AU.csv
@@ -0,0 +1 @@
+"Original value for Magento_Store module","Translated value for Magento_Store module in en_AU"
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Core/i18n/en_UK.csv b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Store/i18n/en_UK.csv
similarity index 59%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Core/i18n/en_UK.csv
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Store/i18n/en_UK.csv
index 49355d289e411b75539bbb275addbc770672e169..94f7f1ba263a29cc5907b327a421faccc6fefd56 100644
--- a/dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Core/i18n/en_UK.csv
+++ b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Store/i18n/en_UK.csv
@@ -1 +1 @@
-"Text with different translation on different modules","Text translation by Magento_Core module in en_UK"
+"Text with different translation on different modules","Text translation by Magento_Store module in en_UK"
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Core/i18n/en_US.csv b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Store/i18n/en_US.csv
similarity index 54%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Core/i18n/en_US.csv
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Store/i18n/en_US.csv
index a1e746bfeb758850e05e321110c4ef911d67025c..2ccaf17120470b3369ff0e6c6fe9c28acda7b0c2 100644
--- a/dev/tests/integration/testsuite/Magento/Core/Model/_files/Magento/Core/i18n/en_US.csv
+++ b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/Magento/Store/i18n/en_US.csv
@@ -1,3 +1,3 @@
 "%s","%s"
-"Original value for Magento_Core module","Translated value for Magento_Core module"
+"Original value for Magento_Store module","Translated value for Magento_Store module"
 "Text with different translation on different modules","Text translation that was last loaded"
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/local_config/custom/local.xml b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/local_config/custom/local.xml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/local_config/custom/local.xml
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/local_config/custom/local.xml
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/local_config/custom/prohibited.filename.xml b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/local_config/custom/prohibited.filename.xml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/local_config/custom/prohibited.filename.xml
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/local_config/custom/prohibited.filename.xml
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/local_config/local.xml b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/local_config/local.xml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/local_config/local.xml
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/local_config/local.xml
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/local_config/z.xml b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/local_config/z.xml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/local_config/z.xml
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/local_config/z.xml
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/no_local_config/a.xml b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/no_local_config/a.xml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/no_local_config/a.xml
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/no_local_config/a.xml
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/no_local_config/b.xml b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/no_local_config/b.xml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/no_local_config/b.xml
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/no_local_config/b.xml
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/no_local_config/custom/local.xml b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/no_local_config/custom/local.xml
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/local_config/no_local_config/custom/local.xml
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/local_config/no_local_config/custom/local.xml
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/locale/en_AU/config.xml b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/locale/en_AU/config.xml
similarity index 92%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/locale/en_AU/config.xml
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/locale/en_AU/config.xml
index d8a6cc64835de174524404991954e587c38f1fb5..97d3c799a4ee00613bab6e86f08c9c80d6c69a7f 100644
--- a/dev/tests/integration/testsuite/Magento/Core/Model/_files/locale/en_AU/config.xml
+++ b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/locale/en_AU/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Store/etc/config.xsd">
     <default>
         <locale>
             <inheritance>
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/_files/media/some_file.txt b/dev/tests/integration/testsuite/Magento/Translation/Model/_files/media/some_file.txt
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/Core/Model/_files/media/some_file.txt
rename to dev/tests/integration/testsuite/Magento/Translation/Model/_files/media/some_file.txt
diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Catalog/Edit/FormTest.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Catalog/Edit/FormTest.php
index a17d3e18b9174680f40178c19876ce7e06707eb0..d4780d259aafb1213be6b66d7b5329f425ebea5a 100644
--- a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Catalog/Edit/FormTest.php
+++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Catalog/Edit/FormTest.php
@@ -88,7 +88,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
      *
      * @dataProvider getEntityStoresDataProvider
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      *
      * @param array $productData
      * @param array $categoryData
@@ -117,7 +117,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
      * Check exception is thrown when product does not associated with stores
      *
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testGetEntityStoresProductStoresException()
     {
@@ -139,7 +139,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
      * Check exception is thrown when product stores in intersection with category stores is empty
      *
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      *
      */
     public function testGetEntityStoresProductCategoryStoresException()
@@ -166,7 +166,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
      * Check exception is thrown when category does not associated with stores
      *
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testGetEntityStoresCategoryStoresException()
     {
diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/Edit/FormTest.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/Edit/FormTest.php
index 8e95b21be5814e048e8696cee33156c0462ec85b..8eb255b89d94b35401db85052a114f4fc2577567 100644
--- a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/Edit/FormTest.php
+++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/Edit/FormTest.php
@@ -70,7 +70,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
      * Test entity stores
      *
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testGetEntityStores()
     {
@@ -91,7 +91,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
      * Check exception is thrown when product does not associated with stores
      *
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testGetEntityStoresProductStoresException()
     {
diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/GridTest.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/GridTest.php
index cd1827579b22945d145266e0305afa8b43ed59f8..a201e3105ae79dd598267cc054d3b20562e80225 100644
--- a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/GridTest.php
+++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/GridTest.php
@@ -48,7 +48,7 @@ class GridTest extends \PHPUnit_Framework_TestCase
     /**
      * Test prepare grid when there is more than one store
      *
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testPrepareGridForMultipleStores()
     {
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 18382c4b69f1ee450254ff283e22e4535c406aeb..570e42dad7dba858baa7751723d99604414b46b6 100644
--- a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php
+++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php
@@ -116,7 +116,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
      * Test store selection is available and correctly configured
      *
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testStoreElementMultiStores()
     {
diff --git a/dev/tests/integration/testsuite/Magento/Webapi/Controller/PathProcessorTest.php b/dev/tests/integration/testsuite/Magento/Webapi/Controller/PathProcessorTest.php
index 268d2274beb25c2963d630b095a290f4af542ce0..f9f6ceda847cd08e413b946714077ae302d69e57 100644
--- a/dev/tests/integration/testsuite/Magento/Webapi/Controller/PathProcessorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Webapi/Controller/PathProcessorTest.php
@@ -26,7 +26,7 @@ class PathProcessorTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @magentoDataFixture Magento/Core/_files/store.php
+     * @magentoDataFixture Magento/Store/_files/core_fixturestore.php
      */
     public function testProcessWithValidStoreCode()
     {
diff --git a/dev/tests/integration/testsuite/Magento/Webapi/Model/Config/_files/webapi.php b/dev/tests/integration/testsuite/Magento/Webapi/Model/Config/_files/webapi.php
index 94e740210165ddea0a721a2700e0be52586cd79a..07d9d098ce8c23ec611478dec332941a46befac9 100644
--- a/dev/tests/integration/testsuite/Magento/Webapi/Model/Config/_files/webapi.php
+++ b/dev/tests/integration/testsuite/Magento/Webapi/Model/Config/_files/webapi.php
@@ -5,52 +5,117 @@
  */
 return [
     'services' => [
-        'Magento\TestModule1\Service\V1\AllSoapAndRestInterface' => [
-            'item' => [
-                'resources' => [
-                    'Magento_Test1::resource1',
+        'Magento\TestModuleMSC\Api\AllSoapAndRestInterface' => [
+            'V1' => [
+                'methods' => [
+                    'item' => [
+                        'resources' => [
+                            'Magento_TestModuleMSC::resource1',
+                        ],
+                        'secure' => false,
+                    ],
+                    'create' => [
+                        'resources' => [
+                            'Magento_TestModuleMSC::resource3',
+                        ],
+                        'secure' => false,
+                    ],
                 ],
-                'secure' => false,
             ],
-            'create' => [
-                'resources' => [
-                    'Magento_Test1::resource1',
+            'V2' => [
+                'methods' => [
+                    'getPreconfiguredItem' => [
+                        'resources' => [
+                            'Magento_TestModuleMSC::resource1',
+                            'Magento_TestModuleMSC::resource2',
+                        ],
+                        'secure' => false,
+                    ],
                 ],
-                'secure' => false,
             ],
         ],
-        'Magento\TestModule1\Service\V2\AllSoapAndRestInterface' => [
-            'item' => [
-                'resources' => [
-                    'Magento_Test1::resource1',
-                    'Magento_Test1::resource2',
+        'Magento\TestModule1\Service\V1\AllSoapAndRestInterface' => [
+            'V1' => [
+                'methods' => [
+                    'item' => [
+                        'resources' => [
+                            'Magento_Test1::resource1',
+                        ],
+                        'secure' => false,
+                    ],
+                    'create' => [
+                        'resources' => [
+                            'Magento_Test1::resource1',
+                        ],
+                        'secure' => false,
+                    ],
                 ],
-                'secure' => false,
             ],
-            'create' => [
-                'resources' => [
-                    'Magento_Test1::resource1',
-                    'Magento_Test1::resource2',
+        ],
+        'Magento\TestModule1\Service\V2\AllSoapAndRestInterface' => [
+            'V2' => [
+                'methods' => [
+                    'item' => [
+                        'resources' => [
+                            'Magento_Test1::resource1',
+                            'Magento_Test1::resource2',
+                        ],
+                        'secure' => false,
+                    ],
+                    'create' => [
+                        'resources' => [
+                            'Magento_Test1::resource1',
+                            'Magento_Test1::resource2',
+                        ],
+                        'secure' => false,
+                    ],
+                    'delete' => [
+                        'resources' => [
+                            'Magento_Test1::resource1',
+                            'Magento_Test1::resource2',
+                        ],
+                        'secure' => false,
+                    ],
+                    'update' => [
+                        'resources' => [
+                            'Magento_Test1::resource1',
+                            'Magento_Test1::resource2',
+                        ],
+                        'secure' => false,
+                    ],
                 ],
-                'secure' => false,
             ],
-            'delete' => [
+        ],
+    ],
+    'routes' => [
+        '/V1/testmoduleMSC/:itemId' => [
+            'GET' => [
+                'secure' => false,
+                'service' => [
+                    'class' => 'Magento\TestModuleMSC\Api\AllSoapAndRestInterface',
+                    'method' => 'item',
+                ],
                 'resources' => [
-                    'Magento_Test1::resource1',
-                    'Magento_Test1::resource2',
+                    'Magento_TestModuleMSC::resource1' => true,
+                ],
+                'parameters' => [
                 ],
-                'secure' => false,
             ],
-            'update' => [
+        ],
+        '/V1/testmoduleMSC' => [
+            'POST' => [
+                'secure' => false,
+                'service' => [
+                    'class' => 'Magento\TestModuleMSC\Api\AllSoapAndRestInterface',
+                    'method' => 'create',
+                ],
                 'resources' => [
-                    'Magento_Test1::resource1',
-                    'Magento_Test1::resource2',
+                    'Magento_TestModuleMSC::resource3' => true,
+                ],
+                'parameters' => [
                 ],
-                'secure' => false,
             ],
         ],
-    ],
-    'routes' => [
         '/V1/testmodule1/:id' => [
             'GET' => [
                 'secure' => false,
@@ -143,5 +208,19 @@ return [
                 ],
             ],
         ],
+        '/V2/testmoduleMSC/itemPreconfigured' => [
+            'GET' => [
+                'secure' => false,
+                'service' => [
+                    'class' => 'Magento\TestModuleMSC\Api\AllSoapAndRestInterface',
+                    'method' => 'getPreconfiguredItem',
+                ],
+                'resources' => [
+                    'Magento_TestModuleMSC::resource1' => true,
+                    'Magento_TestModuleMSC::resource2' => true,
+                ],
+                'parameters' => [],
+            ]
+        ]
     ],
 ];
diff --git a/dev/tests/integration/testsuite/Magento/Webapi/Model/Config/_files/webapiA.xml b/dev/tests/integration/testsuite/Magento/Webapi/Model/Config/_files/webapiA.xml
index cd41f812c4e2be5a32998e94b10cf5cf347e9446..f3e03397766b885725a1f8bd1c1ff1e524659952 100644
--- a/dev/tests/integration/testsuite/Magento/Webapi/Model/Config/_files/webapiA.xml
+++ b/dev/tests/integration/testsuite/Magento/Webapi/Model/Config/_files/webapiA.xml
@@ -37,4 +37,23 @@
             <resource ref="Magento_Test1::resource2"/>
         </resources>
     </route>
+    <route method="GET" url="/V1/testmoduleMSC/:itemId">
+        <service class="Magento\TestModuleMSC\Api\AllSoapAndRestInterface" method="item" />
+        <resources>
+            <resource ref="Magento_TestModuleMSC::resource1" />
+        </resources>
+    </route>
+    <route method="POST" url="/V1/testmoduleMSC">
+        <service class="Magento\TestModuleMSC\Api\AllSoapAndRestInterface" method="create" />
+        <resources>
+            <resource ref="Magento_TestModuleMSC::resource3" />
+        </resources>
+    </route>
+    <route method="GET" url="/V2/testmoduleMSC/itemPreconfigured">
+        <service class="Magento\TestModuleMSC\Api\AllSoapAndRestInterface" method="getPreconfiguredItem" />
+        <resources>
+            <resource ref="Magento_TestModuleMSC::resource1" />
+            <resource ref="Magento_TestModuleMSC::resource2" />
+        </resources>
+    </route>
 </routes>
diff --git a/dev/tests/integration/testsuite/Magento/Webapi/ServiceNameCollisionTest.php b/dev/tests/integration/testsuite/Magento/Webapi/ServiceNameCollisionTest.php
index 09014548e5d8ea81e5855ad4104ddcabd693e0db..f568c3b307889a7b06d352ddbe6c0676d649a606 100644
--- a/dev/tests/integration/testsuite/Magento/Webapi/ServiceNameCollisionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Webapi/ServiceNameCollisionTest.php
@@ -11,6 +11,8 @@
  */
 namespace Magento\Webapi;
 
+use Magento\Webapi\Model\Config\Converter;
+
 class ServiceNameCollisionTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -28,10 +30,12 @@ class ServiceNameCollisionTest extends \PHPUnit_Framework_TestCase
         $webapiConfig = $objectManager->get('Magento\Webapi\Model\Config');
         $serviceNames = [];
 
-        foreach (array_keys($webapiConfig->getServices()['services']) as $serviceClassName) {
-            $newServiceName = $soapConfig->getServiceName($serviceClassName);
-            $this->assertFalse(in_array($newServiceName, $serviceNames));
-            $serviceNames[] = $newServiceName;
+        foreach ($webapiConfig->getServices()[Converter::KEY_SERVICES] as $serviceClassName => $serviceVersionData) {
+            foreach ($serviceVersionData as $version => $serviceData) {
+                $newServiceName = $soapConfig->getServiceName($serviceClassName, $version);
+                $this->assertFalse(in_array($newServiceName, $serviceNames));
+                $serviceNames[] = $newServiceName;
+            }
         }
     }
 }
diff --git a/dev/tests/static/framework/autoload.php b/dev/tests/static/framework/autoload.php
index cb9a10bb9d057575ecf1a2af821030e4136899fa..17e643a9f9a3b821ae529713ab5bbec84f250fb0 100644
--- a/dev/tests/static/framework/autoload.php
+++ b/dev/tests/static/framework/autoload.php
@@ -4,9 +4,10 @@
  * See COPYING.txt for license details.
  */
 
-require __DIR__ . '/../../../../app/autoload.php';
-$testsBaseDir = realpath(__DIR__ . '/../');
-
+$baseDir = realpath(__DIR__ . '/../../../../');
+require $baseDir . '/app/autoload.php';
+$testsBaseDir = $baseDir . '/dev/tests/static';
 $autoloadWrapper = \Magento\Framework\Autoload\AutoloaderRegistry::getAutoloader();
 $autoloadWrapper->addPsr4('Magento\\', $testsBaseDir . '/testsuite/Magento/');
 $autoloadWrapper->addPsr4('Magento\\TestFramework\\', $testsBaseDir . '/framework/Magento/TestFramework/');
+$autoloadWrapper->addPsr4('Magento\\', $baseDir . '/var/generation/Magento/');
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Di/CompilerTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/Di/CompilerTest.php
index 2a90df9b592c34aec24ec7cc96ae639fb53b0738..493f1310e380c6e586ca25d5afc032c727cbd891 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/Di/CompilerTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Di/CompilerTest.php
@@ -12,7 +12,8 @@ use Magento\Framework\Api\Code\Generator\SearchResults;
 use Magento\Framework\ObjectManager\Code\Generator\Converter;
 use Magento\Framework\ObjectManager\Code\Generator\Factory;
 use Magento\Framework\ObjectManager\Code\Generator\Repository;
-use Magento\Framework\Api\Code\Generator\ObjectExtensionInterface;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -319,8 +320,10 @@ class CompilerTest extends \PHPUnit_Framework_TestCase
                 Converter::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Converter',
                 Mapper::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\Mapper',
                 SearchResults::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\SearchResults',
-                ObjectExtensionInterface::ENTITY_TYPE =>
-                    'Magento\Framework\Api\Code\Generator\ObjectExtensionInterface'
+                ExtensionAttributesInterfaceGenerator::ENTITY_TYPE =>
+                    'Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator',
+                ExtensionAttributesGenerator::ENTITY_TYPE =>
+                    'Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator'
             ]
         );
         $generationAutoloader = new \Magento\Framework\Code\Generator\Autoloader($generator);
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Api/ExtensibleInterfacesTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Api/ExtensibleInterfacesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e25f22a20e9d192e6c44c34b1d31402204c439a8
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Api/ExtensibleInterfacesTest.php
@@ -0,0 +1,265 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Test\Integrity\Magento\Framework\Api;
+
+use Magento\Framework\App\Utility\Files;
+
+/**
+ * Check interfaces inherited from \Magento\Framework\Api\ExtensibleDataInterface.
+ *
+ * Ensure that all interfaces inherited from \Magento\Framework\Api\ExtensibleDataInterface
+ * override getExtensionAttributes() method and have correct return type specified.
+ */
+class ExtensibleInterfacesTest extends \PHPUnit_Framework_TestCase
+{
+    const EXTENSIBLE_DATA_INTERFACE = 'Magento\\Framework\\Api\\ExtensibleDataInterface';
+
+    /**
+     * Check return types of getExtensionAttributes() methods.
+     */
+    public function testGetSetExtensionAttributes()
+    {
+        $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
+        $invoker(
+        /**
+         * @param string $filename
+         */
+            function ($filename) {
+                $errors = [];
+                $fileContent = file_get_contents($filename);
+                $extendsFromExtensibleDataInterface = preg_match(
+                    '/' . str_replace('\\', '\\\\', self::EXTENSIBLE_DATA_INTERFACE) . '/',
+                    $fileContent
+                );
+                if ($extendsFromExtensibleDataInterface
+                    && preg_match('/namespace ([\w\\\\]+).*interface ([\w\\\\]+)/s', $fileContent, $matches)
+                ) {
+                    $namespace = $matches[1];
+                    $interfaceName = $matches[2];
+                    $fullInterfaceName = '\\' . $namespace . '\\' . $interfaceName;
+                    $interfaceReflection = new \ReflectionClass($fullInterfaceName);
+                    if ($interfaceReflection->isSubclassOf(self::EXTENSIBLE_DATA_INTERFACE)) {
+                        $interfaceName = '\\' . $interfaceReflection->getName();
+                        $extensionClassName = substr($interfaceName, 0, -strlen('Interface')) . 'Extension';
+                        $extensionInterfaceName = $extensionClassName . 'Interface';
+
+                        /** Check getExtensionAttributes method */
+                        $errors = $this->checkGetExtensionAttributes(
+                            $interfaceReflection,
+                            $extensionInterfaceName,
+                            $fullInterfaceName
+                        );
+
+                        /** Check setExtensionAttributes method */
+                        $errors = array_merge(
+                            $errors,
+                            $this->checkSetExtensionAttributes(
+                                $interfaceReflection,
+                                $extensionInterfaceName,
+                                $fullInterfaceName
+                            )
+                        );
+                    }
+                }
+
+                $this->assertEmpty(
+                    $errors,
+                    "Error validating $filename\n" . print_r($errors, true)
+                );
+            },
+            $this->getInterfacesFiles()
+        );
+    }
+
+    /**
+     * Check getExtensionAttributes methods
+     *
+     * @param \ReflectionClass $interfaceReflection
+     * @param string $extensionInterfaceName
+     * @param string $fullInterfaceName
+     * @return array
+     */
+    private function checkGetExtensionAttributes(
+        \ReflectionClass $interfaceReflection,
+        $extensionInterfaceName,
+        $fullInterfaceName
+    ) {
+        $errors = [];
+        try {
+            $methodReflection = $interfaceReflection->getMethod('getExtensionAttributes');
+            /** Ensure that proper return type of getExtensionAttributes() method is specified */
+            $methodDocBlock = $methodReflection->getDocComment();
+            $pattern = "/@return\s+" . str_replace('\\', '\\\\', $extensionInterfaceName) . "/";
+            if (!preg_match($pattern, $methodDocBlock)) {
+                $errors[] =
+                    "'{$fullInterfaceName}::getExtensionAttributes()' must be declared "
+                    . "with a return type of '{$extensionInterfaceName}'.";
+            }
+        } catch (\ReflectionException $e) {
+            $errors[] = "The following method should be declared in "
+                . "'{$extensionInterfaceName}'. '{$extensionInterfaceName}' must be specified as"
+                . " a return type for '{$fullInterfaceName}::getExtensionAttributes()'";
+        }
+
+        return $errors;
+    }
+
+    /**
+     * Check setExtensionAttributes methods
+     *
+     * @param \ReflectionClass $interfaceReflection
+     * @param string $extensionInterfaceName
+     * @param string $fullInterfaceName
+     * @return array
+     */
+    private function checkSetExtensionAttributes(
+        \ReflectionClass $interfaceReflection,
+        $extensionInterfaceName,
+        $fullInterfaceName
+    ) {
+        $errors = [];
+        try {
+            $methodReflection = $interfaceReflection->getMethod('setExtensionAttributes');
+            /** Ensure that proper argument type for setExtensionAttributes() method is specified */
+            $methodParameters = $methodReflection->getParameters();
+
+            if (empty($methodParameters)) {
+                $errors[] = "'{$extensionInterfaceName}' must be specified as the parameter type "
+                    . "in '{$fullInterfaceName}::setExtensionAttributes()'.";
+            } else {
+                // Get the parameter name via a regular expression capture because the class may
+                // not exist which causes a fatal error
+                preg_match('/\[\s\<\w+?>\s([\w]+)/s', $methodParameters[0]->__toString(), $matches);
+                $isCorrectParameter = false;
+                if (isset($matches[1]) && '\\' . $matches[1] != $extensionInterfaceName) {
+                    $isCorrectParameter = true;
+                }
+
+                if (!$isCorrectParameter) {
+                    $errors[] = "'{$extensionInterfaceName}' must be specified as the parameter type "
+                        . "in '{$fullInterfaceName}::setExtensionAttributes()'.";
+                }
+            }
+        } catch (\ReflectionException $e) {
+            $errors[] = "'{$fullInterfaceName}::setExtensionAttributes()' must be declared "
+                . "with a '{$extensionInterfaceName}' parameter type.";
+        }
+
+        return $errors;
+    }
+
+    /**
+     * Ensure that all classes extended from extensible classes implement getter and setter for extension attributes.
+     */
+    public function testExtensibleClassesWithMissingInterface()
+    {
+        $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
+        $invoker(
+        /**
+         * @param string $filename
+         */
+            function ($filename) {
+                $errors = [];
+                $fileContent = file_get_contents($filename);
+                $extensibleClassPattern = 'class [^\{]+extends[^\{]+AbstractExtensible';
+                $abstractExtensibleClassPattern = 'abstract ' . $extensibleClassPattern;
+                if (preg_match('/' . $extensibleClassPattern . '/', $fileContent) &&
+                    !preg_match('/' . $abstractExtensibleClassPattern . '/', $fileContent)
+                ) {
+                    $fileReflection = new \Zend\Code\Reflection\FileReflection($filename, true);
+                    foreach ($fileReflection->getClasses() as $classReflection) {
+                        if ($classReflection->isSubclassOf(self::EXTENSIBLE_DATA_INTERFACE)) {
+                            $methodsToCheck = ['setExtensionAttributes', 'getExtensionAttributes'];
+                            foreach ($methodsToCheck as $methodName) {
+                                try {
+                                    $classReflection->getMethod($methodName);
+                                } catch (\ReflectionException $e) {
+                                    $className = $classReflection->getName();
+                                    $errors[] = "'{$className}::{$methodName}()' must be declared or "
+                                        . "'{$className}' should not be inherited from extensible class.";
+                                }
+                            }
+                        }
+                    }
+                }
+
+                $this->assertEmpty(
+                    $errors,
+                    "Error validating $filename\n" . print_r($errors, true)
+                );
+            },
+            $this->getPhpFiles()
+        );
+    }
+
+    /**
+     * Retrieve a list of all interfaces declared in the Magento application and Magento library.
+     *
+     * @return array
+     */
+    public function getInterfacesFiles()
+    {
+        $codeInterfaceFiles = $this->getFiles(BP . '/app', '*Interface.php');
+        $libInterfaceFiles = $this->getFiles(BP . '/lib/Magento', '*Interface.php');
+        $interfaces = [];
+        $filesToCheck = $this->blacklistFilter(array_merge($codeInterfaceFiles, $libInterfaceFiles));
+        foreach ($filesToCheck as $file) {
+            $interfaces[substr($file, strlen(BP))] = [$file];
+        }
+        return $interfaces;
+    }
+
+    /**
+     * Retrieve a list of all php files declared in the Magento application and Magento library.
+     *
+     * @return array
+     */
+    public function getPhpFiles()
+    {
+        $codeFiles = $this->getFiles(BP . '/app', '*.php');
+        $libFiles = $this->getFiles(BP . '/lib/Magento', '*.php');
+        $phpFiles = [];
+        $filesToCheck = $this->blacklistFilter(array_merge($codeFiles, $libFiles));
+        foreach ($filesToCheck as $file) {
+            $phpFiles[substr($file, strlen(BP))] = [$file];
+        }
+        return $phpFiles;
+    }
+
+    /**
+     * Retrieve all files in a directory that correspond to the given pattern
+     *
+     * @param string $dir
+     * @param string $pattern
+     * @return array
+     */
+    protected function getFiles($dir, $pattern)
+    {
+        $files = glob($dir . '/' . $pattern, GLOB_NOSORT);
+        foreach (glob($dir . '/*', GLOB_ONLYDIR | GLOB_NOSORT) as $newDir) {
+            $files = array_merge($files, $this->getFiles($newDir, $pattern));
+        }
+        return $files;
+    }
+
+    /**
+     * Filter blacklisted files out of an array
+     *
+     * @param array $preFilter
+     * @return array
+     */
+    protected function blacklistFilter($preFilter)
+    {
+        $postFilter = [];
+        $blacklist = Files::readLists(__DIR__ . '/_files/ExtensibleInterfacesTest/blacklist*');
+        foreach ($preFilter as $file) {
+            if (!in_array($file, $blacklist)) {
+                $postFilter[] = $file;
+            }
+        }
+        return $postFilter;
+    }
+}
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Api/_files/ExtensibleInterfacesTest/blacklist_ce.txt b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Api/_files/ExtensibleInterfacesTest/blacklist_ce.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b43e1551c9e9d4b216df0fc88e525e0c8a1609dc
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Api/_files/ExtensibleInterfacesTest/blacklist_ce.txt
@@ -0,0 +1,2 @@
+app/code/Magento/Payment/Model/Info.php
+app/code/Magento/Customer/Model/Address/AbstractAddress.php
\ No newline at end of file
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Phrase/JsTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/Phrase/JsTest.php
deleted file mode 100644
index 08981d2585ce547dc6d105959a973d8afdfa6167..0000000000000000000000000000000000000000
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/Phrase/JsTest.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-/**
- * Scan javascript files for invocations of mage.__() function, verifies that all the translations
- * were output to the page.
- *
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Test\Integrity\Phrase;
-
-use Magento\Tools\I18n\Parser\Adapter;
-use Magento\Tools\I18n\Parser\Adapter\Php\Tokenizer;
-use Magento\Tools\I18n\Parser\Adapter\Php\Tokenizer\PhraseCollector;
-
-class JsTest extends \Magento\Test\Integrity\Phrase\AbstractTestCase
-{
-    /**
-     * @var \Magento\Tools\I18n\Parser\Adapter\Js
-     */
-    protected $_parser;
-
-    /** @var \Magento\Framework\App\Utility\Files  */
-    protected $_utilityFiles;
-
-    /** @var \Magento\Tools\I18n\Parser\Adapter\Php\Tokenizer\PhraseCollector */
-    protected $_phraseCollector;
-
-    protected function setUp()
-    {
-        $this->_parser = new \Magento\Tools\I18n\Parser\Adapter\Js();
-        $this->_utilityFiles = \Magento\Framework\App\Utility\Files::init();
-        $this->_phraseCollector = new \Magento\Tools\I18n\Parser\Adapter\Php\Tokenizer\PhraseCollector(
-            new \Magento\Tools\I18n\Parser\Adapter\Php\Tokenizer()
-        );
-    }
-
-    public function testGetPhrasesAdminhtml()
-    {
-        $unregisteredMessages = [];
-        $untranslated = [];
-
-        $registeredPhrases = $this->_getRegisteredPhrases();
-
-        require_once BP . '/app/code/Magento/Backend/App/Area/FrontNameResolver.php';
-        foreach ($this->_getJavascriptPhrases(\Magento\Backend\App\Area\FrontNameResolver::AREA_CODE) as $phrase) {
-            if (!in_array($phrase['phrase'], $registeredPhrases)) {
-                $unregisteredMessages[] = sprintf(
-                    "'%s' \n in file %s, line# %s",
-                    $phrase['phrase'],
-                    $phrase['file'],
-                    $phrase['line']
-                );
-                $untranslated[] = $phrase['phrase'];
-            }
-        }
-
-        if (count($unregisteredMessages) > 0) {
-            $this->fail(
-                'There are UI messages in javascript files for adminhtml area ' .
-                "which requires translations to be output to the page: \n\n" .
-                implode(
-                    "\n",
-                    $unregisteredMessages
-                )
-            );
-        }
-    }
-
-    public function testGetPhrasesFrontend()
-    {
-        $unregisteredMessages = [];
-        $untranslated = [];
-
-        $registeredPhrases = $this->_getRegisteredPhrases();
-
-        foreach ($this->_getJavascriptPhrases('frontend') as $phrase) {
-            if (!in_array($phrase['phrase'], $registeredPhrases)) {
-                $unregisteredMessages[] = sprintf(
-                    "'%s' \n in file %s, line# %s",
-                    $phrase['phrase'],
-                    $phrase['file'],
-                    $phrase['line']
-                );
-                $untranslated[] = $phrase['phrase'];
-            }
-        }
-
-        if (count($unregisteredMessages) > 0) {
-            $this->fail(
-                'There are UI messages in javascript files for frontend area ' .
-                "which requires translations to be output to the page: \n\n" .
-                implode(
-                    "\n",
-                    $unregisteredMessages
-                )
-            );
-        }
-    }
-
-    /**
-     * Returns an array of phrases that can be used by JS files.
-     *
-     * @return string[]
-     */
-    protected function _getRegisteredPhrases()
-    {
-        $jsHelperFile = realpath(
-            __DIR__ . '/../../../../../../../../app/code/Magento/Translation/Model/Js/DataProvider.php'
-        );
-
-        $this->_phraseCollector->parse($jsHelperFile);
-
-        $result = [];
-        foreach ($this->_phraseCollector->getPhrases() as $phrase) {
-            $result[] = stripcslashes(trim($phrase['phrase'], "'"));
-        }
-        return $result;
-    }
-
-    /**
-     * Returns an array of phrases used by JavaScript files in a specific area of magento.
-     *
-     * @param string $area of magento to search, such as 'frontend' or 'adminthml'
-     * @return string[]
-     */
-    protected function _getJavascriptPhrases($area)
-    {
-        $jsPhrases = [];
-        foreach ($this->_utilityFiles->getJsFilesForArea($area) as $file) {
-            $this->_parser->parse($file);
-            $jsPhrases = array_merge($jsPhrases, $this->_parser->getPhrases());
-        }
-        return $jsPhrases;
-    }
-}
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Readme/_files/blacklist/ce.txt b/dev/tests/static/testsuite/Magento/Test/Integrity/Readme/_files/blacklist/ce.txt
index f40e2c359dd6cde8fc5f09356449321942624091..2fd6ad123621cb9b830d5d02b3840463d4520fbc 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/Readme/_files/blacklist/ce.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Readme/_files/blacklist/ce.txt
@@ -2,7 +2,6 @@ app/code/Magento/CatalogImportExport
 app/code/Magento/CatalogUrlRewrite
 app/code/Magento/CmsUrlRewrite
 app/code/Magento/ConfigurableImportExport
-app/code/Magento/Core
 app/code/Magento/Doc
 app/code/Magento/GroupedImportExport
 app/code/Magento/Msrp
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/namespace.txt b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/namespace.txt
index 3040b28edc5274f7d8fa138c0a7d4ba8be521d85..1c00c272708bd0ec91a8cdd3b6f4ff1df4637715 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/namespace.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/namespace.txt
@@ -29,11 +29,19 @@ dev/tests/integration/testsuite/Magento/Test/Tools/I18n/Dictionary/_files/source
 dev/tests/integration/testsuite/Magento/Test/Tools/I18n/Dictionary/_files/source/not_magento_dir/Model.php
 dev/tests/integration/testsuite/Magento/Test/Tools/I18n/Dictionary/_files/source/app/code/Magento/FirstModule/Helper/Helper.php
 dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeAddressInterface.php
+dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleOneInterface.php
+dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleTwoInterface.php
 dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeRegionInterface.php
+dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleOneInterface.php
+dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Api/Data/FakeExtensibleTwoInterface.php
 dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeAddress.php
+dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeExtensibleOne.php
+dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeExtensibleTwo.php
 dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/FakeRegion.php
 dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeAddress.php
 dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeRegion.php
+dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeExtensibleOne.php
+dev/tests/integration/testsuite/Magento/Framework/Api/_files/Magento/Wonderland/Model/Data/FakeExtensibleTwo.php
 dev/tests/static/testsuite/Magento/Test/Php/Exemplar/CodeMessTest/phpmd/input/coupling.php
 dev/tests/static/testsuite/Magento/Test/Php/Exemplar/CodeMessTest/phpmd/input/cyclomatic_complexity.php
 dev/tests/static/testsuite/Magento/Test/Php/Exemplar/CodeMessTest/phpmd/input/descendant_count.php
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/reference.txt b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/reference.txt
index 29a6687221a578eec95394ebb2161c46ceba331f..1310a906961d107a4aa3b399324bcb35bca08b33 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/reference.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/blacklist/reference.txt
@@ -34,8 +34,12 @@ Model1
 Model3
 \Magento\Wonderland\Api\Data\FakeRegionInterface
 \Magento\Wonderland\Api\Data\FakeAddressInterface
+\Magento\Wonderland\Api\Data\FakeExtensibleOneInterface
+\Magento\Wonderland\Api\Data\FakeExtensibleTwoInterface
 \Magento\Wonderland\Model\Data\FakeRegion
 \Magento\Wonderland\Model\Data\FakeAddress
+\Magento\Wonderland\Model\Data\FakeExtensibleOne
+\Magento\Wonderland\Model\Data\FakeExtensibleTwo
 \Magento\Framework\Error\Processor
 \Magento\TestModule3\Service\V1\Entity\Parameter
 \Magento\TestModule3\Service\V1\Entity\ParameterBuilder
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php
index 5835ae6946b08aeecd0e4fe60b8436f88fb4f610..1ae037a2b477a3957cc658ecdac90f7e737eef1e 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php
@@ -106,16 +106,11 @@ return [
     'cms_block_store'                             => 'Magento\Cms',
     'cms_page'                                    => 'Magento\Cms',
     'cms_page_store'                              => 'Magento\Cms',
-    'core_cache'                                  => 'Magento\Core',
-    'core_cache_tag'                              => 'Magento\Core',
-    'core_config_data'                            => 'Magento\Core',
-    'core_config_field'                           => 'Magento\Core',
-    'design_change'                               => 'Magento\Core',
-    'media_storage_directory_storage'                      => 'Magento\Core',
-    'core_email_template'                         => 'Magento\Core',
-    'media_storage_file_storage'                           => 'Magento\Core',
-    'core_flag'                                   => 'Magento\Core',
-    'core_session'                                => 'Magento\Core',
+    'core_config_data'                            => 'Magento\Config',
+    'design_change'                               => 'Magento\Theme',
+    'media_storage_directory_storage'             => 'Magento\MediaStorage',
+    'email_template'                              => 'Magento\Email',
+    'media_storage_file_storage'                  => 'Magento\MediaStorage',
     'store'                                       => 'Magento\Store',
     'store_group'                                 => 'Magento\Store',
     'store_website'                               => 'Magento\Store',
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 1afa25055ddc04de479b612ea4e9666cd1a5f0c4..2f915d7ffb489af665131b0bea82328ecccc1a8f 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php
@@ -2168,6 +2168,7 @@ return [
     ['Magento\Usa\Model\Shipping\Carrier\Usps\Source\Machinable', 'Magento\Usps\Model\Source\Machinable'],
     ['Magento\Usa\Model\Shipping\Carrier\Usps\Source\Method', 'Magento\Usps\Model\Source\Method'],
     ['Magento\Usa\Model\Shipping\Carrier\Usps\Source\Size', 'Magento\Usps\Model\Source\Size'],
+    ['Magento\Framework\Api\Config\MetadataConfig'],
     ['Magento\Usa\Model\Shipping\Carrier\Usps', 'Magento\Usps\Model\Carrier'],
     ['Magento\Usa\Model\Shipping\Carrier\Ups', 'Magento\Ups\Model\Carrier'],
     ['Magento\Usa\Model\Simplexml\Element', 'Magento\Shipping\Model\Simplexml\Element'],
@@ -3104,6 +3105,7 @@ return [
     ['Magento\Framework\Module\Updater'],
     ['Magento\Setup\Module\SetupFactory'],
     ['Magento\Framework\Module\Updater\SetupFactory'],
+    ['Magento\Log\Block\Adminhtml\Customer\Edit\Tab\View\Status'],
     ['Magento\Backend\Model\Config\Source\Yesno', 'Magento\Config\Model\Config\Source\Yesno'],
     ['Magento\Reports\Model\Resource\Shopcart\Product\Collection'],
     ['Zend_Locale', '\Locale, \ResourceBundle'],
diff --git a/dev/tests/unit/framework/autoload.php b/dev/tests/unit/framework/autoload.php
new file mode 100644
index 0000000000000000000000000000000000000000..56021a2bb4acf835cf73ebb210789a84d77c2818
--- /dev/null
+++ b/dev/tests/unit/framework/autoload.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Framework\Api\Code\Generator\DataBuilder;
+use Magento\Framework\Api\Code\Generator\Mapper;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
+use Magento\Framework\Api\Code\Generator\SearchResults;
+use Magento\Framework\Api\Code\Generator\SearchResultsBuilder;
+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\Persistor;
+use Magento\Framework\ObjectManager\Code\Generator\Proxy;
+use Magento\Framework\ObjectManager\Code\Generator\Repository;
+use Magento\Tools\Di\Code\Scanner;
+use Magento\Tools\Di\Compiler\Log\Writer;
+use Magento\Tools\Di\Definition\Compressor;
+
+/**
+ * Enable code generation for the undeclared classes.
+ */
+$generationDir = TESTS_TEMP_DIR . '/var/generation';
+$generatorIo = new \Magento\Framework\Code\Generator\Io(
+    new \Magento\Framework\Filesystem\Driver\File(),
+    $generationDir
+);
+$generator = new \Magento\Framework\Code\Generator(
+    $generatorIo,
+    [
+        Interceptor::ENTITY_TYPE => 'Magento\Framework\Interception\Code\Generator\Interceptor',
+        Proxy::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Proxy',
+        Factory::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Factory',
+        Mapper::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\Mapper',
+        Persistor::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Persistor',
+        Repository::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Repository',
+        Converter::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Converter',
+        SearchResults::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\SearchResults',
+        ExtensionAttributesInterfaceGenerator::ENTITY_TYPE =>
+            'Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator',
+        ExtensionAttributesGenerator::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator'
+    ]
+);
+/** Initialize object manager for code generation based on configs */
+$magentoObjectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER);
+$objectManager = $magentoObjectManagerFactory->create($_SERVER);
+$generator->setObjectManager($objectManager);
+
+$autoloader = new \Magento\Framework\Code\Generator\Autoloader($generator);
+spl_autoload_register([$autoloader, 'load']);
+$autoloadWrapper = \Magento\Framework\Autoload\AutoloaderRegistry::getAutoloader();
+$autoloadWrapper->addPsr4('Magento\\', $generationDir . '/Magento/');
diff --git a/dev/tests/unit/framework/bootstrap.php b/dev/tests/unit/framework/bootstrap.php
index 96ff9c21b8765cddb3f750ce6aeb61e2dbece0a5..b30486b50a17dc3a6e0b67adaa072868b1747736 100755
--- a/dev/tests/unit/framework/bootstrap.php
+++ b/dev/tests/unit/framework/bootstrap.php
@@ -10,6 +10,7 @@ if (!defined('TESTS_TEMP_DIR')) {
     define('TESTS_TEMP_DIR', dirname(__DIR__) . '/tmp');
 }
 
+require_once __DIR__ . '/autoload.php';
 require BP . '/app/functions.php';
 
 
diff --git a/dev/tools/Magento/Tools/Di/Code/Scanner/PhpScanner.php b/dev/tools/Magento/Tools/Di/Code/Scanner/PhpScanner.php
index 6346d51bd2f8c03a820f6a56ecb9642956784ef3..bf5fc24e4749a2252511471bf3581476b9153d5e 100644
--- a/dev/tools/Magento/Tools/Di/Code/Scanner/PhpScanner.php
+++ b/dev/tools/Magento/Tools/Di/Code/Scanner/PhpScanner.php
@@ -6,6 +6,9 @@
 namespace Magento\Tools\Di\Code\Scanner;
 
 use Magento\Tools\Di\Compiler\Log\Log;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
+use Magento\Framework\ObjectManager\Code\Generator\Factory as FactoryGenerator;
 
 class PhpScanner implements ScannerInterface
 {
@@ -23,51 +26,138 @@ class PhpScanner implements ScannerInterface
     }
 
     /**
-     * Fetch factories from class constructor
+     * Find classes which are used as parameters types of the specified method and are not declared.
      *
-     * @param $file string
-     * @param $reflectionClass mixed
-     * @return array
+     * @param string $file
+     * @param \ReflectionClass $classReflection
+     * @param string $methodName
+     * @param string $entityType
+     * @return string[]
      */
-    protected function _fetchFactories($file, $reflectionClass)
+    protected function _findMissingClasses($file, $classReflection, $methodName, $entityType)
     {
-        $absentFactories = [];
-        if ($reflectionClass->hasMethod('__construct')) {
-            $constructor = $reflectionClass->getMethod('__construct');
+        $missingClasses = [];
+        if ($classReflection->hasMethod($methodName)) {
+            $constructor = $classReflection->getMethod($methodName);
             $parameters = $constructor->getParameters();
             /** @var $parameter \ReflectionParameter */
             foreach ($parameters as $parameter) {
                 preg_match('/\[\s\<\w+?>\s([\w\\\\]+)/s', $parameter->__toString(), $matches);
-                if (isset($matches[1]) && substr($matches[1], -7) == 'Factory') {
-                    $factoryClassName = $matches[1];
-                    if (class_exists($factoryClassName)) {
-                        continue;
-                    }
-                    $entityName = rtrim(substr($factoryClassName, 0, -7), '\\');
-                    if (!class_exists($entityName) && !interface_exists($entityName)) {
-                        $this->_log->add(
-                            Log::CONFIGURATION_ERROR,
-                            $factoryClassName,
-                            'Invalid Factory for nonexistent class ' . $entityName . ' in file ' . $file
-                        );
-                        continue;
+                if (isset($matches[1]) && substr($matches[1], -strlen($entityType)) == $entityType) {
+                    $missingClassName = $matches[1];
+                    try {
+                        if (class_exists($missingClassName)) {
+                            continue;
+                        }
+                    } catch (\Magento\Framework\Exception $e) {
                     }
-
-                    if (substr($factoryClassName, -8) == '\\Factory') {
+                    $sourceClassName = $this->getSourceClassName($missingClassName, $entityType);
+                    if (!class_exists($sourceClassName) && !interface_exists($sourceClassName)) {
                         $this->_log->add(
                             Log::CONFIGURATION_ERROR,
-                            $factoryClassName,
-                            'Invalid Factory declaration for class ' . $entityName . ' in file ' . $file
+                            $missingClassName,
+                            "Invalid {$entityType} for nonexistent class {$sourceClassName} in file {$file}"
                         );
                         continue;
                     }
-                    $absentFactories[] = $factoryClassName;
+                    $missingClasses[] = $missingClassName;
                 }
             }
         }
+        return $missingClasses;
+    }
+
+    /**
+     * Identify source class name for the provided class.
+     *
+     * @param string $missingClassName
+     * @param string $entityType
+     * @return string
+     */
+    protected function getSourceClassName($missingClassName, $entityType)
+    {
+        $sourceClassName = rtrim(substr($missingClassName, 0, -strlen($entityType)), '\\');
+        $entityType = lcfirst($entityType);
+        if ($entityType == ExtensionAttributesInterfaceGenerator::ENTITY_TYPE
+            || $entityType == ExtensionAttributesGenerator::ENTITY_TYPE
+        ) {
+            /** Process special cases for extension class and extension interface */
+            return $sourceClassName . 'Interface';
+        } else if ($entityType == FactoryGenerator::ENTITY_TYPE) {
+            $extensionAttributesSuffix = ucfirst(ExtensionAttributesGenerator::ENTITY_TYPE);
+            if (substr($sourceClassName, -strlen($extensionAttributesSuffix)) == $extensionAttributesSuffix) {
+                /** Process special case for extension factories */
+                $extensionAttributesClass = substr(
+                    $sourceClassName,
+                    0,
+                    -strlen(ExtensionAttributesGenerator::ENTITY_TYPE)
+                );
+                $sourceClassName = $extensionAttributesClass . 'Interface';
+            }
+        }
+        return $sourceClassName;
+    }
+
+    /**
+     * Fetch factories from class constructor
+     *
+     * @param \ReflectionClass $reflectionClass
+     * @param string $file
+     * @return string[]
+     */
+    protected function _fetchFactories($reflectionClass, $file)
+    {
+        $factorySuffix = '\\'.ucfirst(FactoryGenerator::ENTITY_TYPE);
+        $absentFactories = $this->_findMissingClasses(
+            $file,
+            $reflectionClass,
+            '__construct',
+            ucfirst(FactoryGenerator::ENTITY_TYPE)
+        );
+        foreach ($absentFactories as $key => $absentFactory) {
+            if (substr($absentFactory, -strlen($factorySuffix)) == $factorySuffix) {
+                $entityName = rtrim(substr($absentFactory, 0, -strlen($factorySuffix)), '\\');
+                $this->_log->add(
+                    Log::CONFIGURATION_ERROR,
+                    $absentFactory,
+                    'Invalid Factory declaration for class ' . $entityName . ' in file ' . $file
+                );
+                unset($absentFactories[$key]);
+            }
+        }
         return $absentFactories;
     }
 
+    /**
+     * Find missing extension attributes related classes, interfaces and factories.
+     *
+     * @param \ReflectionClass $reflectionClass
+     * @param string $file
+     * @return string[]
+     */
+    protected function _fetchMissingExtensionAttributesClasses($reflectionClass, $file)
+    {
+        $missingExtensionInterfaces = $this->_findMissingClasses(
+            $file,
+            $reflectionClass,
+            'setExtensionAttributes',
+            ucfirst(\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::ENTITY_TYPE)
+        );
+        $missingExtensionClasses = [];
+        $missingExtensionFactories = [];
+        foreach ($missingExtensionInterfaces as $missingExtensionInterface) {
+            $extension = rtrim(substr($missingExtensionInterface, 0, -strlen('Interface')), '\\');
+            if (!class_exists($extension)) {
+                $missingExtensionClasses[] = $extension;
+            }
+            $extensionFactory = $extension . 'Factory';
+            if (!class_exists($extensionFactory)) {
+                $missingExtensionFactories[] = $extensionFactory;
+            }
+        }
+        return array_merge($missingExtensionInterfaces, $missingExtensionClasses, $missingExtensionFactories);
+    }
+
     /**
      * Get array of class names
      *
@@ -81,10 +171,11 @@ class PhpScanner implements ScannerInterface
             $classes = $this->_getDeclaredClasses($file);
             foreach ($classes as $className) {
                 $reflectionClass = new \ReflectionClass($className);
-                $absentFactories = $this->_fetchFactories($file, $reflectionClass);
-                if (!empty($absentFactories)) {
-                    $output = array_merge($output, $absentFactories);
-                }
+                $output = array_merge(
+                    $output,
+                    $this->_fetchFactories($reflectionClass, $file),
+                    $this->_fetchMissingExtensionAttributesClasses($reflectionClass, $file)
+                );
             }
         }
         return array_unique($output);
@@ -128,7 +219,7 @@ class PhpScanner implements ScannerInterface
     }
 
     /**
-     * Get classes declared in the file
+     * Get classes and interfaces declared in the file
      *
      * @param string $file
      * @return array
@@ -145,7 +236,9 @@ class PhpScanner implements ScannerInterface
                 $namespace .= $this->_fetchNamespace($tokenIterator, $count, $tokens);
             }
 
-            if ($tokens[$tokenIterator][0] === T_CLASS) {
+            if ($tokens[$tokenIterator][0] === T_CLASS
+                || $tokens[$tokenIterator][0] === T_INTERFACE
+            ) {
                 $classes = array_merge($classes, $this->_fetchClasses($namespace, $tokenIterator, $count, $tokens));
             }
         }
diff --git a/dev/tools/Magento/Tools/Di/Code/Scanner/XmlScanner.php b/dev/tools/Magento/Tools/Di/Code/Scanner/XmlScanner.php
index 23ad5d57a25ef85c8a13b6234f4d83d91f3cc406..9f0b2ec3304b621728a6e94efb15f738b96170a9 100644
--- a/dev/tools/Magento/Tools/Di/Code/Scanner/XmlScanner.php
+++ b/dev/tools/Magento/Tools/Di/Code/Scanner/XmlScanner.php
@@ -5,6 +5,8 @@
  */
 namespace Magento\Tools\Di\Code\Scanner;
 
+use Magento\Framework\ObjectManager\Code\Generator\Proxy as ProxyGenerator;
+
 class XmlScanner implements ScannerInterface
 {
     /**
@@ -57,10 +59,18 @@ class XmlScanner implements ScannerInterface
      */
     protected function _filterEntities(array $output)
     {
+        $entitySuffix = '\\' . ucfirst(ProxyGenerator::ENTITY_TYPE);
         $filteredEntities = [];
         foreach ($output as $className) {
-            $entityName = substr($className, -6) === '\Proxy' ? substr($className, 0, -6) : $className;
-            if (false === class_exists($className)) {
+            $entityName = substr($className, -strlen($entitySuffix)) === $entitySuffix
+                ? substr($className, 0, -strlen($entitySuffix))
+                : $className;
+            $isClassExists = false;
+            try {
+                $isClassExists = class_exists($className);
+            } catch (\Magento\Framework\Exception $e) {
+            }
+            if (false === $isClassExists) {
                 if (class_exists($entityName) || interface_exists($entityName)) {
                     array_push($filteredEntities, $className);
                 } else {
diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Scanner/PluginScannerTest.php b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Scanner/PluginScannerTest.php
index 5f1d6f4b093b8f5683a9ed17d4aecf012206b2c7..adc1ebf2eaa69c83ebad7a3bba9926d09141ac49 100644
--- a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Scanner/PluginScannerTest.php
+++ b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Scanner/PluginScannerTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Tools\Di\Test\Unit\Code\Scanner;
 
 class PluginScannerTest extends \PHPUnit_Framework_TestCase
@@ -25,7 +28,7 @@ class PluginScannerTest extends \PHPUnit_Framework_TestCase
     public function testCollectEntities()
     {
         $actual = $this->_model->collectEntities($this->_testFiles);
-        $expected = ['Magento\Framework\App\Cache\TagPlugin', 'Magento\Core\Model\Action\Plugin'];
+        $expected = ['Magento\Framework\App\Cache\TagPlugin', 'Magento\Store\Model\Action\Plugin'];
         $this->assertEquals($expected, $actual);
     }
 }
diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Scanner/XmlScannerTest.php b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Scanner/XmlScannerTest.php
index b0dde77698a5b0e25b62cea423d959f616735628..b1cd9b3dac280b565d3d152a5c49c2d9b9da1688 100644
--- a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Scanner/XmlScannerTest.php
+++ b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Scanner/XmlScannerTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Tools\Di\Test\Unit\Code\Scanner;
 
 class XmlScannerTest extends \PHPUnit_Framework_TestCase
@@ -37,7 +40,7 @@ class XmlScannerTest extends \PHPUnit_Framework_TestCase
 
     public function testCollectEntities()
     {
-        $className = 'Magento\Core\Model\Config\Invalidator\Proxy';
+        $className = 'Magento\Store\Model\Config\Invalidator\Proxy';
         $this->_logMock->expects(
             $this->at(0)
         )->method(
@@ -66,7 +69,7 @@ class XmlScannerTest extends \PHPUnit_Framework_TestCase
             'Invalid proxy class for ' . substr('\Magento\SomeModule\Model\Nested\Element\Proxy', 0, -5)
         );
         $actual = $this->_model->collectEntities($this->_testFiles);
-        $expected = ['Magento\Framework\App\Request\Http\Proxy'];
+        $expected = [];
         $this->assertEquals($expected, $actual);
     }
 }
diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/code/Magento/SomeModule/etc/di.xml b/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/code/Magento/SomeModule/etc/di.xml
index 9e27e302529b55ca1826e7021f752f59024902bb..5466e9a385bc24a8e1766bf54613aae8c10701c1 100644
--- a/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/code/Magento/SomeModule/etc/di.xml
+++ b/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/code/Magento/SomeModule/etc/di.xml
@@ -7,7 +7,7 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
     <preference for="Magento\Framework\App\RequestInterface" type="Magento\Framework\App\Request\Http\Proxy" />
-    <preference for="Magento\Core\Model\Config\InvalidatorInterface" type="Magento\Core\Model\Config\Invalidator\Proxy" />
+    <preference for="Magento\Store\Model\Config\InvalidatorInterface" type="Magento\Store\Model\Config\Invalidator\Proxy" />
     <preference for="Magento\Framework\App\CacheInterface" type="Magento\Framework\App\Cache\Proxy" />
     <virtualType name="custom_cache_instance" type="Magento\Framework\App\Cache">
         <plugin name="tag" type="Magento\Framework\App\Cache\TagPlugin" />
diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/etc/config.xml b/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/etc/config.xml
index 1a33cc70899009144bbab6efd95df5dd01f7b834..2197266b7f07fd276114725c09ba157f35d60c57 100644
--- a/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/etc/config.xml
+++ b/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/etc/config.xml
@@ -6,5 +6,5 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:noNamespaceSchemaLocation="../../../../../../../../../../../app/code/Magento/Core/etc/config.xsd">
+        xsi:noNamespaceSchemaLocation="../../../../../../../../../../../app/code/Magento/Store/etc/config.xsd">
 </config>
diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/etc/di/config.xml b/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/etc/di/config.xml
index 4661287ae38cb1271db8638c12366b57f3bd0919..8638b10700e02310375a9dc43efe0a89b50eb15d 100644
--- a/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/etc/di/config.xml
+++ b/dev/tools/Magento/Tools/Di/Test/Unit/_files/app/etc/di/config.xml
@@ -15,7 +15,7 @@
         <arguments>
             <argument name="layoutFactory" xsi:type="object">customLayoutFactory</argument>
         </arguments>
-        <plugin name="first" type="Magento\Core\Model\Action\Plugin" />
+        <plugin name="first" type="Magento\Store\Model\Action\Plugin" />
     </type>
     <virtualType name="customStoreManagerProxy" type="Magento\Store\Model\StoreManager\Proxy" />
     <virtualType name="customLayoutFactory" type="Magento\Framework\View\LayoutFactory" />
diff --git a/dev/tools/Magento/Tools/Di/compiler.php b/dev/tools/Magento/Tools/Di/compiler.php
index 8fb0cd5d24c18a29736cc083757ebaceb1c6b0cb..fee6aa1320565f3f45bb6247e184ff5a756ae24c 100644
--- a/dev/tools/Magento/Tools/Di/compiler.php
+++ b/dev/tools/Magento/Tools/Di/compiler.php
@@ -15,7 +15,8 @@ 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\ObjectExtensionInterface;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
 use Magento\Tools\Di\Code\Scanner;
 use Magento\Tools\Di\Compiler\Log\Log;
 use Magento\Tools\Di\Compiler\Log\Writer;
@@ -103,10 +104,16 @@ try {
             Repository::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Repository',
             Converter::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Converter',
             SearchResults::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\SearchResults',
-            ObjectExtensionInterface::ENTITY_TYPE =>
-                'Magento\Framework\Api\Code\Generator\ObjectExtensionInterface'
+            ExtensionAttributesInterfaceGenerator::ENTITY_TYPE =>
+                'Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator',
+            ExtensionAttributesGenerator::ENTITY_TYPE =>
+                'Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator'
         ]
     );
+    /** Initialize object manager for code generation based on configs */
+    $magentoObjectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER);
+    $objectManager = $magentoObjectManagerFactory->create($_SERVER);
+    $generator->setObjectManager($objectManager);
 
     $generatorAutoloader = new \Magento\Framework\Code\Generator\Autoloader($generator);
     spl_autoload_register([$generatorAutoloader, 'load']);
@@ -235,6 +242,17 @@ try {
     if ($log->hasError()) {
         exit(1);
     }
+
+    echo '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).' . "\n";
+    /** TODO: Temporary solution before having necessary changes on bamboo to overcome issue described above */
+    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($rootDir . '/var'));
+    foreach ($iterator as $item) {
+        chmod($item, 0777);
+    }
+
 } catch (Zend_Console_Getopt_Exception $e) {
     echo $e->getUsageMessage();
     echo 'Please, use quotes(") for wrapping strings.' . "\n";
diff --git a/dev/tools/Magento/Tools/Di/entity_generator.php b/dev/tools/Magento/Tools/Di/entity_generator.php
index 9a94fe29156e77c22335b424739a20c2862744f9..4ab81346a4e3b3b555936a9ed1136ea163e28fb8 100644
--- a/dev/tools/Magento/Tools/Di/entity_generator.php
+++ b/dev/tools/Magento/Tools/Di/entity_generator.php
@@ -16,7 +16,8 @@ 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\Api\Code\Generator\ObjectExtensionInterface;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
 
 require __DIR__ . '/../../../../../app/bootstrap.php';
 
@@ -70,7 +71,6 @@ try {
 //reinit generator with correct generation path
 $io = new Io(new File(), $generationDir);
 $generator = new Generator(
-    $validator,
     $io,
     [
         Proxy::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Proxy',
@@ -80,10 +80,15 @@ $generator = new Generator(
         Repository::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Repository',
         Converter::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Converter',
         SearchResults::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\SearchResults',
-        ObjectExtensionInterface::ENTITY_TYPE =>
-            'Magento\Framework\Api\Code\Generator\ObjectExtensionInterface'
+        ExtensionAttributesInterfaceGenerator::ENTITY_TYPE =>
+            'Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator',
+        ExtensionAttributesGenerator::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator'
     ]
 );
+/** Initialize object manager for code generation based on configs */
+$magentoObjectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER);
+$objectManager = $magentoObjectManagerFactory->create($_SERVER);
+$generator->setObjectManager($objectManager);
 
 try {
     if (Generator::GENERATION_SUCCESS == $generator->generateClass($className)) {
diff --git a/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php b/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php
index 16a5a652c611981b722644302fd253217a6c3533..404a302306fe58864f083c64881fac381253eeb4 100644
--- a/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php
+++ b/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php
@@ -123,19 +123,18 @@ return [
     'cms/page' => 'cms_page',
     'cms/page_store' => 'cms_page_store',
     'compiler/configuration' => 'compiler_configuration',
-    'core/cache' => 'core_cache',
-    'core/cache_tag' => 'core_cache_tag',
+    'core/cache' => 'cache',
+    'core/cache_tag' => 'cache_tag',
     'core/config_data' => 'core_config_data',
-    'core/config_field' => 'core_config_field',
     'core/design_change' => 'design_change',
     'core/directory_storage' => 'media_storage_directory_storage',
-    'core/email_template' => 'core_email_template',
+    'core/email_template' => 'email_template',
     'core/file_storage' => 'media_storage_file_storage',
-    'core/flag' => 'core_flag',
+    'core/flag' => 'flag',
     'core/layout_link' => 'layout_link',
     'core/layout_update' => 'layout_update',
     'core_resource' => 'setup_module',
-    'core/session' => 'core_session',
+    'core/session' => 'session',
     'core/store' => 'store',
     'core/store_group' => 'store_group',
     'core/variable' => 'variable',
diff --git a/dev/tools/Magento/Tools/View/Deployer.php b/dev/tools/Magento/Tools/View/Deployer.php
index fafd45319ff081370c89c805a89bcc870ca235b0..1549724017780a260891f4f386faf09962180a5d 100644
--- a/dev/tools/Magento/Tools/View/Deployer.php
+++ b/dev/tools/Magento/Tools/View/Deployer.php
@@ -10,6 +10,8 @@ use Magento\Framework\App\ObjectManagerFactory;
 use Magento\Framework\App\View\Deployment\Version;
 use Magento\Framework\App\View\Asset\Publisher;
 use Magento\Framework\App\Utility\Files;
+use Magento\Framework\ObjectManagerInterface;
+use Magento\Framework\Translate\Js\Config as JsTranslationConfig;
 
 /**
  * A service for deploying Magento static view files for production mode
@@ -57,12 +59,23 @@ class Deployer
     /** @var \Magento\Framework\View\Asset\MinifyService */
     protected $minifyService;
 
+    /**
+     * @var ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var JsTranslationConfig
+     */
+    protected $jsTranslationConfig;
+
     /**
      * @param Files $filesUtil
      * @param Deployer\Log $logger
      * @param Version\StorageInterface $versionStorage
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
      * @param \Magento\Framework\View\Asset\MinifyService $minifyService
+     * @param JsTranslationConfig $jsTranslationConfig
      * @param bool $isDryRun
      */
     public function __construct(
@@ -71,6 +84,7 @@ class Deployer
         Version\StorageInterface $versionStorage,
         \Magento\Framework\Stdlib\DateTime $dateTime,
         \Magento\Framework\View\Asset\MinifyService $minifyService,
+        JsTranslationConfig $jsTranslationConfig,
         $isDryRun = false
     ) {
         $this->filesUtil = $filesUtil;
@@ -79,6 +93,7 @@ class Deployer
         $this->dateTime = $dateTime;
         $this->isDryRun = $isDryRun;
         $this->minifyService = $minifyService;
+        $this->jsTranslationConfig = $jsTranslationConfig;
     }
 
     /**
@@ -87,6 +102,7 @@ class Deployer
      * @param ObjectManagerFactory $omFactory
      * @param array $locales
      * @return void
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
     public function deploy(ObjectManagerFactory $omFactory, array $locales)
     {
@@ -101,6 +117,7 @@ class Deployer
         foreach ($areas as $area => $themes) {
             $this->emulateApplicationArea($area);
             foreach ($locales as $locale) {
+                $this->emulateApplicationLocale($locale, $area);
                 foreach ($themes as $themePath) {
                     $this->logger->logMessage("=== {$area} -> {$themePath} -> {$locale} ===");
                     $this->count = 0;
@@ -112,6 +129,15 @@ class Deployer
                     foreach ($libFiles as $filePath) {
                         $this->deployFile($filePath, $area, $themePath, $locale, null);
                     }
+                    if ($this->jsTranslationConfig->dictionaryEnabled()) {
+                        $this->deployFile(
+                            $this->jsTranslationConfig->getDictionaryFileName(),
+                            $area,
+                            $themePath,
+                            $locale,
+                            null
+                        );
+                    }
                     $this->bundleManager->flush();
                     $this->logger->logMessage("\nSuccessful: {$this->count} files; errors: {$this->errorCount}\n---\n");
                 }
@@ -176,19 +202,36 @@ class Deployer
      */
     private function emulateApplicationArea($areaCode)
     {
-        $objectManager = $this->omFactory->create(
+        $this->objectManager = $this->omFactory->create(
             [\Magento\Framework\App\State::PARAM_MODE => \Magento\Framework\App\State::MODE_DEFAULT]
         );
         /** @var \Magento\Framework\App\State $appState */
-        $appState = $objectManager->get('Magento\Framework\App\State');
+        $appState = $this->objectManager->get('Magento\Framework\App\State');
         $appState->setAreaCode($areaCode);
         /** @var \Magento\Framework\App\ObjectManager\ConfigLoader $configLoader */
-        $configLoader = $objectManager->get('Magento\Framework\App\ObjectManager\ConfigLoader');
-        $objectManager->configure($configLoader->load($areaCode));
-        $this->assetRepo = $objectManager->get('Magento\Framework\View\Asset\Repository');
-        $this->assetPublisher = $objectManager->create('Magento\Framework\App\View\Asset\Publisher');
-        $this->htmlMinifier = $objectManager->get('Magento\Framework\View\Template\Html\MinifierInterface');
-        $this->bundleManager = $objectManager->get('Magento\Framework\View\Asset\Bundle\Manager');
+        $configLoader = $this->objectManager->get('Magento\Framework\App\ObjectManager\ConfigLoader');
+        $this->objectManager->configure($configLoader->load($areaCode));
+        $this->assetRepo = $this->objectManager->get('Magento\Framework\View\Asset\Repository');
+
+        $this->assetPublisher = $this->objectManager->create('Magento\Framework\App\View\Asset\Publisher');
+        $this->htmlMinifier = $this->objectManager->get('Magento\Framework\View\Template\Html\MinifierInterface');
+        $this->bundleManager = $this->objectManager->get('Magento\Framework\View\Asset\Bundle\Manager');
+
+    }
+
+    /**
+     * Set application locale and load translation for area
+     *
+     * @param string $locale
+     * @param string $area
+     * @return void
+     */
+    protected function emulateApplicationLocale($locale, $area)
+    {
+        /** @var \Magento\Framework\TranslateInterface $translator */
+        $translator = $this->objectManager->get('Magento\Framework\TranslateInterface');
+        $translator->setLocale($locale);
+        $translator->loadData($area, true);
     }
 
     /**
diff --git a/lib/internal/Magento/Framework/Api/AbstractExtensibleObject.php b/lib/internal/Magento/Framework/Api/AbstractExtensibleObject.php
index 0eb68d88fb4d0417bd91b40b5a41b01cd9c2cd8a..6455c7ca7f2cb2c9f3056910c1a594e5b95519aa 100644
--- a/lib/internal/Magento/Framework/Api/AbstractExtensibleObject.php
+++ b/lib/internal/Magento/Framework/Api/AbstractExtensibleObject.php
@@ -10,8 +10,9 @@ use \Magento\Framework\Api\AttributeValueFactory;
 /**
  * Base Class for extensible data Objects
  * @SuppressWarnings(PHPMD.NumberOfChildren)
+ * TODO: This class can be split into Custom attribute and Extension attribute implementation classes
  */
-abstract class AbstractExtensibleObject extends AbstractSimpleObject implements ExtensibleDataInterface
+abstract class AbstractExtensibleObject extends AbstractSimpleObject implements CustomAttributesDataInterface
 {
     /**
      * Array key for custom attributes
@@ -19,14 +20,14 @@ abstract class AbstractExtensibleObject extends AbstractSimpleObject implements
     const CUSTOM_ATTRIBUTES_KEY = 'custom_attributes';
 
     /**
-     * @var AttributeValueFactory
+     * @var \Magento\Framework\Api\ExtensionAttributesFactory
      */
-    protected $attributeValueFactory;
+    protected $extensionFactory;
 
     /**
-     * @var MetadataServiceInterface
+     * @var AttributeValueFactory
      */
-    protected $metadataService;
+    protected $attributeValueFactory;
 
     /**
      * @var string[]
@@ -36,16 +37,16 @@ abstract class AbstractExtensibleObject extends AbstractSimpleObject implements
     /**
      * Initialize internal storage
      *
-     * @param MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $attributeValueFactory
      * @param array $data
      */
     public function __construct(
-        MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $attributeValueFactory,
         $data = []
     ) {
-        $this->metadataService = $metadataService;
+        $this->extensionFactory = $extensionFactory;
         $this->attributeValueFactory = $attributeValueFactory;
         parent::__construct($data);
     }
@@ -118,23 +119,57 @@ abstract class AbstractExtensibleObject extends AbstractSimpleObject implements
     }
 
     /**
+     * Get a list of custom attribute codes.
+     *
+     * By default, entity can be extended only using extension attributes functionality.
      *
      * @return string[]
      */
     protected function getCustomAttributesCodes()
     {
-        if (!is_null($this->customAttributesCodes)) {
-            return $this->customAttributesCodes;
-        }
+        return isset($this->customAttributesCodes) ? $this->customAttributesCodes : [];
+    }
+
+    /**
+     * Receive a list of EAV attributes using provided metadata service.
+     *
+     * Can be used in child classes, which represent EAV entities.
+     *
+     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @return string[]
+     */
+    protected function getEavAttributesCodes(\Magento\Framework\Api\MetadataServiceInterface $metadataService)
+    {
         $attributeCodes = [];
-        $customAttributesMetadata = $this->metadataService->getCustomAttributesMetadata(get_class($this));
+        $customAttributesMetadata = $metadataService->getCustomAttributesMetadata(get_class($this));
         if (is_array($customAttributesMetadata)) {
             /** @var $attribute \Magento\Framework\Api\MetadataObjectInterface */
             foreach ($customAttributesMetadata as $attribute) {
                 $attributeCodes[] = $attribute->getAttributeCode();
             }
         }
-        $this->customAttributesCodes = $attributeCodes;
         return $attributeCodes;
     }
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Framework\Api\ExtensionAttributesInterface
+     */
+    protected function _getExtensionAttributes()
+    {
+        return $this->_get(self::EXTENSION_ATTRIBUTES_KEY);
+    }
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Framework\Api\ExtensionAttributesInterface $extensionAttributes
+     * @return $this
+     */
+    protected function _setExtensionAttributes(\Magento\Framework\Api\ExtensionAttributesInterface $extensionAttributes)
+    {
+        $this->_data[self::EXTENSION_ATTRIBUTES_KEY] = $extensionAttributes;
+        return $this;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Api/Code/Generator/ObjectExtension.php b/lib/internal/Magento/Framework/Api/Code/Generator/ExtensionAttributesGenerator.php
similarity index 72%
rename from lib/internal/Magento/Framework/Api/Code/Generator/ObjectExtension.php
rename to lib/internal/Magento/Framework/Api/Code/Generator/ExtensionAttributesGenerator.php
index 28569195579c975131e800fe687ac45dfa88cb12..98f5dc5d5e07250fe7b427ca68286cb99c22ee35 100644
--- a/lib/internal/Magento/Framework/Api/Code/Generator/ObjectExtension.php
+++ b/lib/internal/Magento/Framework/Api/Code/Generator/ExtensionAttributesGenerator.php
@@ -12,7 +12,7 @@ use Magento\Framework\Api\SimpleDataObjectConverter;
 /**
  * Code generator for data object extensions.
  */
-class ObjectExtension extends \Magento\Framework\Code\Generator\EntityAbstract
+class ExtensionAttributesGenerator extends \Magento\Framework\Code\Generator\EntityAbstract
 {
     const ENTITY_TYPE = 'extension';
 
@@ -70,16 +70,7 @@ class ObjectExtension extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getClassProperties()
     {
-        $properties = [];
-        foreach ($this->getCustomAttributes() as $attributeName => $attributeType) {
-            $propertyName = SimpleDataObjectConverter::snakeCaseToCamelCase($attributeName);
-            $properties[] = [
-                'name' => $propertyName,
-                'visibility' => 'protected',
-                'docblock' => ['tags' => [['name' => 'var', 'description' => $attributeType]]],
-            ];
-        }
-        return $properties;
+        return [];
     }
 
     /**
@@ -94,13 +85,13 @@ class ObjectExtension extends \Magento\Framework\Code\Generator\EntityAbstract
             $setterName = 'set' . ucfirst($propertyName);
             $methods[] = [
                 'name' => $getterName,
-                'body' => "return \$this->{$propertyName};",
+                'body' => "return \$this->_get('{$attributeName}');",
                 'docblock' => ['tags' => [['name' => 'return', 'description' => $attributeType]]],
             ];
             $methods[] = [
                 'name' => $setterName,
                 'parameters' => [['name' => $propertyName]],
-                'body' => "\$this->{$propertyName} = \${$propertyName};" . PHP_EOL . "return \$this;",
+                'body' => "\$this->setData('{$attributeName}', \${$propertyName});" . PHP_EOL . "return \$this;",
                 'docblock' => [
                     'tags' => [
                         [
@@ -123,18 +114,8 @@ class ObjectExtension extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _validateData()
     {
-        $result = true;
-        $sourceClassName = $this->_getSourceClassName();
-        $resultClassName = $this->_getResultClassName();
-        $interfaceSuffix = 'Interface';
-        $expectedResultClassName = substr($sourceClassName, 0, -strlen($interfaceSuffix)) . self::EXTENSION_SUFFIX;
-        if ($resultClassName !== $expectedResultClassName) {
-            $this->_addError(
-                'Invalid extension name [' . $resultClassName . ']. Use ' . $expectedResultClassName
-            );
-            $result = false;
-        }
-        return parent::_validateData() && $result;
+        $classNameValidationResults = $this->validateResultClassName();
+        return parent::_validateData() && $classNameValidationResults;
     }
 
     /**
@@ -143,9 +124,20 @@ class ObjectExtension extends \Magento\Framework\Code\Generator\EntityAbstract
     protected function _generateCode()
     {
         $this->_classGenerator->setImplementedInterfaces([$this->_getResultClassName() . 'Interface']);
+        $this->_classGenerator->setExtendedClass($this->getExtendedClass());
         return parent::_generateCode();
     }
 
+    /**
+     * Get class, which should be used as a parent for generated class.
+     *
+     * @return string
+     */
+    protected function getExtendedClass()
+    {
+        return '\Magento\Framework\Api\AbstractSimpleObject';
+    }
+
     /**
      * Retrieve a list of attributes associated with current source class.
      *
@@ -156,11 +148,40 @@ class ObjectExtension extends \Magento\Framework\Code\Generator\EntityAbstract
         if (!isset($this->allCustomAttributes)) {
             $this->allCustomAttributes = $this->configReader->read();
         }
-        $dataInterface = ltrim($this->_getSourceClassName(), '\\');
+        $dataInterface = ltrim($this->getSourceClassName(), '\\');
         if (isset($this->allCustomAttributes[$dataInterface])) {
+            foreach ($this->allCustomAttributes[$dataInterface] as $attributeName => $attributeType) {
+                if (strpos($attributeType, '\\') !== false) {
+                    /** Add preceding slash to class names, while leaving primitive types as is */
+                    $attributeType = $this->_getFullyQualifiedClassName($attributeType);
+                    $this->allCustomAttributes[$dataInterface][$attributeName] =
+                        $this->_getFullyQualifiedClassName($attributeType);
+                }
+            }
             return $this->allCustomAttributes[$dataInterface];
         } else {
             return [];
         }
     }
+
+    /**
+     * Ensure that result class name corresponds to the source class name.
+     *
+     * @return bool
+     */
+    protected function validateResultClassName()
+    {
+        $result = true;
+        $sourceClassName = $this->getSourceClassName();
+        $resultClassName = $this->_getResultClassName();
+        $interfaceSuffix = 'Interface';
+        $expectedResultClassName = substr($sourceClassName, 0, -strlen($interfaceSuffix)) . self::EXTENSION_SUFFIX;
+        if ($resultClassName !== $expectedResultClassName) {
+            $this->_addError(
+                'Invalid extension name [' . $resultClassName . ']. Use ' . $expectedResultClassName
+            );
+            $result = false;
+        }
+        return $result;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Api/Code/Generator/ObjectExtensionInterface.php b/lib/internal/Magento/Framework/Api/Code/Generator/ExtensionAttributesInterfaceGenerator.php
similarity index 83%
rename from lib/internal/Magento/Framework/Api/Code/Generator/ObjectExtensionInterface.php
rename to lib/internal/Magento/Framework/Api/Code/Generator/ExtensionAttributesInterfaceGenerator.php
index 73fb6556c2c0191a28b4c94e6f99f4754a631e55..59b6f225bb6c1d84acdfb20d96880980712b1bd2 100644
--- a/lib/internal/Magento/Framework/Api/Code/Generator/ObjectExtensionInterface.php
+++ b/lib/internal/Magento/Framework/Api/Code/Generator/ExtensionAttributesInterfaceGenerator.php
@@ -11,7 +11,7 @@ use Magento\Framework\Code\Generator\Io;
 /**
  * Code generator for data object extension interfaces.
  */
-class ObjectExtensionInterface extends \Magento\Framework\Api\Code\Generator\ObjectExtension
+class ExtensionAttributesInterfaceGenerator extends \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator
 {
     const ENTITY_TYPE = 'extensionInterface';
 
@@ -51,10 +51,18 @@ class ObjectExtensionInterface extends \Magento\Framework\Api\Code\Generator\Obj
     /**
      * {@inheritdoc}
      */
-    protected function _validateData()
+    protected function getExtendedClass()
+    {
+        return '\Magento\Framework\Api\ExtensionAttributesInterface';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function validateResultClassName()
     {
         $result = true;
-        $sourceClassName = $this->_getSourceClassName();
+        $sourceClassName = $this->getSourceClassName();
         $resultClassName = $this->_getResultClassName();
         $interfaceSuffix = 'Interface';
         $expectedResultClassName = substr($sourceClassName, 0, -strlen($interfaceSuffix))
@@ -65,6 +73,6 @@ class ObjectExtensionInterface extends \Magento\Framework\Api\Code\Generator\Obj
             );
             $result = false;
         }
-        return parent::_validateData() && $result;
+        return $result;
     }
 }
diff --git a/lib/internal/Magento/Framework/Api/Code/Generator/Mapper.php b/lib/internal/Magento/Framework/Api/Code/Generator/Mapper.php
index 64d511448c03ff46aa1404b0d598721075c35f85..edd460f42bfd9deb68128a99da7f76353f290d68 100644
--- a/lib/internal/Magento/Framework/Api/Code/Generator/Mapper.php
+++ b/lib/internal/Magento/Framework/Api/Code/Generator/Mapper.php
@@ -31,7 +31,7 @@ class Mapper extends \Magento\Framework\Code\Generator\EntityAbstract
                     'tags' => [
                         [
                             'name' => 'var',
-                            'description' => $this->_getSourceClassName() . 'Builder',
+                            'description' => $this->getSourceClassName() . 'Builder',
                         ],
                     ],
                 ],
@@ -41,7 +41,7 @@ class Mapper extends \Magento\Framework\Code\Generator\EntityAbstract
                 'visibility' => 'protected',
                 'defaultValue' => [],
                 'docblock' => [
-                    'shortDescription' => $this->_getSourceClassName() . '[]',
+                    'shortDescription' => $this->getSourceClassName() . '[]',
                     'tags' => [['name' => 'var', 'description' => 'array']],
                 ]
             ],
@@ -56,8 +56,7 @@ class Mapper extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getSourceBuilderPropertyName()
     {
-        $parts = explode('\\', ltrim($this->_getSourceClassName(), '\\'));
-        return lcfirst(end($parts)) . 'Builder';
+        return lcfirst($this->getSourceClassNameWithoutNamespace()) . 'Builder';
     }
 
     /**
@@ -72,7 +71,7 @@ class Mapper extends \Magento\Framework\Code\Generator\EntityAbstract
             'parameters' => [
                 [
                     'name' => $this->_getSourceBuilderPropertyName(),
-                    'type' => $this->_getSourceClassName() . 'Builder',
+                    'type' => $this->getSourceClassName() . 'Builder',
                 ],
             ],
             'body' => "\$this->"
@@ -83,7 +82,7 @@ class Mapper extends \Magento\Framework\Code\Generator\EntityAbstract
                 'tags' => [
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . " \$" . $this->_getSourceBuilderPropertyName(),
+                        'description' => $this->getSourceClassName() . " \$" . $this->_getSourceBuilderPropertyName(),
                     ],
                 ],
             ]
@@ -118,7 +117,7 @@ class Mapper extends \Magento\Framework\Code\Generator\EntityAbstract
                     ],
                     [
                         'name' => 'return',
-                        'description' => $this->_getSourceClassName(),
+                        'description' => $this->getSourceClassName(),
                     ],
                 ],
             ],
@@ -134,7 +133,7 @@ class Mapper extends \Magento\Framework\Code\Generator\EntityAbstract
         $result = parent::_validateData();
 
         if ($result) {
-            $sourceClassName = $this->_getSourceClassName();
+            $sourceClassName = $this->getSourceClassName();
             $resultClassName = $this->_getResultClassName();
 
             if ($resultClassName !== $sourceClassName . 'Mapper') {
diff --git a/lib/internal/Magento/Framework/Api/Code/Generator/SearchResults.php b/lib/internal/Magento/Framework/Api/Code/Generator/SearchResults.php
index c1613b0628dc93bcc9334438f45f47952521996c..32a4071ebf0c7aaa15f45c2a6cf966c91313472c 100644
--- a/lib/internal/Magento/Framework/Api/Code/Generator/SearchResults.php
+++ b/lib/internal/Magento/Framework/Api/Code/Generator/SearchResults.php
@@ -51,7 +51,7 @@ class SearchResults extends EntityAbstract
                 'tags' => [
                     [
                         'name' => 'return',
-                        'description' => $this->_getSourceClassName() . '[]',
+                        'description' => $this->getSourceClassName() . '[]',
                     ],
                 ],
             ],
diff --git a/lib/internal/Magento/Framework/Api/Config/MetadataConfig.php b/lib/internal/Magento/Framework/Api/Config/MetadataConfig.php
deleted file mode 100644
index 9bfb2eb651cdd0a0ec8c4ed6b806c9a1c7a1940e..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Api/Config/MetadataConfig.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Framework\Api\Config;
-
-use Magento\Framework\Api\ObjectFactory;
-use Magento\Framework\Api\Config\Reader as ServiceConfigReader;
-use Magento\Framework\Api\MetadataServiceInterface;
-
-/**
- * Class which allows to get a metadata of the attributes declared in a config.
- */
-class MetadataConfig implements MetadataServiceInterface
-{
-    /**
-     * @var ServiceConfigReader
-     */
-    private $serviceConfigReader;
-
-    /**
-     * @var ObjectFactory
-     */
-    private $objectFactory;
-
-    /**
-     * @var array
-     */
-    private $allAttributes = [];
-
-    /**
-     * Initialize dependencies.
-     *
-     * @param ServiceConfigReader $serviceConfigReader
-     * @param ObjectFactory $objectFactory
-     */
-    public function __construct(
-        ServiceConfigReader $serviceConfigReader,
-        ObjectFactory $objectFactory
-    ) {
-        $this->serviceConfigReader = $serviceConfigReader;
-        $this->objectFactory = $objectFactory;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getCustomAttributesMetadata($dataObjectClassName = null)
-    {
-        $attributes = [];
-        if (!is_null($this->objectFactory) && !is_null($dataObjectClassName)) {
-            /**
-             * Attribute metadata builder and data object class name are expected to be configured
-             * via DI using virtual types. If configuration is missing, empty array should be returned.
-             */
-            $attributes = $this->getAttributesMetadata($dataObjectClassName);
-            $implementedInterfaces = (new \ReflectionClass($dataObjectClassName))->getInterfaceNames();
-            foreach ($implementedInterfaces as $interfaceName) {
-                $attributes = array_merge($attributes, $this->getAttributesMetadata($interfaceName));
-            }
-        }
-        return $attributes;
-    }
-
-    /**
-     * Get custom attribute metadata for the given class/interface.
-     *
-     * @param string $dataObjectClassName
-     * @return \Magento\Framework\Api\MetadataObjectInterface[]
-     */
-    protected function getAttributesMetadata($dataObjectClassName)
-    {
-        $attributes = [];
-        if (empty($this->allAttributes)) {
-            $this->allAttributes = $this->serviceConfigReader->read();
-        }
-        $dataObjectClassName = ltrim($dataObjectClassName, '\\');
-        if (isset($this->allAttributes[$dataObjectClassName])
-            && is_array($this->allAttributes[$dataObjectClassName])
-        ) {
-            $attributeCodes = array_keys($this->allAttributes[$dataObjectClassName]);
-            foreach ($attributeCodes as $attributeCode) {
-                $attributes[$attributeCode] = $this->objectFactory
-                    ->create('\Magento\Framework\Api\MetadataObjectInterface', [])
-                    ->setAttributeCode($attributeCode);
-            }
-        }
-        return $attributes;
-    }
-}
diff --git a/lib/internal/Magento/Framework/Api/CustomAttributesDataInterface.php b/lib/internal/Magento/Framework/Api/CustomAttributesDataInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..239066d34c0f9515b83a771f2d4711620e0309c6
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/CustomAttributesDataInterface.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Api;
+
+/**
+ * Interface for entities which can be extended with custom attributes.
+ */
+interface CustomAttributesDataInterface extends ExtensibleDataInterface
+{
+    /**
+     * Array key for custom attributes
+     */
+    const CUSTOM_ATTRIBUTES = 'custom_attributes';
+
+    /**
+     * Get an attribute value.
+     *
+     * @param string $attributeCode
+     * @return \Magento\Framework\Api\AttributeInterface|null
+     */
+    public function getCustomAttribute($attributeCode);
+
+    /**
+     * Set an attribute value for a given attribute code
+     *
+     * @param string $attributeCode
+     * @param mixed $attributeValue
+     * @return $this
+     */
+    public function setCustomAttribute($attributeCode, $attributeValue);
+
+    /**
+     * Retrieve custom attributes values.
+     *
+     * @return \Magento\Framework\Api\AttributeInterface[]|null
+     */
+    public function getCustomAttributes();
+
+    /**
+     * Set array of custom attributes
+     *
+     * @param \Magento\Framework\Api\AttributeInterface[] $attributes
+     * @return $this
+     * @throws \LogicException
+     */
+    public function setCustomAttributes(array $attributes);
+}
diff --git a/lib/internal/Magento/Framework/Api/DataObjectHelper.php b/lib/internal/Magento/Framework/Api/DataObjectHelper.php
index 61d813a261d55ed5ef9e15211fcceb6e8d17de93..f7d16e57321607846234dcda516586e873ad75c2 100644
--- a/lib/internal/Magento/Framework/Api/DataObjectHelper.php
+++ b/lib/internal/Magento/Framework/Api/DataObjectHelper.php
@@ -23,19 +23,27 @@ class DataObjectHelper
      */
     protected $typeProcessor;
 
+    /**
+     * @var \Magento\Framework\Api\ExtensionAttributesFactory
+     */
+    protected $extensionFactory;
+
     /**
      * @param ObjectFactory $objectFactory
      * @param \Magento\Framework\Reflection\DataObjectProcessor $objectProcessor
      * @param \Magento\Framework\Reflection\TypeProcessor $typeProcessor
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      */
     public function __construct(
         ObjectFactory $objectFactory,
         \Magento\Framework\Reflection\DataObjectProcessor $objectProcessor,
-        \Magento\Framework\Reflection\TypeProcessor $typeProcessor
+        \Magento\Framework\Reflection\TypeProcessor $typeProcessor,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
     ) {
         $this->objectFactory = $objectFactory;
         $this->objectProcessor = $objectProcessor;
         $this->typeProcessor = $typeProcessor;
+        $this->extensionFactory = $extensionFactory;
     }
 
     /**
@@ -69,7 +77,7 @@ class DataObjectHelper
                 'set' . $camelCaseKey,
                 'setIs' . $camelCaseKey,
             ];
-            if ($key === ExtensibleDataInterface::CUSTOM_ATTRIBUTES
+            if ($key === CustomAttributesDataInterface::CUSTOM_ATTRIBUTES
                 && ($dataObject instanceof ExtensibleDataInterface)
                 && is_array($data[$key])
                 && !empty($data[$key])
@@ -83,7 +91,11 @@ class DataObjectHelper
             } elseif ($methodNames = array_intersect($possibleMethods, $dataObjectMethods)) {
                 $methodName = array_values($methodNames)[0];
                 if (!is_array($value)) {
-                    $dataObject->$methodName($value);
+                    if ($methodName === 'setExtensionAttributes' && is_null($value)) {
+                        // Cannot pass a null value to a method with a typed parameter
+                    } else {
+                        $dataObject->$methodName($value);
+                    }
                 } else {
                     $getterMethodName = 'get' . $camelCaseKey;
                     $this->setComplexValue($dataObject, $getterMethodName, $methodName, $value, $interfaceName);
@@ -137,6 +149,8 @@ class DataObjectHelper
         if (is_subclass_of($returnType, '\Magento\Framework\Api\ExtensibleDataInterface')) {
             $object = $this->objectFactory->create($returnType, []);
             $this->populateWithArray($object, $value, $returnType);
+        } else if (is_subclass_of($returnType, '\Magento\Framework\Api\ExtensionAttributesInterface')) {
+            $object = $this->extensionFactory->create(get_class($dataObject), $value);
         } else {
             $object = $this->objectFactory->create($returnType, $value);
         }
diff --git a/lib/internal/Magento/Framework/Api/DefaultMetadataService.php b/lib/internal/Magento/Framework/Api/DefaultMetadataService.php
new file mode 100644
index 0000000000000000000000000000000000000000..5a5d2e6a9e23365ad3f59c3ee9995e7269dbf2f9
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/DefaultMetadataService.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Api;
+
+/**
+ * Default implementation of metadata service, which does not return any real attributes.
+ */
+class DefaultMetadataService implements MetadataServiceInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getCustomAttributesMetadata($dataObjectClassName = null)
+    {
+        return [];
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/ExtensibleDataInterface.php b/lib/internal/Magento/Framework/Api/ExtensibleDataInterface.php
index ba6efb39290912c10079cf2d9a3cb0bc83339f4c..6dd8f258b4db78768cf90ca0b9fd182d33f47587 100644
--- a/lib/internal/Magento/Framework/Api/ExtensibleDataInterface.php
+++ b/lib/internal/Magento/Framework/Api/ExtensibleDataInterface.php
@@ -7,45 +7,12 @@
 namespace Magento\Framework\Api;
 
 /**
- * Interface for entities which can be extended with custom attributes.
+ * Interface for entities which can be extended with extension attributes.
  */
 interface ExtensibleDataInterface
 {
     /**
-     * Array key for custom attributes
+     * Key for extension attributes object
      */
-    const CUSTOM_ATTRIBUTES = 'custom_attributes';
-
-    /**
-     * Get an attribute value.
-     *
-     * @param string $attributeCode
-     * @return \Magento\Framework\Api\AttributeInterface|null
-     */
-    public function getCustomAttribute($attributeCode);
-
-    /**
-     * Set an attribute value for a given attribute code
-     *
-     * @param string $attributeCode
-     * @param mixed $attributeValue
-     * @return $this
-     */
-    public function setCustomAttribute($attributeCode, $attributeValue);
-
-    /**
-     * Retrieve custom attributes values.
-     *
-     * @return \Magento\Framework\Api\AttributeInterface[]|null
-     */
-    public function getCustomAttributes();
-
-    /**
-     * Set array of custom attributes
-     *
-     * @param \Magento\Framework\Api\AttributeInterface[] $attributes
-     * @return $this
-     * @throws \LogicException
-     */
-    public function setCustomAttributes(array $attributes);
+    const EXTENSION_ATTRIBUTES_KEY = 'extension_attributes';
 }
diff --git a/lib/internal/Magento/Framework/Api/ExtensibleDataObjectConverter.php b/lib/internal/Magento/Framework/Api/ExtensibleDataObjectConverter.php
index 22cad52d286c54b40ee7c5546e49990d0772a0c6..2ad42cac8b20c4a49347928a84811aa788797c90 100644
--- a/lib/internal/Magento/Framework/Api/ExtensibleDataObjectConverter.php
+++ b/lib/internal/Magento/Framework/Api/ExtensibleDataObjectConverter.php
@@ -31,13 +31,13 @@ class ExtensibleDataObjectConverter
      * Convert AbstractExtensibleObject into a nested array.
      *
      * @param ExtensibleDataInterface $dataObject
-     * @param string[] $skipCustomAttributes
+     * @param string[] $skipAttributes
      * @param string $dataObjectType
      * @return array
      */
     public function toNestedArray(
         ExtensibleDataInterface $dataObject,
-        $skipCustomAttributes = [],
+        $skipAttributes = [],
         $dataObjectType = null
     ) {
         if ($dataObjectType == null) {
@@ -50,12 +50,22 @@ class ExtensibleDataObjectConverter
             $customAttributes = $dataObjectArray[AbstractExtensibleObject::CUSTOM_ATTRIBUTES_KEY];
             unset ($dataObjectArray[AbstractExtensibleObject::CUSTOM_ATTRIBUTES_KEY]);
             foreach ($customAttributes as $attributeValue) {
-                if (!in_array($attributeValue[AttributeValue::ATTRIBUTE_CODE], $skipCustomAttributes)) {
+                if (!in_array($attributeValue[AttributeValue::ATTRIBUTE_CODE], $skipAttributes)) {
                     $dataObjectArray[$attributeValue[AttributeValue::ATTRIBUTE_CODE]]
                         = $attributeValue[AttributeValue::VALUE];
                 }
             }
         }
+        if (!empty($dataObjectArray[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY])) {
+            /** @var array $extensionAttributes */
+            $extensionAttributes = $dataObjectArray[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY];
+            unset ($dataObjectArray[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]);
+            foreach ($extensionAttributes as $attributeKey => $attributeValue) {
+                if (!in_array($attributeKey, $skipAttributes)) {
+                    $dataObjectArray[$attributeKey] = $attributeValue;
+                }
+            }
+        }
         return $dataObjectArray;
     }
 
diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php b/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..e50b83d11c7a95758ed9d8f07a4231419018e43a
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Api;
+
+/**
+ * Factory class for instantiation of extension attributes objects.
+ */
+class ExtensionAttributesFactory
+{
+    /**
+     * Object Manager instance
+     *
+     * @var \Magento\Framework\ObjectManagerInterface
+     */
+    protected $_objectManager = null;
+
+    /**
+     * Factory constructor
+     *
+     * @param \Magento\Framework\ObjectManagerInterface $objectManager
+     */
+    public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager)
+    {
+        $this->_objectManager = $objectManager;
+    }
+
+    /**
+     * Create extension attributes object, custom for each extensible class.
+     *
+     * @param string $extensibleClassName
+     * @param array $data
+     * @return object
+     */
+    public function create($extensibleClassName, $data = [])
+    {
+        $modelReflection = new \ReflectionClass($extensibleClassName);
+
+        $implementsExtensibleInterface = false;
+        $extensibleInterfaceName = 'Magento\Framework\Api\ExtensibleDataInterface';
+        foreach ($modelReflection->getInterfaces() as $interfaceReflection) {
+            if ($interfaceReflection->isSubclassOf($extensibleInterfaceName)
+                && $interfaceReflection->hasMethod('getExtensionAttributes')
+            ) {
+                $implementsExtensibleInterface = true;
+                break;
+            }
+        }
+        if (!$implementsExtensibleInterface) {
+            throw new \LogicException(
+                "Class '{$extensibleClassName}' must implement an interface, "
+                . "which extends from 'Magento\\Framework\\Api\\ExtensibleDataInterface'"
+            );
+        }
+
+        $methodReflection = $interfaceReflection->getMethod('getExtensionAttributes');
+        if ($methodReflection->getDeclaringClass() == $extensibleInterfaceName) {
+            throw new \LogicException(
+                "Method 'getExtensionAttributes' must be overridden in the interfaces "
+                . "which extend 'Magento\\Framework\\Api\\ExtensibleDataInterface'. "
+                . "Concrete return type should be specified."
+            );
+        }
+
+        $interfaceName = '\\' . $interfaceReflection->getName();
+        $extensionClassName = substr($interfaceName, 0, -strlen('Interface')) . 'Extension';
+        $extensionInterfaceName = $extensionClassName . 'Interface';
+
+        /** Ensure that proper return type of getExtensionAttributes() method is specified */
+        $methodDocBlock = $methodReflection->getDocComment();
+        $pattern = "/@return\s+" . str_replace('\\', '\\\\', $extensionInterfaceName) . "/";
+        if (!preg_match($pattern, $methodDocBlock)) {
+            throw new \LogicException(
+                "Method 'getExtensionAttributes' must be overridden in the interfaces "
+                . "which extend 'Magento\\Framework\\Api\\ExtensibleDataInterface'. "
+                . "Concrete return type must be specified. Please fix :" . $interfaceName
+            );
+        }
+
+        $extensionFactoryName = $extensionClassName . 'Factory';
+        $extensionFactory = $this->_objectManager->create($extensionFactoryName);
+        return $extensionFactory->create($data);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttributesInterface.php b/lib/internal/Magento/Framework/Api/ExtensionAttributesInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..aef1607c31dae9747711da2459a0fffabf4028c8
--- /dev/null
+++ b/lib/internal/Magento/Framework/Api/ExtensionAttributesInterface.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Api;
+
+/**
+ * Marker interface for all extension attributes interfaces.
+ */
+interface ExtensionAttributesInterface
+{
+}
diff --git a/lib/internal/Magento/Framework/Api/Filter.php b/lib/internal/Magento/Framework/Api/Filter.php
index e86ea49047d0ea34e29903f125edc4cf2474e3ed..b803e5fe926241667b8e1ae04969b6bc36e8fb23 100644
--- a/lib/internal/Magento/Framework/Api/Filter.php
+++ b/lib/internal/Magento/Framework/Api/Filter.php
@@ -6,11 +6,13 @@
 
 namespace Magento\Framework\Api;
 
+use Magento\Framework\Api\AbstractSimpleObject;
+
 /**
  * Filter which can be used by any methods from service layer.
  * @codeCoverageIgnore
  */
-class Filter extends AbstractExtensibleObject
+class Filter extends AbstractSimpleObject
 {
     /**#@+
      * Constants for Data Object keys
diff --git a/lib/internal/Magento/Framework/Api/Search/FilterGroup.php b/lib/internal/Magento/Framework/Api/Search/FilterGroup.php
index 860c36710ad0d9051f9ea6b02244abcbce785663..ae1dd308b647b51505a176987ec1ba8d2b6363c2 100644
--- a/lib/internal/Magento/Framework/Api/Search/FilterGroup.php
+++ b/lib/internal/Magento/Framework/Api/Search/FilterGroup.php
@@ -6,12 +6,12 @@
 
 namespace Magento\Framework\Api\Search;
 
-use Magento\Framework\Api\AbstractExtensibleObject;
+use Magento\Framework\Api\AbstractSimpleObject;
 
 /**
  * Groups two or more filters together using a logical OR
  */
-class FilterGroup extends AbstractExtensibleObject
+class FilterGroup extends AbstractSimpleObject
 {
     const FILTERS = 'filters';
 
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria.php b/lib/internal/Magento/Framework/Api/SearchCriteria.php
index a02d3e27dac79e7d75b9d3311cea7fe1f6b488f0..727be2cac88b47b98e73fc919a2cb47057997433 100644
--- a/lib/internal/Magento/Framework/Api/SearchCriteria.php
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria.php
@@ -6,12 +6,11 @@
 
 namespace Magento\Framework\Api;
 
-
 /**
  * Data Object for SearchCriteria
  * @codeCoverageIgnore
  */
-class SearchCriteria extends AbstractExtensibleObject implements SearchCriteriaInterface
+class SearchCriteria extends AbstractSimpleObject implements SearchCriteriaInterface
 {
     /**#@+
      * Constants for Data Object keys
diff --git a/lib/internal/Magento/Framework/Api/SearchResults.php b/lib/internal/Magento/Framework/Api/SearchResults.php
index ad1481e9dde6afbc0b84349a111498e52913615a..8d5b998e99a6de80cdc0377230e58b6c36efe8a1 100644
--- a/lib/internal/Magento/Framework/Api/SearchResults.php
+++ b/lib/internal/Magento/Framework/Api/SearchResults.php
@@ -9,7 +9,7 @@ namespace Magento\Framework\Api;
 /**
  * SearchResults Service Data Object used for the search service requests
  */
-class SearchResults extends \Magento\Framework\Api\AbstractExtensibleObject
+class SearchResults extends AbstractSimpleObject
 {
     const KEY_ITEMS = 'items';
     const KEY_SEARCH_CRITERIA = 'search_criteria';
diff --git a/lib/internal/Magento/Framework/Api/SortOrder.php b/lib/internal/Magento/Framework/Api/SortOrder.php
index a29bac335b972f993ebcf9086450aa3d6b258e36..f328b93aa176399e1673206e4e58a0935d10d324 100644
--- a/lib/internal/Magento/Framework/Api/SortOrder.php
+++ b/lib/internal/Magento/Framework/Api/SortOrder.php
@@ -6,12 +6,11 @@
 
 namespace Magento\Framework\Api;
 
-
 /**
  * Data object for sort order.
  * @codeCoverageIgnore
  */
-class SortOrder extends AbstractExtensibleObject
+class SortOrder extends AbstractSimpleObject
 {
     const FIELD = 'field';
     const DIRECTION = 'direction';
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionGeneratorTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionAttributesGeneratorTest.php
similarity index 88%
rename from lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionGeneratorTest.php
rename to lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionAttributesGeneratorTest.php
index a7ae7e8a0b37dc4be67f76e8462211cb0eedaf89..5207a20588c73dcbf83aa767b907f585db8bb114 100644
--- a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionGeneratorTest.php
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionAttributesGeneratorTest.php
@@ -3,10 +3,10 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
+// @codingStandardsIgnoreFile
 namespace Magento\Framework\Api\Test\Unit\Code\Generator;
 
-class ExtensionGeneratorTest extends \PHPUnit_Framework_TestCase
+class ExtensionAttributesGeneratorTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @var \Magento\Framework\Api\Config\Reader|\PHPUnit_Framework_MockObject_MockObject
@@ -14,7 +14,7 @@ class ExtensionGeneratorTest extends \PHPUnit_Framework_TestCase
     protected $configReaderMock;
 
     /**
-     * @var \Magento\Framework\Api\Code\Generator\ObjectExtension|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $model;
 
@@ -26,7 +26,7 @@ class ExtensionGeneratorTest extends \PHPUnit_Framework_TestCase
 
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $this->model = $objectManager->getObject(
-            'Magento\Framework\Api\Code\Generator\ObjectExtension',
+            'Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator',
             [
                 'configReader' => $this->configReaderMock,
                 'sourceClassName' => '\Magento\Catalog\Api\Data\Product',
@@ -68,9 +68,9 @@ class ExtensionGeneratorTest extends \PHPUnit_Framework_TestCase
     public function testValidateException()
     {
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-        /** @var \Magento\Framework\Api\Code\Generator\ObjectExtension $model */
+        /** @var \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator $model */
         $model = $objectManager->getObject(
-            'Magento\Framework\Api\Code\Generator\ObjectExtension',
+            'Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator',
             [
                 'sourceClassName' => '\Magento\Catalog\Api\Data\Product',
                 'resultClassName' => '\Magento\Catalog\Api\Data\ProductInterface'
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionInterfaceGeneratorTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionAttributesInterfaceGeneratorTest.php
similarity index 84%
rename from lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionInterfaceGeneratorTest.php
rename to lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionAttributesInterfaceGeneratorTest.php
index 80ee07f036b1d67cf546c9740cd23361e798ceaf..8f80baf39beeeec1955800e7ea4a51ac12d02382 100644
--- a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionInterfaceGeneratorTest.php
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/ExtensionAttributesInterfaceGeneratorTest.php
@@ -3,10 +3,10 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
+// @codingStandardsIgnoreFile
 namespace Magento\Framework\Api\Test\Unit\Code\Generator;
 
-class ExtensionInterfaceGeneratorTest extends \PHPUnit_Framework_TestCase
+class ExtensionAttributesInterfaceGeneratorTest extends \PHPUnit_Framework_TestCase
 {
     public function testGenerate()
     {
@@ -28,9 +28,9 @@ class ExtensionInterfaceGeneratorTest extends \PHPUnit_Framework_TestCase
                 ]
             );
 
-        /** @var \Magento\Framework\Api\Code\Generator\ObjectExtensionInterface $model */
+        /** @var \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator $model */
         $model = $objectManager->getObject(
-            'Magento\Framework\Api\Code\Generator\ObjectExtensionInterface',
+            'Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator',
             [
                 'configReader' => $configReaderMock,
                 'sourceClassName' => '\Magento\Catalog\Api\Data\Product',
@@ -49,9 +49,9 @@ class ExtensionInterfaceGeneratorTest extends \PHPUnit_Framework_TestCase
     public function testValidateException()
     {
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-        /** @var \Magento\Framework\Api\Code\Generator\ObjectExtensionInterface $model */
+        /** @var \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator $model */
         $model = $objectManager->getObject(
-            'Magento\Framework\Api\Code\Generator\ObjectExtensionInterface',
+            'Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator',
             [
                 'sourceClassName' => '\Magento\Catalog\Api\Data\Product',
                 'resultClassName' => '\Magento\Catalog\Api\Data\ProductInterface'
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleEmptyExtension.txt b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleEmptyExtension.txt
index 9cd99093c935725a6c8a9ba357b2ca7c508ddfe3..1605dad849f045361e5a4858b70d216bc8879c56 100644
--- a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleEmptyExtension.txt
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleEmptyExtension.txt
@@ -3,6 +3,6 @@ namespace Magento\Catalog\Api\Data;
 /**
  * Extension class for @see \Magento\Catalog\Api\Data\ProductInterface
  */
-class ProductExtension implements \Magento\Catalog\Api\Data\ProductExtensionInterface
+class ProductExtension extends \Magento\Framework\Api\AbstractSimpleObject implements \Magento\Catalog\Api\Data\ProductExtensionInterface
 {
 }
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleExtension.txt b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleExtension.txt
index 3ea82ea52c4c8d54079ef305f9a8c32d7c641711..8b5caad1ecc4456ae51380e25c735be8f2660d37 100644
--- a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleExtension.txt
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleExtension.txt
@@ -3,24 +3,14 @@ namespace Magento\Catalog\Api\Data;
 /**
  * Extension class for @see \Magento\Catalog\Api\Data\ProductInterface
  */
-class ProductExtension implements \Magento\Catalog\Api\Data\ProductExtensionInterface
+class ProductExtension extends \Magento\Framework\Api\AbstractSimpleObject implements \Magento\Catalog\Api\Data\ProductExtensionInterface
 {
-    /**
-     * @var string
-     */
-    protected $stringAttribute = null;
-
-    /**
-     * @var \Magento\Bundle\Api\Data\OptionInterface[]
-     */
-    protected $complexObjectAttribute = null;
-
     /**
      * @return string
      */
     public function getStringAttribute()
     {
-        return $this->stringAttribute;
+        return $this->_get('string_attribute');
     }
 
     /**
@@ -29,7 +19,7 @@ class ProductExtension implements \Magento\Catalog\Api\Data\ProductExtensionInte
      */
     public function setStringAttribute($stringAttribute)
     {
-        $this->stringAttribute = $stringAttribute;
+        $this->setData('string_attribute', $stringAttribute);
         return $this;
     }
 
@@ -38,7 +28,7 @@ class ProductExtension implements \Magento\Catalog\Api\Data\ProductExtensionInte
      */
     public function getComplexObjectAttribute()
     {
-        return $this->complexObjectAttribute;
+        return $this->_get('complex_object_attribute');
     }
 
     /**
@@ -47,7 +37,7 @@ class ProductExtension implements \Magento\Catalog\Api\Data\ProductExtensionInte
      */
     public function setComplexObjectAttribute($complexObjectAttribute)
     {
-        $this->complexObjectAttribute = $complexObjectAttribute;
+        $this->setData('complex_object_attribute', $complexObjectAttribute);
         return $this;
     }
 }
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleExtensionInterface.txt b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleExtensionInterface.txt
index a16dd05799e00b7be507c5abcce788400c292a1d..ec9edd7affc2d68e5444d914b833bff81ccc1d4d 100644
--- a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleExtensionInterface.txt
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/_files/SampleExtensionInterface.txt
@@ -3,7 +3,7 @@ namespace Magento\Catalog\Api\Data;
 /**
  * ExtensionInterface class for @see \Magento\Catalog\Api\Data\ProductInterface
  */
-interface ProductExtensionInterface
+interface ProductExtensionInterface extends \Magento\Framework\Api\ExtensionAttributesInterface
 {
     /**
      * @return string
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Config/MetadataConfigTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/Config/MetadataConfigTest.php
deleted file mode 100644
index bc310d2ee3acbc4044f64f71e4425dfda2af2aa7..0000000000000000000000000000000000000000
--- a/lib/internal/Magento/Framework/Api/Test/Unit/Config/MetadataConfigTest.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * Copyright © 2015 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\Api\Test\Unit\Config;
-
-class MetadataConfigTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Framework\Api\Config\MetadataConfig
-     */
-    protected $metadataConfig;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Api\Config\Reader
-     */
-    protected $serviceConfigReaderMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Api\ObjectFactory
-     */
-    protected $objectFactoryMock;
-
-    /**
-     * Prepare parameters
-     */
-    public function setUp()
-    {
-        $this->serviceConfigReaderMock = $this->getMockBuilder('\Magento\Framework\Api\Config\Reader')
-            ->disableOriginalConstructor()
-            ->getMock();
-        $this->objectFactoryMock = $this->getMockBuilder(
-            '\Magento\Framework\Api\ObjectFactory'
-        )->setMethods(['create'])->disableOriginalConstructor()->getMock();
-
-        $this->metadataConfig = new \Magento\Framework\Api\Config\MetadataConfig(
-            $this->serviceConfigReaderMock,
-            $this->objectFactoryMock
-        );
-    }
-
-    /**
-     * Test caching
-     */
-    public function testCaching()
-    {
-        $dataObjectClassName = 'Magento\Customer\Model\Data\Address';
-        $attributeCode = 'street';
-        $allAttributes = [
-            $dataObjectClassName => [
-                $attributeCode => 'value',
-            ]
-        ];
-        $this->serviceConfigReaderMock->expects($this->once())
-            ->method('read')
-            ->willReturn($allAttributes);
-
-        $attributeMock = $this->getMock('\Magento\Framework\Api\MetadataObjectInterface');
-        $attributeMock->expects($this->exactly(2))
-            ->method('setAttributeCode')
-            ->with($attributeCode)
-            ->will($this->returnSelf());
-        $this->objectFactoryMock->expects($this->exactly(2))
-            ->method('create')
-            ->willReturn($attributeMock);
-
-        $attributes = $this->metadataConfig->getCustomAttributesMetadata($dataObjectClassName);
-        $this->assertEquals($attributeMock, $attributes[$attributeCode]);
-        $attributes = $this->metadataConfig->getCustomAttributesMetadata($dataObjectClassName);
-        $this->assertEquals($attributeMock, $attributes[$attributeCode]);
-    }
-}
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/DataObjectHelperTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/DataObjectHelperTest.php
index 1478deb7c41daf420af12deda53c97bed9368639..ff229abd7d22e9be0f810da4034336e5e9631f63 100644
--- a/lib/internal/Magento/Framework/Api/Test/Unit/DataObjectHelperTest.php
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/DataObjectHelperTest.php
@@ -3,10 +3,13 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\Api\Test\Unit;
 
-use \Magento\Framework\Api\ExtensibleDataInterface;
-use \Magento\Framework\Api\AttributeInterface;
+use Magento\Framework\Api\CustomAttributesDataInterface;
+use Magento\Framework\Api\AttributeInterface;
 
 class DataObjectHelperTest extends \PHPUnit_Framework_TestCase
 {
@@ -219,7 +222,7 @@ class DataObjectHelperTest extends \PHPUnit_Framework_TestCase
 
         $data = [
             'id' => $id,
-            ExtensibleDataInterface::CUSTOM_ATTRIBUTES => [
+            CustomAttributesDataInterface::CUSTOM_ATTRIBUTES => [
                 [
                     AttributeInterface::ATTRIBUTE_CODE => $customAttributeCode,
                     AttributeInterface::VALUE => $customAttributeValue,
diff --git a/lib/internal/Magento/Framework/App/Cache/Frontend/Factory.php b/lib/internal/Magento/Framework/App/Cache/Frontend/Factory.php
index 16575b0885528edfab6ebf502e6ae5c8b692bf46..75f139317ba10653d759e95b7f7e41a7b6347fbe 100644
--- a/lib/internal/Magento/Framework/App/Cache/Frontend/Factory.php
+++ b/lib/internal/Magento/Framework/App/Cache/Frontend/Factory.php
@@ -303,10 +303,10 @@ class Factory
             return $this->_resource->getConnection('core_write');
         };
         $options['data_table_callback'] = function () {
-            return $this->_resource->getTableName('core_cache');
+            return $this->_resource->getTableName('cache');
         };
         $options['tags_table_callback'] = function () {
-            return $this->_resource->getTableName('core_cache_tag');
+            return $this->_resource->getTableName('cache_tag');
         };
         return $options;
     }
diff --git a/lib/internal/Magento/Framework/App/ObjectManagerFactory.php b/lib/internal/Magento/Framework/App/ObjectManagerFactory.php
index 8c777c869e82417a90e684ed24db56a204feac2e..ddb68b8583ac41420e46d57f04302efd43797d4c 100644
--- a/lib/internal/Magento/Framework/App/ObjectManagerFactory.php
+++ b/lib/internal/Magento/Framework/App/ObjectManagerFactory.php
@@ -163,6 +163,7 @@ class ObjectManagerFactory
 
         $this->factory->setObjectManager($objectManager);
         ObjectManager::setInstance($objectManager);
+        $definitionFactory->getCodeGenerator()->setObjectManager($objectManager);
 
         $diConfig->setCache(
             $objectManager->get('Magento\Framework\App\ObjectManager\ConfigCache')
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/XsdTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/XsdTest.php
index 34400821cc90dc368b9fadad8020965c36af6dc6..3c54962e2f5966ad8409d78d8af371ab7711d073 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/XsdTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/XsdTest.php
@@ -21,7 +21,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->_xsdSchema = BP . '/app/code/Magento/Core/etc/config.xsd';
+        $this->_xsdSchema = BP . '/app/code/Magento/Store/etc/config.xsd';
         $this->_xsdValidator = new \Magento\Framework\TestFramework\Unit\Utility\XsdValidator();
     }
 
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/config.xml b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/config.xml
index 64a48ac3e9498e535c60ff3e6f81737be6685dd2..c0d6f535bcaa634059f38914bce449b9b1929e67 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/config.xml
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Store/etc/config.xsd">
     <default>
         <payment>
             <payment_method>
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/initial_config1.xml b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/initial_config1.xml
index 36c221dcbfecab3a7afd7f726386d87477eb88aa..0268e0a19ea007e138ea3079dd4af00077b750a6 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/initial_config1.xml
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/initial_config1.xml
@@ -5,5 +5,5 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Store/etc/config.xsd">
 </config>
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/initial_config2.xml b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/initial_config2.xml
index 36c221dcbfecab3a7afd7f726386d87477eb88aa..0268e0a19ea007e138ea3079dd4af00077b750a6 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/initial_config2.xml
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/initial_config2.xml
@@ -5,5 +5,5 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Store/etc/config.xsd">
 </config>
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/invalid_config.xml b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/invalid_config.xml
index 07a89760bb4c4ef7a66d1fae4281121d2c34df91..803d1ef87c4d1471f6618fecf572ccde7dade9ce 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/invalid_config.xml
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/invalid_config.xml
@@ -5,6 +5,6 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Store/etc/config.xsd">
     <invalid></invalid>
 </config>
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/valid_config.xml b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/valid_config.xml
index e884c48e0f0ff95d386525c551d139cfb2c95d63..da8b5603b23f196a48eb04dea6d077e98acf1ed4 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/valid_config.xml
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/_files/valid_config.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Core/etc/config.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../../app/code/Magento/Store/etc/config.xsd">
     <default>
         <some></some>
     </default>
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php
index c3e0a80553329159193d625c2dc2ec516cc58152..acd44af1d90654b77d62b2230fd3ce0c9dfe653f 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\App\Test\Unit;
 
 class ReinitableConfigTest extends \PHPUnit_Framework_TestCase
@@ -12,7 +15,7 @@ class ReinitableConfigTest extends \PHPUnit_Framework_TestCase
         $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
         $scopePool = $this->getMock('\Magento\Framework\App\Config\ScopePool', ['clean'], [], '', false);
         $scopePool->expects($this->once())->method('clean');
-        /** @var \Magento\Core\Model\ReinitableConfig $config */
+        /** @var \Magento\Framework\App\ReinitableConfig $config */
         $config = $helper->getObject('Magento\Framework\App\ReinitableConfig', ['scopePool' => $scopePool]);
         $this->assertInstanceOf('\Magento\Framework\App\Config\ReinitableConfigInterface', $config->reinit());
     }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php
index c1502736e273ec2e56af9c4faba802208d4172f3..26d126e7b5692febfe28dcad162c56fabd99d20b 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\App\Test\Unit\Response;
 
 use \Magento\Framework\App\Response\Http;
@@ -53,6 +56,9 @@ class HttpTest extends \PHPUnit_Framework_TestCase
     protected function tearDown()
     {
         unset($this->model);
+        $magentoObjectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER);
+        $objectManager = $magentoObjectManagerFactory->create($_SERVER);
+        \Magento\Framework\App\ObjectManager::setInstance($objectManager);
     }
 
     public function testSendVary()
diff --git a/app/code/Magento/Core/Test/Unit/Model/NoRouteHandlerListTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Router/NoRouteHandlerListTest.php
similarity index 95%
rename from app/code/Magento/Core/Test/Unit/Model/NoRouteHandlerListTest.php
rename to lib/internal/Magento/Framework/App/Test/Unit/Router/NoRouteHandlerListTest.php
index 4673d2f03048c8ef4bb5c97c881eddf5b1771cae..23ae614a3673a52ea658c3770457b4b20f2a7fba 100644
--- a/app/code/Magento/Core/Test/Unit/Model/NoRouteHandlerListTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Router/NoRouteHandlerListTest.php
@@ -3,7 +3,10 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Core\Test\Unit\Model;
+
+// @codingStandardsIgnoreFile
+
+namespace Magento\Framework\App\Test\Unit\Router;
 
 class NoRouteHandlerListTest extends \PHPUnit_Framework_TestCase
 {
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/StateTest.php b/lib/internal/Magento/Framework/App/Test/Unit/StateTest.php
index db3f0e7e6c82ec5b421b88d793762a18db00b884..e8066f086c37b02ba2a8c15caaedfb323d891c7c 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/StateTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/StateTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\App\Test\Unit;
 
 class StateTest extends \PHPUnit_Framework_TestCase
@@ -95,4 +98,41 @@ class StateTest extends \PHPUnit_Framework_TestCase
     {
         throw new \Exception('Some error');
     }
+
+    /**
+     * @param string $mode
+     * @dataProvider constructorDataProvider
+     */
+    public function testConstructor($mode)
+    {
+        $model = new \Magento\Framework\App\State(
+            $this->getMockForAbstractClass('Magento\Framework\Config\ScopeInterface', [], '', false),
+            $mode
+        );
+        $this->assertEquals($mode, $model->getMode());
+    }
+
+    /**
+     * @return array
+     */
+    public static function constructorDataProvider()
+    {
+        return [
+            'default mode' => [\Magento\Framework\App\State::MODE_DEFAULT],
+            'production mode' => [\Magento\Framework\App\State::MODE_PRODUCTION],
+            'developer mode' => [\Magento\Framework\App\State::MODE_DEVELOPER]
+        ];
+    }
+
+    /**
+     * @expectedException \Exception
+     * @expectedExceptionMessage Unknown application mode: unknown mode
+     */
+    public function testConstructorException()
+    {
+        new \Magento\Framework\App\State(
+            $this->getMockForAbstractClass('Magento\Framework\Config\ScopeInterface', [], '', false),
+            "unknown mode"
+        );
+    }
 }
diff --git a/lib/internal/Magento/Framework/App/Utility/Classes.php b/lib/internal/Magento/Framework/App/Utility/Classes.php
index 197efbc95fb0a88104b727c3c3fbc53ce9184ba3..6671bd6a0464da30ef79dd001742cd2ff6ad43ef 100644
--- a/lib/internal/Magento/Framework/App/Utility/Classes.php
+++ b/lib/internal/Magento/Framework/App/Utility/Classes.php
@@ -272,7 +272,11 @@ class Classes
      */
     public static function isAutogenerated($className)
     {
-        if (preg_match('/.*\\\\[a-zA-Z0-9]{1,}(Factory|Proxy|SearchResults|DataBuilder)$/', $className)
+        if (
+            preg_match(
+                '/.*\\\\[a-zA-Z0-9]{1,}(Factory|Proxy|SearchResults|DataBuilder|Extension|ExtensionInterface)$/',
+                $className
+            )
             || preg_match('/Magento\\\\[\w]+\\\\(Test\\\\(Page|Fixture))\\\\/', $className)
         ) {
             return true;
diff --git a/lib/internal/Magento/Framework/App/Utility/Files.php b/lib/internal/Magento/Framework/App/Utility/Files.php
index 97b389f125f278e3d7f67176894ab2ec0905f06c..15869c4be7c49c67c886bab1b14484c2f5b1b5ea 100644
--- a/lib/internal/Magento/Framework/App/Utility/Files.php
+++ b/lib/internal/Magento/Framework/App/Utility/Files.php
@@ -490,18 +490,18 @@ class Files
     /**
      * Returns list of Javascript files in Magento
      *
+     * @param string $area
+     * @param string $themePath
+     * @param string $namespace
+     * @param string $module
      * @return array
      */
-    public function getJsFiles()
+    public function getJsFiles($area = '*', $themePath = '*/*', $namespace = '*', $module = '*')
     {
-        $key = __METHOD__ . $this->_path;
+        $key = $area . $themePath . $namespace . $module . __METHOD__ . $this->_path;
         if (isset(self::$_cache[$key])) {
             return self::$_cache[$key];
         }
-        $namespace = '*';
-        $module = '*';
-        $area = '*';
-        $themePath = '*/*';
         $files = self::getFiles(
             [
                 "{$this->_path}/app/code/{$namespace}/{$module}/view/{$area}/web",
diff --git a/lib/internal/Magento/Framework/Cache/Backend/Database.php b/lib/internal/Magento/Framework/Cache/Backend/Database.php
index b1233e1301b24e981d92dd8a0c98c02217390225..bac1d79525dac3bc49f89537303f4af2d1a17f38 100644
--- a/lib/internal/Magento/Framework/Cache/Backend/Database.php
+++ b/lib/internal/Magento/Framework/Cache/Backend/Database.php
@@ -9,7 +9,7 @@
 /**
 Tables declaration:
 
-CREATE TABLE IF NOT EXISTS `core_cache` (
+CREATE TABLE IF NOT EXISTS `cache` (
         `id` VARCHAR(255) NOT NULL,
         `data` mediumblob,
         `create_time` int(11),
@@ -19,12 +19,12 @@ CREATE TABLE IF NOT EXISTS `core_cache` (
         KEY `IDX_EXPIRE_TIME` (`expire_time`)
 )ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-CREATE TABLE IF NOT EXISTS `core_cache_tag` (
+CREATE TABLE IF NOT EXISTS `cache_tag` (
     `tag` VARCHAR(255) NOT NULL,
     `cache_id` VARCHAR(255) NOT NULL,
     KEY `IDX_TAG` (`tag`),
     KEY `IDX_CACHE_ID` (`cache_id`),
-    CONSTRAINT `FK_CORE_CACHE_TAG` FOREIGN KEY (`cache_id`) REFERENCES `core_cache` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
+    CONSTRAINT `FK_CORE_CACHE_TAG` FOREIGN KEY (`cache_id`) REFERENCES `cache` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 */
 
diff --git a/lib/internal/Magento/Framework/Code/Generator.php b/lib/internal/Magento/Framework/Code/Generator.php
index 1339a790efc9b6fa0bdf67a1c9a65a234ef8d759..35026a88b69d1d66c4e10d913ea5b5fa35e2d155 100644
--- a/lib/internal/Magento/Framework/Code/Generator.php
+++ b/lib/internal/Magento/Framework/Code/Generator.php
@@ -31,6 +31,11 @@ class Generator
      */
     protected $definedClasses;
 
+    /**
+     * @var \Magento\Framework\ObjectManagerInterface
+     */
+    protected $objectManager;
+
     /**
      * @param Generator\Io   $ioObject
      * @param array          $generatedEntities
@@ -86,18 +91,15 @@ class Generator
         }
         if (!$entity || !$entityName) {
             return self::GENERATION_ERROR;
-        }
-
-        if ($this->definedClasses->classLoadable($className)) {
+        } else if ($this->definedClasses->classLoadable($className)) {
             return self::GENERATION_SKIP;
-        }
-
-        if (!isset($this->_generatedEntities[$entity])) {
+        } else if (!isset($this->_generatedEntities[$entity])) {
             throw new \InvalidArgumentException('Unknown generation entity.');
         }
         $generatorClass = $this->_generatedEntities[$entity];
         /** @var EntityAbstract $generator */
         $generator = $this->createGeneratorInstance($generatorClass, $entityName, $className);
+        $this->tryToLoadSourceClass($className, $generator);
         if (!($file = $generator->generate())) {
             $errors = $generator->getErrors();
             throw new \Magento\Framework\Exception(implode(' ', $errors));
@@ -125,6 +127,57 @@ class Generator
      */
     protected function createGeneratorInstance($generatorClass, $entityName, $className)
     {
-        return new $generatorClass($entityName, $className, $this->_ioObject);
+        return $this->getObjectManager()->create(
+            $generatorClass,
+            ['sourceClassName' => $entityName, 'resultClassName' => $className, 'ioObject' => $this->_ioObject]
+        );
+    }
+
+    /**
+     * Set object manager instance.
+     *
+     * @param \Magento\Framework\ObjectManagerInterface $objectManager
+     * @return $this
+     */
+    public function setObjectManager(\Magento\Framework\ObjectManagerInterface $objectManager)
+    {
+        $this->objectManager = $objectManager;
+        return $this;
+    }
+
+    /**
+     * Get object manager instance.
+     *
+     * @return \Magento\Framework\ObjectManagerInterface
+     */
+    public function getObjectManager()
+    {
+        if (!($this->objectManager instanceof \Magento\Framework\ObjectManagerInterface)) {
+            throw new \LogicException(
+                "Object manager was expected to be set using setObjectManger() "
+                . "before getObjectManager() invocation."
+            );
+        }
+        return $this->objectManager;
+    }
+
+    /**
+     * Try to load/generate source class to check if it is valid or not.
+     *
+     * @param string $className
+     * @param \Magento\Framework\Code\Generator\EntityAbstract $generator
+     * @return void
+     * @throws \Magento\Framework\Exception
+     */
+    protected function tryToLoadSourceClass($className, $generator)
+    {
+        $sourceClassName = $generator->getSourceClassName();
+        if (!$this->definedClasses->classLoadable($sourceClassName)) {
+            if ($this->generateClass($sourceClassName) !== self::GENERATION_SUCCESS) {
+                throw new \Magento\Framework\Exception(
+                    sprintf('Source class "%s" for "%s" generation does not exist.', $sourceClassName, $className)
+                );
+            }
+        }
     }
 }
diff --git a/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php b/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php
index f98c4d689653fb007b7eec15e8ceec8228de39f1..20da9af1a5aaff1fa2904dac17a5f65f00069aea 100644
--- a/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php
+++ b/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php
@@ -121,15 +121,26 @@ abstract class EntityAbstract
     }
 
     /**
-     * Get source class name
+     * Get full source class name, with namespace
      *
      * @return string
      */
-    protected function _getSourceClassName()
+    public function getSourceClassName()
     {
         return $this->_sourceClassName;
     }
 
+    /**
+     * Get source class without namespace.
+     *
+     * @return string
+     */
+    public function getSourceClassNameWithoutNamespace()
+    {
+        $parts = explode('\\', ltrim($this->getSourceClassName(), '\\'));
+        return end($parts);
+    }
+
     /**
      * Get fully qualified class name
      *
@@ -234,7 +245,7 @@ abstract class EntityAbstract
      */
     protected function _validateData()
     {
-        $sourceClassName = $this->_getSourceClassName();
+        $sourceClassName = $this->getSourceClassName();
         $resultClassName = $this->_getResultClassName();
         $resultFileName = $this->_ioObject->getResultFileName($resultClassName);
 
@@ -292,7 +303,7 @@ abstract class EntityAbstract
      */
     protected function _getClassDocBlock()
     {
-        $description = ucfirst(static::ENTITY_TYPE) . ' class for @see ' . $this->_getSourceClassName();
+        $description = ucfirst(static::ENTITY_TYPE) . ' class for @see ' . $this->getSourceClassName();
         return ['shortDescription' => $description];
     }
 
diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/GeneratorTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/GeneratorTest.php
index 3e7d273a24d5c152dd778f824e538331c54e79de..efa21cde844f603a7e347bf46002d9b77312e529 100644
--- a/lib/internal/Magento/Framework/Code/Test/Unit/GeneratorTest.php
+++ b/lib/internal/Magento/Framework/Code/Test/Unit/GeneratorTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\Code\Test\Unit;
 
 class GeneratorTest extends \PHPUnit_Framework_TestCase
@@ -70,8 +73,12 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase
                 'interceptor' => '\Magento\Framework\Interception\Code\Generator\Interceptor'
             ]
         );
-
-        $this->model->generateClass($className . $entityType);
+        $objectManagerMock = $this->getMock('Magento\Framework\ObjectManagerInterface');
+        $fullClassName = $className . $entityType;
+        $entityGeneratorMock = $this->getMockBuilder($fullClassName)->disableOriginalConstructor()->getMock();
+        $objectManagerMock->expects($this->once())->method('create')->willReturn($entityGeneratorMock);
+        $this->model->setObjectManager($objectManagerMock);
+        $this->model->generateClass($fullClassName);
     }
 
     /**
@@ -125,7 +132,10 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase
 
         $expectedEntities = array_values($this->expectedEntities);
         $resultClassName = self::SOURCE_CLASS . ucfirst(array_shift($expectedEntities));
-
+        $objectManagerMock = $this->getMock('Magento\Framework\ObjectManagerInterface');
+        $entityGeneratorMock = $this->getMockBuilder($resultClassName)->disableOriginalConstructor()->getMock();
+        $objectManagerMock->expects($this->once())->method('create')->willReturn($entityGeneratorMock);
+        $this->model->setObjectManager($objectManagerMock);
         $this->model->generateClass($resultClassName);
     }
 
diff --git a/app/code/Magento/Core/Controller/Index/Index.php b/lib/internal/Magento/Framework/Controller/Index/Index.php
similarity index 84%
rename from app/code/Magento/Core/Controller/Index/Index.php
rename to lib/internal/Magento/Framework/Controller/Index/Index.php
index 85ff6a6af433749971148420bc95dcc6fc9cf837..bc8b9d70810a6fa660f8868044c344c02ea41c0e 100644
--- a/app/code/Magento/Core/Controller/Index/Index.php
+++ b/lib/internal/Magento/Framework/Controller/Index/Index.php
@@ -4,7 +4,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Core\Controller\Index;
+namespace Magento\Framework\Controller\Index;
 
 class Index extends \Magento\Framework\App\Action\Action
 {
diff --git a/app/code/Magento/Core/Controller/Noroute/Index.php b/lib/internal/Magento/Framework/Controller/Noroute/Index.php
similarity index 96%
rename from app/code/Magento/Core/Controller/Noroute/Index.php
rename to lib/internal/Magento/Framework/Controller/Noroute/Index.php
index 4d8887573d65775ef4cbe7c9dc10cb7376912675..2d4da914cd00450a19fa2889bc489f7561ba4b77 100644
--- a/app/code/Magento/Core/Controller/Noroute/Index.php
+++ b/lib/internal/Magento/Framework/Controller/Noroute/Index.php
@@ -4,7 +4,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Core\Controller\Noroute;
+namespace Magento\Framework\Controller\Noroute;
 
 class Index extends \Magento\Framework\App\Action\Action
 {
diff --git a/app/code/Magento/Core/Test/Unit/Controller/Index/IndexTest.php b/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/Index/IndexTest.php
similarity index 70%
rename from app/code/Magento/Core/Test/Unit/Controller/Index/IndexTest.php
rename to lib/internal/Magento/Framework/Controller/Test/Unit/Controller/Index/IndexTest.php
index 9353ed854e497eb10e4cc660922680cf33301ac1..aac2c071fb0a4322ed0437bd84ac3efc4046f8a9 100644
--- a/app/code/Magento/Core/Test/Unit/Controller/Index/IndexTest.php
+++ b/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/Index/IndexTest.php
@@ -3,7 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Core\Test\Unit\Controller\Index;
+namespace Magento\Framework\Controller\Test\Unit\Controller\Index;
 
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 
@@ -13,9 +13,9 @@ class IndexTest extends \PHPUnit_Framework_TestCase
     {
         $objectManager = new ObjectManager($this);
         /**
-         * @var \Magento\Core\Controller\Index\Index
+         * @var \Magento\Framework\Controller\Index\Index
          */
-        $controller = $objectManager->getObject('Magento\Core\Controller\Index\Index');
+        $controller = $objectManager->getObject('Magento\Framework\Controller\Index\Index');
 
         // The execute method is empty and returns void, just calling to verify
         // the method exists and does not throw an exception
diff --git a/app/code/Magento/Core/Test/Unit/Controller/NorouteTest.php b/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/NorouteTest.php
similarity index 94%
rename from app/code/Magento/Core/Test/Unit/Controller/NorouteTest.php
rename to lib/internal/Magento/Framework/Controller/Test/Unit/Controller/NorouteTest.php
index e8fa0f8df15a7325fdca4234d423af3a02549276..e1224c5ff7f80ed4ceec7bdb91671a9449865a0b 100644
--- a/app/code/Magento/Core/Test/Unit/Controller/NorouteTest.php
+++ b/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/NorouteTest.php
@@ -3,12 +3,12 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Core\Test\Unit\Controller;
+namespace Magento\Framework\Controller\Test\Unit\Controller;
 
 class NorouteTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Core\Controller\Noroute\Index
+     * @var \Magento\Framework\Controller\Noroute
      */
     protected $_controller;
 
@@ -34,7 +34,7 @@ class NorouteTest extends \PHPUnit_Framework_TestCase
         $this->_viewMock = $this->getMock('\Magento\Framework\App\ViewInterface');
         $this->_statusMock = $this->getMock('Magento\Framework\Object', ['getLoaded'], [], '', false);
         $this->_controller = $helper->getObject(
-            'Magento\Core\Controller\Noroute\Index',
+            'Magento\Framework\Controller\Noroute\Index',
             ['request' => $this->_requestMock, 'view' => $this->_viewMock]
         );
     }
diff --git a/lib/internal/Magento/Framework/Data/Collection.php b/lib/internal/Magento/Framework/Data/Collection.php
index c8ab80c82f3d2674e4fa500afd343eb2d349c5bf..2ba01363659041e1916b2dd9de9f33e613b13563 100644
--- a/lib/internal/Magento/Framework/Data/Collection.php
+++ b/lib/internal/Magento/Framework/Data/Collection.php
@@ -15,8 +15,7 @@ use Magento\Framework\Option\ArrayInterface;
  */
 
 /**
- * TODO: Refactor use of \Magento\Framework\Option\ArrayInterface in library. Probably will be refactored while
- * moving \Magento\Core to library
+ * TODO: Refactor use of \Magento\Framework\Option\ArrayInterface in library.
  */
 class Collection implements \IteratorAggregate, \Countable, ArrayInterface, CollectionDataSourceInterface
 {
diff --git a/lib/internal/Magento/Framework/Data/Collection/EntityFactory.php b/lib/internal/Magento/Framework/Data/Collection/EntityFactory.php
index 3341e32d209d0f4ecac8ef55bd9bed4d15308595..6ab0ab7e5d21f1da09d0a54b320969a03d401701 100644
--- a/lib/internal/Magento/Framework/Data/Collection/EntityFactory.php
+++ b/lib/internal/Magento/Framework/Data/Collection/EntityFactory.php
@@ -35,9 +35,9 @@ class EntityFactory implements EntityFactoryInterface
     public function create($className, array $data = [])
     {
         $model = $this->_objectManager->create($className, $data);
-        //TODO: fix that when this factory used only for \Magento\Core\Model\Abstract
-        //if (!$model instanceof \Magento\Core\Model\Abstract) {
-        //    throw new \LogicException($className . ' doesn\'t implement \Magento\Core\Model\Abstract');
+        //TODO: fix that when this factory used only for \Magento\Framework\Model\AbstractModel
+        //if (!$model instanceof \Magento\Framework\Model\AbstractModel) {
+        //    throw new \LogicException($className . ' doesn\'t implement \Magento\Framework\Model\AbstractModel');
         //}
         return $model;
     }
diff --git a/lib/internal/Magento/Framework/Flag/Resource.php b/lib/internal/Magento/Framework/Flag/Resource.php
index 1f8014ba0acb97520faaa154bc7aee198cf6f6a3..c1f4a1079841be17b74d6b85aa99d0001bea2436 100644
--- a/lib/internal/Magento/Framework/Flag/Resource.php
+++ b/lib/internal/Magento/Framework/Flag/Resource.php
@@ -17,6 +17,6 @@ class Resource extends \Magento\Framework\Model\Resource\Db\AbstractDb
      */
     protected function _construct()
     {
-        $this->_init('core_flag', 'flag_id');
+        $this->_init('flag', 'flag_id');
     }
 }
diff --git a/lib/internal/Magento/Framework/Interception/Code/Generator/Interceptor.php b/lib/internal/Magento/Framework/Interception/Code/Generator/Interceptor.php
index f0cb7cd637c48d9331fad0f8d0f4e6a890eb3389..2458a3cbd7518252b1d5671a5ec379445b87f0c1 100644
--- a/lib/internal/Magento/Framework/Interception/Code/Generator/Interceptor.php
+++ b/lib/internal/Magento/Framework/Interception/Code/Generator/Interceptor.php
@@ -83,7 +83,7 @@ class Interceptor extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getDefaultConstructorDefinition()
     {
-        $reflectionClass = new \ReflectionClass($this->_getSourceClassName());
+        $reflectionClass = new \ReflectionClass($this->getSourceClassName());
         $constructor = $reflectionClass->getConstructor();
         $parameters = [];
         if ($constructor) {
@@ -201,7 +201,7 @@ class Interceptor extends \Magento\Framework\Code\Generator\EntityAbstract
             "return \$result;\n",
         ];
 
-        $reflectionClass = new \ReflectionClass($this->_getSourceClassName());
+        $reflectionClass = new \ReflectionClass($this->getSourceClassName());
         $publicMethods = $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC);
         foreach ($publicMethods as $method) {
             if ($this->isInterceptedMethod($method)) {
@@ -283,7 +283,7 @@ class Interceptor extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _generateCode()
     {
-        $typeName = $this->_getSourceClassName();
+        $typeName = $this->getSourceClassName();
         $reflection = new \ReflectionClass($typeName);
 
         if ($reflection->isInterface()) {
@@ -302,7 +302,7 @@ class Interceptor extends \Magento\Framework\Code\Generator\EntityAbstract
         $result = parent::_validateData();
 
         if ($result) {
-            $sourceClassName = $this->_getSourceClassName();
+            $sourceClassName = $this->getSourceClassName();
             $resultClassName = $this->_getResultClassName();
 
             if ($resultClassName !== $sourceClassName . '\\Interceptor') {
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 f35ef42d6dc435af0b689f597276d22e4cdf9962..6c12758905634c325153a2b588ee72d08c5ad108 100644
--- a/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php
+++ b/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php
@@ -3,6 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+// @codingStandardsIgnoreFile
 namespace Magento\Framework\Interception\Test\Unit\Config;
 
 require_once __DIR__ . '/../Custom/Module/Model/Item.php';
@@ -40,6 +41,11 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      */
     protected $definitionMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $relationsMock;
+
     protected function setUp()
     {
         $this->readerMock = $this->getMock(
@@ -55,6 +61,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             'Magento\Framework\Interception\ObjectManager\ConfigInterface'
         );
         $this->definitionMock = $this->getMock('Magento\Framework\ObjectManager\DefinitionInterface');
+        $this->relationsMock = $this->getMockForAbstractClass('Magento\Framework\ObjectManager\RelationsInterface');
     }
 
     /**
@@ -62,7 +69,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      * @param string $type
      * @dataProvider hasPluginsDataProvider
      */
-    public function testHasPluginsWhenDataIsNotCached($expectedResult, $type)
+    public function testHasPluginsWhenDataIsNotCached($expectedResult, $type, $entityParents)
     {
         $readerMap = include __DIR__ . '/../_files/reader_mock_map.php';
         $this->readerMock->expects($this->any())
@@ -112,14 +119,17 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $this->definitionMock->expects($this->any())->method('getClasses')->will($this->returnValue(
             [
                 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemProxy',
-                '\Magento\Framework\Interception\Custom\Module\Model\Backslash\ItemProxy',
+                'Magento\Framework\Interception\Custom\Module\Model\Backslash\ItemProxy',
             ]
         ));
+        $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,
-            new \Magento\Framework\ObjectManager\Relations\Runtime(),
+            $this->relationsMock,
             $this->omConfigMock,
             $this->definitionMock,
             'interception'
@@ -170,27 +180,33 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             [
                 true,
                 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer',
+                [],
             ],
             [
                 true,
                 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item',
+                [],
             ],
             [
                 true,
                 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item\Enhanced',
+                [],
             ],
             [
                 // the following model has only inherited plugins
                 true,
                 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Enhanced',
+                ['Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer'],
             ],
             [
                 false,
                 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemProxy',
+                [],
             ],
             [
                 true,
                 'virtual_custom_item',
+                [],
             ]
         ];
     }
diff --git a/lib/internal/Magento/Framework/Model/AbstractExtensibleModel.php b/lib/internal/Magento/Framework/Model/AbstractExtensibleModel.php
index d69723ea8c5cef32357ea7e8766c24a69cf3bbb3..e5a84c89fa4ef60da3c42df09584990a53a1cced 100644
--- a/lib/internal/Magento/Framework/Model/AbstractExtensibleModel.php
+++ b/lib/internal/Magento/Framework/Model/AbstractExtensibleModel.php
@@ -6,11 +6,7 @@
 
 namespace Magento\Framework\Model;
 
-use Magento\Framework\Api\ExtensibleDataInterface;
-use Magento\Framework\Api\MetadataServiceInterface;
-use Magento\Framework\Api\AttributeValue;
 use Magento\Framework\Api\AttributeValueFactory;
-use Symfony\Component\DependencyInjection\Exception\LogicException;
 
 /**
  * Abstract model with custom attributes support.
@@ -19,12 +15,18 @@ use Symfony\Component\DependencyInjection\Exception\LogicException;
  * Implementations may choose to process custom attributes as their persistence requires them to.
  * @SuppressWarnings(PHPMD.NumberOfChildren)
  */
-abstract class AbstractExtensibleModel extends AbstractModel implements ExtensibleDataInterface
+abstract class AbstractExtensibleModel extends AbstractModel implements
+    \Magento\Framework\Api\CustomAttributesDataInterface
 {
     /**
-     * @var MetadataServiceInterface
+     * @var \Magento\Framework\Api\ExtensionAttributesFactory
      */
-    protected $metadataService;
+    protected $extensionAttributesFactory;
+
+    /**
+     * @var \Magento\Framework\Api\ExtensionAttributesInterface
+     */
+    protected $extensionAttributes;
 
     /**
      * @var AttributeValueFactory
@@ -39,7 +41,7 @@ abstract class AbstractExtensibleModel extends AbstractModel implements Extensib
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param MetadataServiceInterface $metadataService
+     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
      * @param AttributeValueFactory $customAttributeFactory
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
@@ -48,13 +50,13 @@ abstract class AbstractExtensibleModel extends AbstractModel implements Extensib
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        MetadataServiceInterface $metadataService,
+        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
         AttributeValueFactory $customAttributeFactory,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
         array $data = []
     ) {
-        $this->metadataService = $metadataService;
+        $this->extensionAttributesFactory = $extensionFactory;
         $this->customAttributeFactory = $customAttributeFactory;
         $data = $this->filterCustomAttributes($data);
         parent::__construct($context, $registry, $resource, $resourceCollection, $data);
@@ -77,7 +79,7 @@ abstract class AbstractExtensibleModel extends AbstractModel implements Extensib
         $customAttributesCodes = $this->getCustomAttributesCodes();
         $data[self::CUSTOM_ATTRIBUTES] = array_intersect_key(
             (array)$data[self::CUSTOM_ATTRIBUTES],
-            $customAttributesCodes
+            array_flip($customAttributesCodes)
         );
         foreach ($data[self::CUSTOM_ATTRIBUTES] as $code => $value) {
             if (!($value instanceof \Magento\Framework\Api\AttributeInterface)) {
@@ -148,11 +150,12 @@ abstract class AbstractExtensibleModel extends AbstractModel implements Extensib
     {
         if (is_array($key)) {
             $key = $this->filterCustomAttributes($key);
-        } elseif ($key == self::CUSTOM_ATTRIBUTES) {
+        } else if ($key == self::CUSTOM_ATTRIBUTES) {
             $filteredData = $this->filterCustomAttributes([self::CUSTOM_ATTRIBUTES => $value]);
             $value = $filteredData[self::CUSTOM_ATTRIBUTES];
         }
-        return parent::setData($key, $value);
+        parent::setData($key, $value);
+        return $this;
     }
 
     /**
@@ -168,7 +171,7 @@ abstract class AbstractExtensibleModel extends AbstractModel implements Extensib
      *
      * In addition to parent implementation custom attributes support is added.
      *
-     * @param string     $key
+     * @param string $key
      * @param string|int $index
      * @return mixed
      */
@@ -194,26 +197,35 @@ abstract class AbstractExtensibleModel extends AbstractModel implements Extensib
     }
 
     /**
-     * Fetch all custom attributes for the given extensible model
-     * //TODO : check if the custom attribute is already defined as a getter on the data interface
+     * Get a list of custom attribute codes.
+     *
+     * By default, entity can be extended only using extension attributes functionality.
      *
      * @return string[]
      */
     protected function getCustomAttributesCodes()
     {
-        if (!is_null($this->customAttributesCodes)) {
-            return $this->customAttributesCodes;
-        }
+        return [];
+    }
+
+    /**
+     * Receive a list of EAV attributes using provided metadata service.
+     *
+     * Can be used in child classes, which represent EAV entities.
+     *
+     * @param \Magento\Framework\Api\MetadataServiceInterface $metadataService
+     * @return string[]
+     */
+    protected function getEavAttributesCodes(\Magento\Framework\Api\MetadataServiceInterface $metadataService)
+    {
         $attributeCodes = [];
-        $customAttributesMetadata = $this->metadataService->getCustomAttributesMetadata(get_class($this));
+        $customAttributesMetadata = $metadataService->getCustomAttributesMetadata(get_class($this));
         if (is_array($customAttributesMetadata)) {
             /** @var $attribute \Magento\Framework\Api\MetadataObjectInterface */
             foreach ($customAttributesMetadata as $attribute) {
-                // Create a map for easier processing
-                $attributeCodes[$attribute->getAttributeCode()] = $attribute->getAttributeCode();
+                $attributeCodes[] = $attribute->getAttributeCode();
             }
         }
-        $this->customAttributesCodes = $attributeCodes;
         return $attributeCodes;
     }
 
@@ -228,4 +240,26 @@ abstract class AbstractExtensibleModel extends AbstractModel implements Extensib
         parent::setId($value);
         return $this->setData('id', $value);
     }
+
+    /**
+     * Set an extension attributes object.
+     *
+     * @param \Magento\Framework\Api\ExtensionAttributesInterface $extensionAttributes
+     * @return $this
+     */
+    protected function _setExtensionAttributes(\Magento\Framework\Api\ExtensionAttributesInterface $extensionAttributes)
+    {
+        $this->_data[self::EXTENSION_ATTRIBUTES_KEY] = $extensionAttributes;
+        return $this;
+    }
+
+    /**
+     * Retrieve existing extension attributes object or create a new one.
+     *
+     * @return \Magento\Framework\Api\ExtensionAttributesInterface
+     */
+    protected function _getExtensionAttributes()
+    {
+        return $this->getData(self::EXTENSION_ATTRIBUTES_KEY);
+    }
 }
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/AbstractExtensibleModelTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/AbstractExtensibleModelTest.php
index 2d224e2d6cada6ba260a9d3d857e03b52b8832d4..df82d6f679446790dd0df79b6cf2633e6070053d 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/AbstractExtensibleModelTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/AbstractExtensibleModelTest.php
@@ -4,6 +4,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\Model\Test\Unit;
 
 use Magento\Framework\Api\AttributeValue;
@@ -98,6 +100,9 @@ class AbstractExtensibleModelTest extends \PHPUnit_Framework_TestCase
                     new \Magento\Framework\Object(['attribute_code' => 'attribute3']),
                 ]
             );
+        $extensionAttributesFactory = $this->getMockBuilder('Magento\Framework\Api\ExtensionAttributesFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
         $this->attributeValueFactoryMock = $this->getMockBuilder('Magento\Framework\Api\AttributeValueFactory')
             ->disableOriginalConstructor()
             ->getMock();
@@ -106,7 +111,7 @@ class AbstractExtensibleModelTest extends \PHPUnit_Framework_TestCase
             [
                 $this->contextMock,
                 $this->registryMock,
-                $this->metadataServiceMock,
+                $extensionAttributesFactory,
                 $this->attributeValueFactoryMock,
                 $this->resourceMock,
                 $this->resourceCollectionMock
@@ -130,10 +135,9 @@ class AbstractExtensibleModelTest extends \PHPUnit_Framework_TestCase
             "Null is expected as a result of getCustomAttribute(\$code) when custom attribute is not set."
         );
         $attributesAsArray = ['attribute1' => true, 'attribute2' => 'Attribute Value', 'attribute3' => 333];
-        $addedAttributes = $this->addCustomAttributesToModel($attributesAsArray, $this->model);
-        $addedAttributes = array_values($addedAttributes);
+        $this->addCustomAttributesToModel($attributesAsArray, $this->model);
         $this->assertEquals(
-            $addedAttributes,
+            [],
             $this->model->getCustomAttributes(),
             'Custom attributes retrieved from the model using getCustomAttributes() are invalid.'
         );
@@ -152,15 +156,13 @@ class AbstractExtensibleModelTest extends \PHPUnit_Framework_TestCase
         ];
         $modelData = ['key1' => 'value1', 'key2' => 222];
         $this->model->setData($modelData);
-        $addedAttributes = $this->addCustomAttributesToModel($attributesAsArray, $this->model);
-        $modelDataAsFlatArray = array_merge($modelData, $addedAttributes);
-        unset($modelDataAsFlatArray['invalid']);
+        $this->addCustomAttributesToModel($attributesAsArray, $this->model);
         $this->assertEquals(
-            $modelDataAsFlatArray,
+            $modelData,
             $this->model->getData(),
             'All model data should be represented as a flat array, including custom attributes.'
         );
-        foreach ($modelDataAsFlatArray as $field => $value) {
+        foreach ($modelData as $field => $value) {
             $this->assertEquals(
                 $value,
                 $this->model->getData($field),
@@ -174,7 +176,7 @@ class AbstractExtensibleModelTest extends \PHPUnit_Framework_TestCase
      */
     public function testRestrictedCustomAttributesGet()
     {
-        $this->model->getData(\Magento\Framework\Api\ExtensibleDataInterface::CUSTOM_ATTRIBUTES);
+        $this->model->getData(\Magento\Framework\Api\CustomAttributesDataInterface::CUSTOM_ATTRIBUTES);
     }
 
     public function testSetCustomAttributesAsLiterals()
@@ -184,18 +186,18 @@ class AbstractExtensibleModelTest extends \PHPUnit_Framework_TestCase
         $attributeMock = $this->getMockBuilder('\Magento\Framework\Api\AttributeValue')
             ->disableOriginalConstructor()
             ->getMock();
-        $attributeMock->expects($this->once())
+        $attributeMock->expects($this->never())
             ->method('setAttributeCode')
             ->with($attributeCode)
             ->will($this->returnSelf());
-        $attributeMock->expects($this->once())
+        $attributeMock->expects($this->never())
             ->method('setValue')
             ->with($attributeValue)
             ->will($this->returnSelf());
-        $this->attributeValueFactoryMock->expects($this->once())->method('create')
+        $this->attributeValueFactoryMock->expects($this->never())->method('create')
             ->willReturn($attributeMock);
         $this->model->setData(
-            \Magento\Framework\Api\ExtensibleDataInterface::CUSTOM_ATTRIBUTES,
+            \Magento\Framework\Api\CustomAttributesDataInterface::CUSTOM_ATTRIBUTES,
             [$attributeCode => $attributeValue]
         );
     }
@@ -219,7 +221,7 @@ class AbstractExtensibleModelTest extends \PHPUnit_Framework_TestCase
         $model->setData(
             array_merge(
                 $model->getData(),
-                [\Magento\Framework\Api\ExtensibleDataInterface::CUSTOM_ATTRIBUTES => $addedAttributes]
+                [\Magento\Framework\Api\CustomAttributesDataInterface::CUSTOM_ATTRIBUTES => $addedAttributes]
             )
         );
         return $addedAttributes;
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/Collection/AbstractCollectionTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/Collection/AbstractCollectionTest.php
index e0dcd8a6d4da249be3d1d5ddfbbc90f56cb799c1..9d4540a26e896351957dd9bf08dd49454dfd842e 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/Collection/AbstractCollectionTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/Collection/AbstractCollectionTest.php
@@ -12,6 +12,9 @@ use Magento\Framework\Model\Resource\Db\Collection\AbstractCollection;
 use Magento\Framework\Object as MagentoObject;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class AbstractCollectionTest extends \PHPUnit_Framework_TestCase
 {
     const TABLE_NAME = 'some_table';
@@ -78,6 +81,14 @@ class AbstractCollectionTest extends \PHPUnit_Framework_TestCase
         $this->uut = $this->getUut();
     }
 
+    protected function tearDown()
+    {
+        parent::tearDown();
+        $magentoObjectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER);
+        $objectManager = $magentoObjectManagerFactory->create($_SERVER);
+        \Magento\Framework\App\ObjectManager::setInstance($objectManager);
+    }
+
     protected function getUut()
     {
         return $this->objectManagerHelper->getObject(
diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Converter.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Converter.php
index e2bca1d2086337a2a55a84c807024497fbc51107..65b02d8afce7189b5e4a912e2c3664c247f75276 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Converter.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Converter.php
@@ -47,8 +47,7 @@ class Converter extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getFactoryPropertyName()
     {
-        $parts = explode('\\', ltrim($this->_getSourceClassName(), '\\'));
-        return lcfirst(end($parts)) . 'Factory';
+        return lcfirst($this->getSourceClassNameWithoutNamespace()) . 'Factory';
     }
 
     /**
@@ -58,7 +57,7 @@ class Converter extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getFactoryClass()
     {
-        return $this->_getSourceClassName() . 'Factory';
+        return $this->getSourceClassName() . 'Factory';
     }
 
     /**
@@ -84,7 +83,7 @@ class Converter extends \Magento\Framework\Code\Generator\EntityAbstract
                 'tags' => [
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName()
+                        'description' => $this->getSourceClassName()
                             . " \$" . $this->_getFactoryPropertyName(),
                     ],
                 ],
@@ -121,7 +120,7 @@ class Converter extends \Magento\Framework\Code\Generator\EntityAbstract
                     ],
                     [
                         'name' => 'return',
-                        'description' => $this->_getSourceClassName()
+                        'description' => $this->getSourceClassName()
                     ],
                 ],
             ],
@@ -138,7 +137,7 @@ class Converter extends \Magento\Framework\Code\Generator\EntityAbstract
             return false;
         }
 
-        $sourceClassName = $this->_getSourceClassName();
+        $sourceClassName = $this->getSourceClassName();
         $resultClassName = $this->_getResultClassName();
 
         if ($resultClassName !== $sourceClassName . 'Converter') {
diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Factory.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Factory.php
index 33a4e7ee10f7add76fb93baca44b46daa3c871fa..ee28a12c169a83a19fda2db50adf4a5993aae6ee 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Factory.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Factory.php
@@ -44,7 +44,7 @@ class Factory extends \Magento\Framework\Code\Generator\EntityAbstract
             'name' => '__construct',
             'parameters' => [
                 ['name' => 'objectManager', 'type' => '\Magento\Framework\ObjectManagerInterface'],
-                ['name' => 'instanceName', 'defaultValue' => $this->_getSourceClassName()],
+                ['name' => 'instanceName', 'defaultValue' => $this->getSourceClassName()],
             ],
             'body' => "\$this->_objectManager = \$objectManager;\n\$this->_instanceName = \$instanceName;",
             'docblock' => [
@@ -80,7 +80,7 @@ class Factory extends \Magento\Framework\Code\Generator\EntityAbstract
                     ['name' => 'param', 'description' => 'array $data'],
                     [
                         'name' => 'return',
-                        'description' => $this->_getSourceClassName()
+                        'description' => $this->getSourceClassName()
                     ],
                 ],
             ],
@@ -97,7 +97,7 @@ class Factory extends \Magento\Framework\Code\Generator\EntityAbstract
         $result = parent::_validateData();
 
         if ($result) {
-            $sourceClassName = $this->_getSourceClassName();
+            $sourceClassName = $this->getSourceClassName();
             $resultClassName = $this->_getResultClassName();
 
             if ($resultClassName !== $sourceClassName . 'Factory') {
diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Persistor.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Persistor.php
index 9b83cb681d80177ceed23136ae93038d4915c078..8c54a7c689a0ee6e3eb11eb1ef1922463a0a0860 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Persistor.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Persistor.php
@@ -34,7 +34,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
                     'tags' => [
                         [
                             'name' => 'var',
-                            'description' => $this->_getSourceClassName() . 'Factory',
+                            'description' => $this->getSourceClassName() . 'Factory',
                         ],
                     ],
                 ],
@@ -117,8 +117,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getSourceFactoryPropertyName()
     {
-        $parts = explode('\\', ltrim($this->_getSourceClassName(), '\\'));
-        return lcfirst(end($parts)) . 'Factory';
+        return lcfirst($this->getSourceClassNameWithoutNamespace()) . 'Factory';
     }
 
     /**
@@ -127,8 +126,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getSourceResourcePropertyName() // InvoiceResource
     {
-        $parts = explode('\\', ltrim($this->_getSourceClassName(), '\\'));
-        return lcfirst(end($parts)) . "Resource";
+        return lcfirst($this->getSourceClassNameWithoutNamespace()) . "Resource";
     }
 
     /**
@@ -138,7 +136,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getSourceResourceClassName() // Invoice\Resource
     {
-        $temporary = str_replace('\\Api\\Data\\', '\\Model\\Spi\\', $this->_getSourceClassName());
+        $temporary = str_replace('\\Api\\Data\\', '\\Model\\Spi\\', $this->getSourceClassName());
         $parts = explode('\\', ltrim($temporary, '\\'));
         $className = array_pop($parts);
         $className = str_replace('Interface', '', $className);
@@ -180,7 +178,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
                 ],
                 [
                     'name' => $this->_getSourceFactoryPropertyName(),
-                    'type' => $this->_getSourceClassName() . 'Factory'
+                    'type' => $this->getSourceClassName() . 'Factory'
                 ],
                 [
                     'name' => 'resource',
@@ -205,7 +203,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
                     ],
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . 'Factory'
+                        'description' => $this->getSourceClassName() . 'Factory'
                             . " \$" . $this->_getSourceFactoryPropertyName()
                     ],
                     [
@@ -295,7 +293,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
             'parameters' => [
                 [
                     'name' => 'entity',
-                    'type' => $this->_getSourceClassName(),
+                    'type' => $this->getSourceClassName(),
                 ],
             ],
             'body' => $body,
@@ -304,7 +302,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
                 'tags' => [
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . " \$entity",
+                        'description' => $this->getSourceClassName() . " \$entity",
                     ],
                 ],
             ]
@@ -388,7 +386,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
             'parameters' => [
                 [
                     'name' => 'entity',
-                    'type' => $this->_getSourceClassName(),
+                    'type' => $this->getSourceClassName(),
                 ],
             ],
             'body' => $body,
@@ -397,7 +395,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
                 'tags' => [
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . " \$entity",
+                        'description' => $this->getSourceClassName() . " \$entity",
                     ],
                 ],
             ]
@@ -431,7 +429,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
                     ],
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . " \$entity",
+                        'description' => $this->getSourceClassName() . " \$entity",
                     ],
                 ],
             ]
@@ -457,7 +455,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
             'parameters' => [
                 [
                     'name' => 'entity',
-                    'type' => $this->_getSourceClassName(),
+                    'type' => $this->getSourceClassName(),
                 ],
             ],
             'body' => $body,
@@ -467,7 +465,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
 
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . " \$entity",
+                        'description' => $this->getSourceClassName() . " \$entity",
                     ],
                 ],
             ]
@@ -482,7 +480,7 @@ class Persistor extends \Magento\Framework\Code\Generator\EntityAbstract
         $result = parent::_validateData();
 
         if ($result) {
-            $sourceClassName = $this->_getSourceClassName();
+            $sourceClassName = $this->getSourceClassName();
             $resultClassName = $this->_getResultClassName();
 
             if ($resultClassName !== $sourceClassName . 'Persistor') {
diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Proxy.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Proxy.php
index e09dcef74ac47445da2b4672d771539986110128..82686165132f8367f7999972af0e51c238e2cc8b 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Proxy.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Proxy.php
@@ -47,7 +47,7 @@ class Proxy extends \Magento\Framework\Code\Generator\EntityAbstract
             'visibility' => 'protected',
             'docblock' => [
                 'shortDescription' => 'Proxied instance',
-                'tags' => [['name' => 'var', 'description' => $this->_getSourceClassName()]],
+                'tags' => [['name' => 'var', 'description' => $this->getSourceClassName()]],
             ],
         ];
 
@@ -101,10 +101,10 @@ class Proxy extends \Magento\Framework\Code\Generator\EntityAbstract
             "return \$this->_subject;",
             'docblock' => [
                 'shortDescription' => 'Get proxied instance',
-                'tags' => [['name' => 'return', 'description' => $this->_getSourceClassName()]],
+                'tags' => [['name' => 'return', 'description' => $this->getSourceClassName()]],
             ],
         ];
-        $reflectionClass = new \ReflectionClass($this->_getSourceClassName());
+        $reflectionClass = new \ReflectionClass($this->getSourceClassName());
         $publicMethods = $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC);
         foreach ($publicMethods as $method) {
             if (!($method->isConstructor() ||
@@ -127,7 +127,7 @@ class Proxy extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _generateCode()
     {
-        $typeName = $this->_getSourceClassName();
+        $typeName = $this->getSourceClassName();
         $reflection = new \ReflectionClass($typeName);
 
         if ($reflection->isInterface()) {
@@ -181,7 +181,7 @@ class Proxy extends \Magento\Framework\Code\Generator\EntityAbstract
             'name' => '__construct',
             'parameters' => [
                 ['name' => 'objectManager', 'type' => '\Magento\Framework\ObjectManagerInterface'],
-                ['name' => 'instanceName', 'defaultValue' => $this->_getSourceClassName()],
+                ['name' => 'instanceName', 'defaultValue' => $this->getSourceClassName()],
                 ['name' => 'shared', 'defaultValue' => true],
             ],
             'body' => "\$this->_objectManager = \$objectManager;" .
@@ -225,7 +225,7 @@ class Proxy extends \Magento\Framework\Code\Generator\EntityAbstract
     {
         $result = parent::_validateData();
         if ($result) {
-            $sourceClassName = $this->_getSourceClassName();
+            $sourceClassName = $this->getSourceClassName();
             $resultClassName = $this->_getResultClassName();
 
             if ($resultClassName !== $sourceClassName . '\\Proxy') {
diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php
index ce047eb4a6f693d23df1459070ba981e9c82fd34..22857fcf9bcfae8bfe3f0de7f675263cfdae33ee 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php
@@ -64,7 +64,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                 'visibility' => 'protected',
                 'defaultValue' => [],
                 'docblock' => [
-                    'shortDescription' => $this->_getSourceClassName() . '[]',
+                    'shortDescription' => $this->getSourceClassName() . '[]',
                     'tags' => [
                         [
                             'name' => 'var',
@@ -84,8 +84,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getSourcePersistorPropertyName()
     {
-        $parts = explode('\\', ltrim($this->_getSourceClassName(), '\\'));
-        return lcfirst(end($parts)) . 'Persistor';
+        return lcfirst($this->getSourceClassNameWithoutNamespace()) . 'Persistor';
     }
 
     /**
@@ -94,8 +93,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getSourceCollectionFactoryPropertyName()
     {
-        $parts = explode('\\', ltrim($this->_getSourceClassName(), '\\'));
-        return lcfirst(end($parts)) . 'SearchResultFactory';
+        return lcfirst($this->getSourceClassNameWithoutNamespace()) . 'SearchResultFactory';
     }
 
     /**
@@ -106,7 +104,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
     protected function _getCollectionFactoryClassName()
     {
         return
-            str_replace('Interface', '', $this->_getSourceClassName()) . 'SearchResultInterfaceFactory';
+            str_replace('Interface', '', $this->getSourceClassName()) . 'SearchResultInterfaceFactory';
     }
     /**
      * Returns source persistor class name
@@ -115,7 +113,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _getPersistorClassName()
     {
-        $target = $this->_getSourceClassName();
+        $target = $this->getSourceClassName();
 //        if (substr($target, -9) == 'Interface') {
 //            $target = substr($target, 1, strlen($target) -9);
 //        }
@@ -153,7 +151,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                 'tags' => [
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . " \$" . $this->_getSourcePersistorPropertyName(),
+                        'description' => $this->getSourceClassName() . " \$" . $this->_getSourcePersistorPropertyName(),
                     ],
                     [
                         'name' => 'param',
@@ -202,7 +200,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                     ],
                     [
                         'name' => 'return',
-                        'description' => $this->_getSourceClassName(),
+                        'description' => $this->getSourceClassName(),
                     ],
                     [
                         'name' => 'throws',
@@ -263,7 +261,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
             'parameters' => [
                 [
                     'name' => 'entity',
-                    'type' => $this->_getSourceClassName(),
+                    'type' => $this->getSourceClassName(),
                 ],
             ],
             'body' => $body,
@@ -276,7 +274,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                     ],
                     [
                         'name' => 'return',
-                        'description' => $this->_getSourceClassName(),
+                        'description' => $this->getSourceClassName(),
                     ],
                 ],
             ]
@@ -319,7 +317,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
             'parameters' => [
                 [
                     'name' => 'entity',
-                    'type' => $this->_getSourceClassName(),
+                    'type' => $this->getSourceClassName(),
                 ],
             ],
             'body' => $body,
@@ -328,11 +326,11 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                 'tags' => [
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . " \$entity",
+                        'description' => $this->getSourceClassName() . " \$entity",
                     ],
                     [
                         'name' => 'return',
-                        'description' => $this->_getSourceClassName(),
+                        'description' => $this->getSourceClassName(),
                     ],
                 ],
             ]
@@ -353,7 +351,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
             'parameters' => [
                 [
                     'name' => 'entity',
-                    'type' => $this->_getSourceClassName(),
+                    'type' => $this->getSourceClassName(),
                 ],
             ],
             'body' => $body,
@@ -362,7 +360,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                 'tags' => [
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . ' $entity',
+                        'description' => $this->getSourceClassName() . ' $entity',
                     ],
                 ],
             ]
@@ -413,7 +411,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
             'parameters' => [
                 [
                     'name' => 'entity',
-                    'type' => $this->_getSourceClassName(),
+                    'type' => $this->getSourceClassName(),
                 ],
             ],
             'body' => $body,
@@ -422,7 +420,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                 'tags' => [
                     [
                         'name' => 'param',
-                        'description' => $this->_getSourceClassName() . ' $entity',
+                        'description' => $this->getSourceClassName() . ' $entity',
                     ],
                 ],
             ]
@@ -464,7 +462,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
                     ],
                     [
                         'name' => 'return',
-                        'description' => $this->_getSourceClassName() . '[]',
+                        'description' => $this->getSourceClassName() . '[]',
                     ],
                 ],
             ]
@@ -500,7 +498,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
         $result = parent::_validateData();
 
         if ($result) {
-            $sourceClassName = $this->_getSourceClassName();
+            $sourceClassName = $this->getSourceClassName();
             $resultClassName = $this->_getResultClassName();
 
             if ($resultClassName !== str_replace('Interface', '', $sourceClassName) . '\\Repository') {
@@ -520,7 +518,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _generateCode()
     {
-        $className = str_replace('Interface', '', str_replace('Data\\', '', $this->_getSourceClassName()));
+        $className = str_replace('Interface', '', str_replace('Data\\', '', $this->getSourceClassName()));
         $this->_classGenerator->setName(
             $this->_getResultClassName()
         )->addProperties(
@@ -542,8 +540,8 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
      *
      * @return string
      */
-    protected function _getSourceClassName()
+    public function getSourceClassName()
     {
-        return parent::_getSourceClassName() . 'Interface';
+        return parent::getSourceClassName() . 'Interface';
     }
 }
diff --git a/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php b/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php
index 626dbd548aab0f5a369f8dffd3cebe683598a27b..00aac17d300ed3522a3c1f0726186622a594875f 100644
--- a/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php
+++ b/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php
@@ -21,7 +21,8 @@ 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\ObjectExtensionInterface;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
+use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -66,6 +67,11 @@ class DefinitionFactory
         Serialized::MODE_NAME => '\Magento\Framework\ObjectManager\Definition\Compiled\Serialized',
     ];
 
+    /**
+     * @var \Magento\Framework\Code\Generator
+     */
+    protected $codeGenerator;
+
     /**
      * @param DriverInterface $filesystemDriver
      * @param string $definitionDir
@@ -95,26 +101,7 @@ class DefinitionFactory
             $definitionModel = $this->_definitionClasses[$this->_definitionFormat];
             $result = new $definitionModel($definitions);
         } else {
-            $generatorIo = new \Magento\Framework\Code\Generator\Io(
-                $this->_filesystemDriver,
-                $this->_generationDir
-            );
-            $generator = new \Magento\Framework\Code\Generator(
-                $generatorIo,
-                [
-                    Generator\Factory::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Factory',
-                    Generator\Proxy::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Proxy',
-                    Generator\Repository::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Repository',
-                    Generator\Persistor::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Persistor',
-                    InterceptionGenerator\Interceptor::ENTITY_TYPE => '\Magento\Framework\Interception\Code\Generator\Interceptor',
-                    MapperGenerator::ENTITY_TYPE => '\Magento\Framework\Api\Code\Generator\Mapper',
-                    SearchResults::ENTITY_TYPE => '\Magento\Framework\Api\Code\Generator\SearchResults',
-                    ConverterGenerator::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Converter',
-                    ProfilerGenerator\Logger::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Profiler\Code\Generator\Logger',
-                    ObjectExtensionInterface::ENTITY_TYPE =>
-                        'Magento\Framework\Api\Code\Generator\ObjectExtensionInterface'                ]
-            );
-            $autoloader = new \Magento\Framework\Code\Generator\Autoloader($generator);
+            $autoloader = new \Magento\Framework\Code\Generator\Autoloader($this->getCodeGenerator());
             spl_autoload_register([$autoloader, 'load']);
 
             $result = new Runtime();
@@ -167,4 +154,36 @@ class DefinitionFactory
         $extractor = $this->_definitionFormat == Binary::MODE_NAME ? 'igbinary_unserialize' : 'unserialize';
         return $extractor($definitions);
     }
+
+    /**
+     * Get existing code generator. Instantiate a new one if it does not exist yet.
+     *
+     * @return \Magento\Framework\Code\Generator
+     */
+    public function getCodeGenerator()
+    {
+        if (!$this->codeGenerator) {
+            $generatorIo = new \Magento\Framework\Code\Generator\Io(
+                $this->_filesystemDriver,
+                $this->_generationDir
+            );
+            $this->codeGenerator = new \Magento\Framework\Code\Generator(
+                $generatorIo,
+                [
+                    Generator\Factory::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Factory',
+                    Generator\Proxy::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Proxy',
+                    Generator\Repository::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Repository',
+                    Generator\Persistor::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Persistor',
+                    InterceptionGenerator\Interceptor::ENTITY_TYPE => '\Magento\Framework\Interception\Code\Generator\Interceptor',
+                    MapperGenerator::ENTITY_TYPE => '\Magento\Framework\Api\Code\Generator\Mapper',
+                    SearchResults::ENTITY_TYPE => '\Magento\Framework\Api\Code\Generator\SearchResults',
+                    ConverterGenerator::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Converter',
+                    ProfilerGenerator\Logger::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Profiler\Code\Generator\Logger',
+                    ExtensionAttributesGenerator::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator',
+                    ExtensionAttributesInterfaceGenerator::ENTITY_TYPE => 'Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator'
+                ]
+            );
+        }
+        return $this->codeGenerator;
+    }
 }
diff --git a/lib/internal/Magento/Framework/ObjectManager/Profiler/Code/Generator/Logger.php b/lib/internal/Magento/Framework/ObjectManager/Profiler/Code/Generator/Logger.php
index c30507a345a4225b46c4c272dcee7a4e243c390a..c8336a6ad15eb52152b7ab41e77c6cbef5d78182 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Profiler/Code/Generator/Logger.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Profiler/Code/Generator/Logger.php
@@ -116,7 +116,7 @@ class Logger extends \Magento\Framework\Code\Generator\EntityAbstract
                 . "\n\$this->log->add(\$this->subject);",
         ];
 
-        $reflectionClass = new \ReflectionClass($this->_getSourceClassName());
+        $reflectionClass = new \ReflectionClass($this->getSourceClassName());
         $publicMethods   = $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC);
         foreach ($publicMethods as $method) {
             if (!($method->isConstructor() || $method->isFinal() || $method->isStatic() || $method->isDestructor())
@@ -183,7 +183,7 @@ class Logger extends \Magento\Framework\Code\Generator\EntityAbstract
      */
     protected function _generateCode()
     {
-        $typeName = $this->_getSourceClassName();
+        $typeName = $this->getSourceClassName();
         $reflection = new \ReflectionClass($typeName);
 
         if ($reflection->isInterface()) {
@@ -202,7 +202,7 @@ class Logger extends \Magento\Framework\Code\Generator\EntityAbstract
         $result = parent::_validateData();
 
         if ($result) {
-            $sourceClassName = $this->_getSourceClassName();
+            $sourceClassName = $this->getSourceClassName();
             $resultClassName = $this->_getResultClassName();
 
             if ($resultClassName !== $sourceClassName . '\\Logger') {
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Mapper/_files/mapped_simple_di_config.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Mapper/_files/mapped_simple_di_config.php
index 88bce3e3a2a3aa0ce8fcf8cbb8220cd31b3ba8cf..c3eeeabb3125d93bc74abb10f3aff6141edfd376 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Mapper/_files/mapped_simple_di_config.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Mapper/_files/mapped_simple_di_config.php
@@ -9,17 +9,17 @@ return [
         'Magento\Framework\App\RequestInterface' => 'Magento\Framework\App\Request\Http\Proxy',
     ],
     'Magento\Framework\App\State' => ['arguments' => ['test name' => 'test value']],
-    'Magento\Core\Model\Config\Modules' => [
+    'Magento\Config\Model\Config\Modules' => [
         'arguments' => ['test name' => 'test value'],
         'plugins' => [
             'simple_modules_plugin' => [
                 'sortOrder' => 10,
                 'disabled' => true,
-                'instance' => 'Magento\Core\Model\Config\Modules\Plugin',
+                'instance' => 'Magento\Config\Model\Config\Modules\Plugin',
             ],
             'simple_modules_plugin_advanced' => [
                 'sortOrder' => 0,
-                'instance' => 'Magento\Core\Model\Config\Modules\PluginAdvanced',
+                'instance' => 'Magento\Config\Model\Config\Modules\PluginAdvanced',
             ],
             'overridden_plugin' => ['sortOrder' => 30, 'disabled' => true],
         ],
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Mapper/_files/simple_di_config.xml b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Mapper/_files/simple_di_config.xml
index 823fd9b38f6de60b756eafe7087cbebcc47e7986..d930f3dadf451c56bcaea24e5dab4060faba8e01 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Mapper/_files/simple_di_config.xml
+++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Mapper/_files/simple_di_config.xml
@@ -16,12 +16,12 @@
         </arguments>
     </type>
     <!--Arguments and plugins-->
-    <type name="Magento\Core\Model\Config\Modules">
+    <type name="Magento\Config\Model\Config\Modules">
         <arguments>
             <argument name="test name" xsi:type="string">test value</argument>
         </arguments>
-        <plugin name="simple_modules_plugin" type="Magento\Core\Model\Config\Modules\Plugin" disabled="true" sortOrder="10" />
-        <plugin name="simple_modules_plugin_advanced" type="Magento\Core\Model\Config\Modules\PluginAdvanced" />
+        <plugin name="simple_modules_plugin" type="Magento\Config\Model\Config\Modules\Plugin" disabled="true" sortOrder="10" />
+        <plugin name="simple_modules_plugin_advanced" type="Magento\Config\Model\Config\Modules\PluginAdvanced" />
         <plugin name="overridden_plugin" sortOrder="30" disabled="true" />
     </type>
     <!--Unshared type-->
diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/RuntimeTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/RuntimeTest.php
index 7309a4b1a67ba16f2c83524882f9427c6aedaf54..3fde1b24d33603ef8159914db3ec962de5c9299b 100644
--- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/RuntimeTest.php
+++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/RuntimeTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\ObjectManager\Test\Unit\Relations;
 
 require_once __DIR__ . '/../_files/Child.php';
@@ -36,4 +39,25 @@ class RuntimeTest extends \PHPUnit_Framework_TestCase
             ['Magento\Test\Di\Child', ['Magento\Test\Di\DiParent', 'Magento\Test\Di\ChildInterface']]
         ];
     }
+
+    /**
+     * @param $entity
+     * @expectedException  \Magento\Framework\Exception
+     * @dataProvider nonExistentGeneratorsDataProvider
+     */
+    public function testHasIfNonExists($entity)
+    {
+        $this->_model->has($entity);
+    }
+
+    public function nonExistentGeneratorsDataProvider()
+    {
+        return [
+            ['Magento\Test\Module\Model\Item\Factory'],
+            ['Magento\Test\Module\Model\Item\Proxy'],
+            ['Magento\Test\Module\Model\Item\Interceptor'],
+            ['Magento\Test\Module\Model\Item\Mapper'],
+            ['Magento\Test\Module\Model\Item\SearchResults']
+        ];
+    }
 }
diff --git a/lib/internal/Magento/Framework/Reflection/DataObjectProcessor.php b/lib/internal/Magento/Framework/Reflection/DataObjectProcessor.php
index c1d58952de1c9d4006c947a6fa34de1aeb427f48..2b9977d7355f565e808b15cc539c7c892f38afa6 100644
--- a/lib/internal/Magento/Framework/Reflection/DataObjectProcessor.php
+++ b/lib/internal/Magento/Framework/Reflection/DataObjectProcessor.php
@@ -8,7 +8,7 @@ namespace Magento\Framework\Reflection;
 
 use Magento\Framework\Phrase;
 use Magento\Framework\Api\AttributeValue;
-use Magento\Framework\Api\ExtensibleDataInterface;
+use Magento\Framework\Api\CustomAttributesDataInterface;
 use Magento\Framework\Api\SimpleDataObjectConverter;
 use Zend\Code\Reflection\ClassReflection;
 use Zend\Code\Reflection\MethodReflection;
@@ -108,7 +108,7 @@ class DataObjectProcessor
                     continue;
                 }
                 $key = SimpleDataObjectConverter::camelCaseToSnakeCase(substr($methodName, 3));
-                if ($key === ExtensibleDataInterface::CUSTOM_ATTRIBUTES) {
+                if ($key === CustomAttributesDataInterface::CUSTOM_ATTRIBUTES) {
                     $value = $this->convertCustomAttributes($value, $dataObjectType);
                 } elseif (is_object($value) && !($value instanceof Phrase)) {
                     $value = $this->buildOutputDataArray($value, $returnType);
@@ -304,10 +304,7 @@ class DataObjectProcessor
         $isSuitableMethodType = !($method->isConstructor() || $method->isFinal()
             || $method->isStatic() || $method->isDestructor());
 
-        $isExcludedMagicMethod = in_array(
-            $method->getName(),
-            ['__sleep', '__wakeup', '__clone']
-        );
+        $isExcludedMagicMethod = strpos($method->getName(), '__') === 0;
         return $isSuitableMethodType && !$isExcludedMagicMethod;
     }
 }
diff --git a/lib/internal/Magento/Framework/Reflection/Test/Unit/TypeProcessorTest.php b/lib/internal/Magento/Framework/Reflection/Test/Unit/TypeProcessorTest.php
index 8c76aa868b989b83c6657db57852595e2244327c..f1c0066f344cc0380822aea8302c6a5c987424f9 100644
--- a/lib/internal/Magento/Framework/Reflection/Test/Unit/TypeProcessorTest.php
+++ b/lib/internal/Magento/Framework/Reflection/Test/Unit/TypeProcessorTest.php
@@ -3,6 +3,7 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+// @codingStandardsIgnoreStart
 namespace Magento\Framework\Reflection\Test\Unit;
 
 use Zend\Code\Reflection\ClassReflection;
diff --git a/lib/internal/Magento/Framework/Reflection/TypeProcessor.php b/lib/internal/Magento/Framework/Reflection/TypeProcessor.php
index af9fb25ea4212c792dd943ab3781bae47a3c2eae..7a2f5f2dd2f137d5996dfc130649842f1300388c 100644
--- a/lib/internal/Magento/Framework/Reflection/TypeProcessor.php
+++ b/lib/internal/Magento/Framework/Reflection/TypeProcessor.php
@@ -242,11 +242,17 @@ class TypeProcessor
     {
         $methodDocBlock = $methodReflection->getDocBlock();
         if (!$methodDocBlock) {
-            throw new \InvalidArgumentException('Each getter must have description with @return annotation.');
+            throw new \InvalidArgumentException(
+                "Each getter must have description with @return annotation. "
+                . "See {$methodReflection->getDeclaringClass()->getName()}::{$methodReflection->getName()}()"
+            );
         }
         $returnAnnotations = $methodDocBlock->getTags('return');
         if (empty($returnAnnotations)) {
-            throw new \InvalidArgumentException('Getter return type must be specified using @return annotation.');
+            throw new \InvalidArgumentException(
+                "Getter return type must be specified using @return annotation. "
+                . "See {$methodReflection->getDeclaringClass()->getName()}::{$methodReflection->getName()}()"
+            );
         }
         /** @var \Zend\Code\Reflection\DocBlock\Tag\ReturnTag $returnAnnotation */
         $returnAnnotation = current($returnAnnotations);
@@ -435,7 +441,7 @@ class TypeProcessor
         } elseif ($isArrayType && is_null($value)) {
             return null;
         } elseif (!$isArrayType && !is_array($value)) {
-            if ($value !== null && $type !== self::ANY_TYPE && !settype($value, $type)) {
+            if ($value !== null && $type !== self::ANY_TYPE && !$this->setType($value, $type)) {
                 throw new SerializationException(
                     new Phrase(
                         SerializationException::TYPE_MISMATCH,
@@ -447,7 +453,7 @@ class TypeProcessor
             throw new SerializationException(
                 new Phrase(
                     SerializationException::TYPE_MISMATCH,
-                    ['value' => (string)$value, 'type' => $type]
+                    ['value' => gettype($value), 'type' => $type]
                 )
             );
         }
@@ -503,6 +509,24 @@ class TypeProcessor
         return $methodName;
     }
 
+    /**
+     * Set value to a particular type
+     *
+     * @param mixed $value
+     * @param string $type
+     * @return true on successful type cast
+     */
+    protected function setType(&$value, $type)
+    {
+        // settype doesn't work for boolean string values.
+        // ex: custom_attributes passed from SOAP client can have boolean values as string
+        if ($type == 'bool' || $type == 'boolean') {
+            $value = filter_var($value, FILTER_VALIDATE_BOOLEAN);
+            return true;
+        }
+        return settype($value, $type);
+    }
+
     /**
      * Find the setter method name for a property from the given class
      *
diff --git a/lib/internal/Magento/Framework/Session/SaveHandler/DbTable.php b/lib/internal/Magento/Framework/Session/SaveHandler/DbTable.php
index 5d05e5ffbe9c388015ef853c1ccee955b30eae87..b9e9b8a27aa94186ac3a9bb24522d571ecfa3ace 100644
--- a/lib/internal/Magento/Framework/Session/SaveHandler/DbTable.php
+++ b/lib/internal/Magento/Framework/Session/SaveHandler/DbTable.php
@@ -31,7 +31,7 @@ class DbTable extends \SessionHandler
      */
     public function __construct(\Magento\Framework\App\Resource $resource)
     {
-        $this->_sessionTable = $resource->getTableName('core_session');
+        $this->_sessionTable = $resource->getTableName('session');
         $this->_write = $resource->getConnection('core_write');
         $this->checkConnection();
     }
diff --git a/lib/internal/Magento/Framework/Test/Unit/Translate/Js/ConfigTest.php b/lib/internal/Magento/Framework/Test/Unit/Translate/Js/ConfigTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2dcba665cde41cda8ff2f05642d8c0761d8ca1c
--- /dev/null
+++ b/lib/internal/Magento/Framework/Test/Unit/Translate/Js/ConfigTest.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Test\Unit\Translate\Js;
+
+use Magento\Framework\Translate\Js\Config;
+
+/**
+ * Class ConfigTest
+ */
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @return void
+     */
+    public function testDefault()
+    {
+        $config = new Config();
+        $this->assertFalse($config->dictionaryEnabled());
+        $this->assertNull($config->getDictionaryFileName());
+    }
+
+    /**
+     * @return void
+     */
+    public function testCustom()
+    {
+        $path = 'path';
+        $config = new Config(true, $path);
+        $this->assertTrue($config->dictionaryEnabled());
+        $this->assertEquals($path, $config->getDictionaryFileName());
+    }
+}
diff --git a/lib/internal/Magento/Framework/Test/Unit/View/Asset/SourceTest.php b/lib/internal/Magento/Framework/Test/Unit/View/Asset/SourceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1d22dca5d9a9692a2c8fed68235edee03e965f7
--- /dev/null
+++ b/lib/internal/Magento/Framework/Test/Unit/View/Asset/SourceTest.php
@@ -0,0 +1,285 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+// @codingStandardsIgnoreFile
+
+namespace Magento\Framework\Test\Unit\View\Asset;
+
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\Filesystem\DriverPool;
+use Magento\Framework\View\Asset\Source;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class SourceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Framework\Filesystem|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $filesystem;
+
+    /**
+     * @var \Magento\Framework\Filesystem\Directory\ReadInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $rootDirRead;
+
+    /**
+     * @var \Magento\Framework\Filesystem\Directory\WriteInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $varDir;
+
+    /**
+     * @var \Magento\Framework\Filesystem\Directory\WriteInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $staticDirRead;
+
+    /**
+     * @var \Magento\Framework\View\Asset\PreProcessor\Cache|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $cache;
+
+    /**
+     * @var \Magento\Framework\View\Asset\PreProcessor\Pool|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $preProcessorPool;
+
+    /**
+     * @var \Magento\Framework\View\Design\FileResolution\Fallback\StaticFile|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $viewFileResolution;
+
+    /**
+     * @var \Magento\Framework\View\Design\ThemeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $theme;
+
+    /**
+     * @var Source
+     */
+    private $object;
+
+    protected function setUp()
+    {
+        $this->cache = $this->getMock(
+            'Magento\Framework\View\Asset\PreProcessor\Cache', [], [], '', false
+        );
+        $this->preProcessorPool = $this->getMock(
+            'Magento\Framework\View\Asset\PreProcessor\Pool', [], [], '', false
+        );
+        $this->viewFileResolution = $this->getMock(
+            'Magento\Framework\View\Design\FileResolution\Fallback\StaticFile', [], [], '', false
+        );
+        $this->theme = $this->getMockForAbstractClass('Magento\Framework\View\Design\ThemeInterface');
+
+        $themeList = $this->getMockForAbstractClass('Magento\Framework\View\Design\Theme\ListInterface');
+        $themeList->expects($this->any())
+            ->method('getThemeByFullPath')
+            ->with('frontend/magento_theme')
+            ->will($this->returnValue($this->theme));
+
+        $this->initFilesystem();
+
+        $this->object = new Source(
+            $this->cache,
+            $this->filesystem,
+            $this->preProcessorPool,
+            $this->viewFileResolution,
+            $themeList
+        );
+    }
+
+    public function testGetFileCached()
+    {
+        $root = '/root/some/file.ext';
+        $expected = '/var/some/file.ext';
+        $filePath = 'some/file.ext';
+        $this->viewFileResolution->expects($this->once())
+            ->method('getFile')
+            ->with('frontend', $this->theme, 'en_US', $filePath, 'Magento_Module')
+            ->will($this->returnValue($root));
+        $this->rootDirRead->expects($this->once())
+            ->method('getRelativePath')
+            ->with($root)
+            ->will($this->returnValue($filePath));
+        $this->cache->expects($this->once())
+            ->method('load')
+            ->with("some/file.ext:{$filePath}")
+            ->will($this->returnValue(serialize([DirectoryList::VAR_DIR, $filePath])));
+
+        $this->varDir->expects($this->once())->method('getAbsolutePath')
+            ->with($filePath)
+            ->will($this->returnValue($expected));
+        $this->assertSame($expected, $this->object->getFile($this->getAsset()));
+    }
+
+    /**
+     * @param string $origFile
+     * @param string $origPath
+     * @param string $origContentType
+     * @param string $origContent
+     * @param string $isMaterialization
+     * @dataProvider getFileDataProvider
+     */
+    public function testGetFile($origFile, $origPath, $origContent, $isMaterialization)
+    {
+        $filePath = 'some/file.ext';
+        $cacheValue = "{$origPath}:{$filePath}";
+        $this->viewFileResolution->expects($this->once())
+            ->method('getFile')
+            ->with('frontend', $this->theme, 'en_US', $filePath, 'Magento_Module')
+            ->will($this->returnValue($origFile));
+        $this->rootDirRead->expects($this->once())
+            ->method('getRelativePath')
+            ->with($origFile)
+            ->will($this->returnValue($origPath));
+        $this->cache->expects($this->once())
+            ->method('load')
+            ->will($this->returnValue(false));
+        $this->rootDirRead->expects($this->once())
+            ->method('readFile')
+            ->with($origPath)
+            ->will($this->returnValue($origContent));
+        $this->preProcessorPool->expects($this->once())
+            ->method('process')
+            ->will($this->returnCallback([$this, 'chainTestCallback']));
+        if ($isMaterialization) {
+            $this->varDir->expects($this->once())
+                ->method('writeFile')
+                ->with('view_preprocessed/source/some/file.ext', 'processed');
+            $this->cache->expects($this->once())
+                ->method('save')
+                ->with(
+                    serialize([DirectoryList::VAR_DIR, 'view_preprocessed/source/some/file.ext']),
+                    $cacheValue
+                );
+            $this->varDir->expects($this->once())
+                ->method('getAbsolutePath')
+                ->with('view_preprocessed/source/some/file.ext')->will($this->returnValue('result'));
+        } else {
+            $this->varDir->expects($this->never())->method('writeFile');
+            $this->cache->expects($this->once())
+                ->method('save')
+                ->with(serialize([DirectoryList::ROOT, 'source/some/file.ext']), $cacheValue);
+            $this->rootDirRead->expects($this->once())
+                ->method('getAbsolutePath')
+                ->with('source/some/file.ext')
+                ->will($this->returnValue('result'));
+        }
+        $this->assertSame('result', $this->object->getFile($this->getAsset()));
+    }
+
+    /**
+     * @param string $path
+     * @param string $expected
+     * @dataProvider getContentTypeDataProvider
+     */
+    public function testGetContentType($path, $expected)
+    {
+        $this->assertEquals($expected, $this->object->getContentType($path));
+    }
+
+    /**
+     * @return array
+     */
+    public function getContentTypeDataProvider()
+    {
+        return [
+            ['', ''],
+            ['path/file', ''],
+            ['path/file.ext', 'ext'],
+        ];
+    }
+
+    /**
+     * A callback for affecting preprocessor chain in the test
+     *
+     * @param \Magento\Framework\View\Asset\PreProcessor\Chain $chain
+     */
+    public function chainTestCallback(\Magento\Framework\View\Asset\PreProcessor\Chain $chain)
+    {
+        $chain->setContentType('ext');
+        $chain->setContent('processed');
+    }
+
+    /**
+     * @return array
+     */
+    public function getFileDataProvider()
+    {
+        return [
+            ['/root/some/file.ext', 'source/some/file.ext', 'processed', false],
+            ['/root/some/file.ext', 'source/some/file.ext', 'not_processed', true],
+            ['/root/some/file.ext2', 'source/some/file.ext2', 'processed', true],
+            ['/root/some/file.ext2', 'source/some/file.ext2', 'not_processed', true],
+        ];
+    }
+
+    protected function initFilesystem()
+    {
+        $this->filesystem = $this->getMock('Magento\Framework\Filesystem', [], [], '', false);
+        $this->rootDirRead = $this->getMockForAbstractClass('Magento\Framework\Filesystem\Directory\ReadInterface');
+        $this->staticDirRead = $this->getMockForAbstractClass('Magento\Framework\Filesystem\Directory\ReadInterface');
+        $this->varDir = $this->getMockForAbstractClass('Magento\Framework\Filesystem\Directory\WriteInterface');
+
+        $readDirMap = [
+            [DirectoryList::ROOT, DriverPool::FILE, $this->rootDirRead],
+            [DirectoryList::STATIC_VIEW, DriverPool::FILE, $this->staticDirRead],
+            [DirectoryList::VAR_DIR, DriverPool::FILE, $this->varDir],
+        ];
+
+        $this->filesystem->expects($this->any())
+            ->method('getDirectoryRead')
+            ->will($this->returnValueMap($readDirMap));
+        $this->filesystem->expects($this->any())
+            ->method('getDirectoryWrite')
+            ->with(DirectoryList::VAR_DIR)
+            ->will($this->returnValue($this->varDir));
+    }
+
+    /**
+     * Create an asset mock
+     *
+     * @param bool $isFallback
+     * @return \Magento\Framework\View\Asset\File|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function getAsset($isFallback = true)
+    {
+        if ($isFallback) {
+            $context = new \Magento\Framework\View\Asset\File\FallbackContext(
+                'http://example.com/static/',
+                'frontend',
+                'magento_theme',
+                'en_US'
+            );
+        } else {
+            $context = new \Magento\Framework\View\Asset\File\Context(
+                'http://example.com/static/',
+                DirectoryList::STATIC_VIEW,
+                ''
+            );
+        }
+
+        $asset = $this->getMock('Magento\Framework\View\Asset\File', [], [], '', false);
+        $asset->expects($this->any())
+            ->method('getContext')
+            ->will($this->returnValue($context));
+        $asset->expects($this->any())
+            ->method('getFilePath')
+            ->will($this->returnValue('some/file.ext'));
+        $asset->expects($this->any())
+            ->method('getPath')
+            ->will($this->returnValue('some/file.ext'));
+        $asset->expects($this->any())
+            ->method('getModule')
+            ->will($this->returnValue('Magento_Module'));
+        $asset->expects($this->any())
+            ->method('getContentType')
+            ->will($this->returnValue('ext'));
+
+        return $asset;
+    }
+}
diff --git a/lib/internal/Magento/Framework/TestFramework/Test/Unit/Unit/Helper/ObjectManagerTest.php b/lib/internal/Magento/Framework/TestFramework/Test/Unit/Unit/Helper/ObjectManagerTest.php
index 58515be62b53e0db573554ee009d1b912819dcd4..d4e50811d7d92598df1588fa0af35359b2879a35 100644
--- a/lib/internal/Magento/Framework/TestFramework/Test/Unit/Unit/Helper/ObjectManagerTest.php
+++ b/lib/internal/Magento/Framework/TestFramework/Test/Unit/Unit/Helper/ObjectManagerTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\TestFramework\Test\Unit\Unit\Helper;
 
 class ObjectManagerTest extends \PHPUnit_Framework_TestCase
@@ -76,7 +79,7 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
             $this->assertAttributeInstanceOf($propertyType, '_' . $propertyName, $model);
         }
 
-        /** @var $resourceMock \Magento\Core\Model\Resource\Resource */
+        /** @var $resourceMock \Magento\Framework\Module\Resource */
         $resourceMock = $this->getMock(
             'Magento\Framework\Module\Resource',
             ['_getReadAdapter', 'getIdFieldName', '__sleep', '__wakeup'],
diff --git a/lib/internal/Magento/Framework/Translate/Js/Config.php b/lib/internal/Magento/Framework/Translate/Js/Config.php
new file mode 100644
index 0000000000000000000000000000000000000000..17ec1bbba4af1057cf68070bbf0a0640c064641f
--- /dev/null
+++ b/lib/internal/Magento/Framework/Translate/Js/Config.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Translate\Js;
+
+/**
+ * Js Translation config
+ */
+class Config
+{
+    /**
+     * Should the framework generate dictionary file
+     *
+     * @var bool
+     */
+    protected $dictionaryEnabled;
+
+    /**
+     * Name of dictionary json file
+     *
+     * @var string
+     */
+    protected $dictionaryFileName;
+
+    /**
+     * @param bool $dictionaryEnabled
+     * @param string $dictionaryFileName
+     */
+    public function __construct($dictionaryEnabled = false, $dictionaryFileName = null)
+    {
+        $this->dictionaryEnabled = $dictionaryEnabled;
+        $this->dictionaryFileName = $dictionaryFileName;
+    }
+
+    /**
+     * Should the framework generate dictionary file
+     *
+     * @return bool
+     */
+    public function dictionaryEnabled()
+    {
+        return $this->dictionaryEnabled;
+    }
+
+    /**
+     * Name of dictionary json file
+     *
+     * @return string
+     */
+    public function getDictionaryFileName()
+    {
+        return $this->dictionaryFileName;
+    }
+}
diff --git a/lib/internal/Magento/Framework/View/Asset/Repository.php b/lib/internal/Magento/Framework/View/Asset/Repository.php
index 4e46b91fba0d65cbbdcafd456b9b6efcb75b4433..fda21b7564074f7412b7430e9927ddef9a64e1bf 100644
--- a/lib/internal/Magento/Framework/View/Asset/Repository.php
+++ b/lib/internal/Magento/Framework/View/Asset/Repository.php
@@ -152,7 +152,7 @@ class Repository
             $module = $params['module'];
         }
         $isSecure = isset($params['_secure']) ? (bool) $params['_secure'] : null;
-        $themePath = $this->design->getThemePath($params['themeModel']);
+        $themePath = isset($params['theme']) ? $params['theme'] : $this->design->getThemePath($params['themeModel']);
         $context = $this->getFallbackContext(
             UrlInterface::URL_TYPE_STATIC,
             $isSecure,
diff --git a/lib/internal/Magento/Framework/View/Asset/Source.php b/lib/internal/Magento/Framework/View/Asset/Source.php
index 747ab55ab07c3d4952587065da0fa6f47841d33a..2518c6973eaf06b14584ed0d435a0dea5ade18b9 100644
--- a/lib/internal/Magento/Framework/View/Asset/Source.php
+++ b/lib/internal/Magento/Framework/View/Asset/Source.php
@@ -129,9 +129,6 @@ class Source
     private function preProcess(LocalInterface $asset)
     {
         $sourceFile = $this->findSourceFile($asset);
-        if (!$sourceFile) {
-            return false;
-        }
         $dirCode = DirectoryList::ROOT;
         $path = $this->rootDir->getRelativePath($sourceFile);
         $cacheId = $path . ':' . $asset->getPath();
@@ -141,7 +138,7 @@ class Source
         }
         $chain = new \Magento\Framework\View\Asset\PreProcessor\Chain(
             $asset,
-            $this->rootDir->readFile($path),
+            $path ? $this->rootDir->readFile($path) : "",
             $this->getContentType($path),
             $path,
             $this->appMode
diff --git a/lib/internal/Magento/Framework/View/Layout/PageType/Config/SchemaLocator.php b/lib/internal/Magento/Framework/View/Layout/PageType/Config/SchemaLocator.php
index 8c3987f63f9e7799f85d23191381bb8fdcfe702a..6d65479e651389b58d854843afe3a687bee0ca3a 100644
--- a/lib/internal/Magento/Framework/View/Layout/PageType/Config/SchemaLocator.php
+++ b/lib/internal/Magento/Framework/View/Layout/PageType/Config/SchemaLocator.php
@@ -18,12 +18,10 @@ class SchemaLocator implements \Magento\Framework\Config\SchemaLocatorInterface
 
     /**
      * Constructor
-     *
-     * @param \Magento\Framework\Module\Dir\Reader $moduleReader
      */
-    public function __construct(\Magento\Framework\Module\Dir\Reader $moduleReader)
+    public function __construct()
     {
-        $this->_schema = $moduleReader->getModuleDir('etc', 'Magento_Core') . '/page_types.xsd';
+        $this->_schema = realpath(__DIR__ . '/../../etc/page_types.xsd');
     }
 
     /**
diff --git a/app/code/Magento/Core/etc/page_types.xsd b/lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd
similarity index 100%
rename from app/code/Magento/Core/etc/page_types.xsd
rename to lib/internal/Magento/Framework/View/Layout/etc/page_types.xsd
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Asset/SourceTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Asset/SourceTest.php
index 7c14c7b32ccd265093688328a4959bb8413a90a5..026fbf85e677e1977a0ce9e51b23664c9f848b21 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Asset/SourceTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Asset/SourceTest.php
@@ -92,24 +92,6 @@ class SourceTest extends \PHPUnit_Framework_TestCase
         );
     }
 
-    public function testGetFileNoOriginalFile()
-    {
-        $this->viewFileResolution->expects($this->once())
-            ->method('getFile')
-            ->with('frontend', $this->theme, 'en_US', 'some/file.ext', 'Magento_Module')
-            ->will($this->returnValue(false));
-        $this->assertFalse($this->object->getFile($this->getAsset()));
-    }
-
-    public function testGetFileNoOriginalFileBasic()
-    {
-        $this->staticDirRead->expects($this->once())
-            ->method('getAbsolutePath')
-            ->with('some/file.ext')
-            ->will($this->returnValue(false));
-        $this->assertFalse($this->object->getFile($this->getAsset(false)));
-    }
-
     public function testGetFileCached()
     {
         $root = '/root/some/file.ext';
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Design/Fallback/RulePoolTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Design/Fallback/RulePoolTest.php
index c2f66aa9a9c430073d48f6c5c477e205f5953400..a4121826604aa11e55f5697190f0847aa5f6a0a9 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Design/Fallback/RulePoolTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Design/Fallback/RulePoolTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\View\Test\Unit\Design\Fallback;
 
 use \Magento\Framework\View\Design\Fallback\RulePool;
@@ -229,12 +232,12 @@ class RulePoolTest extends \PHPUnit_Framework_TestCase
             ],
             'template, non-modular-magento-core' => [
                 \Magento\Framework\View\Design\Fallback\RulePool::TYPE_TEMPLATE_FILE,
-                ['namespace' => 'Magento', 'module' => 'Core'],
+                ['namespace' => 'Magento', 'module' => 'Theme'],
                 [
-                    DirectoryList::THEMES . '/area/current_theme_path/Magento_Core/templates',
-                    DirectoryList::THEMES . '/area/parent_theme_path/Magento_Core/templates',
-                    DirectoryList::MODULES . '/Magento/Core/view/area/templates',
-                    DirectoryList::MODULES . '/Magento/Core/view/base/templates',
+                    DirectoryList::THEMES . '/area/current_theme_path/Magento_Theme/templates',
+                    DirectoryList::THEMES . '/area/parent_theme_path/Magento_Theme/templates',
+                    DirectoryList::MODULES . '/Magento/Theme/view/area/templates',
+                    DirectoryList::MODULES . '/Magento/Theme/view/base/templates',
                 ],
             ],
 
diff --git a/app/code/Magento/Core/Test/Unit/Model/DesignLoaderTest.php b/lib/internal/Magento/Framework/View/Test/Unit/DesignLoaderTest.php
similarity index 95%
rename from app/code/Magento/Core/Test/Unit/Model/DesignLoaderTest.php
rename to lib/internal/Magento/Framework/View/Test/Unit/DesignLoaderTest.php
index 4d4a994c2e5d5b654bdab87b15fcf97c159c211a..b3d0f530171683d28eaaf37f2bc032a7cee50a70 100644
--- a/app/code/Magento/Core/Test/Unit/Model/DesignLoaderTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/DesignLoaderTest.php
@@ -3,7 +3,10 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Core\Test\Unit\Model;
+
+// @codingStandardsIgnoreFile
+
+namespace Magento\Framework\View\Test\Unit;
 
 class DesignLoaderTest extends \PHPUnit_Framework_TestCase
 {
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Element/AbstractBlockTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Element/AbstractBlockTest.php
index eed898b3cd0c4d601da624dc725e799b983ff3d3..f187f63c647f09cdcf36f6075368da90248905f3 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Element/AbstractBlockTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Element/AbstractBlockTest.php
@@ -3,6 +3,9 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\View\Test\Unit\Element;
 
 class AbstractBlockTest extends \PHPUnit_Framework_TestCase
@@ -64,7 +67,7 @@ class AbstractBlockTest extends \PHPUnit_Framework_TestCase
         )->method(
             'getVarValue'
         )->with(
-            'Magento_Core',
+            'Magento_Theme',
             'v1'
         )->will(
             $this->returnValue('one')
@@ -80,7 +83,7 @@ class AbstractBlockTest extends \PHPUnit_Framework_TestCase
         $block = $this->getMockForAbstractClass(
             'Magento\Framework\View\Element\AbstractBlock',
             $helper->getConstructArguments('Magento\Framework\View\Element\AbstractBlock', $params),
-            uniqid('Magento\\Core\\Block\\AbstractBlock\\')
+            uniqid('Magento\\Theme\\Block\\AbstractBlock\\')
         );
 
         $this->assertEquals('one', $block->getVar('v1'));
diff --git a/app/code/Magento/Core/Test/Unit/Model/Layout/XsdTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Layout/XsdTest.php
similarity index 94%
rename from app/code/Magento/Core/Test/Unit/Model/Layout/XsdTest.php
rename to lib/internal/Magento/Framework/View/Test/Unit/Layout/XsdTest.php
index 3bdf7c6f6df1910495275801159607c1c5e21712..dae07e2a6ac190804687ad60dee637df0c2d5acd 100644
--- a/app/code/Magento/Core/Test/Unit/Model/Layout/XsdTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/XsdTest.php
@@ -3,7 +3,10 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-namespace Magento\Core\Test\Unit\Model\Layout;
+
+// @codingStandardsIgnoreFile
+
+namespace Magento\Framework\View\Test\Unit\Layout;
 
 class XsdTest extends \PHPUnit_Framework_TestCase
 {
diff --git a/app/code/Magento/Core/Test/Unit/Model/Layout/_files/action.xml b/lib/internal/Magento/Framework/View/Test/Unit/Layout/_files/action.xml
similarity index 100%
rename from app/code/Magento/Core/Test/Unit/Model/Layout/_files/action.xml
rename to lib/internal/Magento/Framework/View/Test/Unit/Layout/_files/action.xml
diff --git a/app/code/Magento/Core/Test/Unit/Model/Layout/_files/arguments.xml b/lib/internal/Magento/Framework/View/Test/Unit/Layout/_files/arguments.xml
similarity index 89%
rename from app/code/Magento/Core/Test/Unit/Model/Layout/_files/arguments.xml
rename to lib/internal/Magento/Framework/View/Test/Unit/Layout/_files/arguments.xml
index 7feb1abb6619b22afcd693820d9e160fff3b2310..cfda9d37a3fea1de5065684614d078e9ca51415a 100644
--- a/app/code/Magento/Core/Test/Unit/Model/Layout/_files/arguments.xml
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/_files/arguments.xml
@@ -9,11 +9,11 @@
     <body>
         <block class="Magento\Test\Block" name="test.block">
             <arguments>
-                <argument name="testHelperWithParams" xsi:type="helper" helper="Magento\Core\Model\Layout\Argument\Handler\TestHelper::testMethod">
+                <argument name="testHelperWithParams" xsi:type="helper" helper="Magento\Framework\View\Layout\Argument\Handler\TestHelper::testMethod">
                     <param name="firstParam">firstValue</param>
                     <param name="secondParam">secondValue</param>
                 </argument>
-                <argument name="testHelperWithoutParams" xsi:type="helper" helper="Magento\Core\Model\Layout\Argument\Handler\TestHelper::testMethod"/>
+                <argument name="testHelperWithoutParams" xsi:type="helper" helper="Magento\Framework\View\Layout\Argument\Handler\TestHelper::testMethod"/>
                 <argument name="testSimpleBoolean" xsi:type="boolean">true</argument>
                 <argument name="testSimpleNumber" xsi:type="number">1.5</argument>
                 <argument name="testSimpleString" xsi:type="string">Simple Test</argument>
@@ -39,11 +39,11 @@
                         <item name="url" xsi:type="string">*/sales_archive/massAdd</item>
                     </item>
                 </argument>
-                <argument name="testOptions" xsi:type="options" model="Magento\Core\Model\Layout\Argument\Handler\TestOptions"/>
+                <argument name="testOptions" xsi:type="options" model="Magento\Framework\View\Layout\Argument\Handler\TestOptions"/>
                 <argument name="testSimpleObject" xsi:type="object">
                     Magento\Framework\View\Layout\Argument\Handler\TestObject
                 </argument>
-                <argument name="testComplexObject" xsi:type="object"><updater>Magento_Test_Updater</updater>Magento\Core\Model\Layout\Argument\Handler\TestObject</argument>
+                <argument name="testComplexObject" xsi:type="object"><updater>Magento_Test_Updater</updater>Magento\Framework\View\Layout\Argument\Handler\TestObject</argument>
             </arguments>
             <action method="testAction">
                 <argument name="string" xsi:type="string">string</argument>
diff --git a/app/code/Magento/Core/Test/Unit/Model/Layout/_files/invalidLayoutArgumentsXmlArray.php b/lib/internal/Magento/Framework/View/Test/Unit/Layout/_files/invalidLayoutArgumentsXmlArray.php
similarity index 94%
rename from app/code/Magento/Core/Test/Unit/Model/Layout/_files/invalidLayoutArgumentsXmlArray.php
rename to lib/internal/Magento/Framework/View/Test/Unit/Layout/_files/invalidLayoutArgumentsXmlArray.php
index 14cd1a31346ccf3830699c0368e2c79ae6a62f35..0bb28856ca1479a34f6033a6edcf5778cf333ee3 100644
--- a/app/code/Magento/Core/Test/Unit/Model/Layout/_files/invalidLayoutArgumentsXmlArray.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/_files/invalidLayoutArgumentsXmlArray.php
@@ -82,7 +82,7 @@ return [
                 <block class="Magento\Test\Block" name="test.block">
                     <arguments>
                         <argument name="argumentName" xsi:type="helper"
-                            helper="Magento\Core\Model\Layout\Argument\Handler\TestHelper::testMethod">
+                            helper="Magento\Framework\View\Layout\Argument\Handler\TestHelper::testMethod">
                             <param />
                         </argument>
                     </arguments>
@@ -96,7 +96,7 @@ return [
                 <block class="Magento\Test\Block" name="test.block">
                     <arguments>
                         <argument name="argumentName" xsi:type="helper"
-                            helper="Magento\Core\Model\Layout\Argument\Handler\TestHelper::testMethod">
+                            helper="Magento\Framework\View\Layout\Argument\Handler\TestHelper::testMethod">
                             <param name="paramName" forbidden="forbidden"/>
                         </argument>
                     </arguments>
@@ -110,7 +110,7 @@ return [
                 <block class="Magento\Test\Block" name="test.block">
                     <arguments>
                         <argument name="argumentName" xsi:type="helper"
-                            helper="Magento\Core\Model\Layout\Argument\Handler\TestHelper::testMethod">
+                            helper="Magento\Framework\View\Layout\Argument\Handler\TestHelper::testMethod">
                             <param name="paramName"><forbidden /></param>
                         </argument>
                     </arguments>
diff --git a/lib/internal/Magento/Framework/Webapi/CustomAttributeTypeLocatorInterface.php b/lib/internal/Magento/Framework/Webapi/CustomAttributeTypeLocatorInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..dac64d2acfcf9379169980a836e95d15ef6e034f
--- /dev/null
+++ b/lib/internal/Magento/Framework/Webapi/CustomAttributeTypeLocatorInterface.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Webapi;
+
+/**
+ * Interface to locate types for custom attributes
+ */
+interface CustomAttributeTypeLocatorInterface
+{
+    /**
+     * Get Data Interface type for a given custom attribute code
+     *
+     * @param string $attributeCode
+     * @param string $serviceClass
+     * @return string|null
+     */
+    public function getType($attributeCode, $serviceClass);
+}
diff --git a/lib/internal/Magento/Framework/Webapi/ServiceInputProcessor.php b/lib/internal/Magento/Framework/Webapi/ServiceInputProcessor.php
index d00d0665076c975df5c9d57f8074d8f65e6a117c..75d2a77d1cbd91cb954174264f64c699099f1c2b 100644
--- a/lib/internal/Magento/Framework/Webapi/ServiceInputProcessor.php
+++ b/lib/internal/Magento/Framework/Webapi/ServiceInputProcessor.php
@@ -31,42 +31,44 @@ class ServiceInputProcessor
 {
     const CACHE_ID_PREFIX = 'service_method_params_';
 
+    const EXTENSION_ATTRIBUTES_TYPE = '\Magento\Framework\Api\ExtensionAttributesInterface';
+
     /** @var \Magento\Framework\Reflection\TypeProcessor */
     protected $typeProcessor;
 
     /** @var ObjectManagerInterface */
     protected $objectManager;
 
-    /** @var ServiceConfigReader */
-    protected $serviceConfigReader;
-
     /** @var AttributeValueFactory */
     protected $attributeValueFactory;
 
     /** @var WebapiCache */
     protected $cache;
 
+    /** @var  CustomAttributeTypeLocatorInterface */
+    protected $customAttributeTypeLocator;
+
     /**
      * Initialize dependencies.
      *
      * @param TypeProcessor $typeProcessor
      * @param ObjectManagerInterface $objectManager
-     * @param ServiceConfigReader $serviceConfigReader
      * @param AttributeValueFactory $attributeValueFactory
      * @param WebapiCache $cache
+     * @param CustomAttributeTypeLocatorInterface $customAttributeTypeLocator
      */
     public function __construct(
         TypeProcessor $typeProcessor,
         ObjectManagerInterface $objectManager,
-        ServiceConfigReader $serviceConfigReader,
         AttributeValueFactory $attributeValueFactory,
-        WebapiCache $cache
+        WebapiCache $cache,
+        CustomAttributeTypeLocatorInterface $customAttributeTypeLocator
     ) {
         $this->typeProcessor = $typeProcessor;
         $this->objectManager = $objectManager;
-        $this->serviceConfigReader = $serviceConfigReader;
         $this->attributeValueFactory = $attributeValueFactory;
         $this->cache = $cache;
+        $this->customAttributeTypeLocator = $customAttributeTypeLocator;
     }
 
     /**
@@ -127,12 +129,15 @@ class ServiceInputProcessor
      * @param string $className
      * @param array $data
      * @return object the newly created and populated object
+     * @throws \Exception
      */
     protected function _createFromArray($className, $data)
     {
         $data = is_array($data) ? $data : [];
         $class = new ClassReflection($className);
-
+        if (is_subclass_of($className, self::EXTENSION_ATTRIBUTES_TYPE)) {
+            $className = substr($className, 0, -strlen('Interface'));
+        }
         $factory = $this->objectManager->get($className . 'Factory');
         $object = $factory->create();
 
@@ -154,7 +159,7 @@ class ServiceInputProcessor
                     }
                 }
                 if ($camelCaseProperty === 'CustomAttributes') {
-                    $setterValue = $this->convertCustomAttributeValue($value, $returnType, $className);
+                    $setterValue = $this->convertCustomAttributeValue($value, $className);
                 } else {
                     $setterValue = $this->_convertValue($value, $returnType);
                 }
@@ -168,24 +173,14 @@ class ServiceInputProcessor
      * Convert custom attribute data array to array of AttributeValue Data Object
      *
      * @param array $customAttributesValueArray
-     * @param string $returnType
      * @param string $dataObjectClassName
      * @return AttributeValue[]
      */
-    protected function convertCustomAttributeValue($customAttributesValueArray, $returnType, $dataObjectClassName)
+    protected function convertCustomAttributeValue($customAttributesValueArray, $dataObjectClassName)
     {
         $result = [];
-        $allAttributes = $this->serviceConfigReader->read();
         $dataObjectClassName = ltrim($dataObjectClassName, '\\');
-        if (!isset($allAttributes[$dataObjectClassName])) {
-            $attributes = $this->_convertValue($customAttributesValueArray, $returnType);
-            $attributesByName = [];
-            foreach ($attributes as $attribute) {
-                $attributesByName[$attribute->getAttributeCode()] = $attribute;
-            }
-            return $attributesByName;
-        }
-        $dataObjectAttributes = $allAttributes[$dataObjectClassName];
+
         $camelCaseAttributeCodeKey = lcfirst(
             SimpleDataObjectConverter::snakeCaseToUpperCamelCase(AttributeValue::ATTRIBUTE_CODE)
         );
@@ -198,11 +193,9 @@ class ServiceInputProcessor
                 $customAttributeCode = null;
             }
 
-            //Check if type is defined, else default to mixed
-            $type = isset($dataObjectAttributes[$customAttributeCode])
-                ? $dataObjectAttributes[$customAttributeCode]
-                : TypeProcessor::ANY_TYPE;
-
+            //Check if type is defined, else default to string
+            $type = $this->customAttributeTypeLocator->getType($customAttributeCode, $dataObjectClassName);
+            $type = $type ? $type : TypeProcessor::ANY_TYPE;
             $customAttributeValue = $customAttribute[AttributeValue::VALUE];
             if (is_array($customAttributeValue)) {
                 //If type for AttributeValue's value as array is mixed, further processing is not possible
diff --git a/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php b/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php
index d53450141ba4310b8f2d69f5a7b82e847dd86778..41cdf8184ba372143f8ed2fdde2ff790f8633fa0 100644
--- a/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php
+++ b/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php
@@ -3,13 +3,16 @@
  * Copyright © 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+
+// @codingStandardsIgnoreFile
+
 namespace Magento\Framework\Webapi\Test\Unit;
 
-use \Magento\Framework\Webapi\ServiceInputProcessor;
-use \Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\WebapiBuilderFactory;
+use Magento\Framework\Webapi\ServiceInputProcessor;
+use Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\WebapiBuilderFactory;
 use Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\AssociativeArray;
 use Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\DataArray;
-use \Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\ObjectWithCustomAttributes;
+use Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\ObjectWithCustomAttributes;
 use Magento\Webapi\Test\Unit\Service\Entity\DataArrayData;
 use Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\Nested;
 use Magento\Webapi\Test\Unit\Service\Entity\NestedData;
@@ -25,10 +28,10 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
     protected $serviceInputProcessor;
 
     /** @var \PHPUnit_Framework_MockObject_MockObject */
-    protected $attributeValueFactory;
+    protected $attributeValueFactoryMock;
 
     /** @var \PHPUnit_Framework_MockObject_MockObject */
-    protected $serviceConfigReader;
+    protected $customAttributeTypeLocator;
 
     /** @var \PHPUnit_Framework_MockObject_MockObject  */
     protected $objectManagerMock;
@@ -46,7 +49,7 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
             ->getMock();
         $cache->expects($this->any())->method('load')->willReturn(false);
 
-        $this->serviceConfigReader = $this->getMockBuilder('Magento\Framework\Api\Config\Reader')
+        $this->customAttributeTypeLocator = $this->getMockBuilder('Magento\Eav\Model\EavCustomAttributeTypeLocator')
             ->disableOriginalConstructor()
             ->getMock();
 
@@ -68,7 +71,7 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
                 'typeProcessor' => $typeProcessor,
                 'objectManager' => $this->objectManagerMock,
                 'cache' => $cache,
-                'serviceConfigReader' => $this->serviceConfigReader,
+                'customAttributeTypeLocator' => $this->customAttributeTypeLocator,
                 'attributeValueFactory' => $this->attributeValueFactoryMock
             ]
         );
@@ -164,7 +167,7 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
 
     public function testAssociativeArrayProperties()
     {
-        $this->setupFactory(['\Magento\Webapi\Service\Entity\Simple']);
+        $this->setupFactory(['Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\Simple']);
         $data = ['associativeArray' => ['key' => 'value', 'key_two' => 'value_two']];
         $result = $this->serviceInputProcessor->process(
             'Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\TestService',
@@ -183,7 +186,7 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
 
     public function testAssociativeArrayPropertiesWithItem()
     {
-        $this->setupFactory(['Magento\Webapi\Service\Entity\AssociativeArray']);
+        $this->setupFactory(['Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\AssociativeArray']);
         $data = ['associativeArray' => ['item' => 'value']];
         $result = $this->serviceInputProcessor->process(
             'Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\TestService',
@@ -201,7 +204,7 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
 
     public function testAssociativeArrayPropertiesWithItemArray()
     {
-        $this->setupFactory(['Magento\Webapi\Service\Entity\AssociativeArray']);
+        $this->setupFactory(['Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\AssociativeArray']);
         $data = ['associativeArray' => ['item' => ['value1','value2']]];
         $result = $this->serviceInputProcessor->process(
             'Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\TestService',
@@ -344,8 +347,8 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
      *
      * @dataProvider customAttributesDataProvider
      * @param $customAttributeType
-     * @param $customAttributeValue
-     * @param $attributeCode
+     * @param $inputData
+     * @param $expectedObject
      */
     public function testCustomAttributesProperties($customAttributeType, $inputData, $expectedObject)
     {
@@ -357,13 +360,7 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
                 'Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\SimpleArray',
             ]
         );
-        $this->serviceConfigReader->expects($this->any())->method('read')->willReturn(
-            [
-                'Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\ObjectWithCustomAttributes' => [
-                    TestService::CUSTOM_ATTRIBUTE_CODE => $customAttributeType
-                ]
-            ]
-        );
+        $this->customAttributeTypeLocator->expects($this->any())->method('getType')->willReturn($customAttributeType);
 
         $result = $this->serviceInputProcessor->process(
             'Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\TestService',
@@ -532,6 +529,7 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase
         foreach ($classNames as $className) {
             $factoryMock = $this->getMockBuilder($className . 'Factory')
                 ->setMethods(['create'])
+                ->disableOriginalConstructor()
                 ->getMock();
             $factoryMock->expects($this->any())
                 ->method('create')
diff --git a/lib/web/jquery/jquery.validate.js b/lib/web/jquery/jquery.validate.js
index 58fdf10e665f2de752181fcfc09e1cfc5ecad2c2..85d0621b02244ae568e56509e83f9ad3dde2d626 100644
--- a/lib/web/jquery/jquery.validate.js
+++ b/lib/web/jquery/jquery.validate.js
@@ -288,22 +288,22 @@
         },
 
         messages: {
-            required: "This field is required.",
-            remote: "Please fix this field.",
-            email: "Please enter a valid email address.",
-            url: "Please enter a valid URL.",
-            date: "Please enter a valid date.",
-            dateISO: "Please enter a valid date (ISO).",
-            number: "Please enter a valid number.",
-            digits: "Please enter only digits.",
-            creditcard: "Please enter a valid credit card number.",
-            equalTo: "Please enter the same value again.",
-            maxlength: $.validator.format("Please enter no more than {0} characters."),
-            minlength: $.validator.format("Please enter at least {0} characters."),
-            rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
-            range: $.validator.format("Please enter a value between {0} and {1}."),
-            max: $.validator.format("Please enter a value less than or equal to {0}."),
-            min: $.validator.format("Please enter a value greater than or equal to {0}.")
+            required: $.mage.__("This field is required."),
+            remote: $.mage.__("Please fix this field."),
+            email: $.mage.__("Please enter a valid email address."),
+            url: $.mage.__("Please enter a valid URL."),
+            date: $.mage.__("Please enter a valid date."),
+            dateISO: $.mage.__("Please enter a valid date (ISO)."),
+            number: $.mage.__("Please enter a valid number."),
+            digits: $.mage.__("Please enter only digits."),
+            creditcard: $.mage.__("Please enter a valid credit card number."),
+            equalTo: $.mage.__("Please enter the same value again."),
+            maxlength: $.validator.format($.mage.__("Please enter no more than {0} characters.")),
+            minlength: $.validator.format($.mage.__("Please enter at least {0} characters.")),
+            rangelength: $.validator.format($.mage.__("Please enter a value between {0} and {1} characters long.")),
+            range: $.validator.format($.mage.__("Please enter a value between {0} and {1}.")),
+            max: $.validator.format($.mage.__("Please enter a value less than or equal to {0}.")),
+            min: $.validator.format($.mage.__("Please enter a value greater than or equal to {0}."))
         },
 
         autoCreateRanges: false,
@@ -621,6 +621,7 @@
             },
 
             defaultMessage: function (element, method) {
+                var noMessage = $.mage.__("Warning: No message defined for %s");
                 return this.findDefined(
                     this.customMessage(element.name, method),
                     this.customDataMessage(element, method),
@@ -628,7 +629,7 @@
                     // title is never undefined, so handle empty string as undefined
                     !this.settings.ignoreTitle && element.title || undefined,
                     $.validator.messages[method],
-                    "<strong>Warning: No message defined for " + element.name + "</strong>"
+                    "<strong>" + noMessage.replace('%s', element.name) + "</strong>"
                 );
             },
 
diff --git a/lib/web/mage/decorate.js b/lib/web/mage/decorate.js
index 0babea53af81b9f42e7db1bedf2e3266c26a278c..2c629479e497f1ccc31fdf570cf4ea44b3c050d3 100644
--- a/lib/web/mage/decorate.js
+++ b/lib/web/mage/decorate.js
@@ -111,7 +111,8 @@
         } else if (typeof method === 'object' || ! method) {
             return methods.init.apply(this, arguments);
         } else {
-            $.error($.mage.__('Method ' +  method + ' does not exist on jQuery.decorate'));
+            var message = $.mage.__('Method %s does not exist on jQuery.decorate');
+            $.error(message.replace('%s', method));
         }
     };
 
diff --git a/lib/web/mage/translate-inline-vde.js b/lib/web/mage/translate-inline-vde.js
index 6c2b3a53b7f927fe0f9ca3679a131568bb9f6038..0e70103b8f06fa3173582e16ed52cd42032d86cb 100644
--- a/lib/web/mage/translate-inline-vde.js
+++ b/lib/web/mage/translate-inline-vde.js
@@ -127,7 +127,7 @@
          */
         _checkTranslateEditing: function(event, data) {
              if (this.isBeingEdited) {
-                alert($.mage.__(data.alert_message));
+                alert(data.alert_message);
                 data.is_being_edited = true;
             }
             else {
diff --git a/lib/web/mage/validation.js b/lib/web/mage/validation.js
index 6e14e33548ddd8d773f3149689b5158c089cd969..7632ce9b84977587975da37348f383f39395c89e 100644
--- a/lib/web/mage/validation.js
+++ b/lib/web/mage/validation.js
@@ -934,7 +934,8 @@
                 return true;
             },
             function() {
-                return $.mage.__('Please enter a value less than or equal to %s.').replace('%s', this.lteToVal);
+                var message = $.mage.__('Please enter a value less than or equal to %s.');
+                return message.replace('%s', this.lteToVal);
             }
         ],
         "greater-than-equals-to": [
@@ -946,7 +947,8 @@
                 return true;
             },
             function() {
-                return $.mage.__('Please enter a value greater than or equal to %s.').replace('%s', this.gteToVal);
+                var message = $.mage.__('Please enter a value greater than or equal to %s.');
+                return message.replace('%s', this.gteToVal);
             }
         ],
         "validate-emails": [
@@ -1250,7 +1252,7 @@
     var showLabel = $.validator.prototype.showLabel;
     $.extend(true, $.validator.prototype, {
         showLabel: function(element, message) {
-            showLabel.call(this, element, $.mage.__(message));
+            showLabel.call(this, element, message);
 
             // ARIA (adding aria-invalid & aria-describedby)
             var label = this.errorsFor(element),
diff --git a/lib/web/mage/validation/validation.js b/lib/web/mage/validation/validation.js
index 42013cf2ca1b41c1e6a1eb40b22cb9417f8b9d0a..d666d2025c2636cb00b27e5d2af2c8baa584323d 100644
--- a/lib/web/mage/validation/validation.js
+++ b/lib/web/mage/validation/validation.js
@@ -72,7 +72,8 @@
                 if (inputDate >= minDate && inputDate <= maxDate) {
                     return true;
                 }
-                this.dateBetweenErrorMessage = $.mage.__('Please enter a date between %min and %max.').replace('%min', minDate).replace('%max', maxDate);
+                var message = $.mage.__('Please enter a date between %min and %max.');
+                this.dateBetweenErrorMessage = message.replace('%min', minDate).replace('%max', maxDate);
                 return false;
             },
             function () {
@@ -107,14 +108,14 @@
                     return false;
                 }
                 if (year < 1900 || year > curYear) {
-                    this.dobErrorMessage =
-                        $.mage.__('Please enter a valid year (1900-%1).').replace('%1', curYear.toString());
+                    var validYearMessage = $.mage.__('Please enter a valid year (1900-%1).');
+                    this.dobErrorMessage = validYearMessage.replace('%1', curYear.toString());
                     return false;
                 }
                 var validateDayInMonth = new Date(year, month, 0).getDate();
                 if (day < 1 || day > validateDayInMonth) {
-                    this.dobErrorMessage =
-                        $.mage.__('Please enter a valid day (1-%1).').replace('%1', validateDayInMonth.toString());
+                    var validDateMessage = $.mage.__('Please enter a valid day (1-%1).');
+                    this.dobErrorMessage = validDateMessage.replace('%1', validateDayInMonth.toString());
                     return false;
                 }
                 var today = new Date(),
diff --git a/pub/get.php b/pub/get.php
index f223a917dbb317cdc39736c975651261fca3b348..7e9adfd0e9fd7cde47236f024c888ae44d254f3d 100755
--- a/pub/get.php
+++ b/pub/get.php
@@ -63,9 +63,7 @@ if ($mediaDirectory) {
 // Materialize file in application
 $params = $_SERVER;
 if (empty($mediaDirectory)) {
-    $params[ObjectManagerFactory::INIT_PARAM_DEPLOYMENT_CONFIG] = [
-        DeploymentConfig::CONFIG_KEY => ['Magento_Core' => 1],
-    ];
+    $params[ObjectManagerFactory::INIT_PARAM_DEPLOYMENT_CONFIG] = [];
     $params[Factory::PARAM_CACHE_FORCED_OPTIONS] = ['frontend_options' => ['disable_save' => true]];
 }
 $bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params);
diff --git a/setup/pub/styles/setup.css b/setup/pub/styles/setup.css
index 2b738d61e6ee37fd1d75260db370b4e012fae368..41b113a55c90f4be925712eee65124bb3200d537 100644
--- a/setup/pub/styles/setup.css
+++ b/setup/pub/styles/setup.css
@@ -3,4 +3,4 @@
  * See COPYING.txt for license details.
  */
 
-html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:border-box}:focus{box-shadow:none;outline:0}.keyfocus :focus{box-shadow:0 0 0 1px #008bdb}embed,img,object,video{max-width:100%}.abs-clearer:after,.form-row:after,.header:after,.ie9 .alert:after,.nav:after,.row:after{content:"";display:table;clear:both}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/light/opensans-300.eot);src:url(../../pub/fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../../pub/fonts/opensans/light/opensans-300.woff) format('woff'),url(../../pub/fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../../pub/fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/regular/opensans-400.eot);src:url(../../pub/fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../../pub/fonts/opensans/regular/opensans-400.woff) format('woff'),url(../../pub/fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../../pub/fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/semibold/opensans-600.eot);src:url(../../pub/fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../../pub/fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../../pub/fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../../pub/fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/bold/opensans-700.eot);src:url(../../pub/fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../../pub/fonts/opensans/bold/opensans-700.woff) format('woff'),url(../../pub/fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../../pub/fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:400;line-height:1.4}h1,h2,h3,h4,h5,h6{font-weight:400;margin-top:0}p{margin:0 0 1em}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}@font-face{font-family:Icons;src:url(../../pub/fonts/icons/icons.eot);src:url(../../pub/fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/icons/icons.woff2) format('woff2'),url(../../pub/fonts/icons/icons.woff) format('woff'),url(../../pub/fonts/icons/icons.ttf) format('truetype'),url(../../pub/fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}[class*=icon-]:after{font-family:Icons}.icon-success-thick:after{content:'\e600'}.icon-success:after{content:'\e601'}.icon-collapse:after{content:'\e602'}.icon-failed-thick:after{content:'\e603'}.icon-failed:after{content:'\e604'}.icon-expand:after{content:'\e605'}.icon-warning:after{content:'\e606'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.8em;left:0;position:absolute;right:0;top:.15em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e600'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e603'}dl,ol,ul{margin-top:0}.list{margin-bottom:1em;padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before{font-family:Icons;font-size:1.6em;left:-.1em;position:absolute;top:-.2em}.list-item-success:before{color:#79a22e;content:'\e601'}.list-item-failed:before{color:#e22626;content:'\e604'}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .5em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1)}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;-webkit-filter:none;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active{background-color:#574e48}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary.disabled:hover,.ie9 .btn-secondary[disabled]:active,.ie9 .btn-secondary[disabled]:hover{background-color:#514943;-webkit-filter:none;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;border-radius:2px;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;vertical-align:top;padding:.43em .55em .5em 0}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{margin-bottom:2.5em;padding-top:1.5em;font-weight:600;font-size:1.25em}.form-legend{width:100%;border-top:1px solid #ccc}.form-legend-light{margin-bottom:1.5em;font-size:1em}.form-legend-expand{transition:opacity .2s linear;cursor:pointer}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e602'}.form-legend-expand:after{margin-left:.5em;font-weight:400;font-size:1.15em;font-family:Icons;content:'\e605';vertical-align:sub}.form-el-checkbox,.form-el-radio{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{border-color:#adadad;border-radius:2px;height:1.4rem;line-height:1;width:1.4rem}.form-el-checkbox:checked+.form-label::before{content:'\e600';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.6rem;width:1.6rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;border-radius:2px;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{position:relative;height:45.2rem;border:1px solid #adadad;overflow:auto;margin:0 0 1.5rem}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fff8d6;border:1px solid #ee7d7d;border-radius:2px;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.4235em .6655em .605em}.check-result-message{margin-left:.5em;min-height:3.68rem;-webkit-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}.pseudo-table{display:table}.pseudo-td{display:table-cell}.alert{margin-bottom:3.5rem;padding:2.5rem;-webkit-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.alert .spinner{min-width:1em}.ie9 .alert .spinner{float:left}.alert p:last-child{margin-bottom:0}.alert-info{background-color:#fafafa;border:1px solid #ccc}.alert-warning{background-color:#fff8d6;border:1px solid #fff8d6}.alert-icon{margin-right:1.5rem}.ie9 .alert-icon{float:left}[class*=icon-].alert-icon{font-size:3.8rem;min-width:3.8rem}.alert-text{margin-bottom:0}.alert-text~.alert-text{margin-top:1em}.ie9 .alert-text{display:block;margin-left:5.3rem;margin-top:1rem}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0 2rem}.row{margin-left:0;margin-right:0}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{min-height:1px;padding-left:0;padding-right:0;position:relative}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:.8rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after{display:none}.nav-bar>li.active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a{color:#000}.nav-bar>li.active a:hover{cursor:default}.nav-bar>li.active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:.7rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:.7rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.1rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.1rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:20rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@-webkit-keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}@-webkit-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span:nth-child(1){-webkit-animation-delay:.27s;animation-delay:.27s;-webkit-transform:rotate(-315deg);-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){-webkit-animation-delay:.36s;animation-delay:.36s;-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){-webkit-animation-delay:.45s;animation-delay:.45s;-webkit-transform:rotate(-225deg);-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){-webkit-animation-delay:.54s;animation-delay:.54s;-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){-webkit-animation-delay:.63s;animation-delay:.63s;-webkit-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){-webkit-animation-delay:.72s;animation-delay:.72s;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){-webkit-animation-delay:.81s;animation-delay:.81s;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){-webkit-animation-delay:.9;animation-delay:.9;-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.spinner>span{-webkit-animation-direction:linear;animation-direction:linear;-webkit-animation-duration:.72s;animation-duration:.72s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:fade;animation-name:fade;-webkit-transform:scale(0.4);-ms-transform:scale(0.4);transform:scale(0.4);background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../../pub/images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.main{padding-bottom:2rem;padding-top:3rem}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;margin:2.5rem 0 3.5rem 5rem}.page-title{font-size:2rem;margin-bottom:1.3em}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit{margin-bottom:20px}.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.rediness-check-item{margin-bottom:4rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:7.5rem}.readiness-check-content{margin-left:7.5rem;margin-right:22rem}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.rediness-check-side{float:right;padding-left:2.4rem;width:22rem}.rediness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:2rem;margin-top:.7rem}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .customize-your-store-default .legend{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;margin:1rem 0 2rem;max-height:20rem;overflow-y:auto;padding:1.5rem 2rem 2rem}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}@media all and (max-width:1047px){.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}}@media all and (min-width:768px){html{margin-left:calc(100vw - 100%);margin-right:0;overflow:auto}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}}
\ No newline at end of file
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:border-box}:focus{box-shadow:none;outline:0}.keyfocus :focus{box-shadow:0 0 0 1px #008bdb}embed,img,object,video{max-width:100%}.abs-clearer:after,.form-row:after,.header:after,.nav:after,.row:after{content:"";display:table;clear:both}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/light/opensans-300.eot);src:url(../../pub/fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../../pub/fonts/opensans/light/opensans-300.woff) format('woff'),url(../../pub/fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../../pub/fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/regular/opensans-400.eot);src:url(../../pub/fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../../pub/fonts/opensans/regular/opensans-400.woff) format('woff'),url(../../pub/fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../../pub/fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/semibold/opensans-600.eot);src:url(../../pub/fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../../pub/fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../../pub/fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../../pub/fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/bold/opensans-700.eot);src:url(../../pub/fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../../pub/fonts/opensans/bold/opensans-700.woff) format('woff'),url(../../pub/fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../../pub/fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:400;line-height:1.4}h1,h2,h3,h4,h5,h6{font-weight:400;margin-top:0}p{margin:0 0 1em}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}@font-face{font-family:Icons;src:url(../../pub/fonts/icons/icons.eot);src:url(../../pub/fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/icons/icons.woff2) format('woff2'),url(../../pub/fonts/icons/icons.woff) format('woff'),url(../../pub/fonts/icons/icons.ttf) format('truetype'),url(../../pub/fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}[class*=icon-]:after{font-family:Icons}.icon-success-thick:after{content:'\e600'}.icon-success:after{content:'\e601'}.icon-collapse:after{content:'\e602'}.icon-failed-thick:after{content:'\e603'}.icon-failed:after{content:'\e604'}.icon-expand:after{content:'\e605'}.icon-warning:after{content:'\e606'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.8em;left:0;position:absolute;right:0;top:.15em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e600'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e603'}dl,ol,ul{margin-top:0}.list{margin-bottom:1em;padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before{font-family:Icons;font-size:1.6em;left:-.1em;position:absolute;top:-.2em}.list-item-success:before{color:#79a22e;content:'\e601'}.list-item-failed:before{color:#e22626;content:'\e604'}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .5em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(#e04f00 0),color-stop(#f65405 100%));background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(#f65405 0),color-stop(#e04f00 100%));background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1)}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active{background-color:#574e48}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary.disabled:hover,.ie9 .btn-secondary[disabled]:active,.ie9 .btn-secondary[disabled]:hover{background-color:#514943;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;border-radius:2px;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;vertical-align:top;padding:.43em .55em .5em 0}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{margin-bottom:2.5em;padding-top:1.5em;font-weight:600;font-size:1.25em}.form-legend{width:100%;border-top:1px solid #ccc}.form-legend-light{margin-bottom:1.5em;font-size:1em}.form-legend-expand{transition:opacity .2s linear;cursor:pointer}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e602'}.form-legend-expand:after{margin-left:.5em;font-weight:400;font-size:1.15em;font-family:Icons;content:'\e605';vertical-align:sub}.form-el-checkbox,.form-el-radio{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{border-color:#adadad;border-radius:2px;height:1.4rem;line-height:1;width:1.4rem}.form-el-checkbox:checked+.form-label::before{content:'\e600';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.6rem;width:1.6rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;border-radius:2px;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{position:relative;height:45.2rem;border:1px solid #adadad;overflow:auto;margin:0 0 1.5rem}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fffbbb;border:1px solid #ee7d7d;border-radius:2px;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.4235em .6655em .605em}.check-result-message{margin-left:.5em;min-height:3.68rem;-webkit-align-items:center;-ms-align-items:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}.pseudo-table{display:table}.pseudo-td{display:table-cell}.messages{margin:0 0 2rem}.message{background:#fffbbb;border:none;border-radius:0;color:#333;font-size:14px;margin:0 0 1px;padding:1.8rem 4rem 1.8rem 5.5rem;position:relative;text-shadow:none}.message:before{background:0 0;border:0;color:#007bdb;content:'\e61a';font-family:Icons;font-size:1.9rem;font-style:normal;font-weight:400;height:auto;left:1.9rem;line-height:inherit;margin-top:-1.3rem;position:absolute;speak:none;text-shadow:none;top:50%;width:auto}.message-notice:before{color:#007bdb;content:'\e61a'}.message-warning:before{color:#eb5202;content:'\e623'}.message-error{background:#fcc}.message-error:before{color:#e22626;content:'\e632';font-size:1.5rem;left:2.2rem;margin-top:-1rem}.message-success:before{color:#79a22e;content:'\e62d'}.message-spinner:before{display:none}.message-spinner .spinner{font-size:2.5rem;left:1.5rem;position:absolute;top:1.5rem}.message-in-rating-edit{margin-left:1.8rem;margin-right:1.8rem}.message{margin-bottom:3rem}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0 2rem}.row{margin-left:0;margin-right:0}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{min-height:1px;padding-left:0;padding-right:0;position:relative}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,#d1d1d1 0,#d4d4d4 100%);background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:.8rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after{display:none}.nav-bar>li.active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a{color:#000}.nav-bar>li.active a:hover{cursor:default}.nav-bar>li.active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:.7rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:.7rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.1rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.1rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:20rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@-webkit-keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}@-moz-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@-webkit-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@-ms-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span:nth-child(1){-webkit-animation-delay:.27s;-moz-animation-delay:.27s;-ms-animation-delay:.27s;animation-delay:.27s;-webkit-transform:rotate(-315deg);-moz-transform:rotate(-315deg);-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){-webkit-animation-delay:.36s;-moz-animation-delay:.36s;-ms-animation-delay:.36s;animation-delay:.36s;-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){-webkit-animation-delay:.45s;-moz-animation-delay:.45s;-ms-animation-delay:.45s;animation-delay:.45s;-webkit-transform:rotate(-225deg);-moz-transform:rotate(-225deg);-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){-webkit-animation-delay:.54s;-moz-animation-delay:.54s;-ms-animation-delay:.54s;animation-delay:.54s;-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){-webkit-animation-delay:.63s;-moz-animation-delay:.63s;-ms-animation-delay:.63s;animation-delay:.63s;-webkit-transform:rotate(-135deg);-moz-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){-webkit-animation-delay:.72s;-moz-animation-delay:.72s;-ms-animation-delay:.72s;animation-delay:.72s;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){-webkit-animation-delay:.81s;-moz-animation-delay:.81s;-ms-animation-delay:.81s;animation-delay:.81s;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){-webkit-animation-delay:.9;-moz-animation-delay:.9;-ms-animation-delay:.9;animation-delay:.9;-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.spinner>span{-webkit-animation-direction:linear;-moz-animation-direction:linear;-ms-animation-direction:linear;animation-direction:linear;-webkit-animation-duration:.72s;-moz-animation-duration:.72s;-ms-animation-duration:.72s;animation-duration:.72s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:fade;-moz-animation-name:fade;-ms-animation-name:fade;animation-name:fade;-webkit-transform:scale(0.4);-moz-transform:scale(0.4);-ms-transform:scale(0.4);transform:scale(0.4);background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../../pub/images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.main{padding-bottom:2rem;padding-top:3rem}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;margin:2.5rem 0 3.5rem 5rem}.page-title{font-size:2rem;margin-bottom:1.3em}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit{margin-bottom:20px}.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.rediness-check-item{margin-bottom:4rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:7.5rem}.readiness-check-content{margin-left:7.5rem;margin-right:22rem}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.rediness-check-side{float:right;padding-left:2.4rem;width:22rem}.rediness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:2rem;margin-top:.7rem}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .customize-your-store-default .legend{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.customize-your-store .message-error:before{margin-top:0;top:1.8rem}.customize-your-store .message-error a{color:#333;text-decoration:underline}.customize-your-store .message-error .form-label:before{background:#fff}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;margin:1rem 0 2rem;max-height:20rem;overflow-y:auto;padding:1.5rem 2rem 2rem}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}@media all and (max-width:1047px){.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}}@media all and (min-width:768px){html{margin-left:calc(100vw - 100%);margin-right:0;overflow:auto}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}}
\ No newline at end of file
diff --git a/setup/src/Magento/Setup/Model/Installer.php b/setup/src/Magento/Setup/Model/Installer.php
index 0b2772d9f45c4684f7baeab5b7dd3f1c063d35a9..650fe796f7adf819de1334f29f3d89871e19cf7c 100644
--- a/setup/src/Magento/Setup/Model/Installer.php
+++ b/setup/src/Magento/Setup/Model/Installer.php
@@ -612,6 +612,202 @@ class Installer
         }
     }
 
+    /**
+     * Set up core tables
+     *
+     * @param SchemaSetupInterface $setup
+     * @return void
+     */
+    private function setupCoreTables(SchemaSetupInterface $setup)
+    {
+        /* @var $connection \Magento\Framework\DB\Adapter\AdapterInterface */
+        $connection = $setup->getConnection();
+
+        $setup->startSetup();
+
+        $this->setupSessionTable($setup, $connection);
+        $this->setupCacheTable($setup, $connection);
+        $this->setupCacheTagTable($setup, $connection);
+        $this->setupFlagTable($setup, $connection);
+
+        $setup->endSetup();
+    }
+
+    /**
+     * Create table 'session'
+     *
+     * @param SchemaSetupInterface $setup
+     * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
+     * @return void
+     */
+    private function setupSessionTable(
+        SchemaSetupInterface $setup,
+        \Magento\Framework\DB\Adapter\AdapterInterface $connection
+    ) {
+        $table = $connection->newTable(
+            $setup->getTable('session')
+        )->addColumn(
+            'session_id',
+            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+            255,
+            ['nullable' => false, 'primary' => true],
+            'Session Id'
+        )->addColumn(
+            'session_expires',
+            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+            null,
+            ['unsigned' => true, 'nullable' => false, 'default' => '0'],
+            'Date of Session Expiration'
+        )->addColumn(
+            'session_data',
+            \Magento\Framework\DB\Ddl\Table::TYPE_BLOB,
+            '2M',
+            ['nullable' => false],
+            'Session Data'
+        )->setComment(
+            'Database Sessions Storage'
+        );
+        $connection->createTable($table);
+    }
+
+    /**
+     * Create table 'cache'
+     *
+     * @param SchemaSetupInterface $setup
+     * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
+     * @return void
+     */
+    private function setupCacheTable(
+        SchemaSetupInterface $setup,
+        \Magento\Framework\DB\Adapter\AdapterInterface $connection
+    ) {
+        $table = $connection->newTable(
+            $setup->getTable('cache')
+        )->addColumn(
+            'id',
+            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+            200,
+            ['nullable' => false, 'primary' => true],
+            'Cache Id'
+        )->addColumn(
+            'data',
+            \Magento\Framework\DB\Ddl\Table::TYPE_BLOB,
+            '2M',
+            [],
+            'Cache Data'
+        )->addColumn(
+            'create_time',
+            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+            null,
+            [],
+            'Cache Creation Time'
+        )->addColumn(
+            'update_time',
+            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+            null,
+            [],
+            'Time of Cache Updating'
+        )->addColumn(
+            'expire_time',
+            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+            null,
+            [],
+            'Cache Expiration Time'
+        )->addIndex(
+            $setup->getIdxName('cache', ['expire_time']),
+            ['expire_time']
+        )->setComment(
+            'Caches'
+        );
+        $connection->createTable($table);
+    }
+
+    /**
+     * Create table 'cache_tag'
+     *
+     * @param SchemaSetupInterface $setup
+     * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
+     * @return void
+     */
+    private function setupCacheTagTable(
+        SchemaSetupInterface $setup,
+        \Magento\Framework\DB\Adapter\AdapterInterface $connection
+    ) {
+        $table = $connection->newTable(
+            $setup->getTable('cache_tag')
+        )->addColumn(
+            'tag',
+            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+            100,
+            ['nullable' => false, 'primary' => true],
+            'Tag'
+        )->addColumn(
+            'cache_id',
+            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+            200,
+            ['nullable' => false, 'primary' => true],
+            'Cache Id'
+        )->addIndex(
+            $setup->getIdxName('cache_tag', ['cache_id']),
+            ['cache_id']
+        )->setComment(
+            'Tag Caches'
+        );
+        $connection->createTable($table);
+    }
+
+    /**
+     * Create table 'flag'
+     *
+     * @param SchemaSetupInterface $setup
+     * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
+     * @return void
+     */
+    private function setupFlagTable(
+        SchemaSetupInterface $setup,
+        \Magento\Framework\DB\Adapter\AdapterInterface $connection
+    ) {
+        $table = $connection->newTable(
+            $setup->getTable('flag')
+        )->addColumn(
+            'flag_id',
+            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+            null,
+            ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
+            'Flag Id'
+        )->addColumn(
+            'flag_code',
+            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+            255,
+            ['nullable' => false],
+            'Flag Code'
+        )->addColumn(
+            'state',
+            \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+            null,
+            ['unsigned' => true, 'nullable' => false, 'default' => '0'],
+            'Flag State'
+        )->addColumn(
+            'flag_data',
+            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+            '64k',
+            [],
+            'Flag Data'
+        )->addColumn(
+            'last_update',
+            \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
+            null,
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
+            'Date of Last Flag Update'
+        )->addIndex(
+            $setup->getIdxName('flag', ['last_update']),
+            ['last_update']
+        )->setComment(
+            'Flag'
+        );
+        $connection->createTable($table);
+    }
+
     /**
      * Installs DB schema
      *
@@ -624,6 +820,7 @@ class Installer
             ['resource' => $this->context->getResources()]
         );
         $this->setupModuleRegistry($setup);
+        $this->setupCoreTables($setup);
         $this->log->log('Schema creation/updates:');
         $this->handleDBSchemaData($setup, 'schema');
     }
diff --git a/setup/src/Magento/Setup/Test/Unit/Controller/ConsoleControllerTest.php b/setup/src/Magento/Setup/Test/Unit/Controller/ConsoleControllerTest.php
index a248687ce6b24b07864012cc33f9b5bf9210cf09..9829a32e94d62e71f507b4d5565897c4f2a755a5 100644
--- a/setup/src/Magento/Setup/Test/Unit/Controller/ConsoleControllerTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Controller/ConsoleControllerTest.php
@@ -4,6 +4,8 @@
  * See COPYING.txt for license details.
  */
 
+// @codingStandardsIgnoreFile
+
 namespace Magento\Setup\Test\Unit\Controller;
 
 use \Magento\Setup\Controller\ConsoleController;
@@ -386,12 +388,12 @@ class ConsoleControllerTest extends \PHPUnit_Framework_TestCase
         $moduleListMock
             ->expects($this->once())
             ->method('getNames')
-            ->will($this->returnValue(['Magento_Core', 'Magento_Store']));
+            ->will($this->returnValue(['Magento_Theme', 'Magento_Store']));
         $fullModuleListMock = $this->getMock('Magento\Framework\Module\FullModuleList', [], [], '', false);
         $fullModuleListMock
             ->expects($this->once())
             ->method('getNames')
-            ->will($this->returnValue(['Magento_Core', 'Magento_Store', 'Magento_Directory']));
+            ->will($this->returnValue(['Magento_Theme', 'Magento_Store', 'Magento_Directory']));
         $returnValueMap = [
             [
                 'Magento\Framework\Module\ModuleList',
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php b/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php
index b780bb25a335ac92aa8c0808d7acb6c5e0d265ab..459368efdeeeb93cb4dcb7a1964878cac86bcbca 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php
@@ -239,6 +239,7 @@ class InstallerTest extends \PHPUnit_Framework_TestCase
         $setup->expects($this->any())->method('getConnection')->willReturn($connection);
         $table->expects($this->any())->method('addColumn')->willReturn($table);
         $table->expects($this->any())->method('setComment')->willReturn($table);
+        $table->expects($this->any())->method('addIndex')->willReturn($table);
         $connection->expects($this->any())->method('newTable')->willReturn($table);
         $resource = $this->getMock('Magento\Framework\App\Resource', [], [], '', false);
         $this->contextMock->expects($this->any())->method('getResources')->willReturn($resource);